예제 #1
0
    def on_request_menu_items(self, manager_menu: ManagerDeviceMenu, device: Device) -> List[DeviceMenuItem]:
        audio_source = False
        for uuid in device['UUIDs']:
            if ServiceUUID(uuid).short_uuid in (AUDIO_SOURCE_SVCLASS_ID, AUDIO_SINK_SVCLASS_ID):
                audio_source = True
                break

        if device['Connected'] and audio_source:

            pa = PulseAudioUtils()
            if not pa.connected:
                self.deferred.append(device)
                return []

            item = create_menuitem(_("Audio Profile"), "audio-card")
            item.props.tooltip_text = _("Select audio profile for PulseAudio")

            if not device['Address'] in self.devices:
                self.query_pa(device, item)
            else:
                self.generate_menu(device, item)

        else:
            return []

        return [DeviceMenuItem(item, DeviceMenuItem.Group.ACTIONS, 300)]
예제 #2
0
    def on_load(self) -> None:
        self.devices: Dict[str, "CardInfo"] = {}

        self.deferred: List[Device] = []

        pa = PulseAudioUtils()
        pa.connect("event", self.on_pa_event)
        pa.connect("connected", self.on_pa_ready)
예제 #3
0
 def unload(self):
     dprint(self.id)
     pa = PulseAudioUtils()
     id = self.id
     pa.UnloadModule(self.id, lambda x: dprint("Unload %s result %s" %
                                               (id, x)))
     self.id = None
     self.refcount = 0
예제 #4
0
    def on_load(self, user_data):
        self.devices = {}
        self.item = None

        self.deferred = []

        pa = PulseAudioUtils()
        pa.connect("event", self.on_pa_event)
        pa.connect("connected", self.on_pa_ready)
예제 #5
0
    def on_load(self) -> None:
        self._devices: Dict[str, "CardInfo"] = {}
        self._device_menus: Dict[str, "MenuItem"] = {}

        self._menu = self.parent.Plugins.Menu

        pa = PulseAudioUtils()
        pa.connect("event", self.on_pa_event)
        pa.connect("connected", self.on_pa_ready)
예제 #6
0
    def query_pa(self, device: Device, item: Gtk.MenuItem) -> None:
        def list_cb(cards: Mapping[str, "CardInfo"]) -> None:
            for c in cards.values():
                if c["proplist"]["device.string"] == device['Address']:
                    self.devices[device['Address']] = c
                    self.generate_menu(device, item)
                    return

        pa = PulseAudioUtils()
        pa.list_cards(list_cb)
예제 #7
0
    def query_pa(self, device):
        def list_cb(cards):
            for c in cards.values():
                if c["proplist"]["device.string"] == device.Address:
                    self.devices[device.Address] = c
                    self.generate_menu(device)
                    return

        pa = PulseAudioUtils()
        pa.ListCards(list_cb)
예제 #8
0
    def on_activate_profile(self, device: "Device", profile: "CardProfileInfo") -> None:
        pa = PulseAudioUtils()

        c = self._devices[device['Address']]

        def on_result(res: int) -> None:
            if not res:
                logging.error("Failed to change profile to %s" % profile["name"])

        pa.set_card_profile(c["index"], profile["name"], on_result)
예제 #9
0
    def query_pa(self, device: "Device") -> None:
        def list_cb(cards: Mapping[str, "CardInfo"]) -> None:
            for c in cards.values():
                if c["proplist"]["device.string"] == device['Address']:
                    self._devices[device['Address']] = c
                    self.add_device_profile_menu(device)
                    return

        pa = PulseAudioUtils()
        pa.list_cards(list_cb)
예제 #10
0
    def on_selection_changed(self, item: Gtk.CheckMenuItem, device: Device, profile: str) -> None:
        if item.get_active():
            pa = PulseAudioUtils()

            c = self.devices[device['Address']]

            def on_result(res: int) -> None:
                if not res:
                    MessageArea.show_message(_("Failed to change profile to %s" % profile))

            pa.set_card_profile(c["index"], profile, on_result)
예제 #11
0
    def on_selection_changed(self, item, device, profile):
        if item.get_active():
            pa = PulseAudioUtils()

            c = self.devices[device['Address']]

            def on_result(res):
                if not res:
                    MessageArea.show_message(_("Failed to change profile to %s" % profile))

            pa.SetCardProfile(c["index"], profile, on_result)
예제 #12
0
    def load(self, args, cb):
        if self.id != None:
            self.unload()

        def load_cb(res):
            if res > 0:
                self.refcount = 1
                self.id = res
                if cb:
                    cb(res)
                self.emit("loaded")
            else:
                self.refcount = 0
                self.id = None

        PulseAudioUtils().LoadModule("module-bluetooth-device", args, load_cb)
예제 #13
0
    def request_device_profile_menu(self, device: "Device") -> None:
        audio_source = False
        for uuid in device['UUIDs']:
            if ServiceUUID(uuid).short_uuid in (AUDIO_SOURCE_SVCLASS_ID, AUDIO_SINK_SVCLASS_ID):
                audio_source = True
                break

        if device['Connected'] and audio_source:
            pa = PulseAudioUtils()
            if not pa.connected:
                return

            if not device['Address'] in self._devices:
                self.query_pa(device)
            else:
                self.add_device_profile_menu(device)
예제 #14
0
    def on_load(self, applet):
        self.signals = SignalTracker()
        if not self.get_option("checked"):
            self.set_option("checked", True)
            if not have("pactl"):
                applet.Plugins.SetConfig("PulseAudio", False)
                return

        self.bus = dbus.SystemBus()

        self.connected_sources = []
        self.connected_sinks = []
        self.connected_hs = []

        self.loaded_modules = {}

        self.pulse_utils = PulseAudioUtils()
        version = self.pulse_utils.GetVersion()
        dprint("PulseAudio version:", version)

        if version[0] == 0:
            if tuple(version) < (0, 9, 15):
                raise Exception(
                    "PulseAudio too old, required 0.9.15 or higher")

        self.signals.Handle("dbus",
                            self.bus,
                            self.on_sink_prop_change,
                            "PropertyChanged",
                            "org.bluez.AudioSink",
                            path_keyword="device")

        self.signals.Handle("dbus",
                            self.bus,
                            self.on_source_prop_change,
                            "PropertyChanged",
                            "org.bluez.AudioSource",
                            path_keyword="device")

        self.signals.Handle("dbus",
                            self.bus,
                            self.on_hsp_prop_change,
                            "PropertyChanged",
                            "org.bluez.Headset",
                            path_keyword="device")

        self.signals.Handle(self.pulse_utils, "event", self.on_pulse_event)
예제 #15
0
    def on_request_menu_items(self, manager_menu, device):

        if self.is_connected(device):
            pa = PulseAudioUtils()
            if not pa.connected:
                self.deferred.append(device)
                return

            self.item = create_menuitem(_("Audio Profile"), get_icon("audio-card", 16))
            self.item.props.tooltip_text = _("Select audio profile for PulseAudio")

            if not device.Address in self.devices:
                self.query_pa(device)
            else:
                self.generate_menu(device)

        else:
            return

        return [(self.item, 300)]