私は android.media.AudioRecord を使用して未加工のオーディオ入力を取得しており、これをリアルタイムで処理して即時のフィードバックを表示しています。さまざまな処理パラメーターを調整して、フィードバックの品質を変更し、対応する処理時間を変更できます。
処理時間を増やすと、ある時点で AudioRecord がオーバーフローし始め、read() でデータのチャンクが欠落し始めます。表示の顕著な変化に加えて、LogCat に次のメッセージが表示されます (デバッグに Eclipse を使用しています): "E/AudioHardwareYamaha(2579): snd_pcm_readi read error -32"
アプリでこのエラーを確認するにはどうすればよいですか? デバッグ中に見つけるだけでは十分ではありません。これがいつ発生したかをアプリに認識させて、パラメータを自動的に調整し、品質が可能な限り高く、オーバーフローがなくなった、またはまれなスイート スポットを見つけられるようにしたいと考えています。このスイート スポットは、ハードウェアによって異なると思います。
私はここと他の場所をチェックしましたが、私が見つけた提案は不十分です:
小さな倍数を超えてバッファー サイズを大きくすることは、避けられないグリッチを遅らせるだけであり、フィードバックにレイテンシーを追加するだけなので、解決策にはなりません。
読み取りと処理を別々のスレッドに入れるという提案を見てきました。基本的に、これは AudioRecord のラッパーに相当し、独自のエラー検出を行うためだけに、かなりの複雑さとさらに多くの処理が追加されます。私のアプリは基本的に完成しています。回避できるのであれば、すべてをリファクタリングしたくありません。
現時点では、期待される経過時間と照らし合わせて経過時間をチェックすることが最も有効な解決策のようですが、AudioRecord が何を行った (そしてログに記録した) かを推測するために、このような間接的な戦略に落ち着かなければならないのは奇妙に思えます。
ログに記録されているエラー情報をアプリがキャプチャする簡単な方法はありますか?