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