2017-12-28 83 views
0

PortAudio의 PaStreamFinishedCallback에서 어떤 작업이 안전한지 알고 싶습니다. 일반적으로 재생을 위해 PaStreamCallback에서 차단할 수있는 작업을 시도하는 것은 좋지 않습니다. 사용자 또는 다른 응용 프로그램의 오디오 스트림에서 팝/글리치가 발생할 수 있기 때문입니다. PaStreamFinishedCallback에도 동일한 제한 사항이 적용됩니까? 그 콜백이 OS의 오디오 스레드에서 호출되는지 궁금합니다.PortAudio의 PaStreamFinishedCallback에 대한 안전한 작업

/paAbort 콜백이 반환 될 때까지 차단되지만 정지를 유발하지 않고 차단하는 기능이 있습니까? 그게 내가 정리할 수있는 실을 가지고 있기 때문에 실제로는 내 사용에 이상적입니다. 내 스레드에 내 콜백 신호를 보내서이 작업을 완료 할 수 있다는 것을 알았습니다. 스레드가 Pa_StopStream을 호출 할 수 있지만 무거운 느낌이 들었습니다.

편집 : 내 사용에 대해 좀 더 많은 컨텍스트를 제공하기 위해 일부 PCM을 보유하고 버퍼에서 공간을 사용할 수있을 때 신호를 보내려면 pthread condvar를 사용하는 링 버퍼가 있습니다. 하나의 쓰레드가이 링에 쓴 다음 PaStreamCallback이 다른 쪽에서 읽습니다. 일이 끝나면 작성자는 링에 닫힌 플래그를 설정하고 콜백은 남아있는 것이 무엇이든 배수합니다. 내 반지가 빠져 나가고 PortAudio가 비워 졌는지 확인하고 싶습니다. 콜백은 링이 끊어지는 것을 아는 유일한 장소이므로 paComplete을 반환하는 것이 적절하다고 느낍니다. 하지만 내 반지를 할당 해제하는 것이 좋다는 것을 알기 위해서는 어떤 방법이 필요합니다.

답변

0

이 답변은 호스트에 크게 의존하며 한 호스트에 대해서도 시간이 지남에 따라 동작이 변경 될 수 있다는 것입니다. 나는 앞서 가서 구현을 읽었으며 여기서 몇 가지 유용한 정보를 발견했다.

Pa_StopStream은 호스트 시스템의 Stop()과 같은 동작을 호출합니다. 모든 구현을 읽지는 않았지만 아마도 대부분의 경우 블로킹을 사용하고 있습니다. Stop(). 즉 실제로 정지를 요구하지 않고 정지를위한 차단이 지원되는 동작이 될 가능성은 거의 없음을 의미합니다.

PaStreamFinishedCallback은 호스트의 자체 스트림 중지 콜백의 단순한 래퍼입니다. 예를 들어, OSX Core Audio에서 ListenerkAudioOutputUnitProperty_IsRunning입니다. 언제 어떻게 이것이 호출되는지는 호스트에게 달려 있습니다. 여기서 똑똑한 플레이는 가능한 한 신중해야한다고 생각합니다.이 콜백 내부에서는 블로킹 작업이 안전하다고 가정하지 않습니다. 당신은 하나 개의 스레드 링 버퍼에 PCM을 공급하고 PaStreamCallback가 그 반지에서 읽고 저와 같은 상황에 있다면

  • PaStreamFinishedCallback에 가입

    그래서, 그때는 아마 할 것

  • 생산자 스레드는 링 버퍼를 닫고 링
  • 신호 께 제조자 스레드를 배출하는 경우가 PaStreamCallback
  • 그것을 PaStreamCallback로부터 복귀 paComplete 드레인 수 WO 그 RK는 pthread_cond_signal
  • 생산자 스레드가 깨어나서 오디오 스레드에서 심지어 신호

을 할당 해제 (뮤텍스 잠금)에 의해 정리 피하기 위해 아마도 가장 좋습니다 사용하여 내 경우에는, PaStreamFinishedCallback에서 수행하지만, 어렵다된다 대안이 있다고 상상해보십시오. PCM 링 버퍼에서 정기적으로 읽으려면 PaStreamCallback을 포기하기 전에 제한된 횟수만큼 회전시켜야합니다.완료 신호의 경우 생성자 스레드는 잠기고 즉시 대기해야하므로 잠김을 가능한 적게 유지해야합니다.