示例#1
0
    def __init__(self, card_index, control, main_instance):
        """ Constructor """
        try:
            self.main = main_instance
            self.card_index = card_index
            self.control = control
            self.mixerlist = []

            self.mixer = alsamixer.Mixer()
            self.mixer.attach("hw:%d" % self.card_index)
            self.mixer.load()

            self.open()
            self._has_capture()
            self._check_version()

        except Exception, err:
            log.warn("can't open %s control for card %s, \
                    trying to select first available mixer channel\n" %
                     (self.control, self.get_card_name()))
            try:
                control = self.get_mixers(self.card_index)[0]
                self.main.control = control
                self.reopen(self.card_index, control)
                self._has_capture()
                self._check_version()
            except Exception, err:
                log.error("can't open first available control \
                        for card %s\nerror: %s" %
                          (self.get_card_name(), str(err)))
                sys.exit(1)
示例#2
0
def get_volume():
    vol = None
    switch = False
    if nwg_panel.common.dependencies["pyalsa"]:
        mixer = alsamixer.Mixer()
        mixer.attach()
        mixer.load()

        element = alsamixer.Element(mixer, "Master")
        max_vol = element.get_volume_range()[1]
        vol = int(round(element.get_volume() * 100 / max_vol, 0))
        switch = element.get_switch()
        del mixer
    else:
        result = cmd2string(nwg_panel.common.commands["get_volume_alt"])
        if result:
            lines = result.splitlines()
            for line in lines:
                if "Front Left:" in line:
                    try:
                        vol = int(line.split()[4][1:-2])
                    except:
                        pass
                    switch = "on" in line.split()[5]
                    break

    return vol, switch
示例#3
0
def get_volume(alt_cmd):
    vol = None
    switch = False
    if py_alsa:
        mixer = alsamixer.Mixer()
        mixer.attach()
        mixer.load()

        element = alsamixer.Element(mixer, "Master")
        max_vol = element.get_volume_range()[1]
        vol = int(round(element.get_volume() * 100 / max_vol, 0))
        switch = element.get_switch()
        del mixer
    else:
        result = cmd2string(alt_cmd)
        if result:
            lines = result.splitlines()
            for line in lines:
                if "Front Left:" in line:
                    try:
                        vol = int(line.split()[4][1:-2])
                    except:
                        pass
                    switch = "on" in line.split()[5]
                    break

    return vol, switch
示例#4
0
    def __init__(self):
	self.audiocfg = vc.get_audiocfg()
        # Get the mixer
	self.mixer = amixer.Mixer()
	self.mixer.attach()
	self.mixer.load()
	self._get_mixer_elements()
	self.mute_all()
示例#5
0
def set_volume(percent, alt_cmd):
    if py_alsa:
        mixer = alsamixer.Mixer()
        mixer.attach()
        mixer.load()

        element = alsamixer.Element(mixer, "Master")
        max_vol = element.get_volume_range()[1]
        element.set_volume_all(int(percent * max_vol / 100))
        del mixer
    else:
        cmd = "{} {}% /dev/null 2>&1".format(alt_cmd, percent)
        subprocess.call(cmd, shell=True)
示例#6
0
 def get_mixers(self, card_index=0):
     """ Returns mixers list """
     mixers = []
     try:
         mixer = alsamixer.Mixer()
         mixer.attach("hw:%d" % card_index)
         mixer.load()
         for mix in mixer.list():
             m = alsamixer.Element(mixer=mixer, name=mix[0], index=0)
             if m.has_volume():
                 if mix[0] not in mixers:
                     mixers.append(mix[0])
     except Exception, err:
         log.exception(str(err))
示例#7
0
    def init_alsa(self):
        self.mixer = alsamixer.Mixer()
        self.mixer.attach()
        self.mixer.load()
        self.element = alsamixer.Element(self.mixer, VOL_CTRL)
        self.element.set_callback(self.on_element_changed)
        self.volume_range = self.element.get_volume_range()

        # Setup mixer changes event handling
        self.poller = select.poll()
        self.mixer.register_poll(self.poller)
        self.handle = True
        gobject.timeout_add(POLL_TIMEOUT,
                            self.poll)
        self.poller.poll()
示例#8
0
def set_volume(slider):
    percent = slider.get_value()
    if nwg_panel.common.dependencies["pyalsa"]:
        mixer = alsamixer.Mixer()
        mixer.attach()
        mixer.load()

        element = alsamixer.Element(mixer, "Master")
        max_vol = element.get_volume_range()[1]
        element.set_volume_all(int(percent * max_vol / 100))
        del mixer
    else:
        cmd = "{} {}% /dev/null 2>&1".format(
            nwg_panel.common.commands["set_volume_alt"], percent)
        subprocess.call(cmd, shell=True)
示例#9
0
    def init_mixers(self):
        '''Initialize handling of ALSA mixer devices.'''
        self._mixer = {}
        if alsamixer is None:
            self.log.warn('no ALSA mixer support')
            return

        self.log.debug('start init mixers')

        for mixer_name, mixer in self.mixers.items():
            m = alsamixer.Mixer()
            try:
                m.attach(mixer_name)
            except RuntimeError:
                raise MissingALSADevice(mixer_name)

            m.load()
            for element_name, element in mixer.items():
                try:
                    e = alsamixer.Element(m, element_name)
                except IOError:
                    raise MissingALSADevice('%s.%s' % (
                        mixer_name, element_name))

                # create output device controls
                for channel, control in element.get('output', {}).items():
                    tag = '%s.%s.%s.out' % (
                        mixer_name,
                        element_name,
                        channel)

                    self.init_mixer_device(tag, m, e, channel, control)

                # create capture device controls
                for channel, control in element.get('capture', {}).items():
                    tag = '%s.%s.%s.in' % (
                        mixer_name,
                        element_name,
                        channel)

                    self.init_mixer_device(tag, m, e, channel, control,
                                           capture=True)

        self.log.debug('done init mixers')
示例#10
0
def set_volume(slider):
    percent = slider.get_value()
    if nwg_panel.common.dependencies["pyalsa"]:
        mixer = alsamixer.Mixer()
        mixer.attach()
        mixer.load()
        try:
            element = alsamixer.Element(mixer,
                                        nwg_panel.common.defaults["master"])
            max_vol = element.get_volume_range()[1]
            element.set_volume_all(int(percent * max_vol / 100))
        except Exception as e:
            eprint(e)
        del mixer
    else:
        c = "amixer sset {}".format(nwg_panel.common.defaults["master"])
        cmd = "{} {}% /dev/null 2>&1".format(c, percent)
        try:
            subprocess.call(cmd.split())
        except Exception as e:
            eprint(e)
示例#11
0
def get_volume():
    vol = 0
    switch = False
    if nwg_panel.common.dependencies["pyalsa"]:
        mixer = alsamixer.Mixer()
        mixer.attach()
        mixer.load()
        # https://github.com/nwg-piotr/nwg-panel/issues/24
        try:
            element = alsamixer.Element(mixer,
                                        nwg_panel.common.defaults["master"])
            max_vol = element.get_volume_range()[1]
            vol = int(round(element.get_volume() * 100 / max_vol, 0))
            switch = element.get_switch()
        except:
            try:
                element = alsamixer.Element(mixer, mixer.list()[0][0])
                # Overwrite user-defined name if caused error
                print("'{}' didn't work, using {} instead".format(
                    nwg_panel.common.defaults["master"], element.name))
                nwg_panel.common.defaults["master"] = element.name

                max_vol = element.get_volume_range()[1]
                vol = int(round(element.get_volume() * 100 / max_vol, 0))
                switch = element.get_switch()
            except:
                return 0, False

        del mixer

    elif nwg_panel.common.dependencies["amixer"]:
        # Same issue as above
        result = cmd2string("amixer sget {}".format(
            nwg_panel.common.defaults["master"]))
        if not result:
            try:
                nwg_panel.common.defaults["master"] = get_scontrol()
                result = cmd2string("amixer sget {}".format(
                    nwg_panel.common.defaults["master"]))
            except:
                result = None

        if result:
            lines = result.splitlines()
            for line in lines:
                if line.strip().startswith("Mono:"):
                    try:
                        vol = int(line.split()[3][1:-2])
                        try:
                            switch = "on" in line.split()[5]
                        except:
                            switch = "on" in line.split()[4]
                        break
                    except:
                        pass

                if line.strip().startswith("Front Left:"):
                    try:
                        vol = int(line.split()[4][1:-2])
                        switch = "on" in line.split()[5]
                        break
                    except:
                        pass

    return vol, switch