summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSolomon Peachy <pizza@shaftnet.org>2024-12-09 20:32:36 -0500
committerSolomon Peachy <pizza@shaftnet.org>2024-12-09 20:34:21 -0500
commitb3dac27aa6c68819c0daabf9b806344207db41c7 (patch)
tree804a5f8ea21179bc452ad8950cb893e301855ed3
parentda8bde0860decc6a5d1d1f39ae3b3c6a4cf1044b (diff)
downloadrockbox-b3dac27aa6.tar.gz
rockbox-b3dac27aa6.zip
SDL: Convert to SDL2's AudioDevice() API
This lets us _demand_ a sane audio configuration that doesn't require us to convert sample formats. (Windows always seems to want us to supply 32-bit floating point) Change-Id: I19113363b33ae99be33afceec50a319c182e9b29
-rw-r--r--firmware/target/hosted/sdl/pcm-sdl.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/firmware/target/hosted/sdl/pcm-sdl.c b/firmware/target/hosted/sdl/pcm-sdl.c
index dec12af2f1..83c983559b 100644
--- a/firmware/target/hosted/sdl/pcm-sdl.c
+++ b/firmware/target/hosted/sdl/pcm-sdl.c
@@ -57,6 +57,7 @@ static const void *pcm_data;
static size_t pcm_data_size;
static size_t pcm_sample_bytes;
static size_t pcm_channel_bytes;
+static SDL_AudioDeviceID pcm_devid = 0;
static struct pcm_udata
{
@@ -97,9 +98,10 @@ static void pcm_dma_apply_settings_nolock(void)
(void (SDLCALL *)(void *userdata,
Uint8 *stream, int len))sdl_audio_callback;
wanted_spec.userdata = &udata;
- SDL_CloseAudio();
+ if (pcm_devid)
+ SDL_CloseAudioDevice(pcm_devid);
/* Open the audio device and start playing sound! */
- if(SDL_OpenAudio(&wanted_spec, &obtained) < 0) {
+ if((pcm_devid = SDL_OpenAudioDevice(NULL, 0, &wanted_spec, &obtained, 0)) == 0) {
DEBUGF("Unable to open audio: %s\n", SDL_GetError());
return;
}
@@ -115,6 +117,10 @@ static void pcm_dma_apply_settings_nolock(void)
case AUDIO_S16MSB:
pcm_channel_bytes = 2;
break;
+ case AUDIO_F32MSB:
+ case AUDIO_F32LSB:
+ pcm_channel_bytes = 4;
+ break;
default:
DEBUGF("Unknown sample format obtained: %u\n",
(unsigned)obtained.format);
@@ -143,12 +149,12 @@ void pcm_play_dma_start(const void *addr, size_t size)
pcm_data = addr;
pcm_data_size = size;
- SDL_PauseAudio(0);
+ SDL_PauseAudioDevice(pcm_devid, 0);
}
void pcm_play_dma_stop(void)
{
- SDL_PauseAudio(1);
+ SDL_PauseAudioDevice(pcm_devid, 1);
#ifdef DEBUG
if (udata.debug != NULL) {
fclose(udata.debug);
@@ -205,8 +211,7 @@ static void write_to_soundcard(struct pcm_udata *udata)
}
#endif
free(cvt.buf);
- }
- else {
+ } else {
/* Convert is bad, so do silence */
Uint32 num = wr*obtained.channels;
udata->num_in = rd;