2011-12-13 5 views
4

Я программирование для 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;
  • Состояние воспроизведения аудиодорожек «играет»
  • исключений в функции модели.

Любые идеи были бы высоко оценены!

ответ

2

OK Я нашел проблему.

В текущей документации AudioTrack относительно AudioTrack и короткого ввода буфера есть ошибка: указанный размер буфера должен быть размером самого буфера (buffer.length) и не размер в байтах.

Смежные вопросы