Score:1

สลับอ่างเสียง/เอาต์พุตด้วยแป้นพิมพ์ลัด

ธง et

ฉันต้องการสลับระหว่างตัวเก็บเสียง/เอาต์พุตบน Ubuntu โดยใช้ทางลัด ฉันต้องการให้โซลูชันทำงานกับอุปกรณ์จำนวนเท่าใดก็ได้และสลับอินพุตซิงก์ทั้งหมดในกระบวนการ

Score:1
ธง et

ฉันต้องการให้โซลูชันของฉันสำหรับทุกคนเพื่อใช้และปรับปรุง เนื่องจากฉันค่อนข้างผิดหวังที่ไม่มีโซลูชันใดเลย (เช่น อุปกรณ์ส่งสัญญาณเสียง สวิตช์เร็ว ?) ทำงานภายใต้เงื่อนไขทั้งหมด

ดังนั้นฉันจึงสร้างสคริปต์หลามด้วย 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)
        
หลัก()

ฉันได้เพิ่มการแจ้งเตือนบนเดสก์ท็อปที่เป็นทางเลือก แต่ไม่ได้ใช้ เนื่องจากไม่สามารถแสดงได้ชั่วคราวเท่านั้น (ฉันจะส่งการแจ้งเตือนบนเดสก์ท็อปแบบกำหนดเองได้อย่างไร)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา