Alsa 將揚聲器聲音複製到 HDMI

Alsa 將揚聲器聲音複製到 HDMI

我正在尋求幫助或建議來在我的 Linux 機器上設定音訊。

我想將從揚聲器發出的音訊複製到 HDMI 輸出。

請查看我的設定:

aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: HDMI [HDA ATI HDMI], device 3: Generic Digital [Generic Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 0: ALC662 rev3 Analog [ALC662 rev3 Analog]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 1: ALC662 rev3 Digital [ALC662 rev3 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

# aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
hdmi:CARD=HDMI,DEV=0
    HDA ATI HDMI, Generic Digital
    HDMI Audio Output
sysdefault:CARD=Generic
    HD-Audio Generic, ALC662 rev3 Analog
    Default Audio Device
front:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    Front speakers
surround21:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    4.0 Surround output to Front and Rear speakers
surround41:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Digital
    IEC958 (S/PDIF) Digital Audio Output

聲音設定檔

pcm.!default{
 type plug
 slave.pcm "speakerphat"
}

ctl.!default {
 type hw card 1
}

pcm.speakerphat {
  type softvol
  slave.pcm "plughw:1"
  control.name "Master"
  control.card 1
}

揚聲器的聲音已啟用:

amixer -q sset 'Master' unmute
amixer -q sset 'IEC958' unmute

答案1

在僅使用 alsa 的聲音系統中,這個答案是一個可能的工作答案。
此後的所有程式碼段都應連接起來並替換現有的 asound.conf 定義。
透過級聯定義,所有這些都可以變得更短。但是,那魔法會更難理解,調試會更困難…;-)


讓我們開始定義需要重新取樣時使用的速率轉換器(需要時 dmix 重新取樣)

defaults.pcm.rate_converter "speexrate_best"

然後主要是給設備定義別名。非阻塞允許多個應用程式同時開啟關聯的裝置。

pcm.ALC662{
        type hw
        card Generic
        device 1
        subdevice 0
        nonblock true}
ctl.ALC662{
        type hw
        card Generic}
pcm.ATI{
        type hw
        card HDMI
        device 0
        subdevice 0
        nonblock true}
ctl.ATI{
        type hw
        card HDMI}

現在讓我們繼續混合插件定義(啟用多個聲源的混合並在需要時重新取樣)。每個聲音輸出設備一個。
請注意ipc_key(共享記憶體標識符)。選擇任何唯一的數字。 (檢查第一次觸發sudo ipcs -ma
也要注意,仍然根據需要進行記錄,我現在才意識到在我的系統上指定 ipc_key 是沒有用的。可能是某些升級在我背後放棄了類似 sysV 的 ipcs 的使用…?
也可以隨意適應週期大小&緩衝區大小根據您的延遲要求和系統功能...

pcm.analog {
    type dmix
    ipc_key 219345
    slave{
        pcm ALC662
        format S32_LE
        period_size 1024
        buffer_size 4096 }}

pcm.hdmi {
    type dmix
    ipc_key 219346
    slave{
        pcm ATI
        format S32_LE
        period_size 1024
        buffer_size 4096 }}

現在來了魔法:將多個(立體聲 VG 2 通道)流組合為一個(立體聲 VG 2 通道),這得益於插入 :

pcm.analogHDMI {
    type multi
    slaves.a.pcm "analog"
    slaves.a.channels 2
    slaves.b.pcm "hdmi"
    slaves.b.channels 2

    bindings.0.slave a
    bindings.0.channel 0
    bindings.1.slave a
    bindings.1.channel 1
    bindings.2.slave b
    bindings.2.channel 0
    bindings.3.slave b
    bindings.3.channel 1}

就是這樣 ?嗯……還沒有:

請注意,產生的 pcm 不是交錯格式,而是「複雜」格式。因此,只能處理交錯(或非交錯)格式的應用程式無法存取它。在這種情況下,請使用路由或插頭插件包裝此 PCM。

威爾科,讓我們路線頻道(來源.目標音量):

pcm.2in1 {
    type route
    slave.pcm "analogHDMI"   
    ttable.0.0 1
    ttable.1.1 1
    ttable.0.2 1
    ttable.1.3 1}

當然,如果您希望這是預設的 alsa 輸出,那麼您需要添加:

pcm.!default {
    type plug
    slave.pcm "2in1"}

為了更進一步的參考

相關內容