2010-11-30 10 views
6

¿Cómo puedo saber si un sonido ha terminado de reproducirse?¿Cómo puedo saber si un sonido ha terminado de reproducirse en Android?

Quiero reproducir 2 sonidos pero quiero un sonido para reproducir y luego esperar hasta que el 1er sonido esté listo antes de que comience el 2do.

Además, si quería hacer algo más cuando el sonido está terminado como mostrar la próxima vista en una aleta de vista, ¿podría hacerlo?

Ahora mismo estoy usando SoundPool para reproducir mis sonidos.

Respuesta

3

utilizar la clase MediaPlayer y un OnCompletionListener

+3

¿No hay una manera de hacer esto con SoundPool? Necesito la baja latencia de SoundPool. – cmerrell

+0

De acuerdo con Dahlgren MediaPlayer es el camino a seguir. Puede pre-laod el sonido con prepare(), luego start() cuando esté listo para obtener una reproducción de baja latencia. – Darrell

+0

¿Puedo cargar más de 20 sonidos usando MediaPlayer, o tengo que tener más de 20 instancias de MediaPlayer? – cmerrell

0

sólo una idea ... get ogg/wav duración de tiempo de reproducción de sonido y usar su propia clase SoundObject con el miembro del temporizador. Actualízalo en alguna función de actualización. Si timer> maxtime + threshold, marcarlo como terminado.

0

La manera en que resolví esto es crear una secuencia de animación que contenga una imagen, un sonido y un retraso. Luego puedo ponerlos en cola para que se pueda mostrar una imagen y acompañar el sonido, y luego cambiar a otra imagen. Hago esto con un SoundPlayer y una vista personalizada (no una aleta de vista, aunque es probable que pueda)

El truco es que no puede simplemente pausar el hilo para el retraso, necesitará usar un controlador para envíese un mensaje para actualizar la IU en el futuro.

Aquí es el controlador

handler = new Handler() { 

      /* (non-Javadoc) 
      * @see android.os.Handler#handleMessage(android.os.Message) 
      */ 
      @Override 
      public void handleMessage(Message msg) { 
       if (msg.what == NEXT_ITEM_MSG) { 
        showNext(); 
       } 
       else if (msg.what == SEQUENCE_COMPLETE_MSG) { 
        // notify the listener 
        if (animationCompleteListener != null) { 
         animationCompleteListener.onAnimationComplete(); 
        } 
       } 
      } 
     }; 

El shownext() método simplemente agarra el siguiente elemento de la secuencia, se actualiza la vista de la imagen, reproduce el sonido, y luego los horarios de un mensaje para el controlador de llamar shownext después la secuencia.

private void showNext() { 
     if (mRunning) { 
      // Get the first item 
      AnimatedSequenceItem item = currentSequence.getNextSequenceItem(); 
      if (item == null) { 
       Message msg = handler.obtainMessage(SEQUENCE_COMPLETE_MSG); 
       handler.sendMessage(msg); 
       return; 
      } 
      // Show the first image 
      showImage(item.getImageResId()); 
      // Play the sound 
      int iSoundResId = item.getSoundResId(); 
      if (iSoundResId != -1) { 
       playSound(iSoundResId); 
      } 

      // schedule a message to advance to next item after duration 
      Message msg = handler.obtainMessage(NEXT_ITEM_MSG); 
      handler.sendMessageDelayed(msg, item.getDuration()); 
     } 
    } 

Por supuesto, todo esto evita la necesidad de determinar y codificar los retrasos, pero en mi experiencia que necesita para hacer eso por un juego de todos modos. Tuve muchos casos en los que quería que la demora fuera más larga que el sonido. Aquí está el código que realmente pone en cola elementos.

battleSequence.addSequenceItem(R.drawable.brigands, 
        R.raw.beep, 
        2000); 
battleSequence.addSequenceItem(R.drawable.black, 
           winning ? R.raw.enemy_hit : R.raw.player_hit, 
           1500); 

Con este enfoque que puedo tener todo tipo de lógica para añadir elementos de animación, duraciones de cambio, animaciones bucle, etc ... que sólo tuvo algunos ajustes para obtener los retrasos derecha.

Espero que esto ayude.

0

Lo siento, es demasiado tarde para responder. Pero usé la API isPlaying() del reproductor de medios para esperar a que se complete la primera canción.

while(mediaPlyaer.isPlaying()){ 
} 
Cuestiones relacionadas