AudioRecord.getMinBufferSizeでバッファサイズ求めてくれます。
setNotificationMarkerPositionはバッファの半分に設定。
たぶん録音でしょう。
onPeriodicNotificationでバッファreadしてFileOutputStreamに
writeします。
再生は、AudioTrackですよ。
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られ
て
> います。
> このグループに投稿するには、android-g...@googlegroups.com にメール
を
> 送信してください。
> このグループから退会するには、
> android-group-j...@googlegroups.com にメールを送信してくださ
い
> 。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
か
> らこのグループにアクセスしてください。
>
>
>
概念だけ。
AudioRecordは、マイクの音をPCM化してます。
それをバッファに貯めてます。
readでバッファから取り出します。バッファは空になります。
バッファからは、あふれる前に取り出します。
問題はバッファの大きさじゃなくて、取り出すタイミングです。
setNotificationMarkerPositionがその条件です。
readの戻り値は、たしかカウントです。
その値みれば、何かわかるかも。
Logとかprintlnとか、使えますよね。
このエラーメッセージは,AudioFlinger.cppで生成しています。
内容的には,オーディオデバイスからデータの読込み(read)が完了したので,再度
readを行なおうとしたのですが,バッファが用意されていないので発生しています。
したがって,原因はAudioTrackがMICデバイスからread時に使用できるバッファが無
かったことが原因です。
いろいろな原因が考えられます。
1. そもそもバッファが小さすぎる
AudioTrackが所定のバッファに読み込んだのでNotificationを送った。
それでもAudioTrackは読込みを続けています。
アプリがNotificationを受け取って,処理しようとしたときにはすでにバッファを
使い切っていた可能性があります。
この場合は,バッファ長を大きくすることで回避できます。
2. Notificationで指定したバッファが小さすぎる
MICは,最低限のブロック長でアクセスします。
Notificationで指定する長さは,getMinBufferSize()以上をお勧めします。
3. その他
ほかに,CPUを使用するアプリが稼動していて,このアプリが動けなかったとか。
おまけ
AudioRdcordの紺とすら区たでのサイズ指定はバイト長ですが,Notificationの指
定はFrame長です。このあたりの指定は問題ありませんか。
AudioRecordでのサイズ指定は,最小値以上でなければ失敗します。この最小値は
getMinBufferSize()で求められます。
最小値以上であれば問題ありません。
Aono
-----Original Message-----
From: android-g...@googlegroups.com
[mailto:android-g...@googlegroups.com] On Behalf Of はち
Sent: Thursday, July 01, 2010 3:58 PM
To: 日本Androidの会
山形のohisamaさん
お返事ありがとうございます。
お指摘の通り録音です。
AudioRecord.getMinBufferSizeで求めたサイズをAudioRecordに指定し、
その半分をsetNotificationMarkerPositionに指定しましたが、
状況は変わりませんでした。
お手数をお掛け致しますが、
宜しくお願い致します。
れ
> て
> > います。
> > このグループに投稿するには、android-g...@googlegroups.com にメー
ル
> を
> > 送信してください。
> > このグループから退会するには、
> > android-group-j...@googlegroups.com にメールを送信してくだ
さ
> い
> > 。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> か
> > らこのグループにアクセスしてください。
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られて
います。
このグループに投稿するには、android-g...@googlegroups.com にメールを
AudioRecordのバッファサイズを大きくすることで、
解決できそうです。
read後のカウントなど確認しながら、
見ていましたら、
read後の処理に時間がかかり、
AudioTrack内のバッファがオーバーフローしていたように、
見受けられますし、再現も確認できました。
Ryu様
Androidフレームワークは,AudioTrackのWarinig出力後,5ミリ秒待ってからreadを再試行します。
再試行してもバッファが用意できないと,録音が途切れることになります。
ハード的な要因もありますが,このあたりが限度ではないでしょうか。
なお,Androidはガーベージコレクションが稼動すると簡単に数十ミリ秒~数百ミリ秒スレッドを停止してしまい,
この警告がでることがあります。
これに関しては,Androidのバージョンアップに期待するしかないのかもしれません。
Aono