2013-11-15 6 views
2

Я создаю внутри своего существующего приложения плеер, использующий класс AudioTrack, в MODE_STATIC, потому что я хочу реализовать функции timestretch и loop points. Код в порядке для start() и stop(), но при паузе, если я попытаюсь возобновить, снова вызов play(), строка состояния останется фиксированной и звук не воспроизводится.Media Player с использованием класса AudioTrack не возобновляется после паузы()

Теперь, из документации:

Public аннулируются пауза() Приостановка воспроизведения аудиоданных. Данные, которые не были воспроизведены> назад, не будут отброшены. Последующие вызовы play() будут воспроизводить эти данные. См.> Flush(), чтобы отменить эти данные.

Кажется, так легко понять, но есть что-то, что ускользает от меня. Может кто-нибудь мне помочь?

Нужно ли создавать логические переменные, такие как запуск, воспроизведение, пауза, остановка и т. Д.? Если да, то где полезность методов, унаследованных от класса AudioTrack?

В MODE_STREAM я реализовал проект, используя приведенные выше булевы переменные., Но мне нужен MODE_STATIC.

Это код, спасибо:

Button playpause, stop; 
SeekBar posBar; 
int sliderval=0; 
int headerOffset = 0x2C; 
File file =new File(Environment.getExternalStorageDirectory(), "raw.pcm"); 
int fileSize = (int) file.length(); 
int dataSize = fileSize-headerOffset ; 
byte[] dataArray = new byte[dataSize]; 
int posValue; 
int dataBytesRead = initializeTrack(); 
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, 
     AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, dataBytesRead , AudioTrack.MODE_STATIC); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 

    playpause= (Button)(findViewById(R.id.playpause)); 
    stop= (Button)(findViewById(R.id.stop)); 

    posBar=(SeekBar)findViewById(R.id.posBar); 

    // create a listener for the slider bar; 
    OnSeekBarChangeListener listener = new OnSeekBarChangeListener() { 
     public void onStopTrackingTouch(SeekBar seekBar) { } 
     public void onStartTrackingTouch(SeekBar seekBar) { } 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     if (fromUser) { sliderval = progress;} 
     } 
    }; 

    // set the listener on the slider 
    posBar.setOnSeekBarChangeListener(listener); } 


public void toggleButtonSound(View button) 
{ 
    switch (button.getId()) 
    { 
     case R.id.playpause: 
      play(); 
      break; 

     case R.id.stop: 
      stop(); 

      break; 
    } 

} 

    private void stop() { 
     if(audioTrack.getState()==AudioTrack.PLAYSTATE_PLAYING || 
       audioTrack.getState()==AudioTrack.PLAYSTATE_PAUSED || audioTrack.getState()==AudioTrack.PLAYSTATE_STOPPED) 
     { audioTrack.stop(); 
     resetPlayer();} 

} 


    Context context; 
    private double actualPos=0; 

    public void pause() {} 

    public void play() 
    { 


     if (audioTrack.getPlayState()==AudioTrack.PLAYSTATE_PLAYING) 
     { //Log.i("", "Play pressed in state "+audioTrack.getPlayState()); 
      audioTrack.pause(); 
      } 
     else if (audioTrack.getPlayState()==AudioTrack.PLAYSTATE_PAUSED) 
     { //Log.i("", "Play pressed in state "+audioTrack.getPlayState()); 
      audioTrack.play(); 
     } 
    else if (audioTrack.getPlayState()==AudioTrack.PLAYSTATE_STOPPED) 
    {  //Log.i("", "Play pressed in state "+audioTrack.getPlayState()); 
     audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, dataSize, AudioTrack.MODE_STATIC); 
     audioTrack.write(dataArray, 0, dataBytesRead); 
     audioTrack.play(); 

     } 
     posBar.setMax((int) (dataBytesRead/2));  // Set the Maximum range of the 

      audioTrack.setNotificationMarkerPosition((int) (dataSize/2)); 
      audioTrack.setPositionNotificationPeriod(1000); 
      audioTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener() { 
      @Override 
      public void onPeriodicNotification(AudioTrack track) { 
       posBar.setProgress(audioTrack.getPlaybackHeadPosition()); 
       Log.i("", " " + audioTrack.getPlaybackHeadPosition() + " " + dataBytesRead/2); 
      } 
      @Override 
      public void onMarkerReached(AudioTrack track) { 
       Log.i("", " End reached "); 

       audioTrack.pause(); 
       audioTrack.flush(); 
       audioTrack.release(); 
       posBar.setProgress(0); 
       resetPlayer();} 
     }); 
    } 



     private int initializeTrack() { 
      InputStream is; 
      BufferedInputStream bis; 
      DataInputStream dis; 
      int temp = 0; 
      try { 
       is = new FileInputStream(file); 
       bis = new BufferedInputStream(is); 
       dis = new DataInputStream(bis); 
       temp = dis.read(dataArray, 0, dataSize); 
       dis.close(); 
       bis.close(); 
       is.close(); 
      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return temp; 
     } 

     public void resetPlayer() { 
      audioTrack.flush(); 
      audioTrack.release(); 
      posBar.setProgress(0); 
      sliderval=0; 
      } 

ответ

0

Вы видите, вы сделали осуществить аудиодорожки так, что даже тогда, когда его пауза содержимого файла еще загружать в AudioTrack:

Я не знаю, как он управляет им, но в моем случае я также приостанавливаю передачу данных на AT. Вроде:

  while (byteOffset < fileLengh) { 
       if(isPaused) 
        continue; 
       ret = in.read(byteData, 0, byteCount); 
       if (ret != -1) { // Write the byte array to the track 
        audioTrack.write(byteData, 0, ret); 
        byteOffset += ret; 
       } else 
        break; 
      } 

Итак, я приостанавливаю AT-загрузку файла, пока цикл возобновляется. Наверное, все. Кроме того, я должен отметить, что даже когда AT играет следующее:

if (audioTrack.getPlayState()==AudioTrack.PLAYSTATE_PLAYING) 

и

if (audioTrack.getPlayState()==AudioTrack.PLAYSTATE_PAUSED) 

не работает для меня и getPlayState() всегда возвращает 1 (AudioTrack.PLAYSTATE_STOPPED) для меня, независимо от того, играли ли они или были приостановлены.