我正在嘗試為很棒的 wm 創建一個小部件來控制和監視音量。
在 ALSA 和 PulseAudio 中取得和設定揚聲器音量很容易,但要取得實際訊號強度呢?
我的意思是您聽到的實際噪音,例如,如果沒有聲音播放,則噪音為零。就像您看到的擴大機(VU 監視器)一樣。
通常我可以設法找到一個文件,/proc/
其中包含有關正在使用的內容的一些值(例如,/proc/stat
CPU 使用情況),但這次情況並非如此。
目標實際上是顯示即時音訊顯示(最好是單獨的 L/R 通道),類似於擴大機的增益 VU 監視器。
請注意,問題不在於如何為很棒的 wm 進行編程,而是如何獲得可用於執行此操作的值
答案1
我認為這不是微不足道的,這個問題可能應該轉移到 stackoverflow。
據我所知,沒有sysfs
或procfs
沒有介面可以存取最終的(ALSA)[音訊]混音;甚至不能保證軟體中存在這樣的事情,因為某些硬體(例如emu10k1
)會執行自己的混合,儘管我承認不知道它是如何運作的。
還有同一張卡上的多個音訊輸出(數位(如 SPDIF)、類比、耳機或揚聲器等)和多個揚聲器配置的問題,更不用說多張卡的可能性了。
最好的選擇大概是嘗試利用任何使用的 ALSA 設備(大概hw0
如果混合發生在像pulseaudio這樣的聲音子系統中,或者dmix
沒有使用聲音子系統),因為這是音頻到達硬體之前的“最後一步” 。話雖這麼說,我不知道這是否可能;可能不會。
如果您可以假設使用者正在使用pulseaudio之類的東西,那麼任務就會變得容易得多。軟體如帕武控制已經實現了這一點,如下所示回放選項卡,以及預最終混合階段輸出裝置。從技術上講,這涉及獲取音訊串流本身,然後將其轉換為頻域(例如,透過執行斯托夫)以便以某種方式將其視覺化;為此,您真正需要的是存取音訊串流,pulseaudio 可以透過接收器提供此功能(就像 pavucontrol 所做的那樣)。
我幫不了什麼忙,不是嗎?如果我是你,只是想在我的桌面上使用這個,並且如果我使用pulseaudio(我自己碰巧使用),我的第一個目標將是嘗試獲得最終的混合流。那些傢伙在這個線程似乎已經找到了一種僅使用pactl
和來做到這一點的雄辯方法pacmd
,這也可以很容易地以程式設計方式完成。
當您掌握了音訊串流時,只剩下數學了:-)