Я программирование для Android 2.1.Не могли бы вы помочь мне со следующей проблемой?Воспроизведение музыки с буфером AudioTrack буфером на Eclipse - без звука
У меня есть три файла, и общая цель состоит в том, чтобы воспроизвести звук с буфером звукового сигнала буфером. Я становлюсь довольно отчаянным, потому что я пробовал все, и из моих динамиков не осталось звука (в то время как интегрированный медиаплеер андроидов не испытывает никаких проблем с воспроизведением звука через эмулятор).
код Источник:
аудиоплеера класс, который реализует звуковую дорожку. Он получит буфер, в котором содержится звук.
public AudioPlayer(int sampleRate, int channelConfiguration, int audioFormat) throws ProjectException {
minBufferSize = AudioTrack.getMinBufferSize(sampleRate, channelConfiguration, audioFormat);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, channelConfiguration,
audioFormat, minBufferSize, AudioTrack.MODE_STREAM);
if(audioTrack == null)
throw new ProjectException("Erreur lors de l'instantiation de AudioTrack");
audioTrack.setStereoVolume((float)1.0, (float)1.0);
}
@Override
public void addToQueue(short[] buffer) {
audioTrack.write(buffer, 0, buffer.length*Short.SIZE);
if(!isPlaying) {
audioTrack.play();
isPlaying = true;
}
}
модель класса, который я использую для заполнения буфера. Обычно он загружает звук из файла, но здесь он просто использует симулятор (440 Гц) для отладки.
Размеры буфера выбраны очень свободно; обычно первый размер буфера должен быть 6615, а затем 4410. Это опять же только для отладки.
public void onTimeChange() {
if(begin) {
//First fill about 300ms
begin = false;
short[][] buffer = new short[channels][numFramesBegin];
//numFramesBegin is for example 10000
//For debugging only buffer[0] is useful
fillSimulatedBuffer(buffer, framesRead);
framesRead += numFramesBegin;
audioPlayer.addToQueue(buffer[0]);
}
else {
try {
short[][] buffer = new short[channels][numFrames];
//Afterwards fill like 200ms
fillSimulatedBuffer(buffer, framesRead);
framesRead += numFrames;
audioPlayer.addToQueue(buffer[0]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private short simulator(int time, short amplitude) {
//a pure A (frequency=440)
//this is probably wrong due to sampling rate, but 44 and 4400 won't work either
return (short)(amplitude*((short)(Math.sin((double)(simulatorFrequency*time)))));
}
private void fillSimulatedBuffer(short[][] buffer, int offset) {
for(int i = 0; i < buffer[0].length; i++)
buffer[0][i] = simulator(offset + i, amplitude);
}
timeTask класс, который вызывает model.ontimechange() каждые 200 мс.
public class ReadMusic extends TimerTask {
private final Model model;
public ReadMusic(Model model) {
this.model = model;
}
@Override
public void run() {
System.out.println("Task run");
model.onTimeChange();
}
}
Что отладка показала мне:
- timeTask работает отлично, он делает свою работу;
- Буферные значения кажутся согласованными, а размер буфера больше minBufSize;
- Состояние воспроизведения аудиодорожек «играет»
- исключений в функции модели.
Любые идеи были бы высоко оценены!