Рейтинг:1

Переключение аудиоприемника/выхода с помощью сочетания клавиш

флаг et

Я хочу переключаться между звуковыми приемниками/выходами в Ubuntu с помощью ярлыка. Я хочу, чтобы решение работало с любым количеством устройств и переключало все стоковые входы в процессе.

Рейтинг:1
флаг et

Я хочу предоставить свое решение для использования и улучшения, так как меня очень расстроило то, что ни одно из решений (т. Устройство вывода звука, быстрый переключатель?) работал в любых условиях.

Таким образом, я создал скрипт Python с небольшим излишеством (и плохими и уродливыми регулярными выражениями), чтобы выполнить эту работу:

#!/usr/bin/env python3
# этот небольшой скрипт переключает звуковой приемник в Ubuntu
# https://askubuntu.com/questions/156895/how-to-switch-sound-output-with-key-shortcut/1203350#1203350 и https://askubuntu.com/questions/1011806/how-do-i -switch-the-audio-output-of-an-audio-device-from-cli?noredirect=1&lq=1 были полезны
импортировать аргументы
журнал импорта
подпроцесс импорта
импортировать повторно

# простое представление всей соответствующей информации об аудиоприемнике для этого скрипта
Класс Раковина:
    def __init__(я, индекс, имя, состояние):
        self.index = индекс
        self.name = имя
        self.state = состояние
        если состояние в ["RUNNING", "IDLE"]:
            self.selected = Истина
        еще:
            self.selected = Ложь

    защита __str__(я):
        return 'sink\nindex: {self.index}\nname: {self.name}\nstate: {self.state}\nselected: {self.selected}\n'.format(self=self)

# простое представление всей соответствующей информации об аудиовходе для этого скрипта
класс Sink_Input:
    def __init__(я, индекс, имя_приложения, приемник, состояние):
        self.index = индекс
        self.имя_приложения = имя_приложения
        self.sink = раковина
        self.state = состояние

    защита __str__(я):
        return 'sink-input\nindex: {self.index}\napplication_name: {self.application_name}\nsink: {self.sink}\nstate: {self.state}\n'.format(self=self)

        
защита get_sinks():
    pacmd_output = str(subprocess.check_output(["pacmd", "list-sinks"]))
    sins_raw = pacmd_output.split («индекс:»)
    раковины = []
    для sink_raw в sins_raw[1:]:
        index = int(re.findall("^\d+", sin_raw)[0])
        name = re.findall("device.description = \"[^\"]*\"", sin_raw)[0][22:-1]
        состояние = re.findall("состояние: [A-Z]*", sin_raw)[0][7:]
        раковина = раковина (индекс, имя, состояние)
        раковины.append(раковина)
    возвратные раковины

защита get_sink_inputs():
    сток_входы = []
    pacmd_output = str(subprocess.check_output(["pacmd", "list-sink-inputs"]))
    inputs_raw = pacmd_output.split («индекс:»)
    для input_raw в inputs_raw[1:]:
        index = int(re.findall("^\d+", input_raw)[0])
        раковина = int(re.findall("раковина: \d*", input_raw)[0][5:])
        application_name = re.findall("application.name = \"[^\"]*\"", input_raw)[0][20:-1]
        состояние = re.findall("состояние: [A-Z]*", input_raw)[0][7:]
        приемник_вход = приемник_ввод (индекс, имя_приложения, приемник, состояние)
        sink_inputs.append (sink_input)
    вернуть приемник_входов

def switch_to_next_sink (приемники, уведомление):
    current_sink = Нет
    next_sink = раковины[0]
    для i в диапазоне (len (раковины)):
        если тонет[i].selected:
            current_sink = раковины[i]
            если я == len(sinks) -1:
                next_sink = раковины[0]
            еще:
                next_sink = раковины[i+1]
    #переключить сток по умолчанию на следующий сток
    subprocess.call(["pacmd", "set-default-sink", str(next_sink.index)])
    # переместить все приложения в следующую раковину
    для sink_input в get_sink_inputs():
        subprocess.call(["pacmd", "move-sink-input", str(sink_input.index), str(next_sink.index)])
    если уведомить:
        subprocess.call(["notify-send", "Измененный приемник звука", "новый приемник звука" + next_sink.name])

деф основной():
    parser = argparse.ArgumentParser(description='''Переключает на «следующий» звуковой приемник в Ubuntu и может предоставить дополнительную информацию о звуковых приемниках.
    Если аргументы не переданы, выбирается только следующий аудиоприемник.
    Для простоты использования добавьте /usr/bin/python3 /home/sebi/misc/switch_sound_sink.py в качестве сочетания клавиш, т.е. Super+Shift+S (Super+O почему-то не работает) ''')
    parser.add_argument('-s', '--state',
                        help='сводные выходные данные pacmd list-sinks и list-sink-inputs', action='store_true')
    parser.add_argument('-n', '--notify', help='отправить уведомление на рабочий стол', action='store_true')
    
    logLevelsRange = [logging.NOTSET, logging.DEBUG, logging.INFO, logging.WARN, logging.ERROR, logging.CRITICAL]
    parser.add_argument('-l', '--logLevel', help='уровень журнала', type=int, selections=logLevelsRange,
                        по умолчанию = logging.INFO)

    аргументы = парсер.parse_args()

    если аргументы.состояние:
        раковины = get_sinks()
        для раковины в раковинах:
            печать (раковина)
        приемник_входов = get_sink_inputs()
        для приемника_ввода в приемнике_входов:
            печать (sink_input)
    еще:
        раковины = get_sinks()
        switch_to_next_sink (раковины, args.notify)
        
главный()

Я добавил дополнительные уведомления на рабочий стол, но не использую их, так как они не могут отображаться только временно. (Как я могу отправить пользовательское уведомление на рабочий стол?)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.