2017-12-28 57 views
0

PortAudioのPaStreamFinishedCallbackで安全な操作を知りたいのですが、私は通常、ユーザまたは他のアプリケーションのオーディオストリームにポップス/グリッチを引き起こす可能性があるので、再生のためにPaStreamCallbackをブロックする操作を試みることをお勧めしません。 PaStreamFinishedCallbackにも同じ制限が適用されますか?そのコールバックがOSのオーディオスレッドでも呼び出されているのであれば、私は最終的に私は不思議だと思います。PortAudioのPaStreamFinishedCallbackでの安全な操作

また、Pa_StopStreamのような機能があり、コールバックがpaComplete/paAbortを返すまでブロックされますが、停止を引き起こすことはありませんか?実際に私の使用には理想的でしょう。なぜなら、私が掃除するのに適した糸があるからです。私はそれが完了した私のスレッドに私のコールバック信号を持ってこれを達成することができると知っているスレッドはPa_StopStreamを呼び出すことができますが、それは重い手を感じる。

編集:私の使用についてもう少しコンテキストを与えるために、私はいくつかのPCMを保持するリングバッファを持っていて、バッファにスペースがあるときにシグナルを送るためにpthread condvarを使用します。 1つのスレッドがこのリングに書き込みを行い、もう一方の端からPaStreamCallbackを読み込みます。物事が終了すると、ライターはリングにクローズドフラッグをセットし、コールバックは残っているものを排除します。私は私のリングが流出し、PortAudioがフラッシュすることを確認したいと思います。コールバックはリングがいつ排除されるかを知る唯一の場所なので、paCompleteを返すことが適切であると感じます。しかし、私はリングを割り当て解除することが大丈夫であることを知るために何らかの方法が必要です。

答えて

0

これは、ホストに大きく依存し、1人のホストであっても動作が時間とともに変化する可能性があるという回答です。私は先に進んで実装を読んで、ここでいくつかの有用な情報を発見しました。

Pa_StopStreamは、ホストシステムのStop()のような動作を呼び出すだけです。私はすべての実装を読んだわけではありませんが、ほとんどの場合、何らかのブロッキングがありますStop()。つまり、実際に停止することを阻止することは、サポートされた動作になるとは考えにくいです。

PaStreamFinishedCallbackは、ホストのストリーム停止コールバックのちょうど薄いラッパーです。たとえば、OSX Core Audioの場合、ListenerkAudioOutputUnitProperty_IsRunningです。どのようにしてこれが呼び出されるのかは、ホストの責任です。私はここでスマートなプレーはできるだけ慎重であると考えています - このコールバックの内部ではブロック操作は安全ではないと仮定します。

使用すると、1つのスレッドがリングバッファにPCMを供給し、そしてPaStreamCallbackがそのリングから読み込み、私と同じような状況にいるのであれば、あなたはおそらく

  • PaStreamFinishedCallbackに購読をお勧めします
  • プロデューサースレッドはリングバッファを閉じ、WOことリングは
  • 信号プロデューサーのスレッドを排出される際PaStreamCallbackPaStreamCallbackから復帰paComplete
  • それを排出することができますRKは、オーディオスレッドからpthread_cond_signal
  • プロデューサーのスレッドがウェイクアップしたとしても、シグナリング(およびミューテックスをロック)

の割り当てを解除することにより、クリーンアップ使用して、私の場合には、PaStreamFinishedCallbackから行われ、おそらく避けることが最善ですが、それはするのは難しいです代わりがあると想像してみてください。 PCMリングバッファから定期的に読み取る場合、PaStreamCallbackは、おそらくいくつかの制限された回数だけスピンして放棄する必要があります。完了シグナルの場合、プロデューサスレッドはロックしてからすぐに待機し、ロックをできるだけ少なく保持する必要があります。

関連する問題