mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	sink, source: Call set_mute() from mute_changed()
This refactoring reduces duplication, as mute_changed() used to do the same things as set_mute(). Other benefits are improved logging (set_mute() logs the mute change, mute_changed() used to not do that) and the soft mute state is kept up to date, because set_mute() sends the SET_MUTE message to the IO thread. The set_mute_in_progress flag is an extra precaution for preventing recursion in case a sink/source implementation's set_mute() callback causes mute_changed() to be called. Currently there are no such implementations, but I think that would be a valid thing to do, so some day there might be such implementation.
This commit is contained in:
		
							parent
							
								
									c93cfc1ca6
								
							
						
					
					
						commit
						dbd2a8f851
					
				
					 4 changed files with 28 additions and 14 deletions
				
			
		| 
						 | 
					@ -2207,8 +2207,11 @@ void pa_sink_set_mute(pa_sink *s, bool mute, bool save) {
 | 
				
			||||||
    s->muted = mute;
 | 
					    s->muted = mute;
 | 
				
			||||||
    s->save_muted = save;
 | 
					    s->save_muted = save;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(s->flags & PA_SINK_DEFERRED_VOLUME) && s->set_mute)
 | 
					    if (!(s->flags & PA_SINK_DEFERRED_VOLUME) && s->set_mute) {
 | 
				
			||||||
 | 
					        s->set_mute_in_progress = true;
 | 
				
			||||||
        s->set_mute(s);
 | 
					        s->set_mute(s);
 | 
				
			||||||
 | 
					        s->set_mute_in_progress = false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!PA_SINK_IS_LINKED(s->state))
 | 
					    if (!PA_SINK_IS_LINKED(s->state))
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
| 
						 | 
					@ -2252,15 +2255,17 @@ void pa_sink_mute_changed(pa_sink *s, bool new_muted) {
 | 
				
			||||||
    pa_assert_ctl_context();
 | 
					    pa_assert_ctl_context();
 | 
				
			||||||
    pa_assert(PA_SINK_IS_LINKED(s->state));
 | 
					    pa_assert(PA_SINK_IS_LINKED(s->state));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* The sink implementor may call this if the volume changed to make sure everyone is notified */
 | 
					    if (s->set_mute_in_progress)
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (s->muted == new_muted)
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    s->muted = new_muted;
 | 
					    /* pa_sink_set_mute() does this same check, so this may appear redundant,
 | 
				
			||||||
    s->save_muted = true;
 | 
					     * but we must have this here also, because the save parameter of
 | 
				
			||||||
 | 
					     * pa_sink_set_mute() would otherwise have unintended side effects (saving
 | 
				
			||||||
 | 
					     * the mute state when it shouldn't be saved). */
 | 
				
			||||||
 | 
					    if (new_muted == s->muted)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
 | 
					    pa_sink_set_mute(s, new_muted, true);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Called from main thread */
 | 
					/* Called from main thread */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -118,6 +118,8 @@ struct pa_sink {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    unsigned priority;
 | 
					    unsigned priority;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool set_mute_in_progress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Called when the main loop requests a state change. Called from
 | 
					    /* Called when the main loop requests a state change. Called from
 | 
				
			||||||
     * main loop context. If returns -1 the state change will be
 | 
					     * main loop context. If returns -1 the state change will be
 | 
				
			||||||
     * inhibited */
 | 
					     * inhibited */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1800,8 +1800,11 @@ void pa_source_set_mute(pa_source *s, bool mute, bool save) {
 | 
				
			||||||
    s->muted = mute;
 | 
					    s->muted = mute;
 | 
				
			||||||
    s->save_muted = save;
 | 
					    s->save_muted = save;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(s->flags & PA_SOURCE_DEFERRED_VOLUME) && s->set_mute)
 | 
					    if (!(s->flags & PA_SOURCE_DEFERRED_VOLUME) && s->set_mute) {
 | 
				
			||||||
 | 
					        s->set_mute_in_progress = true;
 | 
				
			||||||
        s->set_mute(s);
 | 
					        s->set_mute(s);
 | 
				
			||||||
 | 
					        s->set_mute_in_progress = false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!PA_SOURCE_IS_LINKED(s->state))
 | 
					    if (!PA_SOURCE_IS_LINKED(s->state))
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
| 
						 | 
					@ -1845,15 +1848,17 @@ void pa_source_mute_changed(pa_source *s, bool new_muted) {
 | 
				
			||||||
    pa_assert_ctl_context();
 | 
					    pa_assert_ctl_context();
 | 
				
			||||||
    pa_assert(PA_SOURCE_IS_LINKED(s->state));
 | 
					    pa_assert(PA_SOURCE_IS_LINKED(s->state));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* The source implementor may call this if the mute state changed to make sure everyone is notified */
 | 
					    if (s->set_mute_in_progress)
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (s->muted == new_muted)
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    s->muted = new_muted;
 | 
					    /* pa_source_set_mute() does this same check, so this may appear redundant,
 | 
				
			||||||
    s->save_muted = true;
 | 
					     * but we must have this here also, because the save parameter of
 | 
				
			||||||
 | 
					     * pa_source_set_mute() would otherwise have unintended side effects
 | 
				
			||||||
 | 
					     * (saving the mute state when it shouldn't be saved). */
 | 
				
			||||||
 | 
					    if (new_muted == s->muted)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
 | 
					    pa_source_set_mute(s, new_muted, true);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Called from main thread */
 | 
					/* Called from main thread */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -118,6 +118,8 @@ struct pa_source {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    unsigned priority;
 | 
					    unsigned priority;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool set_mute_in_progress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Called when the main loop requests a state change. Called from
 | 
					    /* Called when the main loop requests a state change. Called from
 | 
				
			||||||
     * main loop context. If returns -1 the state change will be
 | 
					     * main loop context. If returns -1 the state change will be
 | 
				
			||||||
     * inhibited */
 | 
					     * inhibited */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue