2011-05-30 9 views
9

Necesito transmitir datos de PCM generados en tiempo de ejecución. Así que tengo un hilo con un bucleAudioTrack en modo de transmisión MODE_STREAMING

public void run() { 
    while(...) { 
    mAudioTrack.write(getPCM(), ...); 
    } 
} 

Lamentablemente esto no funciona. Parece que no depende del tamaño del búfer de AudioTrack. Yo quiero que sea muy pequeño para simular el comportamiento del tipo de baja latencia (150 ms) para que el usuario de forma dinámica puede cambiar el PCM recogido por getPCM()

int bufferSize = 0.150 * sampleRate * channels * bitsPerSample/8; 

Sin embargo, he tratado de aumentar el tamaño del búfer hasta 100k sin resultado

Respuesta

13

Aquí es breve ejemplo que funciona para mí:

public class Internal extends Activity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);    
    } 

    public void onPlayClicked(View v) 
    { 
     start();  
    } 

    public void onStopClicked(View v) 
    { 
     stop(); 
    } 

    boolean m_stop = false; 
    AudioTrack m_audioTrack; 
    Thread m_noiseThread; 

    Runnable m_noiseGenerator = new Runnable() 
    {  
     public void run() 
     { 
      Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 

      /* 8000 bytes per second, 1000 bytes = 125 ms */ 
      byte [] noiseData = new byte[1000]; 
      Random rnd = new Random(); 

      while(!m_stop) 
      {   
       rnd.nextBytes(noiseData); 
       m_audioTrack.write(noiseData, 0, noiseData.length);     
      } 
     } 
    }; 

    void start() 
    { 
     m_stop = false; 

     /* 8000 bytes per second*/ 
     m_audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO, 
             AudioFormat.ENCODING_PCM_8BIT, 8000 /* 1 second buffer */, 
             AudioTrack.MODE_STREAM);    

     m_audioTrack.play();   


     m_noiseThread = new Thread(m_noiseGenerator); 
     m_noiseThread.start(); 
    } 

    void stop() 
    { 
     m_stop = true;   
     m_audioTrack.stop(); 
    } 
} 
+0

no saben lo que quiere decir. No puedo escuchar nada – Raffaele

+0

Este código funciona en dos dispositivos (aunque ambos Samsung). Revisa tus registros de LogCat, debería imprimir todos los detalles sobre 'AudioTrack'. – inazaruk

+0

Claro, tuve que agregar una llamada para comenzar() sobre la creación de la actividad. Entonces es un misterio que no funciona con datos PCM reales. Ahora voy a probar con un sonido A 440Hz generado por la máquina – Raffaele

Cuestiones relacionadas