2010-12-13 21 views
8

Aynı anda iki örnek AudioTrack çalıştırmam gerekiyor. Ayrı ayrı çalışmalılar çünkü farklı, değişken örnek oranlarında oynuyorum. Onları aynı iş parçasında çalıştırırsam, "sırayla" alırlar. Her birini kendi iş parçasında çalıştırıyorum, ama ses kesiliyor.Android: Birden çok AudioTrack örneğini karıştırmak?

İki örnek yapmak için herhangi bir fikir güzel midir? Değilse, iki kısa arabellekleri karıştırmak için herhangi bir ipucu, farklı örnek oranlarında oynamak istesem bile.

cevap

11

Aynı anda 4 tane ses Kaydı var ve iyi görünüyorlar. HTC Desire 1.1ghz OC'de test. Bazen kırılmalarla iltihaplarım olur. Bazen dördün hepsi oynuyorsa, iş parçacığına katılmaya çalıştığımda durmaz. Daha fazla test yapmamız gerekiyor. İşte belirli bir yol

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

teşekkür kaydedilen bir wav dosyası çalmak için benim sınıftır! Bunu deneyeceğim. AudioTrack'ımı sizin gibi geri arama iş parçacığı içinde oluşturmuyorum. Sanırım tedavi budur (kodunuzun geri kalanı benim sahip olduğumla neredeyse aynıdır). Bu, iki AudioTrack'ın "geçiş" nedenini açıklar - birbirlerini bloke ederler. – BTR

+0

Bu iş sizin için uygunsa bana bildirin. Ayrıca tüm bunlar benim için tüm iplik yönetimini yapacak olan başka bir sınıfa sarıldı. Sonra iş parçacığı yöneticisini arayabilir ve akışları kaydetmek veya oynatmak için iş parçacığı hakkında endişelenmem gerekir. – DeliveryNinja

+2

Bundan biraz daha fazlası vardı, ama asıl anahtar iş parçacığı içindeki AudioTrack'ı yaratıyordu. Ayrı bir "Cihaz" sınıfı vardı, bu yüzden tempo, hacim, vb. Dosyayı okuyan ve hepsini tek bir iş parçacığında gerçekleştiren sınıfa dahil olmak, onları güzel oynamasını sağladı. Şimdi DJim Optimus'umda (600mHz). :) – BTR