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;
}
}
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
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
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