From 1f47fa92432a51625e87e45229534b47ff40897c Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 24 Oct 2009 03:20:47 -0700 Subject: [PATCH] Try 32-bit float before 16-bit, and stereo before mono --- Alc/alsa.c | 61 +++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/Alc/alsa.c b/Alc/alsa.c index a4c23df9..c239c61a 100644 --- a/Alc/alsa.c +++ b/Alc/alsa.c @@ -557,26 +557,38 @@ static ALCboolean alsa_reset_playback(ALCdevice *device) { switch(aluChannelsFromFormat(device->Format)) { - case 1: device->Format = AL_FORMAT_MONO16; break; - case 2: device->Format = AL_FORMAT_STEREO16; break; - case 4: device->Format = AL_FORMAT_QUAD16; break; - case 6: device->Format = AL_FORMAT_51CHN16; break; - case 7: device->Format = AL_FORMAT_61CHN16; break; - case 8: device->Format = AL_FORMAT_71CHN16; break; + case 1: device->Format = AL_FORMAT_MONO_FLOAT32; break; + case 2: device->Format = AL_FORMAT_STEREO_FLOAT32; break; + case 4: device->Format = AL_FORMAT_QUAD32; break; + case 6: device->Format = AL_FORMAT_51CHN32; break; + case 7: device->Format = AL_FORMAT_61CHN32; break; + case 8: device->Format = AL_FORMAT_71CHN32; break; } - if((i=psnd_pcm_hw_params_set_format(data->pcmHandle, p, SND_PCM_FORMAT_S16)) < 0) + if((i=psnd_pcm_hw_params_set_format(data->pcmHandle, p, SND_PCM_FORMAT_FLOAT)) < 0) { switch(aluChannelsFromFormat(device->Format)) { - case 1: device->Format = AL_FORMAT_MONO8; break; - case 2: device->Format = AL_FORMAT_STEREO8; break; - case 4: device->Format = AL_FORMAT_QUAD8; break; - case 6: device->Format = AL_FORMAT_51CHN8; break; - case 7: device->Format = AL_FORMAT_61CHN8; break; - case 8: device->Format = AL_FORMAT_71CHN8; break; + case 1: device->Format = AL_FORMAT_MONO16; break; + case 2: device->Format = AL_FORMAT_STEREO16; break; + case 4: device->Format = AL_FORMAT_QUAD16; break; + case 6: device->Format = AL_FORMAT_51CHN16; break; + case 7: device->Format = AL_FORMAT_61CHN16; break; + case 8: device->Format = AL_FORMAT_71CHN16; break; + } + if((i=psnd_pcm_hw_params_set_format(data->pcmHandle, p, SND_PCM_FORMAT_S16)) < 0) + { + switch(aluChannelsFromFormat(device->Format)) + { + case 1: device->Format = AL_FORMAT_MONO8; break; + case 2: device->Format = AL_FORMAT_STEREO8; break; + case 4: device->Format = AL_FORMAT_QUAD8; break; + case 6: device->Format = AL_FORMAT_51CHN8; break; + case 7: device->Format = AL_FORMAT_61CHN8; break; + case 8: device->Format = AL_FORMAT_71CHN8; break; + } + if((i=psnd_pcm_hw_params_set_format(data->pcmHandle, p, SND_PCM_FORMAT_U8)) < 0) + err = "set format"; } - if((i=psnd_pcm_hw_params_set_format(data->pcmHandle, p, SND_PCM_FORMAT_U8)) < 0) - err = "set format"; } } /* set channels (implicitly sets frame bits) */ @@ -584,12 +596,21 @@ static ALCboolean alsa_reset_playback(ALCdevice *device) { switch(aluBytesFromFormat(device->Format)) { - case 1: device->Format = AL_FORMAT_MONO8; break; - case 2: device->Format = AL_FORMAT_MONO16; break; - case 4: device->Format = AL_FORMAT_MONO_FLOAT32; break; + case 1: device->Format = AL_FORMAT_STEREO8; break; + case 2: device->Format = AL_FORMAT_STEREO16; break; + case 4: device->Format = AL_FORMAT_STEREO_FLOAT32; break; + } + if((i=psnd_pcm_hw_params_set_channels(data->pcmHandle, p, 2)) < 0) + { + switch(aluBytesFromFormat(device->Format)) + { + case 1: device->Format = AL_FORMAT_MONO8; break; + case 2: device->Format = AL_FORMAT_MONO16; break; + case 4: device->Format = AL_FORMAT_MONO_FLOAT32; break; + } + if((i=psnd_pcm_hw_params_set_channels(data->pcmHandle, p, 1)) < 0) + err = "set channels"; } - if((i=psnd_pcm_hw_params_set_channels(data->pcmHandle, p, 1)) < 0) - err = "set channels"; } /* set periods (implicitly constrains period/buffer parameters) */ if(err == NULL && (i=psnd_pcm_hw_params_set_periods_near(data->pcmHandle, p, &periods, NULL)) < 0) -- 2.11.4.GIT