web-dev-qa-db-ja.com

aplayを使用して4.0サラウンドシステムで同時にサウンドを再生する方法

アルサとの最初の構成戦争の後( 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

そして1つの実用的なサウンドの例:

[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つのサウンドのうち、1つは2つのフロントスピーカーを使用し、もう1つは2つのリアスピーカーを使用します。どちらのサウンドも、2つのチャネル(サウンドに応じてフロントまたはリア)が空白の4つのチャネルを使用して構築されます。

私の少しの理解から、最初に「カスタムデバイス」(プラグタイプまたは他のタイプ?)を指定してから、それらを「混合」する必要があります。これは、内部のslave.pcmハードウェアアドレスを変更しようとしたためです。 pcm.dmixedブロックですが、このブロックのタイプが正しくないことを示すエラーが表示されます(または同様のもの、必要に応じて正確なメッセージを提供できます...)

hw:CA0106

surround40:CA0106

その問題を解決するのに役立つ情報やアイデアは大歓迎です。

PDATE_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

スレーブ定義が欠落しているように見えますが、どこにあるのかわかりません...

PDATE_2:ここでは、CLのおかげで、最新の「ほぼ」作業ファイルが2つのパートで再生されています(詳細についてはコメントを参照)が、何もないよりはましです。

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を使用するようになりました。

CLありがとうございます。あなたの親切なサポートと忍耐のために。

3
Pier

documentation によると、次のようなものが機能するはずです。

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 }
    ]
}
1
CL.