2011-12-13 2 views
4

나는 안드로이드 2.1 용으로 프로그래밍하고 있습니다. 다음 문제를 도와 줄 수 있습니까?Eclipse에서 버퍼로 AudioTrack 버퍼로 음악 재생 - 소리 없음

나는 세 개의 파일을 가지고 있으며 일반적인 용도는 버퍼에 의해 audiotrack 버퍼로 사운드를 재생하는 것입니다. 모든 것을 시도했기 때문에 필자는 여기서 필사적으로 변했습니다. 내 스피커에서 소리가 나오지 않습니다 (안드로이드의 통합 미디어 플레이어는 에뮬레이터를 통해 소리를 재생하는 데 문제가 없습니다).

소스 코드 : 오디오 트랙을 구현

audioplayer 클래스. 사운드가 포함 된 버퍼를 수신합니다.

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

내가 버퍼를 채우기 위해 사용하는 모델 클래스. 일반적으로 파일에서 사운드를로드하지만 여기에서는 디버깅을 위해 시뮬레이터 (440Hz) 만 사용합니다.

버퍼 크기는 매우 느슨하게 선택됩니다. 일반적으로 첫 번째 버퍼 크기는 6615이고 4410이어야합니다. 다시 한 번 디버그를위한 것입니다. model.ontimechange() 매 200 밀리 호출

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 클래스.

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보다 큽니다.
  • Audiotrack의 재생 상태가 "재생 중"
  • 모델 기능에서 예외가 발견되지 않습니다.

모든 아이디어가 크게 감사하겠습니다!

답변

2

확인 문제가 발견되었습니다.

AudioTrack은 짧은 입력 버퍼에 관한 현재 AudioTrack 문서에 오류가 : 지정된 버퍼 크기는 버퍼 자체 (buffer.length) 및 하지 바이트 크기의 사이즈이어야한다.