2010-12-13 18 views
8

Ich muss zwei Instanzen von AudioTrack zur gleichen Zeit ausführen. Sie müssen separat laufen, weil ich sie mit unterschiedlichen, variablen Abtastraten spiele. Ich habe festgestellt, dass, wenn ich sie im selben Thread laufe, sie sich "abwechseln". Ich führe sie jeweils in ihrem eigenen Thread, aber das Audio stottert.Android: Mischen mehrerer AudioTrack-Instanzen?

Irgendwelche Ideen, um zwei Instanzen schön zu machen? Wenn nicht, irgendwelche Tipps zum Mischen von zwei kurzen Puffern in einen, auch wenn ich sie mit unterschiedlichen Sample-Raten spielen möchte.

Antwort

11

Ich habe 4 audioTracks auf einmal spielen und sie scheinen gut zu spielen. Testen auf HTC Desire 1.1ghz OC. Manchmal bekomme ich Probleme mit dem Threading. Gelegentlich, wenn alle vier spielen, hört man nicht auf, wenn ich versuche, dem Thread beizutreten. Müssen mehr Tests durchführen. Hier ist meine Klasse zum Abspielen einer WAV-Datei zu einem bestimmten Pfad

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

Dank aufgezeichnet zurück! Werde das versuchen. Ich erstelle meinen AudioTrack nicht im Thread-Callback, wie Sie es sind. Ich schätze, das ist die Heilung (der Rest Ihres Codes ist fast identisch mit dem, was ich habe). Das würde erklären, warum die beiden AudioTracks "toggeln" - sie blockieren sich gegenseitig. – BTR

+0

Lassen Sie mich wissen, ob dies für Sie funktioniert. Ich habe auch all das in einer anderen Klasse eingepackt, die die gesamte Thread-Verwaltung für mich übernimmt. Ich kann dann den Thread-Manager anrufen und muss mich nicht um das Threading kümmern, um die Streams aufzunehmen oder abzuspielen. – DeliveryNinja

+2

Es gab ein wenig mehr als das, aber der eigentliche Schlüssel war das Erstellen des AudioTrack innerhalb des Threads. Ich hatte eine separate Art von "Device" -Klasse, so dass ich Tempo, Lautstärke usw. darauf kontrollieren konnte. Wenn man es in die Klasse einfügt, die die Datei liest und alles in einem Thread macht, können sie gut spielen. Mache jetzt Tracks auf meinem Optimus (600MHz). :) – BTR

Verwandte Themen