aplay를 사용하여 4.0 서라운드 시스템에서 동시에 사운드를 재생하는 방법

aplay를 사용하여 4.0 서라운드 시스템에서 동시에 사운드를 재생하는 방법

alsa와의 첫 번째 구성 전쟁 이후(C.L.) 확인하다이 문제...

이제 나는 한 단계 더 나아가고 싶다.

내 설정에서 다중 채널 사운드를 재생할 수 있지만 이제는 동시에 재생해야 합니다!

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" 옵션을 사용하여 매우 짧은 사운드를 차례로 빠르게 재생하는데 이 동작을 제거할 수 없습니다.

간단히 말해서, 다중 채널 용량을 유지하면서 동시에 2개의 서로 다른 사운드를 재생할 수 있게 해주는 asound.conf 파일을 찾고 있습니다.

2개의 사운드 중 하나는 전면 스피커 2개를 사용하고 다른 하나는 후면 스피커 2개를 사용하며 둘 다 4개 채널을 사용하여 구축되었으며 그 중 2개(사운드에 따라 전면 또는 후면)는 공백입니다.

제가 조금 이해한 바에 따르면 먼저 "사용자 정의 장치"(플러그 유형 또는 다른 유형?)를 지정한 다음 변경하려고 할 때 "혼합"해야 합니다.Slave.pcm 하드웨어 주소내부에 -PCM.dmixed하지만 이로 인해 블록이 올바른 유형이 아니라는 오류가 발생합니다(또는 이와 유사한 것, 필요한 경우 정확한 메시지를 제공할 수 있습니다...).

hw:CA0106

도착하다

surround40:CA0106

이 문제를 해결하는 데 도움이 되는 정보와 아이디어를 환영합니다.

업데이트_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

슬레이브 정의가 누락된 것 같은데 어디에 있는지 찾을 수 없습니다...

업데이트_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 }
    ]
}

결국 내 애플리케이션에서 플러그:dmix_front 및 플러그:dmix_front를 사용하게 되었습니다.

고마워요, CL. 귀하의 지원과 인내심에 감사드립니다.

답변1

~에 따르면문서, 다음과 같이 작동해야 합니다.

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 }
    ]
}

관련 정보