Я хочу предоставить свое решение для использования и улучшения, так как меня очень расстроило то, что ни одно из решений (т. Устройство вывода звука, быстрый переключатель?) работал в любых условиях.
Таким образом, я создал скрипт 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)
главный()
Я добавил дополнительные уведомления на рабочий стол, но не использую их, так как они не могут отображаться только временно. (Как я могу отправить пользовательское уведомление на рабочий стол?)