@@ -248,6 +248,67 @@ def test_output_metadata_change_schedules_one_refresh(monkeypatch: pytest.Monkey
248248 assert len (scheduled_callbacks ) == 1
249249
250250
251+ def test_output_metadata_change_records_followed_sink_for_idle (monkeypatch : pytest .MonkeyPatch ) -> None :
252+ controller = routing .SystemWideEqController .__new__ (routing .SystemWideEqController )
253+ calls : list [object ] = []
254+
255+ class FakeBackend :
256+ def remember_default_metadata_change (self , key : str , value : str | None ) -> bool :
257+ calls .append (("remember" , key , value ))
258+ return True
259+
260+ controller .accept_output_events = True
261+ controller .follow_default_output = True
262+ controller .output_event_source_id = 0
263+ controller .pending_followed_output_sink = None
264+ controller .output_backend = FakeBackend ()
265+ scheduled_callbacks : list [object ] = []
266+
267+ monkeypatch .setattr (
268+ routing .GLib ,
269+ "idle_add" ,
270+ lambda callback : scheduled_callbacks .append (callback ) or 321 ,
271+ )
272+
273+ routing .SystemWideEqController .handle_output_metadata_changed (
274+ controller ,
275+ None ,
276+ 0 ,
277+ pw_backend .DEFAULT_CONFIGURED_AUDIO_SINK_KEY ,
278+ "Spa:String:JSON" ,
279+ '{"name":"hdmi"}' ,
280+ )
281+
282+ assert calls == [("remember" , pw_backend .DEFAULT_CONFIGURED_AUDIO_SINK_KEY , '{"name":"hdmi"}' )]
283+ assert controller .pending_followed_output_sink == "hdmi"
284+ assert controller .output_event_source_id == 321
285+ assert len (scheduled_callbacks ) == 1
286+
287+
288+ def test_output_event_idle_uses_pending_followed_sink_before_metadata_refresh () -> None :
289+ controller = routing .SystemWideEqController .__new__ (routing .SystemWideEqController )
290+ controller .accept_output_events = True
291+ controller .output_event_source_id = 123
292+ controller .pending_followed_output_sink = "hdmi"
293+ controller .follow_default_output = True
294+ controller .output_backend = FakeOutputBackend ([make_node (1 , "hdmi" )])
295+ controller ._output_preset_target_sink = "speakers"
296+ controller ._output_preset_target = pw_routes .PipeWireOutputPresetTarget ("speakers" , None , ("speakers" ,))
297+ calls : list [object ] = []
298+ controller .switch_output_sink = lambda sink_name , explicit : calls .append (("switch" , sink_name , explicit ))
299+ controller .refresh_followed_output_sink = lambda : calls .append ("refresh" )
300+ controller .refresh_output_route_param_monitor = lambda : calls .append ("route-monitor" )
301+ controller .outputs_changed_callback = lambda : calls .append ("outputs" )
302+
303+ assert routing .SystemWideEqController .on_output_event_idle (controller ) is False
304+
305+ assert controller .output_event_source_id == 0
306+ assert controller .pending_followed_output_sink is None
307+ assert controller ._output_preset_target_sink is None
308+ assert controller ._output_preset_target is None
309+ assert calls == [("switch" , "hdmi" , False ), "route-monitor" , "outputs" ]
310+
311+
251312def test_output_object_added_schedules_refresh_only_for_audio_sinks (monkeypatch : pytest .MonkeyPatch ) -> None :
252313 controller = routing .SystemWideEqController .__new__ (routing .SystemWideEqController )
253314 controller .accept_output_events = True
0 commit comments