コード例 #1
0
ファイル: PlayerService.java プロジェクト: scarma/Music-Moves
  /*
   * echo() crea 3 audiotrack cloni di quelle "principali"
   * e ci applica un effetto creato con la classe EnvironmentalReverb
   * Due thread (timer1 e timer2) gestiscono l'avvio posticipato e l'interruzione dell'effetto
   */
  synchronized void echo() {
    if (isPlaying == true) {
      showToast("Echo on");
      if (echo != null) {
        echo.release();
      }

      // Creo effetto audio per le tracce ritardate che vado a sovrapporre
      echo = new EnvironmentalReverb(1, 0);
      echo.setDecayHFRatio((short) 1000);
      echo.setDecayTime(2000);
      echo.setDensity((short) 500);
      echo.setDiffusion((short) 700);
      echo.setReflectionsLevel((short) 1000);
      echo.setReverbLevel((short) 2000);
      echo.setReflectionsDelay(100);
      echo.setRoomLevel((short) -10);
      echo.setEnabled(true);

      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
      final int echotime = 1000 + preferences.getInt("recho", 10);
      final float iecho = preferences.getInt("iecho", 10) / 10;

      timer1 =
          new Thread() {
            @Override
            public void run() {
              try {
                audioXe = playSound(genArrayX);
                audioYe = playSound(genArrayY);
                audioZe = playSound(genArrayZ);
                audioXe.setPlaybackHeadPosition(audioX.getPlaybackHeadPosition());
                audioYe.setPlaybackHeadPosition(audioY.getPlaybackHeadPosition());
                audioZe.setPlaybackHeadPosition(audioZ.getPlaybackHeadPosition());
                audioXe.attachAuxEffect(echo.getId());
                audioXe.setAuxEffectSendLevel(iecho);
                audioYe.attachAuxEffect(echo.getId());
                audioYe.setAuxEffectSendLevel(iecho);
                audioZe.attachAuxEffect(echo.getId());
                audioZe.setAuxEffectSendLevel(iecho);
                audioXe.play();
                audioYe.play();
                audioZe.play();
                audioXe.pause();
                audioYe.pause();
                audioZe.pause();
                sleep(500); // Tempo in millisecondi di ritardo delle tracce
                // per creare l'effetto echo
              } catch (InterruptedException e) {
                e.printStackTrace();
              } finally {
                audioXe.play(); // Trascorso il tempo mando le tracce in riproduzi
                audioYe.play(); // (sovrapposte alle tracce audio "principali")
                audioZe.play();
                timer1.interrupt();
              }
              super.run();
            }
          };
      timer1.start();
      timer2 =
          new Thread() {
            @Override
            public void run() {

              try {
                sleep(
                    echotime); // Tempo in millisecondi a cui fermare l'echo (settabile tramite
                               // seekbar)
              } catch (InterruptedException e) {
                e.printStackTrace();
              } finally {
                if (audioXe.getState() == AudioTrack.STATE_INITIALIZED
                    && audioYe.getState() == AudioTrack.STATE_INITIALIZED
                    && audioZe.getState() == AudioTrack.STATE_INITIALIZED) {

                  audioXe.stop();
                  audioYe.stop();
                  audioZe.stop();

                  audioXe.release();
                  audioYe.release();
                  audioZe.release();
                  echo.release();
                  timer2.interrupt();
                }
              }
              super.run();
            }
          };
      timer2.start();
    }
  }