diff --git a/audio/utils.h b/audio/utils.h new file mode 100644 index 0000000000..b5340e30f0 --- /dev/null +++ b/audio/utils.h @@ -0,0 +1,24 @@ +#ifndef AUDIO_UTILS_H +#define AUDIO_UTILS_H + +#include + +static inline void audio_convert_s16_to_float(float *out, + const int16_t *in, unsigned samples) +{ + for (unsigned i = 0; i < samples; i++) + out[i] = (float)in[i] / 0x8000; +} + +static inline void audio_convert_float_to_s16(int16_t *out, + const float *in, unsigned samples) +{ + for (unsigned i = 0; i < samples; i++) + { + int32_t val = in[i] * 0x8000; + out[i] = (val > 0x7FFF) ? 0x7FFF : (val < -0x8000 ? -0x8000 : (int16_t)val); + } +} + +#endif + diff --git a/ssnes.c b/ssnes.c index 39e345514c..6c62d73f0d 100644 --- a/ssnes.c +++ b/ssnes.c @@ -36,6 +36,7 @@ #include "strl.h" #include "screenshot.h" #include "cheats.h" +#include "audio/utils.h" #include #ifdef _WIN32 @@ -187,8 +188,7 @@ static void video_frame(const uint16_t *data, unsigned width, unsigned height) static bool audio_flush(const int16_t *data, unsigned samples) { - for (unsigned i = 0; i < samples; i++) - g_extern.audio_data.data[i] = (float)data[i] / 0x8000; + audio_convert_s16_to_float(g_extern.audio_data.data, data, samples); const float *output_data = NULL; unsigned output_frames = 0; @@ -247,11 +247,8 @@ static bool audio_flush(const int16_t *data, unsigned samples) } else { - for (unsigned i = 0; i < output_frames * 2; i++) - { - int32_t val = output_data[i] * 0x8000; - g_extern.audio_data.conv_outsamples[i] = (val > 0x7FFF) ? 0x7FFF : (val < -0x8000 ? -0x8000 : (int16_t)val); - } + audio_convert_float_to_s16(g_extern.audio_data.conv_outsamples, + output_data, output_frames * 2); if (driver.audio->write(driver.audio_data, g_extern.audio_data.conv_outsamples, output_frames * sizeof(int16_t) * 2) < 0) {