채널 수 3을 사용하는 Linux ALSA 드라이버

채널 수 3을 사용하는 Linux ALSA 드라이버

Ubuntu 14.04, 64bit, 3.16.0-30-generic Kernel에서 ALSA 드라이버를 실행하고 있습니다.

하드웨어는 독점적이므로 많은 세부 정보를 제공할 수 없습니다.

다음은 기존 드라이버 구현입니다.

  1. 드라이버는 모듈 매개변수를 통해 입력으로 채널_카운트가 제공됩니다. (요구 사항으로 인해 모듈 매개변수를 통해 채널 수를 제공해야 함)
  2. 드라이버는 재생->channels_min = 채널_수 및 재생->채널_최대 = 채널_수로 alsa snd_pcm_hardware 구조를 채웁니다. 캡처 측의 값도 동일합니다.
  3. 하드웨어는 채널 수를 기반으로 하는 클록에 대해 구성되었으며 드라이버는 ALSA 계층에 성공적으로 등록됩니다.
  4. aplay/arecord는 Channel_count = 1/2/4에 대해 잘 작동합니다.
  5. 재생/기록 중에 드라이버에서 "runtime->channels" 값을 확인하면 구성된 채널 수를 반영하는데, 제 생각엔 맞는 것 같습니다. 루프백 테스트이므로 재생된 데이터 일치 항목을 기록합니다.

하지만 Channel_count = 3을 사용하면 aplay 또는 arecord 둘 다 "이 PCM에 대한 구성이 깨졌습니다: 사용 가능한 구성이 없습니다"라고 보고합니다!! Channel_count가 '3'인 웨이브 파일의 경우

예: WAVE './xxx.wav' 재생 중: 부호 있는 16비트 Little Endian, 속도 48000Hz, 채널 3

ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) 슬레이브 PCM을 사용할 수 없습니다.

aplay: set_params:1204: 이 PCM에 대한 구성이 손상되었습니다. 사용 가능한 구성이 없습니다.


다음 변경 사항을 통해 조금 더 발전할 수 있었습니다.

방법1:

  1. 드라이버는 모듈 매개변수를 통해 입력으로 Channel_count '3'이 제공됩니다.
  2. snd_pcm_hardware 구조를 payback->channels_min = 2 및 재생->channels_min = 3으로 채우도록 드라이버를 수정했습니다. 캡처 경로와 유사한 값
  3. aplay/arecord는 '채널 수를 사용할 수 없음'으로 보고하지만 사용 중인 웨이브 파일에는 3개의 채널이 있습니다.

예: aplay -D hw:CARD=xxx,DEV=0 ./xxx.wav WAVE 재생 './xxx.wav': 서명된 16비트 Little Endian, 속도 48000Hz, 채널 3

aplay: set_params:1239: 채널 수를 사용할 수 없습니다.

  1. Plughw를 사용하여 aplay/arecord를 시도하고 aplay/arecord가 앞으로 나아갔습니다.

modprobe my_driver.ko 채널=3

arecord -D 플러그hw:CARD=xxx,DEV=0 -d 3 -f S16_LE -r 48000 -c 3 ./xxx_rec0.wav

aplay -D 플러그:CARD=xxx,DEV=0 ./xxx.wav

WAVE './xxx_rec0.wav' 녹음: 부호 있는 16비트 Little Endian, 속도 48000Hz, 채널 3

WAVE './xxx.wav' 재생: 부호 있는 16비트 Little Endian, 속도 48000Hz, 채널 3

테스트 종료

  1. 재생/기록 중에 드라이버에서 "runtime->channels" 값을 확인하면 값 2가 반환됩니다!!! 그런데 재생된 웨이브파일은 채널수가 3개인데...

  2. 녹음된 파일의 데이터를 확인하면 모두 무음입니다.


방법2:

  1. 드라이버는 모듈 매개변수를 통해 입력으로 Channel_count '3'이 제공됩니다.

  2. snd_pcm_hardware 구조를 재생->channels_min = 3 및 재생->channels_min = 4로 채우도록 드라이버를 수정했습니다. 캡처 경로와 유사한 값

  3. aplay/arecord는 '채널 수를 사용할 수 없음'으로 보고하지만 사용 중인 웨이브 파일에는 3개의 채널이 있습니다.

  4. Plughw를 사용하여 aplay/arecord를 시도하고 aplay/arecord가 앞으로 나아갔습니다.

  5. 재생/기록 중에 드라이버에서 "런타임->채널" 값을 확인하면 값 4가 반환됩니다!!! 그런데 재생된 웨이브파일은 채널수가 3개인데...

  6. 녹음된 파일의 데이터를 확인하면 모두 무음입니다.

따라서 위의 관찰에서 런타임-> 채널은 2 또는 4이지만 요청했지만 alsa 스택에서는 3개의 채널을 사용하지 않았습니다. Plughw를 사용하면 alsa는 데이터를 2채널 또는 4채널에서 실행되도록 변환합니다.

채널 카운트 3을 사용할 수 없는 이유는 누구에게나 도움이 될 수 있습니까? 필요한 경우 추가 정보를 제공할 예정입니다. 미리 감사드립니다.

답변1

귀하의 응답에 감사드립니다.

질문은 stackoverflow에 배치됩니다.

추가로 도움을 주실 수 있다면 요청하신 내용은 다음과 같습니다.

DEFAULT_PERIOD_SIZE 정의(4096)

DEFAULT_NO_OF_PERIODS 정의(1024)

정적 구조체 snd_pcm_hardware xxx_playback =

{

.info                   = SNDRV_PCM_INFO_MMAP |
                          SNDRV_PCM_INFO_INTERLEAVED |
                          SNDRV_PCM_INFO_MMAP_VALID |
                          SNDRV_PCM_INFO_SYNC_START,
.formats                = SNDRV_PCM_FMTBIT_S16_LE,
.rates                  = (SNDRV_PCM_RATE_8000 | \
                           SNDRV_PCM_RATE_16000 | \
                           SNDRV_PCM_RATE_48000 | \
                           SNDRV_PCM_RATE_96000),
.rate_min               = 8000,
.rate_max               = 96000,
.channels_min           = 1,
.channels_max           = 1,
.buffer_bytes_max       = (DEFAULT_PERIOD_SIZE * DEFAULT_NO_OF_PERIODS),
.period_bytes_min       = DEFAULT_PERIOD_SIZE,
.period_bytes_max       = DEFAULT_PERIOD_SIZE,
.periods_min            = DEFAULT_NO_OF_PERIODS,
.periods_max            = DEFAULT_NO_OF_PERIODS,

};

캡처 측 snd_pcm_hardware 구조에 대한 유사한 값입니다.

현재 오디오 테스트 구성에 따라 재생 개방 진입점에서 다음 값이 대체됩니다. (사용자는 모듈 매개변수를 통해 오디오 형식, 오디오 속도, 채널 수를 드라이버에 대한 입력으로 제공하며, 이는 snd_pcm_hardware에 다시 채워집니다. 구조)

xxx_playback.formats,

xxx_재생.속도,

xxx_playback.rate_min, xxx_playback.rate_max,

xxx_playback.channels_min, xxx_playback.channels_max

(캡처 측의 snd_pcm_hardware 구조에서 비슷한 값이 대체됨)

관련 정보