2010-12-13 14 views
8

Necesito ejecutar dos instancias de AudioTrack al mismo tiempo. Deben ejecutarse por separado porque los estoy reproduciendo a distintas velocidades de muestreo variables. Descubrí que si los ejecuté en el mismo hilo, se "turnan". Los estoy ejecutando cada uno en su propio hilo, pero el audio es tartamudo.Android: ¿Mezcla varias instancias de AudioTrack?

¿Alguna idea sobre cómo hacer que dos instancias funcionen bien? Si no, cualquier consejo sobre cómo mezclar dos almacenamientos intermedios cortos en uno, incluso si quiero reproducirlos a diferentes frecuencias de muestreo.

Respuesta

11

Tengo 4 audioTracks tocando a la vez y parecen funcionar bien. Pruebas en HTC Desire 1.1ghz OC. Sin embargo, a veces tengo fallas técnicas en el roscado. Ocasionalmente, si los cuatro se están reproduciendo, uno no se detendrá cuando intente unirme al hilo. Necesita hacer más pruebas. Aquí es mi clase para reproducir un archivo WAV grabados en una ruta dada

package com.ron.audio.functions; 

import java.io.BufferedInputStream; 
import java.io.DataInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 

import android.media.AudioFormat; 
import android.media.AudioManager; 
import android.media.AudioTrack; 

public class AudioPlayManager implements Runnable { 

private File fileName; 
private volatile boolean playing; 

public AudioPlayManager() { 
    super(); 
    setPlaying(false); 
} 

public void run(){ 
     // Get the length of the audio stored in the file (16 bit so 2 bytes per short) 
     // and create a short array to store the recorded audio. 
     int musicLength = (int)(fileName.length()/2); 
     short[] music = new short[musicLength]; 

     try { 
     // Create a DataInputStream to read the audio data back from the saved file. 
     InputStream is = new FileInputStream(fileName); 
     BufferedInputStream bis = new BufferedInputStream(is); 
     DataInputStream dis = new DataInputStream(bis); 

     // Read the file into the music array. 
     int i = 0; 
     while (dis.available() > 0) { 
      music[i] = dis.readShort(); 
      i++; 
     } 

     // Close the input streams. 
     dis.close();  

     // Create a new AudioTrack object using the same parameters as the AudioRecord 
     // object used to create the file. 
     AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
               11025, 
               AudioFormat.CHANNEL_CONFIGURATION_MONO, 
               AudioFormat.ENCODING_PCM_16BIT, 
               musicLength, 
               AudioTrack.MODE_STREAM); 
     // Start playback 
     audioTrack.play(); 

     // Write the music buffer to the AudioTrack object 
     while(playing){ 
      audioTrack.write(music, 0, musicLength); 
     } 

     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 

} 


public void setFileName(File fileName) { 
    this.fileName = fileName; 
} 

public File getFileName() { 
    return fileName; 
} 

public void setPlaying(boolean playing) { 
    this.playing = playing; 
} 

public boolean isPlaying() { 
    return playing; 
} 

}

+0

Gracias! Intentaré esto. No estoy creando mi AudioTrack en la devolución de llamada del hilo como lo haces tú. Supongo que esa es la cura (el resto de tu código es casi idéntico al que tengo). Eso explicaría por qué los dos AudioTrack "alternan" - se están bloqueando entre sí. – BTR

+0

Avísame si esto funciona para ti. También tengo todo esto envuelto en otra clase que hará toda la gestión de subprocesos para mí. Luego puedo llamar al administrador de subprocesos y no tener que preocuparme por el subprocesamiento para grabar o reproducir las transmisiones. – DeliveryNinja

+2

Había un poco más que eso, pero la verdadera clave era crear el AudioTrack dentro del hilo. Tenía una clase separada de "Dispositivo" para poder controlar el tempo, el volumen, etc. en él. Combinarlo en la clase que lee el archivo y hacerlo todo en un solo hilo hace que jueguen bien. Ahora estoy pinchando pistas en mi Optimus (600mHz). :) – BTR

Cuestiones relacionadas