@@ -767,8 +767,9 @@ async def async_set_audio_input(
767767 )
768768 return False
769769
770- layers_key = "screenLayers" if isinstance (layout_data .get ("screenLayers" ), list ) else "layers"
771- raw_layers = layout_data .get (layers_key )
770+ raw_layers = layout_data .get ("screenLayers" )
771+ if not isinstance (raw_layers , list ):
772+ raw_layers = layout_data .get ("layers" )
772773 if not isinstance (raw_layers , list ):
773774 self ._debug_log (
774775 "Audio input set aborted: no layers in detailList host=%s keys=%s" ,
@@ -777,41 +778,80 @@ async def async_set_audio_input(
777778 )
778779 return False
779780
780- updated_layers : list [dict [str , Any ]] = []
781+ crafted_layers : list [dict [str , Any ]] = []
781782 selected_found = False
782783 for layer in raw_layers :
783784 if not isinstance (layer , dict ):
784785 continue
785- layer_copy = dict (layer )
786- layer_id = self ._coerce_audio_id (layer_copy .get ("layerId" ))
787- audio_status = layer_copy .get ("audioStatus" )
786+
787+ layer_id = self ._coerce_audio_id (layer .get ("layerId" ))
788+ if layer_id is None :
789+ continue
790+
791+ general = layer .get ("general" )
792+ if not isinstance (general , dict ):
793+ general = {}
794+
795+ source = layer .get ("source" )
796+ if not isinstance (source , dict ):
797+ source = {}
798+
799+ window = layer .get ("window" )
800+ if not isinstance (window , dict ):
801+ window = {}
802+
803+ audio_status = layer .get ("audioStatus" )
788804 if not isinstance (audio_status , dict ):
789805 audio_status = {}
806+
790807 updated_audio_status = dict (audio_status )
791808 if layer_id == selected_layer_id :
792809 updated_audio_status ["isOpen" ] = 1
793810 selected_found = True
794811 else :
795812 updated_audio_status ["isOpen" ] = 0
796- layer_copy ["audioStatus" ] = updated_audio_status
797- updated_layers .append (layer_copy )
813+
814+ crafted_layer = {
815+ "layerId" : int (layer_id ),
816+ "general" : {
817+ "layerId" : int (self ._coerce_audio_id (general .get ("layerId" )) or layer_id ),
818+ "zorder" : int (general .get ("zorder" , 0 )),
819+ "name" : str (general .get ("name" , f"Layer { layer_id } " )),
820+ "isBackground" : bool (general .get ("isBackground" , False )),
821+ "isFreeze" : bool (general .get ("isFreeze" , False )),
822+ "flipType" : int (general .get ("flipType" , 0 )),
823+ },
824+ "lock" : int (layer .get ("lock" , 0 )),
825+ "source" : {
826+ "sourceType" : int (source .get ("sourceType" , 0 )),
827+ "inputId" : int (source .get ("inputId" , 0 )),
828+ "cropId" : int (source .get ("cropId" , 255 )),
829+ "interfaceType" : int (source .get ("interfaceType" , 0 )),
830+ "connectCapacity" : int (source .get ("connectCapacity" , 0 )),
831+ "name" : str (source .get ("name" , "" )),
832+ },
833+ "window" : {
834+ "width" : int (window .get ("width" , 0 )),
835+ "height" : int (window .get ("height" , 0 )),
836+ "x" : int (window .get ("x" , 0 )),
837+ "y" : int (window .get ("y" , 0 )),
838+ },
839+ "audioStatus" : updated_audio_status ,
840+ }
841+ crafted_layers .append (crafted_layer )
798842
799843 if not selected_found :
800844 self ._debug_log (
801845 "Audio input set aborted: selected layer not found selected_layer_id=%s available=%s" ,
802846 selected_layer_id ,
803- [self ._coerce_audio_id (layer .get ("layerId" )) for layer in updated_layers ],
847+ [self ._coerce_audio_id (layer .get ("layerId" )) for layer in crafted_layers ],
804848 )
805849 return False
806850
807851 write_payload = {
808- ** detail_payload ,
809- ** {
810- key : value
811- for key , value in layout_data .items ()
812- if key not in ("screenLayers" , "layers" )
813- },
814- layers_key : updated_layers ,
852+ "deviceId" : int (device_id ),
853+ "screenId" : int (screen_id ),
854+ "layers" : crafted_layers ,
815855 }
816856
817857 self ._debug_log (
0 commit comments