AudioTrack перезапускается даже после его остановки - PullRequest
16 голосов
/ 06 декабря 2011

Я создал простое приложение, которое генерирует прямоугольную волну заданной частоты и воспроизводит ее, используя AudioTrack в режиме STREAM (STREAM_MUSIC).Кажется, что все работает нормально, и звук воспроизводится нормально, однако, когда поток заканчивается, я получаю сообщения в журнале:

W / AudioTrack (7579): trackBoxff () track 0x14c228 отключен, перезапуск ...

Даже после вызова функции stop () я все равно получаю это.Я считаю, что правильно установил размер буфера AudioTrack, исходя из минимального размера, требуемого AudioTrack (в моем случае 6x1024).Я кормлю его меньшими буферами из 1024 шорт.

Это нормально, что я получаю их, и я должен оставить это так?

Ответы [ 4 ]

15 голосов
/ 10 декабря 2011

Хорошо, я думаю, что проблема решена. Ошибка генерируется, когда буфер не полностью заполнен данными о времени (переполнение буфера). Я понятия не имею, какое время ожидания, но если вы испытываете это, убедитесь, что:

  1. Вы не вызываете метод воспроизведения, пока у вас нет данных в буфере.

  2. Вы можете генерировать данные достаточно быстро, чтобы сократить время ожидания.

  3. После того, как вы закончили заполнять буфер данными, перед вызовом метода stop () убедитесь, что «последний» буфер был полностью заполнен данными до истечения времени ожидания.

Я имел дело с последней проблемой: всегда немного ждал (до истечения времени ожидания), затем отправлял 1 буфер, полный нулей, и, наконец, вызывал функцию stop ().

Имейте в виду, что вы всегда должны отправлять буфер меньшими порциями, даже если у вас есть большой готовый блок. Меня все еще беспокоит, что я не на 100% уверен, что это правильный путь, но ошибки исчезли, поэтому я думаю, что смогу с этим смириться:)

5 голосов
/ 03 апреля 2012

Я обнаружил, что даже если буфер технически достаточно длинный и заполнен байтами, если они не отформатированы должным образом (звуковые шорты преобразованы в байтовый массив), он все равно выдаст вам эту ошибку.

4 голосов
/ 27 ноября 2012

Я получил это предупреждение, когда создал экземпляр Audiotrack, названный audioTrack.play(), и между вызовом play() и audioTrack.write() произошла небольшая задержка. Если я позвонил play() прямо перед write(), предупреждение исчезло.

0 голосов
/ 17 октября 2015

Я решил этим

        if (mAudioTrack.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING)
            mAudioTrack.play();
        mAudioTrack.write(b, 0, sz * 2);
        mAudioTrack.stop();
        mAudioTrack.flush();
...