Проблема со Soundpool и Samsung Galaxy S - PullRequest
6 голосов
/ 28 декабря 2010

Я недавно приобрел обновление для 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;

  }
}

У кого-нибудь еще была эта проблема, если да, то как вы решили ее?Любая помощь по этому вопросу будет принята с благодарностью,

Большое спасибо заранее

1 Ответ

8 голосов
/ 06 января 2011

Преобразование звуковых файлов в формат OGG в папке raw, по-видимому, устранило эту ошибку - с тех пор я не видел ее повторения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...