@@ -164,9 +164,9 @@ pub struct Model {
164164 source_node_ids : Vec < NodeId > ,
165165 /// Index of active source device.
166166 active_source : Option < usize > ,
167- /// Device ID of active source device.
167+ /// Node ID of active source device.
168168 active_source_node : Option < u32 > ,
169- /// Device identifier of the default source.
169+ /// Node identifier of the default source.
170170 active_source_node_name : String ,
171171
172172 pub sink_volume_text : String ,
@@ -369,6 +369,80 @@ impl Model {
369369 numtoa:: BaseN :: < 10 > :: u32 ( volume) . as_str ( ) . to_owned ( ) ;
370370 }
371371
372+ pulse:: Event :: SourcePortChange ( name, availability) => {
373+ let Some ( node_id) = self . active_source_node else {
374+ continue ;
375+ } ;
376+
377+ let Some ( device_id) = self . device_ids . get ( node_id) . cloned ( ) else {
378+ continue ;
379+ } ;
380+
381+ let Some ( routes) = self . device_routes . get_mut ( device_id) else {
382+ continue ;
383+ } ;
384+
385+ let mut description = None ;
386+
387+ for route in routes {
388+ if route. name == name {
389+ route. available = availability;
390+ description = Some ( route. description . clone ( ) ) ;
391+ }
392+ }
393+
394+ if !matches ! ( availability, Availability :: No ) {
395+ if let Some ( description) = description {
396+ if let Some ( ( name, _) ) = self . route_name_get (
397+ & description,
398+ availability,
399+ device_id,
400+ ) {
401+ if let Some ( pos) = self . active_source {
402+ self . sources [ pos] = name;
403+ }
404+ }
405+ }
406+ }
407+ }
408+
409+ pulse:: Event :: SinkPortChange ( name, availability) => {
410+ let Some ( node_id) = self . active_sink_node else {
411+ continue ;
412+ } ;
413+
414+ let Some ( device_id) = self . device_ids . get ( node_id) . cloned ( ) else {
415+ continue ;
416+ } ;
417+
418+ let Some ( routes) = self . device_routes . get_mut ( device_id) else {
419+ continue ;
420+ } ;
421+
422+ let mut description = None ;
423+
424+ for route in routes {
425+ if route. name == name {
426+ route. available = availability;
427+ description = Some ( route. description . clone ( ) ) ;
428+ }
429+ }
430+
431+ if !matches ! ( availability, Availability :: No ) {
432+ if let Some ( description) = description {
433+ if let Some ( ( name, _) ) = self . route_name_get (
434+ & description,
435+ availability,
436+ device_id,
437+ ) {
438+ if let Some ( pos) = self . active_sink {
439+ self . sinks [ pos] = name;
440+ }
441+ }
442+ }
443+ }
444+ }
445+
372446 pulse:: Event :: DefaultSink ( node_name) => {
373447 if self . active_sink_node_name == node_name {
374448 continue ;
@@ -466,7 +540,7 @@ impl Model {
466540 } ) ;
467541 }
468542
469- pipewire:: Event :: ActiveRoute ( id, index , route) => {
543+ pipewire:: Event :: ActiveRoute ( id, _index , route) => {
470544 self . update_device_route ( & route, id) ;
471545 }
472546
@@ -540,7 +614,7 @@ impl Model {
540614 }
541615 }
542616 }
543- } ;
617+ }
544618
545619 self . node_descriptions . insert ( node. object_id , description) ;
546620
@@ -632,16 +706,30 @@ impl Model {
632706 return None ;
633707 }
634708
709+ let ( name, plugged) = self . route_name_get ( & route. description , route. available , device) ?;
710+
711+ if plugged {
712+ self . node_route_plugged . insert ( node, ( ) ) ;
713+ }
714+
715+ Some ( name)
716+ }
717+
718+ fn route_name_get (
719+ & self ,
720+ route_description : & str ,
721+ route_available : Availability ,
722+ device : DeviceId ,
723+ ) -> Option < ( String , bool ) > {
635724 let device_name = self . device_names . get ( device) ?;
636725
637- let port_name = if matches ! ( route . available , Availability :: No ) {
638- & self . unplugged_text
726+ let ( port_name, plugged ) = if matches ! ( route_available , Availability :: No ) {
727+ ( self . unplugged_text . as_str ( ) , false )
639728 } else {
640- self . node_route_plugged . insert ( node, ( ) ) ;
641- & route. description
729+ ( route_description, true )
642730 } ;
643731
644- Some ( [ & port_name, " - " , device_name] . concat ( ) )
732+ Some ( ( [ & port_name, " - " , device_name] . concat ( ) , plugged ) )
645733 }
646734
647735 fn update_device_route ( & mut self , route : & pipewire:: Route , id : DeviceId ) {
0 commit comments