import { bind, Binding } from "astal"; import { Gtk } from "astal/gtk4"; import AstalWp from "gi://AstalWp"; const wp = AstalWp.get_default()!; const AudioModule = () => { const setVolumeSpeaker = (volume: number) => { wp.defaultSpeaker.set_volume(volume / 100); }; const setVolumeMicrophone = (volume: number) => { wp.defaultMicrophone.set_volume(volume / 100); }; const speakerSelector = SinkSelectPopover(AstalWp.MediaClass.AUDIO_SPEAKER); const micSelector = SinkSelectPopover(AstalWp.MediaClass.AUDIO_MICROPHONE); return ( 100 * v)} max={100} min={0} step={1} hexpand vexpand onChangeValue={self => setVolumeSpeaker(self.value)} > 100 * v, )} max={100} min={0} step={1} hexpand vexpand onChangeValue={self => setVolumeMicrophone(self.value)} > ); }; const SinkPicker = (type: AstalWp.MediaClass) => { const devices = bind(wp, "endpoints"); return ( {devices.as(d => { return d.map(device => { if (device.get_media_class() !== type) { return ; } return ( ); }); })} ); }; const SinkSelectPopover = (type: AstalWp.MediaClass) => { const popover = new Gtk.Popover(); popover.set_child(SinkPicker(type)); return popover; }; export default { AudioModule, };