common/audio/sdl3: Use a mutex for buffer accesses.

This commit is contained in:
BearOso 2024-12-13 17:23:20 -06:00
parent 56e58cdf99
commit fa94c74b84
1 changed files with 8 additions and 1 deletions

View File

@ -11,6 +11,8 @@
bool S9xSDL3SoundDriver::write_samples(int16_t *data, int samples) bool S9xSDL3SoundDriver::write_samples(int16_t *data, int samples)
{ {
bool retval = true; bool retval = true;
mutex.lock();
auto empty = buffer.space_empty(); auto empty = buffer.space_empty();
if (samples > empty) if (samples > empty)
{ {
@ -18,6 +20,7 @@ bool S9xSDL3SoundDriver::write_samples(int16_t *data, int samples)
buffer.dump(buffer.buffer_size / 2 - empty); buffer.dump(buffer.buffer_size / 2 - empty);
} }
buffer.push(data, samples); buffer.push(data, samples);
mutex.unlock();
return retval; return retval;
} }
@ -27,18 +30,22 @@ void S9xSDL3SoundDriver::mix(int req, int total)
if (tmp.size() < req / 2) if (tmp.size() < req / 2)
tmp.resize(req / 2); tmp.resize(req / 2);
mutex.lock();
if (buffer.avail() >= req / 2) if (buffer.avail() >= req / 2)
{ {
buffer.read((int16_t *)(tmp.data()), req / 2); buffer.read((int16_t *)(tmp.data()), req / 2);
mutex.unlock();
SDL_PutAudioStreamData(stream, tmp.data(), req); SDL_PutAudioStreamData(stream, tmp.data(), req);
} }
else else
{ {
auto avail = buffer.avail(); auto avail = buffer.avail();
buffer.read((int16_t *)(tmp.data()), avail); buffer.read((int16_t *)(tmp.data()), avail);
SDL_PutAudioStreamData(stream, tmp.data(), avail * 2);
buffer.add_silence(buffer.buffer_size / 2); buffer.add_silence(buffer.buffer_size / 2);
mutex.unlock();
SDL_PutAudioStreamData(stream, tmp.data(), avail * 2);
} }
} }