2016-12-22 83 views
3

如果您還沒有聽說過SoundSwitch,它的一個Windows應用程序允許您使用鍵盤快捷鍵切換聲音輸出/輸入設備。我爲Linux做了一個類似的應用程序,但我無法正常工作。大多數應用程序都做完了,如果你想看到完整的代碼,它在這裏:https://github.com/boskobs/sound-Source-Switch-4-Linux 貝婁是部分負責應用的變化:手動更改linux上的聲音輸出設備

os.system("pacmd set-default-sink " + str(nextindex)) 
    output = subprocess.getoutput("pacmd list-sink-inputs") 
    for item in output.split("\n"): 
     if "index:" in item: 
     inputindex = item.strip().replace("index: ","") 
     os.system("pacmd move-sink-input " + str(inputindex) + " " + str(nextindex)) 

它改變默認的聲音輸出設備,並轉移該設備的所有當前應用程序。當我退出應用程序並切換輸出設備時會出現問題。下次我啓動該應用程序時,它輸出聲音的設備是在切換之前處於活動狀態的設備。我怎樣才能使新的默認輸出設備真正作爲默認工作?

回答

1

根據the FreeDesktop.org wiki以及this answer on AskUbuntu和相關帖子,無論何時啓動一個新的數據流(發音程序),PulseAudio都會將其附加到它上次消失的同一個接收器(輸出設備)。這聽起來像你看到的效果。您關閉正在使用設備A的程序,啓動您的源切換應用程序並將所有內容切換到設備B,然後再次打開該程序,然後PulseAudio再次將其設置爲使用設備A.

可以通過添加行

load-module module-stream-restore restore_device=false 

/etc/pulse/default.pa和重新啓動的PulseAudio禁用的PulseAudio的這種行爲。對於將要使用您的應用來管理其聲音設備的用戶來說,這可能是一個合理的選擇;你可以將它加入到你的安裝過程中,但是當你忙於系統配置文件時,你應該非常小心。

或者,您可以刪除存儲在文件$HOME/.pulse/*stream-volumes*.gdbm中的流還原數據庫。從那時起,PulseAudio會認爲每個音頻流都是全新的,並將其分配給後備音頻設備,這是您使用set-default-sink設置的內容。 (這也需要重新啓動PA。)

+0

向defaults.pa添加「load-module module-stream-restore restore_device = false」 修復了我的問題,但它使聲音設置GUI無響應(通過它切換它們不做任何事情)。我試圖找到一個沒有妥協的解決方案。無論如何,謝謝:) –

+0

嗯,這是不幸的。我確實在某處讀過(也許在AU上,現在我忘記了),如果你試圖通過多個GUI應用程序來控制PulseAudio,他們會以奇怪的方式衝突,所以也許類似的事情正在發生......除非你說修改默認值.pa甚至沒有安裝你的應用程序borks的設置GUI? –

+0

我的應用程序只是一個腳本,可以顯示一個gtk窗口給定一個參數,用於配置要在哪個索引之間切換,或者可以直接從gui切換。 所以,是的,我的應用程序與修改defaults.pa後系統gui無法正常工作無關。 將「restore_device = false」添加到具有「load-module module-stream-restore」的行中可以解決我的問題,但不幸的是,它用於管理聲音設備的系統GUI。 @大衛Z –

0

噹噹前選擇的設備與其中一個應用正在流入的設備不同時,將應用修復而不是切換。

# Checking for changes 
    output = subprocess.getoutput("pacmd list-sinks").split("\n") 
    for item in range(0, len(output)-1): 
     if "* index: " in output[item]: 
     currentindexname = output[item+1].replace("name: <", "").strip()[:-1] 
     break 
    output = subprocess.getoutput("pacmd list-sink-inputs") 
    for item in output.split("\n"): 
     if "sink:" in item: 
     if currentindexname != item.split("<")[1].split(">")[0]: 
      for item in output.split("\n"): 
       if "index:" in item: 
        inputindex = item.strip().replace("index: ","") 
        os.system("pacmd move-sink-input " + str(inputindex) + " " + str(currentindex)) 
      os.system('notify-send "Source" "Fixed"') 
      exit() 

它並不理想,但它完成了工作。

相關問題