저는 현재 44.1 및 48khz 오디오를 재생하기 위해 ~12Mhz 클럭과 ~24Mhz 클럭으로 구동되는 사운드 카드 프로젝트를 진행 중입니다. GPIO를 사용하여 이 시계를 전환합니다. 이는 리샘플링이 발생하는 것을 원하지 않는다는 의미입니다. 내 질문은: 커널 공간 리샘플링을 비활성화할 수 있는 방법이 있습니까?
나는 asoundrc.conf를 사용하여 사용자 공간에서 이를 비활성화하는 방법을 알고 있지만 어떤 사용자도 루트가 아닌 리샘플링을 활성화/비활성화하기 위해 이 구성 파일을 변경할 수 없도록 하기 때문에 커널 공간에서 수행하는 것을 선호합니다.
감사해요
답변1
기본적으로 ALSA는 리샘플링하지 않습니다. 특히 커널 드라이버는 리샘플링하지 않습니다.
따라서 커널 공간에서의 리샘플링은 비활성화할 수 없습니다.
ALSA는 플러그인을 통해(사용자 공간 rate
또는 plug
) 리샘플링합니다. ALSA는 기본적 plug
으로 비리샘플링을 제공합니다 hw
. 기본적으로 이를 수행하지 않도록 ALSA를 구성하는 방법이 있을 수 있다고 생각했지만 이는 모든 사운드 카드에 영향을 미칠 수 있습니다.
그러나 나는 어떤 사용자도 루트가 아닌 리샘플링을 활성화/비활성화하기 위해 이 구성 파일을 변경할 수 있기를 원하지 않기 때문에 커널 공간에서 이 작업을 수행하는 것을 선호합니다.
구성을 변경하지 않고 리샘플링을 피하기 위해 올바른 장치를 사용하기만 하면 됩니다. 또한 이는 귀하의 결정이 아닌 사용자의 결정입니다.
마지막으로 Pulseaudio는 모든 곳에서 리샘플링되며 상당수의 사용자가 ALSA 위에 Pulseaudio를 실행합니다.
플러그인이지만 ALSA는 기본적으로 플러그인에 리샘플링을 지시합니다.
아니요, 그렇지 않습니다. 이 플러그인은 rate
리샘플링을 위해 특별히 설계되었으며 plug
다른 플러그인과 함께 작동합니다. rate
"ALSA가 플러그인에게 리샘플링을 지시한다"는 생각은 완전히 잘못된 것입니다.
커널이 출력할 비트 전송률을 어디에서 결정하는지 알아야 합니다.
모든 ALSA 커널 드라이버는 이를 지정합니다.
결국 이것은 사용자의 결정이 아니라 Hi-Fi 스트리밍 장치입니다.
그러나 원하는 플러그인 체인을 구축하는 것은 사용자의 결정입니다. 리샘플링이 포함됩니다. 제가 리샘플링을 하고 싶었는데 귀하가 어떻게든 그렇게 하지 못하게 막았다면(실제로는 그렇게 할 수 없습니다), 사용자로서 저는 매우 화가 났을 것입니다.
활성화해야 하는 스위치 시계가 있습니다. 이는 또한 코덱의 시스템 주파수가 변경되었음을 ALSA에 알려야 함을 의미합니다.
괜찮습니다. 커널에서 얻은 비트 전송률을 확인하여 이를 수행할 수 있습니다. 리샘플링에 대해 걱정할 필요가 없습니다.
귀하의 답변은 저에게 별로 도움이 되지 않았습니다...
나는 당신이 몇 가지 기본 개념을 오해했다고 생각하며 더 명확하게 설명하기를 바랍니다. 여전히 "커널에서 ALSA 리샘플링 비활성화"를 주장하고 있다면 최선을 다하길 바라지만 그것이 어떻게 작동하는지 이해하려고 노력할 것을 강력히 권장할 뿐입니다. 그러면 이것이 말이 되지 않는다는 것을 알게 될 것입니다.
당신은 내 사용 사례와 관련이 없는 사용자 공간에 대해 이야기하고 있습니다.
커널 공간과 아무 관련이 없는 리샘플링에 대해 이야기하고 있습니다. 리샘플링은 사용자 공간에서만 발생합니다.
주파수가 변경되면 ALSA에 GPIO를 전환하라고 지시할 수 없습니다.
물론. 커널 모듈은 지원되는 비트 전송률을 광고합니다. 커널 모듈에 오디오를 보낼 때 얻는 비트 전송률을 기반으로 GPIO를 설정할 수 있습니다. 즉, GPIO가 44.1kHz 오디오를 재생하기 위해 12MHz를 선택하고 48kHz 오디오를 재생하기 위해 24MHz를 선택하고 12/24MHz 변경이 제어할 수 없는 반대 상황에 있지 않은 경우 이에 따라 오디오를 조정해야 합니다. 재생.
후자의 경우에는 좋은 해결책이 없습니다. ALSA는 하드웨어 오디오 출력이 오디오 재생 중에 비트 전송률을 변경하는 것을 원하지 않습니다.
즉, 커널 공간의 모든 드라이버에게 주파수가 변경되었음을 알려야 합니다(MCASP, 사운드 코덱, PCM).
그렇다면 당신은 반대 상황에 처해 있는가? 왜냐하면 이것이 이 요구 사항이 타당하다고 생각할 수 있는 유일한 상황이기 때문입니다.
리샘플링을 고집한다면 최선의 방법은 현재 오디오 스트림에서 오류를 발생시키고 새 비트 전송률을 유일한 비트 전송률로 광고하고 사용자 공간에 의존하여 오디오를 다시 시작하는 것입니다. 이는 임베디드 시스템이고 사용자 공간을 완벽하게 제어할 수 있기 때문에 가능합니다(이 모든 정보는 우선 문제의 일부여야 합니다).
그러나 실제 문제와 문제 상황을 잘 설명하면 도움이 됩니다.