2010-12-13 10 views
8

Je dois exécuter deux instances d'AudioTrack en même temps. Ils doivent fonctionner séparément car je les joue à des fréquences d'échantillonnage différentes et variables. J'ai trouvé que si je les cours dans le même fil, ils "se relaient". Je les lance chacun dans leur propre fil, mais l'audio bégaie.Android: mélange de plusieurs instances AudioTrack?

Avez-vous des idées pour créer deux instances? Si ce n'est pas le cas, des conseils sur le mélange de deux tampons courts en un, même si je veux les jouer à des fréquences d'échantillonnage différentes.

Répondre

11

J'ai 4 pistes audio en même temps et elles semblent fonctionner correctement. Test sur HTC Desire 1.1ghz OC. Je rencontre parfois des problèmes avec le filetage. De temps en temps si tous les quatre jouent, on ne s'arrêtera pas quand j'essayerai de rejoindre le fil. Besoin de faire plus de tests. Voici ma classe pour la lecture d'un fichier wav enregistré à un chemin

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

donné de Merci! Je vais essayer ça. Je ne crée pas mon AudioTrack dans le rappel de thread comme vous l'êtes. Je suppose que c'est le remède (le reste de votre code est presque identique à ce que j'ai). Cela expliquerait pourquoi les deux "toggle" de l'AudioTrack - ils se bloquent mutuellement. – BTR

+0

Faites-moi savoir si cela fonctionne pour vous. J'ai aussi tout cela enveloppé dans une autre classe qui fera tout le fil de la gestion pour moi. Je peux ensuite appeler le gestionnaire de threads et ne pas avoir à se soucier de l'enfilage pour l'enregistrement ou la lecture des flux. – DeliveryNinja

+2

Il y avait un peu plus à cela que cela, mais la vraie clé était la création de l'AudioTrack à l'intérieur du fil. J'avais une classe séparée de "Device" pour pouvoir contrôler le tempo, le volume, etc. En le combinant dans la classe qui lit le fichier et en le faisant tous dans un seul thread, ils ont été très gentils. Suis maintenant des pistes de DJ sur mon Optimus (600mHz). :) – BTR

Questions connexes