Alsa

如何使用 aplay 在 4.0 環繞系統上同時播放聲音

  • April 15, 2014

在我與 alsa 的第一次配置戰(在CL的幫助下獲勝)之後,檢查這個問題……

我現在想更進一步:

我可以在我的設置上播放多聲道聲音,但我現在需要同時播放它們!

我發現使用 dmix 應該對我有幫助,但我仍然在設置正確的 asound.conf 文件時遇到問題,這裡是我嘗試的不同解決方案及其各自的結果:

初始(使用多通道但不是同時使用) asound.conf :

pcm.!default {
      type asym
   playback.pcm {
       type plug
       slave.pcm "surround40:CA0106"
   }
   capture.pcm {
       type plug
       slave.pcm "hw:CA0106"
   }
}

初始(同時播放但不是多聲道,這裡只有 2 個聲道) asound.conf :

pcm.dmixed {
   type dmix
   ipc_key 1024
   ipc_key_add_uid 0
   slave.pcm "hw:CA0106"
}

pcm.duplex {
   type asym
   playback.pcm "dmixed"
}

# Instruct ALSA to use pcm.duplex as the default device
pcm.!default {
   type plug
   slave.pcm "duplex"
}

關於上述設置的注意事項 這個 asound.conf 允許我同時播放 2 個聲音,但只在 2 個通道上,我失去了多通道容量……

此外,一些用於我最初的 asound.conf(上面的第一個摘錄)的聲音不再適用於這個 asound.conf,這是失敗消息

[root@server Sons]# aplay -N Apparition.wav
Playing WAVE 'Apparition.wav' : Signed 32 bit Little Endian, Rate 22050 Hz, Channels 4
aplay: set_params:1015: Unable to install hw params:
ACCESS:  RW_INTERLEAVED
FORMAT:  S32_LE
SUBFORMAT:  STD
SAMPLE_BITS: 32
FRAME_BITS: 128
CHANNELS: 4
RATE: NONE
PERIOD_TIME: 125000
PERIOD_SIZE: NONE
PERIOD_BYTES: (44096 44112)
PERIODS: (1 2)
BUFFER_TIME: (249977 249978)
BUFFER_SIZE: 5512
BUFFER_BYTES: 88192
TICK_TIME: 0

還有一個工作聲音範例:

[root@server Sons]# aplay -vN Disparition.wav                                   
Playing WAVE 'Disparition.wav' : Signed 32 bit Little Endian, Rate 22254 Hz, Channels 4 
Plug PCM: Route conversion PCM (sformat=S32_LE)                                         
 Transformation table:                                                                 
   0 <- 0                                                                              
   1 <- 1                                                                              
Its setup is:                                                                           
 stream       : PLAYBACK                                                               
 access       : RW_INTERLEAVED                                                         
 format       : S32_LE                                                                 
 subformat    : STD                                                                    
 channels     : 4                                                                      
 rate         : 22254                                                                  
 exact rate   : 22254 (22254/1)                                                        
 msbits       : 32                                                                     
 buffer_size  : 5563                                                                   
 period_size  : 2781                                                                   
 period_time  : 125000                                                                 
 tstamp_mode  : NONE                                                                   
 period_step  : 1                                                                      
 avail_min    : 2781                                                                   
 period_event : 0                                                                      
 start_threshold  : 5563                                                               
 stop_threshold   : 5563                                                               
 silence_threshold: 0                                                                  
 silence_size : 0                                                                      
 boundary     : 729153536                                                              
Slave: Rate conversion PCM (48000, sformat=S16_LE)                                      
Its setup is:                                                                           
 stream       : PLAYBACK
 access       : MMAP_INTERLEAVED
 format       : S32_LE
 subformat    : STD
 channels     : 2
 rate         : 22254
 exact rate   : 22254 (22254/1)
 msbits       : 32
 buffer_size  : 5563
 period_size  : 2781
 period_time  : 125000
 tstamp_mode  : NONE
 period_step  : 1
 avail_min    : 2781
 period_event : 0
 start_threshold  : 5563
 stop_threshold   : 5563
 silence_threshold: 0
 silence_size : 0
 boundary     : 729153536
Slave: Direct Stream Mixing PCM
Its setup is:
 stream       : PLAYBACK
 access       : MMAP_INTERLEAVED
 format       : S16_LE
 subformat    : STD
 channels     : 2
 rate         : 48000
 exact rate   : 48000 (48000/1)
 msbits       : 16
 buffer_size  : 12000
 period_size  : 6000
 period_time  : 125000
 tstamp_mode  : NONE
 period_step  : 1
 avail_min    : 6000
 period_event : 0
 start_threshold  : 12000
 stop_threshold   : 12000
 silence_threshold: 0
 silence_size : 0
 boundary     : 1572864000
Hardware PCM card 0 'CA0106' device 0 subdevice 0
Its setup is:
 stream       : PLAYBACK
 access       : MMAP_INTERLEAVED
 format       : S16_LE
 subformat    : STD
 channels     : 2
 rate         : 48000
 exact rate   : 48000 (48000/1)
 msbits       : 16
 buffer_size  : 12000
 period_size  : 6000
 period_time  : 125000
 tstamp_mode  : ENABLE
 period_step  : 1
 avail_min    : 6000
 period_event : 0
 start_threshold  : 1
 stop_threshold   : 1572864000
 silence_threshold: 0
 silence_size : 1572864000
 boundary     : 1572864000

我正在使用“-N”選項讓一些非常短的聲音一個接一個地快速播放,我無法擺脫這個動作。

長話短說,我正在尋找一個 asound.conf 文件,它可以讓我保持多聲道容量,但也可以讓我同時播放 2 種不同的聲音。

在 2 種聲音中,一種使用 2 個前置揚聲器,另一種使用 2 個後置揚聲器,兩種聲音都是使用 4 通道建構的,其中 2 通道(前或後取決於聲音)空白。

據我所知,我需要先指定一個“自定義設備”(插頭類型或任何其他類型?)然後“dmix”它們,因為我試圖更改pcm.dmixed塊內的slave.pcm 硬體地址但是這個給我一個錯誤,指出此塊的類型不正確(或類似的東西,如果需要,我可以提供確切的消息……)

hw:CA0106

surround40:CA0106

歡迎任何資訊和想法來幫助我解決這個問題。

UPDATE_1: 跟隨 CL。建議,我建立了這個 asound.conf :

pcm.dmixed {
       type dmix
       ipc_key 1024
       ipc_key_add_uid 0
       slave {
               pcm "hw:0,0"
               channels 4
       }
}

pcm.dmixed2 {
       type dmix
       ipc_key 1025
       ipc_key_add_uid 0
       slave {
               pcm "hw:0,1"
               channels 4
       }
}



pcm.quad {
       type multi

       slave.pcm "dmixed"
       slave.pcm "dmixed2"
}

# Instruct ALSA to use pcm.quad as the default device
pcm.!default {
   type plug
   slave.pcm "quad"
}

但它仍然無法正常工作……它失敗並出現此錯誤:

ALSA lib pcm_multi.c:1042:(_snd_pcm_multi_open) Unknown field slave

看起來我錯過了從屬定義,但我找不到在哪裡……

UPDATE_2: 這是我最新的“幾乎”工作文件,多虧了 CL。,我仍然可以分兩部分播放聲音(有關更多資訊,請參閱評論),但總比沒有好。

pcm.!default {                         # The "!" is used to overwrite an existing definition (pcm.default in this case ...)
       type asym
   playback.pcm {
       type plug                      # plug is the "automatic conversion" plugin : convert data rate, channel and format on demand
       slave.pcm "quad"
   }
}


pcm.dmix_front {                        # Define the front speakers device : hw:0,0
   type dmix
   ipc_key 12345
   ipc_key_add_uid 0
   slave.pcm "hw:0,0"
}
pcm.dmix_rear {                         # Define the rear speakers device : hw:0,1
   type dmix
   ipc_key 67890
   ipc_key_add_uid 0
   slave.pcm "hw:0,1"
}
pcm.quad {
   type multi
   slaves {
       a { pcm dmix_front channels 2 }
       b { pcm dmix_rear  channels 2 }
   }
   bindings [
       { slave a channel 0 }
       { slave a channel 1 }
       { slave b channel 0 }
       { slave b channel 1 }
   ]
}

我終於從我的應用程序中使用了 plug:dmix_front 和 plug:dmix_front。

謝謝你。感謝您的支持和耐心。

根據文件,這樣的事情應該可以工作:

pcm.dmix_front {
   type dmix
   ipc_key 12345
   ipc_key_add_uid 0
   slave.pcm "hw:0,0"
}
pcm.dmix_rear {
   type dmix
   ipc_key 67890
   ipc_key_add_uid 0
   slave.pcm "hw:0,1"
}
pcm.quad {
   type multi
   slaves {
       a { pcm dmix_front channels 2 }
       b { pcm dmix_rear  channels 2 }
   }
   bindings [
       { slave a channel 0 }
       { slave a channel 1 }
       { slave b channel 0 }
       { slave b channel 1 }
   ]
}

引用自:https://unix.stackexchange.com/questions/124221