| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2008 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-21 02:17:03 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2009-09-09 21:26:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2009-09-09 21:26:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-10 00:20:27 -04:00
										 |  |  | #include <atomic>
 | 
					
						
							| 
									
										
										
										
											2015-07-07 15:30:27 +02:00
										 |  |  | #include <condition_variable>
 | 
					
						
							|  |  |  | #include <mutex>
 | 
					
						
							| 
									
										
										
										
											2015-05-10 00:20:27 -04:00
										 |  |  | #include <thread>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-09 22:56:23 +00:00
										 |  |  | #if defined(HAVE_ALSA) && HAVE_ALSA
 | 
					
						
							| 
									
										
										
										
											2009-09-09 21:26:33 +00:00
										 |  |  | #include <alsa/asoundlib.h>
 | 
					
						
							| 
									
										
										
										
											2009-09-09 22:56:23 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-09-09 21:26:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "AudioCommon/SoundStream.h"
 | 
					
						
							| 
									
										
										
										
											2014-09-07 20:06:58 -05:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2009-09-09 21:26:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-18 10:37:45 -04:00
										 |  |  | class AlsaSound final : public SoundStream | 
					
						
							| 
									
										
										
										
											2009-09-09 21:26:33 +00:00
										 |  |  | { | 
					
						
							|  |  |  | #if defined(HAVE_ALSA) && HAVE_ALSA
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   AlsaSound(); | 
					
						
							| 
									
										
										
										
											2009-09-09 21:26:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   bool Start() override; | 
					
						
							|  |  |  |   void SoundLoop() override; | 
					
						
							|  |  |  |   void Stop() override; | 
					
						
							|  |  |  |   void Update() override; | 
					
						
							|  |  |  |   void Clear(bool) override; | 
					
						
							| 
									
										
										
										
											2009-09-09 21:26:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   static bool isValid() { return true; } | 
					
						
							| 
									
										
										
										
											2009-09-09 21:26:33 +00:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   // maximum number of frames the buffer can hold
 | 
					
						
							|  |  |  |   static constexpr size_t BUFFER_SIZE_MAX = 8192; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // minimum number of frames to deliver in one transfer
 | 
					
						
							|  |  |  |   static constexpr u32 FRAME_COUNT_MIN = 256; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // number of channels per frame
 | 
					
						
							|  |  |  |   static constexpr u32 CHANNEL_COUNT = 2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   enum class ALSAThreadStatus | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     RUNNING, | 
					
						
							|  |  |  |     PAUSED, | 
					
						
							|  |  |  |     STOPPING, | 
					
						
							|  |  |  |     STOPPED, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bool AlsaInit(); | 
					
						
							|  |  |  |   void AlsaShutdown(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   s16 mix_buffer[BUFFER_SIZE_MAX * CHANNEL_COUNT]; | 
					
						
							|  |  |  |   std::thread thread; | 
					
						
							|  |  |  |   std::atomic<ALSAThreadStatus> m_thread_status; | 
					
						
							|  |  |  |   std::condition_variable cv; | 
					
						
							|  |  |  |   std::mutex cv_m; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   snd_pcm_t* handle; | 
					
						
							|  |  |  |   unsigned int frames_to_deliver; | 
					
						
							| 
									
										
										
										
											2009-09-09 21:26:33 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | }; |