1 #pragma once
2 #include <SDL2/SDL.h>
3 #include "../Core/BaseSoundManager.h"
4 
5 class Console;
6 
7 class SdlSoundManager : public BaseSoundManager
8 {
9 public:
10 	SdlSoundManager(shared_ptr<Console> console);
11 	~SdlSoundManager();
12 
13 	void PlayBuffer(int16_t *soundBuffer, uint32_t bufferSize, uint32_t sampleRate, bool isStereo);
14 	void Pause();
15 	void Stop();
16 
17 	void ProcessEndOfFrame();
18 
19 	string GetAvailableDevices();
20 	void SetAudioDevice(string deviceName);
21 
22 private:
23 	vector<string> GetAvailableDeviceInfo();
24 	bool InitializeAudio(uint32_t sampleRate, bool isStereo);
25 	void Release();
26 
27 	static void FillAudioBuffer(void *userData, uint8_t *stream, int len);
28 
29 	void ReadFromBuffer(uint8_t* output, uint32_t len);
30 	void WriteToBuffer(uint8_t* output, uint32_t len);
31 
32 private:
33 	shared_ptr<Console> _console;
34 	SDL_AudioDeviceID _audioDeviceID;
35 	string _deviceName;
36 	bool _needReset = false;
37 
38 	uint16_t _previousLatency = 0;
39 
40 	uint8_t* _buffer = nullptr;
41 	uint32_t _writePosition = 0;
42 	uint32_t _readPosition = 0;
43 };
44