2

SoundPool がクラッシュするという問題が発生していますが、クラッシュしたことをプログラムで示すことはできません。クラッシュした後は、アプリケーションがリロードされるまでサウンドを再生しません ([戻る] ボタンで終了し、再起動するだけでは十分ではありません)。LogCat には次のエラー メッセージが表示されます。

AudioFlinger: no more track names availlable [sic]
AudioTrack: AudioFlinger could not create track, status: -12
SoundPool: Error creating AudioTrack

それでも、これらのエラーにもかかわらず、SoundPool.play() は、ドキュメントによると、エラーがなかったことを示す、新しい再生要求ごとに増加する正の整数を返します。他の誰かがこの問題のイシューを開始しました: http://code.google.com/p/android/issues/detail?id=13453

...しかし、応答はありません。以下のコードは、この問題を一貫して再現するための最小限のアクティビティです。新しい Android プロジェクトを作成し、LinearLayout の ID を main_bg に設定し、TextView の ID を main_tv に設定し、ding という名前のサウンド ファイルを res/raw に追加するだけです。サウンド ファイルは、最初のサウンドが完了する前に画面を 4 回クリックするのに十分な長さである必要があります。私のは 1.7 秒の 22050 Hz モノラル MP3 @ 96kbps です。少し待ってから 5 回目のクリックを行うと、LogCat を介して上記のエラー メッセージが生成されます。または、サウンドの再生が止まるまで何度もクリックすることもできます。

Android 1.6 を実行している T-Mobile G1 で発生するエラー メッセージをテストしましたが、1.6 エミュレータ、2.1 エミュレータ、または 2.2 エミュレータでは発生しません。

誰かがこの問題を解決する方法を知っていますか、それともSoundPoolはG1の同時サウンドエフェクトには価値がありませんか?

コード:

public class SoundTestActivity extends Activity implements OnClickListener {
   private  SoundPool mSoundPool; 
   private  HashMap<Integer, Integer> mSoundPoolMap; 
   private  int index = 0;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      findViewById(R.id.main_bg).setOnClickListener((OnClickListener)this);

      initSounds();
      mSoundPoolMap.put(index, mSoundPool.load(getApplicationContext(), R.raw.ding, 1));
   }

   public void initSounds() { 
      mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); 
      mSoundPoolMap = new HashMap<Integer, Integer>();           
   }

   @Override
   public void onClick(View v) {
      int result = mSoundPool.play(mSoundPoolMap.get(index), 0.99f, 0.99f, 1, 0, 1f);
      ((TextView)findViewById(R.id.main_tv)).setText(Integer.toString(result));
   } 
}
4

1 に答える 1

0

あくまで推測ですが、見た目が気に入らない…

findViewById(R.id.main_bg).setOnClickListener((OnClickListener)this);

これを行うと、ビューが見つかって膨張し、使用できるようになりますsetOnClickListener()が、何にも割り当てられていません。ある時点で、問題を引き起こしている可能性のあるガベージコレクションが行われていると推測しています。

あなたの説明はそれがLinearLayoutだと言っていますか?もしそうなら、これを試してみてください...

public class SoundTestActivity extends Activity implements OnClickListener {
    private SoundPool mSoundPool; 
    private HashMap<Integer, Integer> mSoundPoolMap; 
    private int index = 0;
    private LinearLayout ll = null; // ADD THIS!!!

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ll = findViewById(R.id.main_bg); // ASSIGN TO ll
        ll.setOnClickListener((OnClickListener)this); // SET LISTENER
于 2011-03-09T08:51:24.483 に答える