ฉันต้องการให้โซลูชันของฉันสำหรับทุกคนเพื่อใช้และปรับปรุง เนื่องจากฉันค่อนข้างผิดหวังที่ไม่มีโซลูชันใดเลย (เช่น อุปกรณ์ส่งสัญญาณเสียง สวิตช์เร็ว ?) ทำงานภายใต้เงื่อนไขทั้งหมด
ดังนั้นฉันจึงสร้างสคริปต์หลามด้วย overkill เล็กน้อย (และ regexs ที่ไม่ดีและน่าเกลียด) เพื่อทำงาน:
#!/usr/bin/env python3
#สคริปต์เล็ก ๆ นี้สลับตัวเก็บเสียงบนอูบุนตู
# 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-outputs-of-an-audio-device-from-cli?noredirect=1&lq=1 มีประโยชน์
argparse นำเข้า
บันทึกการนำเข้า
นำเข้ากระบวนการย่อย
นำเข้าอีกครั้ง
#a การแสดงข้อมูลที่เกี่ยวข้องทั้งหมดของอ่างเก็บเสียงสำหรับสคริปต์นี้อย่างง่าย
อ่างล้างจาน:
def __init__(ตัวเอง, ดัชนี, ชื่อ, สถานะ):
self.index = ดัชนี
self.name = ชื่อ
self.state = รัฐ
หากระบุใน ["RUNNING", "IDLE"]:
self.selected = จริง
อื่น:
self.selected = เท็จ
def __str__(ตัวเอง):
กลับ 'sink\nindex: {self.index}\nname: {self.name}\nstate: {self.state}\nselected: {self.selected}\n'.format(self=self)
#a การแสดงข้อมูลที่เกี่ยวข้องทั้งหมดของอินพุตเสียงสำหรับสคริปต์นี้อย่างง่าย
คลาส Sink_Input:
def __init__(ตัวเอง, ดัชนี, application_name, sink, state):
self.index = ดัชนี
self.application_name = ชื่อแอปพลิเคชัน
self.sink = อ่างล้างจาน
self.state = รัฐ
def __str__(ตัวเอง):
กลับ 'sink-input\nindex: {self.index}\napplication_name: {self.application_name}\nsink: {self.sink}\nstate: {self.state}\n'.format(self=self)
def get_sinks():
pacmd_output = str(subprocess.check_output(["pacmd", "list-sinks"]))
sinks_raw = pacmd_output.split("ดัชนี:")
อ่างล้างจาน = []
สำหรับ sink_raw ใน sinks_raw[1:]:
ดัชนี = int(re.findall("^\d+", sink_raw)[0])
ชื่อ = re.findall("device.description = \"[^\"]*\"", sink_raw)[0][22:-1]
state = re.findall("สถานะ: [A-Z]*", sink_raw)[0][7:]
sink = Sink (ดัชนี, ชื่อ, สถานะ)
sinks.append(อ่างล้างจาน)
กลับอ่างล้างจาน
def get_sink_inputs():
sink_inputs = []
pacmd_output = str(subprocess.check_output(["pacmd", "list-sink-inputs"]))
inputs_raw = pacmd_output.split("ดัชนี:")
สำหรับ input_raw ใน inputs_raw[1:]:
ดัชนี = int(re.findall("^\d+", input_raw)[0])
sink = int(re.findall("sink: \d*", input_raw)[0][5:])
application_name = re.findall("application.name = \"[^\"]*\"", input_raw)[0][20:-1]
state = re.findall("สถานะ: [A-Z]*", input_raw)[0][7:]
sink_input = Sink_Input (ดัชนี, application_name, sink, สถานะ)
sink_inputs.append(sink_input)
กลับ sink_inputs
def switch_to_next_sink (จม, แจ้งเตือน):
current_sink = ไม่มี
next_sink = อ่างล้างจาน[0]
สำหรับฉันในช่วง (เลน (อ่างล้างจาน)):
ถ้าจม[i].selected:
current_sink = อ่างล้างจาน[i]
ถ้าฉัน == เลนส์ (จม) -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(["แจ้งเตือน-ส่ง", "เปลี่ยนอ่างเสียง", "อ่างเก็บเสียงใหม่คือ" + next_sink.name])
def หลัก ():
parser = argparse.ArgumentParser(description='''Switches to the 'next' audio sink บน Ubuntu และสามารถให้ข้อมูลเพิ่มเติมเกี่ยวกับ sound sink
หากไม่มีการส่งอาร์กิวเมนต์ จะมีการเลือกตัวรับเสียงถัดไปเท่านั้น
เพื่อความสะดวกในการใช้งาน ให้เพิ่ม /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='send notification to the desktop', action='store_true')
logLevelsRange = [logging.NOTSET, logging.DEBUG, logging.INFO, logging.WARN, logging.ERROR, logging.CRITICAL]
parser.add_argument('-l', '--logLevel', help='ระดับบันทึก', ประเภท=int, options=logLevelsRange,
ค่าเริ่มต้น=การเข้าสู่ระบบ.INFO)
หาเรื่อง = parser.parse_args()
ถ้า args.state:
อ่างล้างจาน = get_sinks()
สำหรับอ่างล้างจาน:
พิมพ์(จม)
sink_inputs = get_sink_inputs()
สำหรับ sink_input ใน sink_inputs:
พิมพ์ (sink_input)
อื่น:
อ่างล้างจาน = get_sinks()
switch_to_next_sink (อ่างล้างจาน args.notify)
หลัก()
ฉันได้เพิ่มการแจ้งเตือนบนเดสก์ท็อปที่เป็นทางเลือก แต่ไม่ได้ใช้ เนื่องจากไม่สามารถแสดงได้ชั่วคราวเท่านั้น (ฉันจะส่งการแจ้งเตือนบนเดสก์ท็อปแบบกำหนดเองได้อย่างไร)