4

これは私を目覚めさせます:
ユーザーがデバイスの現在のサンプルレートを変更した場合に反応しなければならないOSXオーディオアプリケーションがあります。
これを行うには、「kAudioDevicePropertyNominalSampleRate」に入力デバイスと出力デバイスの両方のコールバックを登録します。
したがって、デバイスのサンプルレートのいずれかが変更された場合、コールバックを取得し、セレクターとして「AudioObjectSetPropertyData」および「kAudioDevicePropertyNominalSampleRate」を使用してデバイスに新しいサンプルレートを設定します。
次のステップはアップルのメーリングリストに記載されていて、私はそれらに従いました:

  • 入力AudioUnitとミキサーと出力AudioUnitで構成されるAUGraphを停止します
  • 両方の初期化を解除します。
  • ノード数を確認し、それらをステップオーバーし、AUGraphDisconnectNodeInputを使用してミキサーを出力から切断します
  • ここで、入力ユニットの出力スコープに新しいサンプルレートを設定します
  • ミキサーユニットの入力スコープと出力スコープ
  • ミキサーノードを出力ユニットに再接続します
  • グラフを更新する
  • 初期化入力とグラフ
  • 入力とグラフを開始します

レンダリングと出力のコールバックが再開されますが、オーディオが歪んでいます。シグナルの原因は入力レンダリングコールバックだと思いますが、よくわかりません。
何を忘れましたか?
私の知る限り、サンプルレートはバッファサイズに影響しません。
他のサンプルレートでアプリケーションを開始すると、すべてがOKになります。これは、信号の歪みにつながる変化です。
前後のストリーム形式(kAudioUnitProperty_StreamFormat)を確認します。もちろん新しい値に変更されるサンプルレートを除いて、すべてが同じままです。

私が言ったように、変更する必要があるのは入力レンダリングコールバックだと思います。さらにサンプルが必要であることをコールバックに通知する必要がありますか?44kと48kでコールバックとバッファサイズを確認しましたが、何も違いはありませんでした。

私は小さなテストアプリケーションを作成したので、コードを提供してほしい場合は、お見せすることができます。

編集:歪んだオーディオ(サイン)を録音し、Audacityで見ました。
私が見つけたのは、495サンプルごとに、さらに17サンプルのオーディオがドロップすることでした。これがどこに向かっているのかがわかると思います:495サンプル+17サンプル=512サンプル。これは私のデバイスのバッファサイズです。
しかし、私はまだこの発見で何ができるかわかりません。
入力と出力のレンダリングプロシージャとRingBufferへのアクセスを確認しました(固定バージョンのCARingBufferを使用しています)
512フレームの保存とフェッチの両方が行われるため、ここで欠落しているものはありません...

4

1 に答える 1

1

とった!
グラフを切断した後、両方のデバイスに新しいサンプルレートを通知する必要があるようです。
コールバックの前にすでにこれを実行しましたが、後で実行する必要があるようです。

于 2012-11-26T09:50:24.063 に答える