私はPortAudioのコールバックAPIを使ってシグナル処理ループバックライブラリを設計しています。PortAudioのコールバックと他の場所で変数を変更する
私はそう
do_something_flag
が定期的に別の場所で私のプログラムで設定されている
int pa_callback(const void *inputuffer,
void *outputBuffer,
unsigned long frameCount,
const PaStreamCallbackTimeInfo *timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData)
{
if (do_something_flag) {
do_something(inputBuffer, outputBuffer, frameCount);
} else {
do_something_else(inputBuffer, outputBuffer, frameCount);
}
return paContinue;
}
のように、コールバック内のフラグに依存枝を追加したいと思います。
PortAudioコールバックのドキュメントの状態:
始める前に、それはコールバックが 繊細な場所であることを認識することが重要です。これは、一部のシステムで 特殊スレッドまたは割り込みハンドラでコールバックを実行するため、残りのコードと同じように扱われることはほとんどありません。最新のシステムでは、 はコールバックで許可されていない呼び出しを行うことでクラッシュする可能性がありますが、 では、コードにグリッチフリーのオーディオを生成したい場合は、 実行に無制限の量の をとります。これらはお使いのプラットフォームによって異なりますが、 には次のものが含まれていることがほとんどです。メモリ 割り当て/割り当て解除、I/O(ファイルI/Oおよびprintf()などのコンソール I/Oを含む) exec()やyield())、 mutex操作、またはOSに依存する可能性のあるその他のものが含まれます。 の場合、短いクリティカルセクションが安全であると考える場合は、優先度 の逆転についてお読みください。
do_something_flag
のアトミック性については気にしません。つまり、正しい値(理由の範囲内)を得るために必要なサイクル数は気にしません。 ドキュメントによると、私はmutexを使ってその変数を設定/読み込むことはできないようです。
1)私のオプションは何ですか?
2)グローバル化してプログラムの別の部分(別のスレッド)に設定した場合、どうなるのでしょうか?ここでもまた、プログラムの失敗点などのデータを破壊するという意味です。
これを行う正しい方法はありますか?
ええ、それは完璧です。私はスレッドの安全性、アトミシティ、グローバル変数に関心を持っていましたが、私は単純な答えは見ませんでした。 – justynnuff
あなた自身で新しいAPIを学ぶのは難しいですね... PortAudioを学んだときに幸運にも偉大な先生がいました。あなたがやっていることで幸運! –
HI @ yun.cloud、私は最近、音声の取得とportaudioを使用した処理を開始しました。私はそれを実装する際に少し問題に直面しています。私はここでstackoverflow(https://stackoverflow.com/questions/44645466/portaudio-real-time-audio-processing-for-continuous-input-stream)に質問を掲載しました。どんな種類の助けも大歓迎です。 –