[Pkg-allegro-maintainers] Bug#462810: liballegro4.2: alsa plugin doesn't work with many sound cards -- the patch

Peter De Wachter pdewacht at gmail.com
Sun Jan 27 22:01:33 UTC 2008


Ok, I didn't attach the patch. Sorry.
-------------- next part --------------
Index: allegro4.2-4.2.2/src/unix/alsa9.c
===================================================================
--- allegro4.2-4.2.2.orig/src/unix/alsa9.c	2008-01-27 16:01:06.000000000 +0100
+++ allegro4.2-4.2.2/src/unix/alsa9.c	2008-01-27 16:22:56.000000000 +0100
@@ -353,26 +353,47 @@
    alsa_bits = (_sound_bits == 8) ? 8 : 16;
    alsa_stereo = (_sound_stereo) ? 1 : 0;
    alsa_rate = (_sound_freq > 0) ? _sound_freq : 44100;
-   alsa_signed = 0;
 
-   format = ((alsa_bits == 16) ? SND_PCM_FORMAT_U16_NE : SND_PCM_FORMAT_U8);
-
-   switch (format) {
+   snd_pcm_hw_params_malloc(&hwparams);
+   ALSA9_CHECK(snd_pcm_hw_params_any(pcm_handle, hwparams));
 
-      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_bits == 8) {
+      if (snd_pcm_hw_params_test_format(pcm_handle, hwparams, SND_PCM_FORMAT_U8) == 0) {
+         format = SND_PCM_FORMAT_U8;
+         alsa_signed = 0;
+      }
+      else if (snd_pcm_hw_params_test_format(pcm_handle, hwparams, SND_PCM_FORMAT_S8) == 0) {
+         format = SND_PCM_FORMAT_S8;
+         alsa_signed = 1;
+      }
+      else {
+         ustrzcpy(allegro_error, ALLEGRO_ERROR_SIZE, get_config_text("Unsupported sample format"));
+         goto Error;
+      }
+   }
+   else if (alsa_bits == 16)
+   {
+      if (sizeof(short) != 2)
+      {
+         ustrzcpy(allegro_error, ALLEGRO_ERROR_SIZE, get_config_text("Unsupported sample format"));
+         goto Error;
+      }
+
+      if (snd_pcm_hw_params_test_format(pcm_handle, hwparams, SND_PCM_FORMAT_U16_NE) == 0)
+      {
+         format = SND_PCM_FORMAT_U16_NE;
+         alsa_signed = 0;
+      }
+      else if (snd_pcm_hw_params_test_format(pcm_handle, hwparams, SND_PCM_FORMAT_S16_NE) == 0)
+      {
+         format = SND_PCM_FORMAT_S16_NE;
+         alsa_signed = 1;
+      }
+      else
+      {
+         ustrzcpy(allegro_error, ALLEGRO_ERROR_SIZE, get_config_text("Unsupported sample format"));
+         goto Error;
+      }
    }
 
    alsa_sample_size = (alsa_bits / 8) * (alsa_stereo ? 2 : 1);
@@ -384,10 +405,6 @@
 	 fragsize <<= 1;
    }
 
-   snd_pcm_hw_params_malloc(&hwparams);
-   snd_pcm_sw_params_malloc(&swparams);
-
-   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));
    ALSA9_CHECK(snd_pcm_hw_params_set_channels(pcm_handle, hwparams, alsa_stereo + 1));
@@ -403,6 +420,7 @@
 
    TRACE (PREFIX_I "alsa_bufsize = %ld, alsa_fragments = %d\n", alsa_bufsize, alsa_fragments);
 
+   snd_pcm_sw_params_malloc(&swparams);
    ALSA9_CHECK(snd_pcm_sw_params_current(pcm_handle, swparams));
    ALSA9_CHECK(snd_pcm_sw_params_set_start_threshold(pcm_handle, swparams, alsa_bufsize));
    ALSA9_CHECK(snd_pcm_sw_params_set_avail_min(pcm_handle, swparams, fragsize));


More information about the Pkg-allegro-maintainers mailing list