Autore Topic: AudioTrack non si stoppa  (Letto 1194 volte)

Offline MarkII

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    Ubuntu 11.10
AudioTrack non si stoppa
« il: 30 Marzo 2010, 19:43:24 CEST »
0
Sto cercando di far stoppare la riproduzione di un file audio dopo un tot di secondi stabilito da me , ma a quanto pare la riproduzione non viene interrotta affinchè non abbia riprodotto tutto cio che c'è nel buffer:

Codice: [Seleziona]
at.play();
at.write(data, 0, data.length);
at.stop();   
     

Queste sono le tre istruzioni che uso , anche mettendole una dietro l'altra lo stop() non ha effetto..
« Ultima modifica: 15 Maggio 2010, 17:21:18 CEST da JD »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:AudioTrack non si stoppa
« Risposta #1 il: 30 Marzo 2010, 20:20:04 CEST »
0
prova con

at.flush
at.stop
at.release

Offline MarkII

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    Ubuntu 11.10
Re:AudioTrack non si stoppa
« Risposta #2 il: 30 Marzo 2010, 20:45:17 CEST »
0
no purtroppo non funziona..
continua a riprodurre tutto..

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:AudioTrack non si stoppa
« Risposta #3 il: 30 Marzo 2010, 21:10:43 CEST »
0
cosa usi come bufferSize?

Offline MarkII

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    Ubuntu 11.10
Re:AudioTrack non si stoppa
« Risposta #4 il: 30 Marzo 2010, 21:35:04 CEST »
0
questo :
Codice (Java): [Seleziona]
minBuffer = AudioTrack.getMinBufferSize(48000,
                                AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                                AudioFormat.ENCODING_PCM_16BIT);
« Ultima modifica: 30 Marzo 2010, 21:36:30 CEST da JD »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:AudioTrack non si stoppa
« Risposta #5 il: 01 Aprile 2010, 01:04:11 CEST »
0
se ti va posta il tuo codice (integrale), oppure meglio allega uno zip di un progettino che riproduce il problema.
così provo/proviamo e ti dico se trovo una soluzione al tuo problema....

Offline MarkII

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    Ubuntu 11.10
Re:AudioTrack non si stoppa
« Risposta #6 il: 01 Aprile 2010, 10:19:23 CEST »
0
ti allego la mia classe  nota.. premetto che sono un principiante  :-\

Comunque ho anche provato a riempire il buffer di zeri e poi scrivere ma non funziona lo stesso

grazie per l'aiuto

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:AudioTrack non si stoppa
« Risposta #7 il: 01 Aprile 2010, 17:07:52 CEST »
0
Ciao :) ho guardato il codice che mi hai postato.

il problema sta nel fatto che il metodo AudioTrack.write è bloccante, ovvero fintanto che non finisce di scrivere non ritorna, e quindi il tuo programma resta bloccato nel punto in cui lo chiami.
Per ovviare a tutto ciò possiamo far partire il metodo write all'interno di una thread :)


Codice (Java): [Seleziona]
public class Nota {

        private AudioTrack at;
        private File file;
        private int minBuffer;
        private byte[] data;
        FileInputStream in = null;
        Thread writingThread;
       
        int kHz=48000;

        public Nota(){
                file = new File("/sdcard/ding.wav");
                data = new byte[(int) file.length()];

                try {
                        in = new FileInputStream(file);
                        in.read(data);
                        in.close();
                } catch (Exception e) {
                        Log.e(Suona.tag, e.toString());
                }

                minBuffer = AudioTrack.getMinBufferSize(48000,
                                AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                                AudioFormat.ENCODING_PCM_16BIT);
               
                Log.v(Suona.tag, ""+minBuffer);
               
                at = new AudioTrack(AudioManager.STREAM_MUSIC, 48000,
                                AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                                AudioFormat.ENCODING_PCM_16BIT, minBuffer,
                                AudioTrack.MODE_STREAM);
               
                at.setStereoVolume(100, 100);
               
               

        }

        public void play() {

                kHz=48000;
                at.setPlaybackRate(kHz);
                at.play();
               
                writingThread=new Thread(new Runnable() {
                       
                        @Override
                        public void run() {    
                                at.write(data, 0, data.length);        
                        }
                });
               
                writingThread.start();
                       
               
        }

        public void stop(){
                at.stop();
                at.flush();    
               
        }
       
        public void distortion(){              
                if(kHz>=8000)
                at.setPlaybackRate(kHz-=1000);
        }
       
//      public void progressiva() {
//
//              for (int i = 100; i >= 0; i--)
//                      at.setStereoVolume(i, i);
//
//              at.stop();
//              at.flush();
//      }

        public int isPlaying() {
                return at.getPlayState();

        }

}

ho giocato un attimo con una distorsione :D

Codice (Java): [Seleziona]
public class Suona extends Activity {
        static String tag="suona";
    Nota n;
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
                n=new Nota();
    }
   
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action=event.getAction();
        switch (action) {
                case MotionEvent.ACTION_DOWN:
                        Log.v(tag, "play");
                        n.play();
                        return true;

                case MotionEvent.ACTION_MOVE:
                        Log.v(tag, "move");
                        n.distortion();
                        return true;
                       
                case MotionEvent.ACTION_UP:
                        Log.v(tag, "up");
                        n.stop();
                        return true;
                }
       
       
        return false;
    }
}



Ciao.
Qlimax


Offline MarkII

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    Ubuntu 11.10
Re:AudioTrack non si stoppa
« Risposta #8 il: 01 Aprile 2010, 18:49:45 CEST »
0
Sei un genio  :-)   ;-) ;-)

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:[RISOLTO] AudioTrack non si stoppa
« Risposta #9 il: 02 Aprile 2010, 12:01:04 CEST »
0
Sei un genio  :-)   ;-) ;-)
  O:-) addirittura...

ho modificato il titolo con risolto

Ciao :)