mirror of https://github.com/bjornbytes/lovr.git
no need for a capture lock
This commit is contained in:
parent
e05d554528
commit
d4a5e06932
|
@ -46,7 +46,7 @@ static struct {
|
||||||
ma_context context;
|
ma_context context;
|
||||||
AudioConfig config[AUDIO_TYPE_COUNT];
|
AudioConfig config[AUDIO_TYPE_COUNT];
|
||||||
ma_device devices[AUDIO_TYPE_COUNT];
|
ma_device devices[AUDIO_TYPE_COUNT];
|
||||||
ma_mutex locks[AUDIO_TYPE_COUNT];
|
ma_mutex playbackLock;
|
||||||
Source* sources;
|
Source* sources;
|
||||||
ma_pcm_rb captureRingbuffer;
|
ma_pcm_rb captureRingbuffer;
|
||||||
arr_t(ma_data_converter) converters;
|
arr_t(ma_data_converter) converters;
|
||||||
|
@ -103,7 +103,7 @@ static bool mix(Source* source, float* output, uint32_t count) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void onPlayback(ma_device* device, void* output, const void* _, uint32_t count) {
|
static void onPlayback(ma_device* device, void* output, const void* _, uint32_t count) {
|
||||||
ma_mutex_lock(&state.locks[AUDIO_PLAYBACK]);
|
ma_mutex_lock(&state.playbackLock);
|
||||||
|
|
||||||
// For each Source, remove it if it isn't playing or process it and remove it if it stops
|
// For each Source, remove it if it isn't playing or process it and remove it if it stops
|
||||||
for (Source** list = &state.sources, *source = *list; source != NULL; source = *list) {
|
for (Source** list = &state.sources, *source = *list; source != NULL; source = *list) {
|
||||||
|
@ -116,7 +116,7 @@ static void onPlayback(ma_device* device, void* output, const void* _, uint32_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ma_mutex_unlock(&state.locks[AUDIO_PLAYBACK]);
|
ma_mutex_unlock(&state.playbackLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void onCapture(ma_device* device, void* output, const void* input, uint32_t frames) {
|
static void onCapture(ma_device* device, void* output, const void* input, uint32_t frames) {
|
||||||
|
@ -158,14 +158,12 @@ bool lovrAudioInit(AudioConfig config[2]) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mutexStatus = ma_mutex_init(&state.context, &state.playbackLock);
|
||||||
|
lovrAssert(mutexStatus == MA_SUCCESS, "Failed to create audio mutex");
|
||||||
|
|
||||||
lovrAudioReset();
|
lovrAudioReset();
|
||||||
|
|
||||||
for (int i = 0; i < AUDIO_TYPE_COUNT; i++) {
|
for (int i = 0; i < AUDIO_TYPE_COUNT; i++) {
|
||||||
if (ma_mutex_init(&state.context, &state.locks[i])) {
|
|
||||||
lovrAudioDestroy();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config[i].enable && config[i].start) {
|
if (config[i].enable && config[i].start) {
|
||||||
int startStatus = ma_device_start(&state.devices[i]);
|
int startStatus = ma_device_start(&state.devices[i]);
|
||||||
if(startStatus != MA_SUCCESS) {
|
if(startStatus != MA_SUCCESS) {
|
||||||
|
@ -199,8 +197,7 @@ void lovrAudioDestroy() {
|
||||||
if (!state.initialized) return;
|
if (!state.initialized) return;
|
||||||
ma_device_uninit(&state.devices[AUDIO_PLAYBACK]);
|
ma_device_uninit(&state.devices[AUDIO_PLAYBACK]);
|
||||||
ma_device_uninit(&state.devices[AUDIO_CAPTURE]);
|
ma_device_uninit(&state.devices[AUDIO_CAPTURE]);
|
||||||
ma_mutex_uninit(&state.locks[AUDIO_PLAYBACK]);
|
ma_mutex_uninit(&state.playbackLock);
|
||||||
ma_mutex_uninit(&state.locks[AUDIO_CAPTURE]);
|
|
||||||
ma_context_uninit(&state.context);
|
ma_context_uninit(&state.context);
|
||||||
if (state.spatializer) state.spatializer->destroy();
|
if (state.spatializer) state.spatializer->destroy();
|
||||||
arr_free(&state.converters);
|
arr_free(&state.converters);
|
||||||
|
@ -324,7 +321,7 @@ void lovrSourceDestroy(void* ref) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrSourcePlay(Source* source) {
|
void lovrSourcePlay(Source* source) {
|
||||||
ma_mutex_lock(&state.locks[AUDIO_PLAYBACK]);
|
ma_mutex_lock(&state.playbackLock);
|
||||||
|
|
||||||
source->playing = true;
|
source->playing = true;
|
||||||
|
|
||||||
|
@ -335,7 +332,7 @@ void lovrSourcePlay(Source* source) {
|
||||||
state.sources = source;
|
state.sources = source;
|
||||||
}
|
}
|
||||||
|
|
||||||
ma_mutex_unlock(&state.locks[AUDIO_PLAYBACK]);
|
ma_mutex_unlock(&state.playbackLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrSourcePause(Source* source) {
|
void lovrSourcePause(Source* source) {
|
||||||
|
@ -364,9 +361,9 @@ float lovrSourceGetVolume(Source* source) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrSourceSetVolume(Source* source, float volume) {
|
void lovrSourceSetVolume(Source* source, float volume) {
|
||||||
ma_mutex_lock(&state.locks[AUDIO_PLAYBACK]);
|
ma_mutex_lock(&state.playbackLock);
|
||||||
source->volume = volume;
|
source->volume = volume;
|
||||||
ma_mutex_unlock(&state.locks[AUDIO_PLAYBACK]);
|
ma_mutex_unlock(&state.playbackLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lovrSourceGetSpatial(Source *source) {
|
bool lovrSourceGetSpatial(Source *source) {
|
||||||
|
@ -374,11 +371,11 @@ bool lovrSourceGetSpatial(Source *source) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrSourceSetPose(Source *source, float position[4], float orientation[4]) {
|
void lovrSourceSetPose(Source *source, float position[4], float orientation[4]) {
|
||||||
ma_mutex_lock(&state.locks[AUDIO_PLAYBACK]);
|
ma_mutex_lock(&state.playbackLock);
|
||||||
mat4_identity(source->transform);
|
mat4_identity(source->transform);
|
||||||
mat4_translate(source->transform, position[0], position[1], position[2]);
|
mat4_translate(source->transform, position[0], position[1], position[2]);
|
||||||
mat4_rotate(source->transform, orientation[0], orientation[1], orientation[2], orientation[3]);
|
mat4_rotate(source->transform, orientation[0], orientation[1], orientation[2], orientation[3]);
|
||||||
ma_mutex_unlock(&state.locks[AUDIO_PLAYBACK]);
|
ma_mutex_unlock(&state.playbackLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t lovrSourceGetTime(Source* source) {
|
uint32_t lovrSourceGetTime(Source* source) {
|
||||||
|
@ -386,9 +383,9 @@ uint32_t lovrSourceGetTime(Source* source) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrSourceSetTime(Source* source, uint32_t time) {
|
void lovrSourceSetTime(Source* source, uint32_t time) {
|
||||||
ma_mutex_lock(&state.locks[AUDIO_PLAYBACK]);
|
ma_mutex_lock(&state.playbackLock);
|
||||||
source->offset = time;
|
source->offset = time;
|
||||||
ma_mutex_unlock(&state.locks[AUDIO_PLAYBACK]);
|
ma_mutex_unlock(&state.playbackLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
SoundData* lovrSourceGetSoundData(Source* source) {
|
SoundData* lovrSourceGetSoundData(Source* source) {
|
||||||
|
|
Loading…
Reference in New Issue