| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2009 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-17 23:09:55 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2009-03-26 09:29:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2009-03-26 09:29:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-14 01:19:25 -05:00
										 |  |  | #include <array>
 | 
					
						
							| 
									
										
										
										
											2015-05-09 23:50:45 -04:00
										 |  |  | #include <atomic>
 | 
					
						
							| 
									
										
										
										
											2014-03-12 15:33:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "AudioCommon/WaveFile.h"
 | 
					
						
							| 
									
										
										
										
											2016-01-14 01:19:25 -05:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2011-02-11 18:59:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-14 00:58:01 -05:00
										 |  |  | class CMixer final | 
					
						
							| 
									
										
										
										
											2015-09-26 17:13:07 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-26 09:29:14 +00:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   explicit CMixer(unsigned int BackendSampleRate); | 
					
						
							|  |  |  |   ~CMixer(); | 
					
						
							| 
									
										
										
										
											2010-07-23 23:51:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   // Called from audio threads
 | 
					
						
							|  |  |  |   unsigned int Mix(short* samples, unsigned int numSamples, bool consider_framelimit = true); | 
					
						
							| 
									
										
										
										
											2009-12-20 02:23:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   // Called from main thread
 | 
					
						
							|  |  |  |   void PushSamples(const short* samples, unsigned int num_samples); | 
					
						
							|  |  |  |   void PushStreamingSamples(const short* samples, unsigned int num_samples); | 
					
						
							|  |  |  |   void PushWiimoteSpeakerSamples(const short* samples, unsigned int num_samples, | 
					
						
							|  |  |  |                                  unsigned int sample_rate); | 
					
						
							|  |  |  |   unsigned int GetSampleRate() const { return m_sampleRate; } | 
					
						
							|  |  |  |   void SetDMAInputSampleRate(unsigned int rate); | 
					
						
							|  |  |  |   void SetStreamInputSampleRate(unsigned int rate); | 
					
						
							|  |  |  |   void SetStreamingVolume(unsigned int lvolume, unsigned int rvolume); | 
					
						
							|  |  |  |   void SetWiimoteSpeakerVolume(unsigned int lvolume, unsigned int rvolume); | 
					
						
							| 
									
										
										
										
											2014-07-24 11:20:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   void StartLogDTKAudio(const std::string& filename); | 
					
						
							|  |  |  |   void StopLogDTKAudio(); | 
					
						
							| 
									
										
										
										
											2009-06-12 14:40:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   void StartLogDSPAudio(const std::string& filename); | 
					
						
							|  |  |  |   void StopLogDSPAudio(); | 
					
						
							| 
									
										
										
										
											2013-01-09 22:57:32 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   float GetCurrentSpeed() const { return m_speed.load(); } | 
					
						
							|  |  |  |   void UpdateSpeed(float val) { m_speed.store(val); } | 
					
						
							| 
									
										
										
										
											2016-01-14 00:58:01 -05:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   static constexpr u32 MAX_SAMPLES = 1024 * 4;  // 128 ms
 | 
					
						
							|  |  |  |   static constexpr u32 INDEX_MASK = MAX_SAMPLES * 2 - 1; | 
					
						
							|  |  |  |   static constexpr int MAX_FREQ_SHIFT = 200;  // Per 32000 Hz
 | 
					
						
							|  |  |  |   static constexpr float CONTROL_FACTOR = 0.2f; | 
					
						
							|  |  |  |   static constexpr u32 CONTROL_AVG = 32;  // In freq_shift per FIFO size offset
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class MixerFifo final | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |   public: | 
					
						
							|  |  |  |     MixerFifo(CMixer* mixer, unsigned sample_rate) | 
					
						
							|  |  |  |         : m_mixer(mixer), m_input_sample_rate(sample_rate) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     void PushSamples(const short* samples, unsigned int num_samples); | 
					
						
							|  |  |  |     unsigned int Mix(short* samples, unsigned int numSamples, bool consider_framelimit = true); | 
					
						
							|  |  |  |     void SetInputSampleRate(unsigned int rate); | 
					
						
							| 
									
										
										
										
											2016-06-11 18:52:45 -04:00
										 |  |  |     unsigned int GetInputSampleRate() const; | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |     void SetVolume(unsigned int lvolume, unsigned int rvolume); | 
					
						
							| 
									
										
										
										
											2016-01-14 03:00:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   private: | 
					
						
							|  |  |  |     CMixer* m_mixer; | 
					
						
							|  |  |  |     unsigned m_input_sample_rate; | 
					
						
							|  |  |  |     std::array<short, MAX_SAMPLES * 2> m_buffer{}; | 
					
						
							|  |  |  |     std::atomic<u32> m_indexW{0}; | 
					
						
							|  |  |  |     std::atomic<u32> m_indexR{0}; | 
					
						
							|  |  |  |     // Volume ranges from 0-256
 | 
					
						
							|  |  |  |     std::atomic<s32> m_LVolume{256}; | 
					
						
							|  |  |  |     std::atomic<s32> m_RVolume{256}; | 
					
						
							|  |  |  |     float m_numLeftI = 0.0f; | 
					
						
							|  |  |  |     u32 m_frac = 0; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   MixerFifo m_dma_mixer{this, 32000}; | 
					
						
							|  |  |  |   MixerFifo m_streaming_mixer{this, 48000}; | 
					
						
							|  |  |  |   MixerFifo m_wiimote_speaker_mixer{this, 3000}; | 
					
						
							|  |  |  |   unsigned int m_sampleRate; | 
					
						
							| 
									
										
										
										
											2011-02-11 18:59:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   WaveFileWriter m_wave_writer_dtk; | 
					
						
							|  |  |  |   WaveFileWriter m_wave_writer_dsp; | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   bool m_log_dtk_audio = false; | 
					
						
							|  |  |  |   bool m_log_dsp_audio = false; | 
					
						
							| 
									
										
										
										
											2009-03-26 09:29:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   // Current rate of emulation (1.0 = 100% speed)
 | 
					
						
							|  |  |  |   std::atomic<float> m_speed{0.0f}; | 
					
						
							| 
									
										
										
										
											2015-02-23 18:43:13 +01:00
										 |  |  | }; |