mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	If we cannot open an ALSA device with SND_PCM_NO_AUTO_FORMAT retry without
This should fix compatibility with some sound cards which only support 24 bit packed samples.
This commit is contained in:
		
							parent
							
								
									03aa91dea7
								
							
						
					
					
						commit
						22c3373713
					
				
					 1 changed files with 24 additions and 4 deletions
				
			
		| 
						 | 
					@ -556,6 +556,7 @@ snd_pcm_t *pa_alsa_open_by_device_id(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0;; i += direction) {
 | 
					    for (i = 0;; i += direction) {
 | 
				
			||||||
        pa_sample_spec try_ss;
 | 
					        pa_sample_spec try_ss;
 | 
				
			||||||
 | 
					        pa_bool_t reformat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (i < 0) {
 | 
					        if (i < 0) {
 | 
				
			||||||
            pa_assert(direction == -1);
 | 
					            pa_assert(direction == -1);
 | 
				
			||||||
| 
						 | 
					@ -580,8 +581,9 @@ snd_pcm_t *pa_alsa_open_by_device_id(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        d = pa_sprintf_malloc("%s:%s", device_table[i].name, dev_id);
 | 
					        d = pa_sprintf_malloc("%s:%s", device_table[i].name, dev_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        reformat = FALSE;
 | 
				
			||||||
        for (;;) {
 | 
					        for (;;) {
 | 
				
			||||||
            pa_log_debug("Trying %s...", d);
 | 
					            pa_log_debug("Trying %s %s SND_PCM_NO_AUTO_FORMAT ...", d, reformat ? "without" : "with");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            /* We don't pass SND_PCM_NONBLOCK here, since alsa-lib <=
 | 
					            /* We don't pass SND_PCM_NONBLOCK here, since alsa-lib <=
 | 
				
			||||||
             * 1.0.17a would then ignore the SND_PCM_NO_xxx
 | 
					             * 1.0.17a would then ignore the SND_PCM_NO_xxx
 | 
				
			||||||
| 
						 | 
					@ -593,7 +595,7 @@ snd_pcm_t *pa_alsa_open_by_device_id(
 | 
				
			||||||
                                    /* SND_PCM_NONBLOCK| */
 | 
					                                    /* SND_PCM_NONBLOCK| */
 | 
				
			||||||
                                    SND_PCM_NO_AUTO_RESAMPLE|
 | 
					                                    SND_PCM_NO_AUTO_RESAMPLE|
 | 
				
			||||||
                                    SND_PCM_NO_AUTO_CHANNELS|
 | 
					                                    SND_PCM_NO_AUTO_CHANNELS|
 | 
				
			||||||
                                    SND_PCM_NO_AUTO_FORMAT)) < 0) {
 | 
					                                    (reformat ? 0 : SND_PCM_NO_AUTO_FORMAT))) < 0) {
 | 
				
			||||||
                pa_log_info("Couldn't open PCM device %s: %s", d, snd_strerror(err));
 | 
					                pa_log_info("Couldn't open PCM device %s: %s", d, snd_strerror(err));
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -604,6 +606,12 @@ snd_pcm_t *pa_alsa_open_by_device_id(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if ((err = pa_alsa_set_hw_params(pcm_handle, &try_ss, nfrags, period_size, tsched_size, use_mmap, use_tsched, TRUE)) < 0) {
 | 
					            if ((err = pa_alsa_set_hw_params(pcm_handle, &try_ss, nfrags, period_size, tsched_size, use_mmap, use_tsched, TRUE)) < 0) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (!reformat) {
 | 
				
			||||||
 | 
					                    reformat = TRUE;
 | 
				
			||||||
 | 
					                    snd_pcm_close(pcm_handle);
 | 
				
			||||||
 | 
					                    continue;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (!pa_startswith(d, "plug:") && !pa_startswith(d, "plughw:")) {
 | 
					                if (!pa_startswith(d, "plug:") && !pa_startswith(d, "plughw:")) {
 | 
				
			||||||
                    char *t;
 | 
					                    char *t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -611,6 +619,8 @@ snd_pcm_t *pa_alsa_open_by_device_id(
 | 
				
			||||||
                    pa_xfree(d);
 | 
					                    pa_xfree(d);
 | 
				
			||||||
                    d = t;
 | 
					                    d = t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    reformat = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    snd_pcm_close(pcm_handle);
 | 
					                    snd_pcm_close(pcm_handle);
 | 
				
			||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
| 
						 | 
					@ -655,6 +665,7 @@ snd_pcm_t *pa_alsa_open_by_device_string(
 | 
				
			||||||
    int err;
 | 
					    int err;
 | 
				
			||||||
    char *d;
 | 
					    char *d;
 | 
				
			||||||
    snd_pcm_t *pcm_handle;
 | 
					    snd_pcm_t *pcm_handle;
 | 
				
			||||||
 | 
					    pa_bool_t reformat = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_assert(device);
 | 
					    pa_assert(device);
 | 
				
			||||||
    pa_assert(dev);
 | 
					    pa_assert(dev);
 | 
				
			||||||
| 
						 | 
					@ -666,7 +677,7 @@ snd_pcm_t *pa_alsa_open_by_device_string(
 | 
				
			||||||
    d = pa_xstrdup(device);
 | 
					    d = pa_xstrdup(device);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (;;) {
 | 
					    for (;;) {
 | 
				
			||||||
        pa_log_debug("Trying %s...", d);
 | 
					        pa_log_debug("Trying %s %s SND_PCM_NO_AUTO_FORMAT ...", d, reformat ? "without" : "with");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* We don't pass SND_PCM_NONBLOCK here, since alsa-lib <=
 | 
					        /* We don't pass SND_PCM_NONBLOCK here, since alsa-lib <=
 | 
				
			||||||
         * 1.0.17a would then ignore the SND_PCM_NO_xxx flags. Instead
 | 
					         * 1.0.17a would then ignore the SND_PCM_NO_xxx flags. Instead
 | 
				
			||||||
| 
						 | 
					@ -678,7 +689,7 @@ snd_pcm_t *pa_alsa_open_by_device_string(
 | 
				
			||||||
                                /*SND_PCM_NONBLOCK|*/
 | 
					                                /*SND_PCM_NONBLOCK|*/
 | 
				
			||||||
                                SND_PCM_NO_AUTO_RESAMPLE|
 | 
					                                SND_PCM_NO_AUTO_RESAMPLE|
 | 
				
			||||||
                                SND_PCM_NO_AUTO_CHANNELS|
 | 
					                                SND_PCM_NO_AUTO_CHANNELS|
 | 
				
			||||||
                                SND_PCM_NO_AUTO_FORMAT)) < 0) {
 | 
					                                (reformat ? 0 : SND_PCM_NO_AUTO_FORMAT))) < 0) {
 | 
				
			||||||
            pa_log("Error opening PCM device %s: %s", d, snd_strerror(err));
 | 
					            pa_log("Error opening PCM device %s: %s", d, snd_strerror(err));
 | 
				
			||||||
            pa_xfree(d);
 | 
					            pa_xfree(d);
 | 
				
			||||||
            return NULL;
 | 
					            return NULL;
 | 
				
			||||||
| 
						 | 
					@ -686,6 +697,13 @@ snd_pcm_t *pa_alsa_open_by_device_string(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if ((err = pa_alsa_set_hw_params(pcm_handle, ss, nfrags, period_size, tsched_size, use_mmap, use_tsched, FALSE)) < 0) {
 | 
					        if ((err = pa_alsa_set_hw_params(pcm_handle, ss, nfrags, period_size, tsched_size, use_mmap, use_tsched, FALSE)) < 0) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!reformat) {
 | 
				
			||||||
 | 
					                reformat = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                snd_pcm_close(pcm_handle);
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            /* Hmm, some hw is very exotic, so we retry with plug, if without it didn't work */
 | 
					            /* Hmm, some hw is very exotic, so we retry with plug, if without it didn't work */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!pa_startswith(d, "plug:") && !pa_startswith(d, "plughw:")) {
 | 
					            if (!pa_startswith(d, "plug:") && !pa_startswith(d, "plughw:")) {
 | 
				
			||||||
| 
						 | 
					@ -695,6 +713,8 @@ snd_pcm_t *pa_alsa_open_by_device_string(
 | 
				
			||||||
                pa_xfree(d);
 | 
					                pa_xfree(d);
 | 
				
			||||||
                d = t;
 | 
					                d = t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                reformat = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                snd_pcm_close(pcm_handle);
 | 
					                snd_pcm_close(pcm_handle);
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue