From fe8a6e86127eab6ac284b921ccdf550e5ee99ba9 Mon Sep 17 00:00:00 2001 From: Nevyn Bengtsson Date: Wed, 25 Nov 2020 21:14:24 +0100 Subject: [PATCH] expose Source:{get|set}Spatial --- src/api/l_audio_source.c | 15 +++++++++++++++ src/modules/audio/audio.c | 26 +++++++++++++++++++++----- src/modules/audio/audio.h | 2 ++ 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/api/l_audio_source.c b/src/api/l_audio_source.c index 65f72715..7824637a 100644 --- a/src/api/l_audio_source.c +++ b/src/api/l_audio_source.c @@ -51,6 +51,19 @@ static int l_lovrSourceSetVolume(lua_State* L) { return 0; } +static int l_lovrSourceGetSpatial(lua_State* L) { + Source* source = luax_checktype(L, 1, Source); + lua_pushboolean(L, lovrSourceGetSpatial(source)); + return 1; +} + +static int l_lovrSourceSetSpatial(lua_State* L) { + Source* source = luax_checktype(L, 1, Source); + bool spatial = lua_toboolean(L, 2); + lovrSourceSetSpatial(source, spatial); + return 0; +} + static int l_lovrSourceGetDuration(lua_State* L) { Source* source = luax_checktype(L, 1, Source); TimeUnit units = luax_checkenum(L, 2, TimeUnit, "seconds"); @@ -104,6 +117,8 @@ const luaL_Reg lovrSource[] = { { "setLooping", l_lovrSourceSetLooping }, { "getVolume", l_lovrSourceGetVolume }, { "setVolume", l_lovrSourceSetVolume }, + { "getSpatial", l_lovrSourceGetSpatial }, + { "setSpatial", l_lovrSourceSetSpatial }, { "getDuration", l_lovrSourceGetDuration }, { "getTime", l_lovrSourceGetTime }, { "setTime", l_lovrSourceSetTime }, diff --git a/src/modules/audio/audio.c b/src/modules/audio/audio.c index 7362a633..ca89d43c 100644 --- a/src/modules/audio/audio.c +++ b/src/modules/audio/audio.c @@ -30,6 +30,7 @@ struct Source { bool playing; bool looping; bool spatial; + int output_channel_count; }; typedef struct { @@ -67,7 +68,7 @@ static bool mix(Source* source, float* output, uint32_t count) { // could skip min-ing with one of the buffers if you can guarantee that one is bigger/equal to the other (you can because their formats are known) uint64_t framesIn = source->sound->read(source->sound, source->offset, chunk, raw); - uint64_t framesOut = sizeof(aux) / (sizeof(float) * (2 >> source->spatial)); + uint64_t framesOut = sizeof(aux) / (sizeof(float) * source->output_channel_count); ma_data_converter_process_pcm_frames(source->converter, raw, &framesIn, aux, &framesOut); @@ -237,13 +238,19 @@ Source* lovrSourceCreate(SoundData* sound) { source->sound = sound; lovrRetain(source->sound); source->volume = 1.f; + lovrSourceSetSpatial(source, false); + return source; +} + +void _lovrSourceAssignConverter(Source *source) { + source->converter = NULL; for (size_t i = 0; i < state.converters.length; i++) { ma_data_converter* converter = &state.converters.data[i]; if (converter->config.formatIn != formats[source->sound->format]) continue; if (converter->config.sampleRateIn != source->sound->sampleRate) continue; if (converter->config.channelsIn != source->sound->channels) continue; - if (converter->config.channelsOut != (2 >> source->spatial)) continue; + if (converter->config.channelsOut != source->output_channel_count) continue; source->converter = converter; break; } @@ -253,7 +260,7 @@ Source* lovrSourceCreate(SoundData* sound) { config.formatIn = formats[source->sound->format]; config.formatOut = ma_format_f32; config.channelsIn = source->sound->channels; - config.channelsOut = 2 >> source->spatial; + config.channelsOut = source->output_channel_count; config.sampleRateIn = source->sound->sampleRate; config.sampleRateOut = SAMPLE_RATE; arr_expand(&state.converters, 1); @@ -261,8 +268,6 @@ Source* lovrSourceCreate(SoundData* sound) { lovrAssert(!ma_data_converter_init(&config, converter), "Problem creating Source data converter"); source->converter = converter; } - - return source; } void lovrSourceDestroy(void* ref) { @@ -316,6 +321,17 @@ void lovrSourceSetVolume(Source* source, float volume) { ma_mutex_unlock(&state.locks[AUDIO_PLAYBACK]); } +bool lovrSourceGetSpatial(Source *source) +{ + return source->spatial; +} +void lovrSourceSetSpatial(Source *source, bool spatial) +{ + source->spatial = spatial; + source->output_channel_count = source->spatial ? 1 : 2; + _lovrSourceAssignConverter(source); +} + uint32_t lovrSourceGetTime(Source* source) { return source->offset; } diff --git a/src/modules/audio/audio.h b/src/modules/audio/audio.h index 5908d90a..a44bd6a3 100644 --- a/src/modules/audio/audio.h +++ b/src/modules/audio/audio.h @@ -45,6 +45,8 @@ bool lovrSourceIsLooping(Source* source); void lovrSourceSetLooping(Source* source, bool isLooping); float lovrSourceGetVolume(Source* source); void lovrSourceSetVolume(Source* source, float volume); +bool lovrSourceGetSpatial(Source *source); +void lovrSourceSetSpatial(Source *source, bool spatial); uint32_t lovrSourceGetTime(Source* source); void lovrSourceSetTime(Source* source, uint32_t sample); struct SoundData* lovrSourceGetSoundData(Source* source);