2010-12-17 9 views
2

개폐의 PCM 내가 수행하는 프로그램이 다음ALSA : 온 - 더 - 플라이

  1. snd_pcm_open()
  2. 가 사운드를 재생하기 위해 샘플을 보냅니다 기능을 기본 PCM을 엽니 다
  3. snd_pcm_close() 기능으로 PCM을 닫습니다

이 프로그램은 주기적으로 소리가 다시 요청 재생됩니다 하지만 때때로 open은 실패하고 "Device or resource busy"오류를 반환합니다. 이것은 일반적으로 많은 사운드 파일이있을 때 발생합니다. 그러나 닫기 호출은 항상 성공적입니다. 결론이 성공적이면 PCM을 다른 사람이 즉시 사용할 수 있다고 가정합니다. 또한 사운드를 사용하는 시스템에는 다른 것이 없다고 덧붙여 야합니다.

ALSA가 닫힌 후에 일부 리소스를 정리해야 할 수도 있습니까? PCM 인터페이스가 자주 열리고 닫히지 않도록 설계 되었습니까? 인터넷의 대부분의 예제는 시작시 PCM 스트림을 열고 시스템 종료시 닫습니다.

답변

1

자주 열고 닫지 마십시오. 한 번만 (시작 응용 프로그램의 종료)

snd_pcm_open()snd_pcm_close()을 사용하고 당신이 당신의 스트림을 재설정 할 때 사용할 수 : 일반적으로이 shouldn을 '

snd_pcm_drop() 

snd_pcm_prepare() 

을 dmix는 여러 스트림을 처리 할 수 ​​있기 때문에 전혀 문제가되지 않습니다. 그러나 직접 hw : 0 액세스를 사용하는 경우 close() 단계가 비동기적일 수 있으므로 즉시 open()이 제대로 작동하지 않을 수 있습니다.

+0

pcm을 닫는 것이 DAPM 코어에서 SND_SOC_DAPM_PRE_PMD 위젯 이벤트를 생성 할 수있는 유일한 방법 인 것 같습니다. 내 동기 부여는 절전입니다. alsa-lib를 통해이를 트리거하는 또 다른 방법이 있습니까? – waffleman

+1

@Maister : 어떻게하면 스트림에서 변화하는 샘플링 속도를 관리 할 수 ​​있습니까? 예를 들어 44.1KHz 및 48KHz 샘플링 속도의 PCM 스트림 2 개가 있으며이 오디오를 출력하고 싶습니다 (즉, 44.1 시간과 48 시간). 나는이 전환하는 동안 Alsa를 닫고 열어야한다고 생각한다. 거기에 다른 방법이 있습니까? – jjb

관련 문제