/* * 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(); } }