Android Как установить цикл на AudioTrack? - PullRequest
0 голосов
/ 02 апреля 2012

Я играю WAV-файлы, используя AudioTrack.У меня проблема.Я установил setLoopPoints для зацикливания моих WAV-файлов, но он не работает.

Это мой пример кода.

public class PleaseActivity extends Activity implements Runnable{
AudioTrack audioTrack;
public static final String MEDIA_PATH    = Environment.getExternalStorageDirectory().getAbsolutePath()+"/TEST";
/** Called when the activity is first created. */
  Button play_button, stop_button;
  File file = null;
  byte[] byteData = null;
  Boolean playing = false;
  int bufSize;
  AudioTrack myAT = null;
  Thread play_thread = null;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    play_button = (Button) findViewById(R.id.btn1);
    stop_button = (Button) findViewById(R.id.btn2);


    file = new File(MEDIA_PATH+"/untitled1.wav");
    byteData = new byte[(int) file.length()];   
    FileInputStream in = null;

    try {
      in = new FileInputStream(file);
      in.read(byteData);
      in.close();
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }


    initialize();


    play_button.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {

        play_thread.start();
      }
    });

    //
    stop_button.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        //
        if (myAT.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
          myAT.stop();
          play_thread = null;
          initialize();
        }
      }
    });

  }


  void initialize() {

    bufSize = android.media.AudioTrack.getMinBufferSize(44100,
            AudioFormat.CHANNEL_CONFIGURATION_STEREO,
        AudioFormat.ENCODING_PCM_16BIT);

    myAT = new AudioTrack(AudioManager.STREAM_MUSIC,
        44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
        AudioFormat.ENCODING_PCM_16BIT, bufSize,
        AudioTrack.MODE_STREAM);



    play_thread = new Thread(this);
  }


  public void run() {
    if (myAT != null) {

      myAT.play();
      myAT.setLoopPoints(0, byteData.length, 2);
      myAT.write(byteData, 0, byteData.length);


    }
  }


}

Я могу хорошо воспроизводить свои волновые файлы, но setLoopPointsне работает!Кто-нибудь поможет мне ..


Я решил эту проблему зацикливания, как это.У меня есть другая проблема.всякий раз, когда я записывал данные в аудиотреки, я имею в виду, что всякий раз, когда аудиотреки повторяются, в первой части добавляется некоторый шум, такой как «галочка».Я не знаю, как устранить этот шум .. Кто-нибудь знает, как его решить?

class DLThread extends Thread
    {
        public void run() 
        {
            while(!DLThread.interrupted())
            {
                if (myAT != null) {
                      //

                      myAT.play();
                      myAT.flush();
                      myAT.write(byteData, 0, byteData.length);
                    }
            }


        }

    }

Ответы [ 2 ]

1 голос
/ 16 ноября 2014

Галочка, вероятно, является заголовком файла WAV. Попробуйте сместить воспроизведение на 44 байта.

1 голос
/ 29 августа 2013

public int setLoopPoints (int startInFrames, int endInFrames, int loopCount)

Устанавливает точки цикла и количество циклов. Цикл может быть бесконечным. Аналогично setPlaybackHeadPosition, дорожка должна быть остановлена ​​или приостановлена ​​для изменения позиции, и * должен использовать режим MODE_STATIC *.

...