6

私はAndroidマーケットにアプリを持っていて、効果音にSoundPoolクラスを使用しています。Android APIのすべての部分の中で、これが最も問題を引き起こしているように思われることに気づきました。例えば:

  • HTC DesireにはWAVファイルの再生に問題があります(これにより、ランダムにロックされます)。.oggファイルを使用するとこれが修正されます

  • Droidで、initセットアップ呼び出しのチャネル数を超えた場合:

mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);

受話器がロックします。あなたがそれをデバッグすることの難しさを想像できるなら!私が所有していない受話器。それは私の顧客からの多くの無私の助けを必要としました。「4」を「16」に変更すると、問題が解消されました。16のサウンドを同時に再生しても、クラッシュすることは間違いありません。ありがたいことに、その可能性は低いです。

  • また、さまざまなデバイスでランダムにクラッシュします。顧客の1人から、サウンドの再生に関連する「ヒープオーバーフロー」エラーのあるカタログがあります。

MediaPlayerを使用するようにサウンドマネージャーを変更しました。これは今のところうまく機能しているようです。他の開発者がこれらの問題を経験しているかどうか疑問に思っていますか?

4

1 に答える 1

4

AudioFlingerでは、常に最大 1 Mb 相当のオーディオを処理できるようです。この制限を超えると、ヒープ エラーが発生します。この推測は、AudioFlinger ソース コードで見つけたいくつかのコードに基づいています。

AudioFlinger::Client::Client(const sp<AudioFlinger>& audioFlinger, pid_t pid) 
     :   RefBase(), 
         mAudioFlinger(audioFlinger), 
         mMemoryDealer(new MemoryDealer(1024*1024)), 
         mPid(pid) 
{ 
     // 1 MB of address space is good for 32 tracks, 8 buffers each, 4 KB/buffer 
} 

この:

size_t size = sizeof(audio_track_cblk_t); 
size_t bufferSize = frameCount*channelCount*sizeof(int16_t); 
if (sharedBuffer == 0) { 
    size += bufferSize; 
} 
mCblkMemory = client->heap()->allocate(size); 
if (mCblkMemory != 0) {
    ...
} else {
    LOGE("not enough memory for AudioTrack size=%u", size); 
    client->heap()->dump("AudioTrack"); 
}

他にもっと詳しい人はいますか?

于 2011-04-21T23:12:23.360 に答える