AudioTrackの挙動について

3,455 views
Skip to first unread message

金泰斗

unread,
May 1, 2012, 11:10:26 PM5/1/12
to android-g...@googlegroups.com
金といいます。

AudioTrackクラスを使って、
・Threadクラスのパブリック変数として
    AudioTrack track ;
 を定義。
・クラスのコンストラクタで初期化
        track =
                new AudioTrack(AudioManager.STREAM_MUSIC,
                        MicrophoneActivity.SAMPLERATE,
                        AudioFormat.CHANNEL_OUT_MONO ,
                        AudioFormat.ENCODING_PCM_16BIT,
                        MicrophoneActivity.out_buff_size,
                        AudioTrack.MODE_STREAM);
・run()の中で
        track.play();
        while (isPlay) {
                track.write(buff, 0, buff.length);
        }
        track.stop();
        track.release();

というような処理を実行するプログラムを作成しました。

Android2.Xの複数の実機環境で実行したところ正常に動作しており、
要望の処理が実行できている(音声が再生できている)のですが、
Android4.0の端末でまったく同じアプリを実行したところ、
track.play()の処理で
05-02 02:56:55.825: E/AndroidRuntime(2367): java.lang.IllegalStateException: play() called on uninitialized AudioTrack.
05-02 02:56:55.825: E/AndroidRuntime(2367):     at android.media.AudioTrack.play(AudioTrack.java:828)
05-02 02:56:55.825: E/AndroidRuntime(2367):     at com.njn.NoticeReceiver.TrackPlayThread.run(TrackPlayThread.java:96)
となり、アプリがエラー終了してしまいます。
Thread処理の挙動が違うのかと思い、 track変数の宣言をstaticにしてみたり、
コンストラクタ内の初期化処理をrun()の中に移動させてみたりしましたが、どうにも解決しません。

一応、デバッグツールを使ってそれぞれ処理を通っていることは確認しているのですが、
2.X系では不要だけれど、4.0以上では必要な、initialize処理があったりするのでしょうか。
もしくは、4.0の実行環境がPandaboardという特殊な環境によるものなのでしょうか。

ご教示いただければ幸いです。

金泰斗

unread,
May 1, 2012, 11:53:27 PM5/1/12
to android-g...@googlegroups.com
つい先ほど以下の質問を投げさせていただきました、金と申します。

自分で原因が特定できたようなのでご報告させていただきます。
Pandaboardで動かしているLinaro Androidですが、12.04の最新版を使っていたのですが、
Audioが再生できないと言うバグが報告されています。
https://bugs.launchpad.net/linaro-android/+bug/987776
この情報は把握していたのですが、出力処理そのものは通るだろう
(再生しているように動いているが音が出ない)と思っていたのですが、
通常の音楽プレイヤーで音を再生しようとしたところ、そもそも、
再生処理がエラーとなるようで、おそらく、これが原因ではないかと
思われます。

OS側のほうで対処してもらえないことにはどうにもならないことのように
思われますので、そちらの対処を待ちたいと思います。

お騒がせいたしました。
ありがとうございました。


2012年5月2日水曜日 12時10分26秒 UTC+9 金泰斗:

MORIHIRO

unread,
May 2, 2012, 12:37:18 AM5/2/12
to android-g...@googlegroups.com
既にOS側の問題ということで片付いているようですので、
念のための確認作業になりますが、以下のようなところが気になりました。

1. trackをnewした後、track.getState() の戻り値は、
  AudioTrack.STATE_INITIALIZED(=1)
 ではなく、
  AudioTrack.STATE_UNINITIALIZED(=0)
 となっている?(初期化失敗?)

2.IllegalStateException の前に、
  E/AudioTrack-Java(...): [ android.media.AudioTrack ] Error code エラー番号 when initializing AudioTrack.
 というログが出力されている?
 ※エラー番号 → android/frameworks/base/core/jni/android_media_AudioTrack.cpp


2012年5月2日水曜日 12時10分26秒 UTC+9 金泰斗:

金泰斗

unread,
May 2, 2012, 2:05:06 AM5/2/12
to android-g...@googlegroups.com
>MORIHIROさま
ご確認ありがとうございます。

念のため、確認してみました。


1. trackをnewした後、track.getState() の戻り値は、
  AudioTrack.STATE_INITIALIZED(=1)
 ではなく、
  AudioTrack.STATE_UNINITIALIZED(=0)
 となっている?(初期化失敗?)

getStateの戻り値は 0 でした。

 
2.IllegalStateException の前に、
  E/AudioTrack-Java(...): [ android.media.AudioTrack ] Error code エラー番号 when initializing AudioTrack.
 というログが出力されている?
 ※エラー番号 → android/frameworks/base/core/jni/android_media_AudioTrack.cpp

ご指摘のとおり、確かに
05-02 06:00:34.177: E/AudioTrack(3524): AudioFlinger could not create track, status: -22
05-02 06:00:34.177: E/AudioTrack-JNI(3524): Error initializing AudioTrack
05-02 06:00:34.177: E/AudioTrack-Java(3524): [ android.media.AudioTrack ] Error code -20 when initializing AudioTrack.
が出力されていました。

 ほかの端末での実行時にはまったく問題なく動いているため、OS側の問題と認識しておりましたが、
いかがでしょうか。
もし、アプリ側で何かしら対処できる可能性が考えられるのであれば、ご教示いただければ幸いです。

MORIHIRO

unread,
May 2, 2012, 2:50:38 AM5/2/12
to android-g...@googlegroups.com
> 05-02 06:00:34.177: E/AudioTrack(3524): AudioFlinger could not create track, status: -22
このメッセージは、以下のコードが失敗して出力されています。
 android/frameworks/base/media/libmedia/AudioTrack.cpp
 audioFlinger->createTrack(...)
エラーコードが "BAD_VALUE(-22)" なので、入力値不正が考えられます。

ただ、他の環境では動作しているので、完全に不正な値というわけではなく、
 ・ハード的に非サポート
 ・正常値なのにOSのバグでエラー扱いされている
といったところでしょうか。

以上、ご参考まで。


2012年5月2日水曜日 15時05分06秒 UTC+9 金泰斗:

金泰斗

unread,
May 2, 2012, 3:13:29 AM5/2/12
to android-g...@googlegroups.com
>MORIHIRO様
すばやいご回答ありがとうございます。

2012年5月2日水曜日 15時50分38秒 UTC+9 MORIHIRO:
> 05-02 06:00:34.177: E/AudioTrack(3524): AudioFlinger could not create track, status: -22
このメッセージは、以下のコードが失敗して出力されています。
 android/frameworks/base/media/libmedia/AudioTrack.cpp
 audioFlinger->createTrack(...)
エラーコードが "BAD_VALUE(-22)" なので、入力値不正が考えられます。

入力値不正とのことでしたが、AudioManager.STREAM_MUSICやAudioTrack.MODE_STREAMは
ハードウェアの対応・非対応の問題は関係ないと思いましたので、そのほかの入力値を
ビットレートを44100から22050、
AudioFormat.CHANNEL_OUT_MONOからAudioFormat.CHANNEL_OUT_STEREO、
AudioFormat.ENCODING_PCM_16BITからAudioFormat.ENCODING_PCM_8BIT
などなど、一応試してみましたが、どれも結果は変わらず、initializeできませんでした。

やはり、OSのバグでエラー扱いされている可能性が濃厚な気がします…。
とりあえず、OSのバグが修正されるのを待って、再度チャレンジしたいと思います。

アドバイスありがとうございました。

#ところで、今回引数を変更しようとして気づいたのですが、AudioFormat.CHANNEL_OUT_MONOと
#同種の定数の中に CHANNEL_OUT_5POINT1やCHANNEL_OUT_7POINT1、CHANNEL_OUT_SURROUNDなどの
#定数も用意されているんですね。
#現状、Androidでこれらの、サラウンドシステム対応機器って製品化されているのでしょうか???

MORIHIRO

unread,
May 2, 2012, 4:05:20 AM5/2/12
to android-g...@googlegroups.com
AOSPのソースを眺めながら推測してるだけですのでかなり適当ですが、、、

 ・SAMPLERATE は以下の値を確認してみる
   8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000

 ・out_buff_size は AudioTrack.getMinBufferSize() を使っている?

サラウンドシステム対応の携帯端末というのはピンときませんが、
Android搭載テレビとかHDMIでテレビに接続した場合とか、、、?

 
2012年5月2日水曜日 16時13分29秒 UTC+9 金泰斗:
Reply all
Reply to author
Forward
0 new messages