diff -up allegro-4.2.2/src/unix/alsa9.c.pulse allegro-4.2.2/src/unix/alsa9.c --- allegro-4.2.2/src/unix/alsa9.c.pulse 2006-03-18 16:05:34.000000000 +0100 +++ allegro-4.2.2/src/unix/alsa9.c 2008-01-21 20:01:18.000000000 +0100 @@ -81,7 +81,7 @@ static double alsa_mixer_allegro_ratio = static snd_pcm_t *pcm_handle; static unsigned char *alsa_bufdata; -static int alsa_bits, alsa_signed, alsa_stereo; +static int alsa_bits, alsa_signed, alsa_stereo, alsa_format; static unsigned int alsa_rate; static unsigned int alsa_fragments; static int alsa_sample_size; @@ -292,7 +292,6 @@ static int alsa_init(int input, int voic { int ret = 0; char tmp1[128], tmp2[128]; - int format = 0; unsigned int numfrags = 0; snd_pcm_uframes_t fragsize; @@ -354,29 +353,14 @@ static int alsa_init(int input, int voic alsa_stereo = (_sound_stereo) ? 1 : 0; alsa_rate = (_sound_freq > 0) ? _sound_freq : 44100; alsa_signed = 0; + alsa_format = (alsa_bits == 16) ? SND_PCM_FORMAT_U16_NE : SND_PCM_FORMAT_U8; + alsa_sample_size = (alsa_bits / 8) * (alsa_stereo ? 2 : 1); - format = ((alsa_bits == 16) ? SND_PCM_FORMAT_U16_NE : SND_PCM_FORMAT_U8); - - switch (format) { - - case SND_PCM_FORMAT_U8: - alsa_bits = 8; - break; - - case SND_PCM_FORMAT_U16_NE: - if (sizeof(short) != 2) { - ustrzcpy(allegro_error, ALLEGRO_ERROR_SIZE, get_config_text("Unsupported sample format")); - goto Error; - } - break; - - default: - ustrzcpy(allegro_error, ALLEGRO_ERROR_SIZE, get_config_text("Unsupported sample format")); - goto Error; + if (alsa_format == SND_PCM_FORMAT_U16_NE && sizeof(short) != 2) { + ustrzcpy(allegro_error, ALLEGRO_ERROR_SIZE, get_config_text("Unsupported sample format")); + goto Error; } - alsa_sample_size = (alsa_bits / 8) * (alsa_stereo ? 2 : 1); - if (fragsize == 0) { unsigned int size = alsa_rate * ALSA_DEFAULT_BUFFER_MS / 1000 / numfrags; fragsize = 1; @@ -389,7 +373,12 @@ static int alsa_init(int input, int voic ALSA9_CHECK(snd_pcm_hw_params_any(pcm_handle, hwparams)); ALSA9_CHECK(snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)); - ALSA9_CHECK(snd_pcm_hw_params_set_format(pcm_handle, hwparams, format)); + if (snd_pcm_hw_params_set_format(pcm_handle, hwparams, alsa_format) < 0) { + /* Try again with signed samples (needed atleast for pulseaudio) */ + alsa_format = (alsa_bits == 16) ? SND_PCM_FORMAT_S16_NE : SND_PCM_FORMAT_S8; + alsa_signed = 1; + ALSA9_CHECK(snd_pcm_hw_params_set_format(pcm_handle, hwparams, alsa_format)); + } ALSA9_CHECK(snd_pcm_hw_params_set_channels(pcm_handle, hwparams, alsa_stereo + 1)); ALSA9_CHECK(snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams, &alsa_rate, NULL));