Sunday, February 27, 2011

[android-developers] SoundPool play() fails with no indication

I'm having a problem where SoundPool crashes, but gives no
programmatic indication that is has crashed. After it crashes, it
will not play any more sounds until the application is reloaded
(exiting via back button then restarting is not sufficient). LogCat
gives me these error messages:

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

Yet, despite these errors, SoundPool.play() still returns a positive
integer that increments for each new play request which, according to
the documentation, indicates that there was not an error. Someone
else started an Issue for this problem:
http://code.google.com/p/android/issues/detail?id=13453

...however, there have been no responses. The code below is a
minimalist Activity to consistently recreate this issue. Just create
a new Android project, set the ID of the LinearLayout to main_bg, set
the ID of the TextView to main_tv, and add a sound file named ding to
res/raw. The sound file needs to be long enough to click on the
screen four times before the first sound completes; mine is a 1.7-
second 22050 Hz mono MP3 @ 96kbps. After a brief pause, the fifth
click will generate the error messages above via LogCat. Or, you can
just click a bunch of times until sounds stop playing.

I have tested the error messages to occur on a T-Mobile G1 running
Android 1.6 and a DroidX running Android 2.2, but they do not occur on
a 1.6 emulator, a 2.1 emulator, or a 2.2 emulator.

Does anyone know how to fix this problem, or is SoundPool just
worthless for coincident sound effects?

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));
}
}

--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

No comments:

Post a Comment