mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	alsa-util: Perform format and rate detection before setting HW params
Perform detection of supported sample format and rates just after device is opened, before `snd_pcm_hw_params()` is called for the first time. This fixes a problem where device restricts available sample rates after HW params are set preventing sample rate detection (seen with UAC2 devices and kernel 6.1.9) Bug: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/1414 Bug: https://github.com/alsa-project/alsa-lib/issues/119 Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/782>
This commit is contained in:
		
							parent
							
								
									b8e2198d34
								
							
						
					
					
						commit
						aed52c507f
					
				
					 6 changed files with 46 additions and 12 deletions
				
			
		| 
						 | 
				
			
			@ -523,6 +523,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_auto(
 | 
			
		|||
        snd_pcm_uframes_t tsched_size,
 | 
			
		||||
        bool *use_mmap,
 | 
			
		||||
        bool *use_tsched,
 | 
			
		||||
        pa_sample_format_t **query_supported_formats,
 | 
			
		||||
        unsigned int **query_supported_rates,
 | 
			
		||||
        pa_alsa_profile_set *ps,
 | 
			
		||||
        pa_alsa_mapping **mapping) {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -561,6 +563,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_auto(
 | 
			
		|||
                tsched_size,
 | 
			
		||||
                use_mmap,
 | 
			
		||||
                use_tsched,
 | 
			
		||||
                query_supported_formats,
 | 
			
		||||
                query_supported_rates,
 | 
			
		||||
                m);
 | 
			
		||||
 | 
			
		||||
        if (pcm_handle) {
 | 
			
		||||
| 
						 | 
				
			
			@ -588,6 +592,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_auto(
 | 
			
		|||
                tsched_size,
 | 
			
		||||
                use_mmap,
 | 
			
		||||
                use_tsched,
 | 
			
		||||
                query_supported_formats,
 | 
			
		||||
                query_supported_rates,
 | 
			
		||||
                m);
 | 
			
		||||
 | 
			
		||||
        if (pcm_handle) {
 | 
			
		||||
| 
						 | 
				
			
			@ -612,6 +618,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_auto(
 | 
			
		|||
            tsched_size,
 | 
			
		||||
            use_mmap,
 | 
			
		||||
            use_tsched,
 | 
			
		||||
            query_supported_formats,
 | 
			
		||||
            query_supported_rates,
 | 
			
		||||
            false);
 | 
			
		||||
    pa_xfree(d);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -632,6 +640,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_mapping(
 | 
			
		|||
        snd_pcm_uframes_t tsched_size,
 | 
			
		||||
        bool *use_mmap,
 | 
			
		||||
        bool *use_tsched,
 | 
			
		||||
        pa_sample_format_t **query_supported_formats,
 | 
			
		||||
        unsigned int **query_supported_rates,
 | 
			
		||||
        pa_alsa_mapping *m) {
 | 
			
		||||
 | 
			
		||||
    snd_pcm_t *pcm_handle;
 | 
			
		||||
| 
						 | 
				
			
			@ -661,6 +671,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_mapping(
 | 
			
		|||
            tsched_size,
 | 
			
		||||
            use_mmap,
 | 
			
		||||
            use_tsched,
 | 
			
		||||
            query_supported_formats,
 | 
			
		||||
            query_supported_rates,
 | 
			
		||||
            pa_channel_map_valid(&m->channel_map) /* Query the channel count if we don't know what we want */);
 | 
			
		||||
 | 
			
		||||
    if (!pcm_handle)
 | 
			
		||||
| 
						 | 
				
			
			@ -684,6 +696,8 @@ snd_pcm_t *pa_alsa_open_by_device_string(
 | 
			
		|||
        snd_pcm_uframes_t tsched_size,
 | 
			
		||||
        bool *use_mmap,
 | 
			
		||||
        bool *use_tsched,
 | 
			
		||||
        pa_sample_format_t **query_supported_formats,
 | 
			
		||||
        unsigned int **query_supported_rates,
 | 
			
		||||
        bool require_exact_channel_number) {
 | 
			
		||||
 | 
			
		||||
    int err;
 | 
			
		||||
| 
						 | 
				
			
			@ -711,6 +725,12 @@ snd_pcm_t *pa_alsa_open_by_device_string(
 | 
			
		|||
 | 
			
		||||
        pa_log_debug("Managed to open %s", d);
 | 
			
		||||
 | 
			
		||||
        if (query_supported_formats)
 | 
			
		||||
            *query_supported_formats = pa_alsa_get_supported_formats(pcm_handle, ss->format);
 | 
			
		||||
 | 
			
		||||
        if (query_supported_rates)
 | 
			
		||||
            *query_supported_rates = pa_alsa_get_supported_rates(pcm_handle, ss->rate);
 | 
			
		||||
 | 
			
		||||
        if ((err = pa_alsa_set_hw_params(
 | 
			
		||||
                     pcm_handle,
 | 
			
		||||
                     ss,
 | 
			
		||||
| 
						 | 
				
			
			@ -784,6 +804,8 @@ snd_pcm_t *pa_alsa_open_by_template(
 | 
			
		|||
        snd_pcm_uframes_t tsched_size,
 | 
			
		||||
        bool *use_mmap,
 | 
			
		||||
        bool *use_tsched,
 | 
			
		||||
        pa_sample_format_t **query_supported_formats,
 | 
			
		||||
        unsigned int **query_supported_rates,
 | 
			
		||||
        bool require_exact_channel_number) {
 | 
			
		||||
 | 
			
		||||
    snd_pcm_t *pcm_handle;
 | 
			
		||||
| 
						 | 
				
			
			@ -805,6 +827,8 @@ snd_pcm_t *pa_alsa_open_by_template(
 | 
			
		|||
                tsched_size,
 | 
			
		||||
                use_mmap,
 | 
			
		||||
                use_tsched,
 | 
			
		||||
                query_supported_formats,
 | 
			
		||||
                query_supported_rates,
 | 
			
		||||
                require_exact_channel_number);
 | 
			
		||||
 | 
			
		||||
        pa_xfree(d);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue