Я недавно приобрел обновление для Samsung Galaxy S, Android 2.1, и после запуска моего приложения я обнаружил, что некоторые звуковые эффекты воспроизводятся дважды одновременно.Это странно, потому что звуковые эффекты, которые демонстрируют это поведение, кажутся случайными - в некоторых случаях некоторые будут играть дважды, а другие - один раз, как и ожидалось.Эта ошибка не была обнаружена ни на одной другой аппаратной платформе для моего приложения.Я видел только один зарегистрированный случай этого на этом сайте, и человек переключился на использование MediaPlayer, однако я действительно хочу получить лекарство от этого.
Когда приложение запускается, оно запускает Soundpool следующим образом,
public static final int SOUND_EXPLOSION = 1;
public static final int SOUND_CLEAR = 2;
public static final int SOUND_CLICK = 3;
public static final int SOUND_MAGIC = 4;
public static final int SOUND_ROCKET = 5;
public static final int SOUND_MELT = 6;
private SoundPool soundPool;
private AudioManager mgr;
private HashMap<Integer, Integer> soundPoolMap;
private void initSounds()
{
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
soundPoolMap = new HashMap<Integer, Integer>();
soundPoolMap.put(SOUND_EXPLOSION, soundPool.load(getContext(), R.raw.explosion3, 1));
soundPoolMap.put(SOUND_CLEAR, soundPool.load(getContext(), R.raw.pop, 1));
soundPoolMap.put(SOUND_CLICK, soundPool.load(getContext(), R.raw.click, 1));
soundPoolMap.put(SOUND_MAGIC, soundPool.load(getContext(), R.raw.swoosh, 1));
soundPoolMap.put(SOUND_ROCKET, soundPool.load(getContext(), R.raw.rocket, 1));
soundPoolMap.put(SOUND_MELT, soundPool.load(getContext(), R.raw.melt3, 1));
mgr = (AudioManager)getContext().getSystemService(Context.AUDIO_SERVICE);
}
Затем звуковые эффекты воспроизводятся путем вызова следующего сабвуфера (PlaySound является глобальным переключателем опций пользователя)
public void playSound(int sound)
{
if (PlaySound == true)
{
Log.w("playSound","Playing Sound" + sound);
float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = streamVolumeCurrent / streamVolumeMax;
soundPool.play(soundPoolMap.get(sound), volume, volume, 1, 0, 1f);
}
}
Как вы можете видеть, есть вызов журнала, который я использовалчтобы узнать, сколько раз вызывался сабвуфер, хотя это показало, что при возникновении ошибки процедура вызывается только один раз, когда звук слышен с устройства дважды.
У меня также есть последний сабвуфер, который вызывается, когдаПоверхностный вид разрушен, чтобы привести в порядок.
public void ReleaseSounds()
{
if (soundPool != null)
{
soundPool.release();
soundPool = null;
}
}
У кого-нибудь еще была эта проблема, если да, то как вы решили ее?Любая помощь по этому вопросу будет принята с благодарностью,
Большое спасибо заранее