mirror of
https://github.com/libretro/RetroArch
synced 2025-04-16 08:43:10 +00:00
Refactor out audio conversion.
This commit is contained in:
parent
e91ebdac97
commit
5bcf601a40
24
audio/utils.h
Normal file
24
audio/utils.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef AUDIO_UTILS_H
|
||||||
|
#define AUDIO_UTILS_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
11
ssnes.c
11
ssnes.c
@ -36,6 +36,7 @@
|
|||||||
#include "strl.h"
|
#include "strl.h"
|
||||||
#include "screenshot.h"
|
#include "screenshot.h"
|
||||||
#include "cheats.h"
|
#include "cheats.h"
|
||||||
|
#include "audio/utils.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#ifdef _WIN32
|
#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)
|
static bool audio_flush(const int16_t *data, unsigned samples)
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i < samples; i++)
|
audio_convert_s16_to_float(g_extern.audio_data.data, data, samples);
|
||||||
g_extern.audio_data.data[i] = (float)data[i] / 0x8000;
|
|
||||||
|
|
||||||
const float *output_data = NULL;
|
const float *output_data = NULL;
|
||||||
unsigned output_frames = 0;
|
unsigned output_frames = 0;
|
||||||
@ -247,11 +247,8 @@ static bool audio_flush(const int16_t *data, unsigned samples)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i < output_frames * 2; i++)
|
audio_convert_float_to_s16(g_extern.audio_data.conv_outsamples,
|
||||||
{
|
output_data, output_frames * 2);
|
||||||
int32_t val = output_data[i] * 0x8000;
|
|
||||||
g_extern.audio_data.conv_outsamples[i] = (val > 0x7FFF) ? 0x7FFF : (val < -0x8000 ? -0x8000 : (int16_t)val);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (driver.audio->write(driver.audio_data, g_extern.audio_data.conv_outsamples, output_frames * sizeof(int16_t) * 2) < 0)
|
if (driver.audio->write(driver.audio_data, g_extern.audio_data.conv_outsamples, output_frames * sizeof(int16_t) * 2) < 0)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user