mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	alsa: adjust ucm sink/source priority according to ports priority
On the machines with the ucm used, the different input/output devices often have different pcm stream, so they often belong to different sources and sinks, this is greatly different from the design of all devices connected to a codec (without ucm). For example, on a machine with ucm2 used: the internal dmic is on source#0 the external mic is on the source#1 the internal spk is on sink#0 the external headphone is on sink#1 Users expect that after plugging the external device, it will become the active device automatically. The switch-on-port-available could make it to be the active_port on its own source/sink, but can't make source/sink to be default_source/sink since the sources/sinks belong to the same profile (HiFi usually). If we adjust the source/sink priority according to ucm ports priority, the device_port.c could handle the default_source/sink changing then. Usually we set higher priority for external device than internal device in the ucm. In order to bring the lowest side effect on the source/sink priority, I change the ucm priority to units digit first, then add it to the original priority. Signed-off-by: Hui Wang <hui.wang@canonical.com>
This commit is contained in:
		
							parent
							
								
									0e691b9664
								
							
						
					
					
						commit
						c8653c13fa
					
				
					 2 changed files with 26 additions and 0 deletions
				
			
		| 
						 | 
					@ -2598,6 +2598,19 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
 | 
				
			||||||
        goto fail;
 | 
					        goto fail;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (u->ucm_context) {
 | 
				
			||||||
 | 
					        pa_device_port *port;
 | 
				
			||||||
 | 
					        void *state;
 | 
				
			||||||
 | 
					        unsigned h_prio = 0;
 | 
				
			||||||
 | 
					        PA_HASHMAP_FOREACH(port, u->sink->ports, state) {
 | 
				
			||||||
 | 
					            if (!h_prio || port->priority > h_prio)
 | 
				
			||||||
 | 
					                h_prio = port->priority;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* ucm ports prioriy is 100, 200, ..., 900, change it to units digit */
 | 
				
			||||||
 | 
					        h_prio = h_prio / 100;
 | 
				
			||||||
 | 
					        u->sink->priority += h_prio;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pa_modargs_get_value_u32(ma, "deferred_volume_safety_margin",
 | 
					    if (pa_modargs_get_value_u32(ma, "deferred_volume_safety_margin",
 | 
				
			||||||
                                 &u->sink->thread_info.volume_change_safety_margin) < 0) {
 | 
					                                 &u->sink->thread_info.volume_change_safety_margin) < 0) {
 | 
				
			||||||
        pa_log("Failed to parse deferred_volume_safety_margin parameter");
 | 
					        pa_log("Failed to parse deferred_volume_safety_margin parameter");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2284,6 +2284,19 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
 | 
				
			||||||
        goto fail;
 | 
					        goto fail;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (u->ucm_context) {
 | 
				
			||||||
 | 
					        pa_device_port *port;
 | 
				
			||||||
 | 
					        void *state;
 | 
				
			||||||
 | 
					        unsigned h_prio = 0;
 | 
				
			||||||
 | 
					        PA_HASHMAP_FOREACH(port, u->source->ports, state) {
 | 
				
			||||||
 | 
					            if (!h_prio || port->priority > h_prio)
 | 
				
			||||||
 | 
					                h_prio = port->priority;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* ucm ports prioriy is 100, 200, ..., 900, change it to units digit */
 | 
				
			||||||
 | 
					        h_prio = h_prio / 100;
 | 
				
			||||||
 | 
					        u->source->priority += h_prio;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pa_modargs_get_value_u32(ma, "deferred_volume_safety_margin",
 | 
					    if (pa_modargs_get_value_u32(ma, "deferred_volume_safety_margin",
 | 
				
			||||||
                                 &u->source->thread_info.volume_change_safety_margin) < 0) {
 | 
					                                 &u->source->thread_info.volume_change_safety_margin) < 0) {
 | 
				
			||||||
        pa_log("Failed to parse deferred_volume_safety_margin parameter");
 | 
					        pa_log("Failed to parse deferred_volume_safety_margin parameter");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue