33#include " common/Logger.hpp"
44
55SoundStreamAL::SoundStreamAL ()
6+ : SoundStream()
67{
7- _decoder = nullptr ;
8- _info = stb_vorbis_info ();
98 _createSource ();
109 _createBuffers ();
11- _tempPcmBufferSize = 4096 * 8 ;
12- _tempPcmBuffer = new int16_t [_tempPcmBufferSize];
1310 _alFormat = AL_NONE;
14- _totalSamplesLeft = 0 ;
15- _isStreaming = false ;
16- _isPaused = false ;
17- _shouldLoop = false ;
1811
19- setVolume ( 1 . 0f );
12+ _setVolume ( getVolume () );
2013}
2114
2215SoundStreamAL::~SoundStreamAL ()
2316{
2417 _deleteSource ();
2518 _deleteBuffers ();
26- _deleteDecoder ();
27- delete[] _tempPcmBuffer;
28- }
29-
30- bool SoundStreamAL::_stream (uint32_t buffer)
31- {
32- int size = 0 ;
33- int result = 0 ;
34-
35- while (size < _tempPcmBufferSize)
36- {
37- result = stb_vorbis_get_samples_short_interleaved (_decoder, _info.channels , _tempPcmBuffer + size, _tempPcmBufferSize - size);
38- if (result > 0 ) size += result * _info.channels ;
39- else break ;
40- }
41-
42- if (size == 0 ) return false ;
43-
44- alBufferData (buffer, _alFormat, _tempPcmBuffer, size * sizeof (int16_t ), _info.sample_rate );
45- AL_ERROR_CHECK ();
46- _totalSamplesLeft -= size;
47-
48- return true ;
4919}
5020
5121void SoundStreamAL::_deleteSource ()
@@ -72,13 +42,25 @@ void SoundStreamAL::_resetSource()
7242
7343void SoundStreamAL::_deleteBuffers ()
7444{
75- alDeleteBuffers (2 , _buffers);
45+ alDeleteBuffers (_buffers. size () , _buffers. data () );
7646 AL_ERROR_CHECK ();
47+
48+ _buffers.clear ();
49+ _bufferIdMap.clear ();
7750}
7851
7952void SoundStreamAL::_createBuffers ()
8053{
81- alGenBuffers (2 , _buffers);
54+ // Should not be called while buffers are already present
55+ assert (_buffers.size () == 0 );
56+
57+ ALuint buffers[2 ];
58+ alGenBuffers (2 , buffers);
59+ for (int i = 0 ; i < sizeof (buffers) / sizeof (ALuint); i++)
60+ {
61+ _buffers.push_back (buffers[i]);
62+ _bufferIdMap.emplace (buffers[i], i);
63+ }
8264}
8365
8466void SoundStreamAL::_resetBuffers ()
@@ -87,77 +69,73 @@ void SoundStreamAL::_resetBuffers()
8769 _createBuffers ();
8870}
8971
90- void SoundStreamAL::_deleteDecoder ( )
72+ void SoundStreamAL::_setVolume ( float vol )
9173{
92- if (_decoder != nullptr )
93- stb_vorbis_close (_decoder);
94- _decoder = nullptr ;
74+ alSourcef (_source, AL_GAIN, vol);
75+ AL_ERROR_CHECK ();
9576}
9677
97- bool SoundStreamAL::open ( const std::string& fileName )
78+ void SoundStreamAL::_play ( )
9879{
99- if (isStreaming ())
100- {
101- close ();
102- }
80+ alSourcePlay (_source);
81+ AL_ERROR_CHECK ();
82+ }
10383
104- _isPaused = false ;
84+ void SoundStreamAL::_pause ()
85+ {
86+ alSourcePause (_source);
87+ AL_ERROR_CHECK ();
88+ }
10589
106- _decoder = stb_vorbis_open_filename (fileName.c_str (), NULL , NULL );
107- if (!_decoder) return false ;
108- // Get file info
109- _info = stb_vorbis_get_info (_decoder);
110- if (_info.channels == 2 ) _alFormat = AL_FORMAT_STEREO16;
90+ bool SoundStreamAL::_open (const std::string& fileName)
91+ {
92+ if (m_info.channels == 2 ) _alFormat = AL_FORMAT_STEREO16;
11193 else _alFormat = AL_FORMAT_MONO16;
11294
113- if (!_stream (_buffers[0 ])) return false ;
114- if (!_stream (_buffers[1 ])) return false ;
115- alSourceQueueBuffers (_source, 2 , _buffers);
116- AL_ERROR_CHECK ();
117- alSourcePlay (_source);
95+ size_t size = _buffers.size ();
96+ for (int i = 0 ; i < size; i++)
97+ {
98+ if (!_stream (i)) return false ;
99+ }
100+ alSourceQueueBuffers (_source, size, _buffers.data ());
118101 AL_ERROR_CHECK ();
119-
120- _totalSamplesLeft = stb_vorbis_stream_length_in_samples (_decoder) * _info.channels ;
121- _isStreaming = true ;
102+ _play ();
122103
123104 return true ;
124105}
125106
126- void SoundStreamAL::close ()
107+ void SoundStreamAL::_close ()
127108{
128109 _resetSource ();
129110 // _resetBuffers();
130- _deleteDecoder ();
131111 _alFormat = AL_NONE;
132- _totalSamplesLeft = 0 ;
133- _isStreaming = false ;
134112}
135113
136- void SoundStreamAL::update ()
114+ void SoundStreamAL::_update ()
137115{
138- if (!isPlaying ()) return ;
139-
140- int32_t processed = 0 ;
116+ ALint processed = 0 ;
141117
142118 alGetSourcei (_source, AL_BUFFERS_PROCESSED, &processed);
143119 AL_ERROR_CHECK ();
144120
145121 while (processed--)
146122 {
147- uint32_t buffer = 0 ;
123+ ALuint buffer = 0 ;
148124
149125 alSourceUnqueueBuffers (_source, 1 , &buffer);
150126 AL_ERROR_CHECK ();
151127
152- if (!_stream (buffer))
128+ int bufferId = _bufferIdMap[buffer];
129+
130+ if (!_stream (bufferId))
153131 {
154132 bool shouldExit = true ;
155133
156- if (_shouldLoop )
134+ if (shouldLoop () )
157135 {
158- stb_vorbis_seek_start (_decoder );
159- _totalSamplesLeft = stb_vorbis_stream_length_in_samples (_decoder ) * _info .channels ;
160- shouldExit = !_stream (buffer );
136+ stb_vorbis_seek_start (m_decoder );
137+ m_totalSamplesLeft = stb_vorbis_stream_length_in_samples (m_decoder ) * m_info .channels ;
138+ shouldExit = !_stream (bufferId );
161139 }
162140
163141 if (shouldExit)
@@ -171,8 +149,8 @@ void SoundStreamAL::update()
171149 }
172150}
173151
174- void SoundStreamAL::setVolume ( float vol )
152+ void SoundStreamAL::_publishBuffer ( unsigned int destBufferId, const SoundBuffer& sourceBuffer )
175153{
176- alSourcef (_source, AL_GAIN, vol );
154+ alBufferData (_buffers[destBufferId], _alFormat, sourceBuffer. m_pData , sourceBuffer. m_dataSize * sizeof ( int16_t ), m_info. sample_rate );
177155 AL_ERROR_CHECK ();
178- }
156+ }
0 commit comments