2010-12-13 11 views
8

Muszę uruchomić dwa wystąpienia ścieżki AudioTrack w tym samym czasie. Muszą działać osobno, ponieważ gram je na różnych, zmiennych częstotliwościach próbkowania. Zauważyłem, że jeśli uruchomię je w tym samym wątku, "na zmianę". Używam ich w ich własnych wątkach, ale dźwięk się jąka.Android: Miksowanie wielu instancji AudioTrack?

Jakieś pomysły dotyczące robienia dwóch wystąpień są przyjemne? Jeśli nie, wszelkie wskazówki dotyczące mieszania dwóch krótkich buforów w jeden, nawet jeśli chcę je odtwarzać przy różnych częstotliwościach próbkowania.

Odpowiedz

11

Mam 4 ścieżki dźwiękowe odtwarzane jednocześnie i wydaje się, że grają dobrze. Testowanie w HTC Desire 1.1ghz OC. Czasami dostaję trzasków od gwintów. Czasami, jeśli wszystkie cztery są odtwarzane, nie zatrzyma się, gdy próbuję dołączyć do wątku. Musisz wykonać więcej testów. Oto moja klasa dla odtwarzania pliku wav nagrane w danej ścieżki

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

Dzięki! Spróbuję tego. Nie tworzę mojego AudioTrack w wywołaniu zwrotnym wątku takim, jakim jesteś. Zgaduję, że to jest lekarstwo (reszta twojego kodu jest prawie identyczna z tym, co mam). To wyjaśniałoby, dlaczego dwa przełączniki AudioTrack "blokują się". – BTR

+0

Daj mi znać, jeśli to działa dla Ciebie. Też mam wszystko to opakowane w inną klasę, która zrobi wszystko zarządzanie wątkami dla mnie. Mogę wtedy zadzwonić do menedżera wątków i nie martwić się o wątki do nagrywania lub odtwarzania strumieni. – DeliveryNinja

+2

Było w tym trochę więcej, ale prawdziwym kluczem było stworzenie ścieżki AudioTrack wewnątrz wątku. Miałem oddzielny rodzaj klasy "Urządzenie", dzięki czemu mogłem kontrolować tempo, głośność itp. Połączenie go z klasą, która odczytuje plik i robi to wszystko w jednym wątku, sprawia, że ​​gra się dobrze. Jestem teraz DJem utworów na moim Optimusie (600 MHz). :) – BTR

Powiązane problemy