Synchronize access to sound buffers
This commit is contained in:
parent
e691b3968c
commit
d0bfd277e6
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
|
||||||
#define AUDIO_ENGINE_SOUND_BUFFERS 8
|
#define AUDIO_ENGINE_SOUND_BUFFERS 8
|
||||||
|
@ -18,6 +20,7 @@ struct AudioEngineSoundBuffer {
|
||||||
bool looping;
|
bool looping;
|
||||||
unsigned int pos;
|
unsigned int pos;
|
||||||
SDL_AudioStream* stream;
|
SDL_AudioStream* stream;
|
||||||
|
std::recursive_mutex mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern bool gProgramIsActive;
|
extern bool gProgramIsActive;
|
||||||
|
@ -44,6 +47,8 @@ static void audioEngineMixin(void* userData, Uint8* stream, int length)
|
||||||
|
|
||||||
for (int index = 0; index < AUDIO_ENGINE_SOUND_BUFFERS; index++) {
|
for (int index = 0; index < AUDIO_ENGINE_SOUND_BUFFERS; index++) {
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[index]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[index]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (soundBuffer->active && soundBuffer->playing) {
|
if (soundBuffer->active && soundBuffer->playing) {
|
||||||
int srcFrameSize = soundBuffer->bitsPerSample / 8 * soundBuffer->channels;
|
int srcFrameSize = soundBuffer->bitsPerSample / 8 * soundBuffer->channels;
|
||||||
|
|
||||||
|
@ -132,12 +137,18 @@ int audioEngineCreateSoundBuffer(unsigned int size, int bitsPerSample, int chann
|
||||||
{
|
{
|
||||||
for (int index = 0; index < AUDIO_ENGINE_SOUND_BUFFERS; index++) {
|
for (int index = 0; index < AUDIO_ENGINE_SOUND_BUFFERS; index++) {
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[index]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[index]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (!soundBuffer->active) {
|
if (!soundBuffer->active) {
|
||||||
soundBuffer->active = true;
|
soundBuffer->active = true;
|
||||||
soundBuffer->size = size;
|
soundBuffer->size = size;
|
||||||
soundBuffer->bitsPerSample = bitsPerSample;
|
soundBuffer->bitsPerSample = bitsPerSample;
|
||||||
soundBuffer->channels = channels;
|
soundBuffer->channels = channels;
|
||||||
soundBuffer->rate = rate;
|
soundBuffer->rate = rate;
|
||||||
|
soundBuffer->volume = SDL_MIX_MAXVOLUME;
|
||||||
|
soundBuffer->playing = false;
|
||||||
|
soundBuffer->looping = false;
|
||||||
|
soundBuffer->pos = 0;
|
||||||
soundBuffer->data = malloc(size);
|
soundBuffer->data = malloc(size);
|
||||||
soundBuffer->stream = SDL_NewAudioStream(bitsPerSample == 16 ? AUDIO_S16 : AUDIO_S8, channels, rate, gAudioEngineSpec.format, gAudioEngineSpec.channels, gAudioEngineSpec.freq);
|
soundBuffer->stream = SDL_NewAudioStream(bitsPerSample == 16 ? AUDIO_S16 : AUDIO_S8, channels, rate, gAudioEngineSpec.format, gAudioEngineSpec.channels, gAudioEngineSpec.freq);
|
||||||
return index;
|
return index;
|
||||||
|
@ -154,13 +165,19 @@ bool audioEngineSoundBufferRelease(int soundBufferIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (!soundBuffer->active) {
|
if (!soundBuffer->active) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
soundBuffer->active = false;
|
||||||
|
|
||||||
free(soundBuffer->data);
|
free(soundBuffer->data);
|
||||||
|
soundBuffer->data = NULL;
|
||||||
|
|
||||||
SDL_FreeAudioStream(soundBuffer->stream);
|
SDL_FreeAudioStream(soundBuffer->stream);
|
||||||
memset(soundBuffer, 0, sizeof(*soundBuffer));
|
soundBuffer->stream = NULL;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -172,6 +189,8 @@ bool audioEngineSoundBufferSetVolume(int soundBufferIndex, int volume)
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (!soundBuffer->active) {
|
if (!soundBuffer->active) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -188,6 +207,8 @@ bool audioEngineSoundBufferGetVolume(int soundBufferIndex, int* volumePtr)
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (!soundBuffer->active) {
|
if (!soundBuffer->active) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -204,6 +225,8 @@ bool audioEngineSoundBufferSetPan(int soundBufferIndex, int pan)
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (!soundBuffer->active) {
|
if (!soundBuffer->active) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -221,6 +244,8 @@ bool audioEngineSoundBufferPlay(int soundBufferIndex, unsigned int flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (!soundBuffer->active) {
|
if (!soundBuffer->active) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -241,6 +266,8 @@ bool audioEngineSoundBufferStop(int soundBufferIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (!soundBuffer->active) {
|
if (!soundBuffer->active) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -257,6 +284,8 @@ bool audioEngineSoundBufferGetCurrentPosition(int soundBufferIndex, unsigned int
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (!soundBuffer->active) {
|
if (!soundBuffer->active) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -286,6 +315,8 @@ bool audioEngineSoundBufferSetCurrentPosition(int soundBufferIndex, unsigned int
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (!soundBuffer->active) {
|
if (!soundBuffer->active) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -302,6 +333,8 @@ bool audioEngineSoundBufferLock(int soundBufferIndex, unsigned int writePos, uns
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (!soundBuffer->active) {
|
if (!soundBuffer->active) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -357,6 +390,8 @@ bool audioEngineSoundBufferUnlock(int soundBufferIndex, void* audioPtr1, unsigne
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (!soundBuffer->active) {
|
if (!soundBuffer->active) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -373,6 +408,8 @@ bool audioEngineSoundBufferGetStatus(int soundBufferIndex, unsigned int* statusP
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
AudioEngineSoundBuffer* soundBuffer = &(gAudioEngineSoundBuffers[soundBufferIndex]);
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(soundBuffer->mutex);
|
||||||
|
|
||||||
if (!soundBuffer->active) {
|
if (!soundBuffer->active) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue