2011-12-06 9 views
16

Ho creato una semplice applicazione che genera un'onda quadra di frequenza specificata e la riproduce con AudioTrack in modalità STREAM (STREAM_MUSIC). Tutto sembra funzionare bene e il suono gioca bene, ma quando il flusso è finito ricevo messaggi nel registro:AudioTrack riavvio anche dopo l'interruzione

W/AudioTrack (7579): obtainBuffer() pista 0x14c228 disabili, riavviando ...

Anche dopo aver chiamato la funzione stop() continuo a riceverli. Credo di aver impostato correttamente la dimensione del buffer AudioTrack, in base alle dimensioni minime richieste da AudioTrack (nel mio caso 6x1024). Lo nutro con buffer più piccoli di 1024 cortometraggi.

Va bene che sto ricevendo questi e dovrei lasciarlo così?

risposta

15

Ok, penso che il problema sia risolto. L'errore viene generato quando il buffer non è completamente riempito con dati in tempo (buffer underrun). Non ho idea di quello che il timeout non è che se si verifica questo assicuro che:

  1. non chiami il metodo di esecuzione fino a quando si dispone di alcuni dati nel buffer.

  2. È possibile generare i dati abbastanza velocemente da superare il timeout.

  3. Dopo aver terminato di alimentare il buffer con i dati, prima di chiamare il metodo stop(), assicurarsi che il "ultimo" buffer sia stato completamente riempito con i dati prima del timeout.

ho affrontato l'ultimo numero da sempre in attesa di una funzione po '(fino al timeout) e poi l'invio di 1 buffer pieno di zeri e, infine, chiamando la fermata().

Ricordare che è necessario inviare sempre il buffer in blocchi più piccoli, anche se il grosso pezzo è pronto. Mi infastidisce ancora un po 'che non sono sicuro al 100% se quello è il modo giusto ma gli errori sono spariti quindi suppongo di poter vivere con quello :)

5

Ho trovato che anche quando il buffer è tecnicamente abbastanza lungo e pieno di byte, se non sono formattati correttamente (i corti audio convertiti in un array di byte) continueranno a generare quell'errore.

4

Stavo ricevendo questo avviso quando ho istanziato l'Audiotrack, chiamato audioTrack.play() e c'era un leggero ritardo tra la chiamata play() e lo audioTrack.write(). Se ho chiamato play() subito prima dello write(), l'avviso è scomparso.

+0

Questo è il punto - riempire il buffer con i dati prima di chiamare il gioco. Quindi assicurati di poter generare i dati in tempo. Avrai latenza e dipende dal tuo telefono (dimensione del buffer minima), frequenza di campionamento e risoluzione dinamica che usi. Im my case (HTC Desire) 6kB. Si tratta di circa 3000 campioni mono a 16 bit. È possibile calcolare facilmente la latenza risultante prendendo in considerazione la frequenza di campionamento. Se usi l'API audio nativa puoi ottenere latenze molto più piccole, ma ancora lontane dai minuscoli 5ms di iPhone ... –

0

ho risolto da questo

 if (mAudioTrack.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING) 
      mAudioTrack.play(); 
     mAudioTrack.write(b, 0, sz * 2); 
     mAudioTrack.stop(); 
     mAudioTrack.flush();