2010-12-28 26 views
6

Recientemente adquirí una actualización de Samsung Galaxy S, Android 2.1 y después de ejecutar mi aplicación encontré que algunos de los efectos de sonido se reproducen dos veces al mismo tiempo. Esto es extraño porque los efectos de sonido que exhiben este comportamiento parecen aleatorios: en algunos casos, algunos tocarán dos veces en otros y tocarán una vez como se esperaba. Este error no se ha informado en ninguna otra plataforma de hardware para mi aplicación. Solo he visto un incidente informado de esto en este sitio y la persona cambió a usar MediaPlayer, pero realmente quiero obtener un remedio para esto.Problema con Soundpool y Samsung Galaxy S

Cuando la aplicación se ejecuta inicia la Soundpool de la siguiente manera,

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

sonido son entonces jugó llamando a los siguientes sub, (PlaySound es un mundial conmutado por las opciones de usuario)

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

} 

Como puede ver, hay una llamada de registro que solía ver cuántas veces se había llamado al submarinista, aunque esto reveló que cuando se produce el error, la rutina solo se invoca una vez cuando el sonido se escucha dos veces desde el dispositivo.

También tengo un último sub que se llama cuando se destruye la vista de superficie para poner en orden.

public void ReleaseSounds() 
{ 
    if (soundPool != null) 
    { 

    soundPool.release(); 
    soundPool = null; 

    } 
} 

¿Alguien más ha tenido este problema, de ser así cómo lo resolvió? Cualquier ayuda en esto sería muy apreciada,

Muchas gracias de antemano

+0

Ok, es temprano pero el problema parece haberse ido. Los archivos de sonido en la carpeta raw eran una mezcla de wav y mp3 (los formatos originales), desde entonces los he convertido al formato OGG y desde las pruebas iniciales parece más estable. – Steven

Respuesta

8

la conversión de archivos de sonido a OGG en la carpeta prima parece haber resuelto este error - No he visto una repetición de la misma desde entonces.

+1

Tienes suerte: los bloqueos de mp3 + soundpool en algunos teléfonos funcionan en otros. Cambié a OGG también, aunque no se comprimen también. – richq

+0

Esto parece resolver este error extraño para mí también ... (wav-> ogg) ¡Gracias! – sstn

+0

¿Los teléfonos Android tienen decodificadores de hardware para ogg? – slf

Cuestiones relacionadas