AudioTrack перезапускается даже после остановки

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

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

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

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


person Chris Koston    schedule 06.12.2011    source источник


Ответы (4)


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

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

  2. Вы можете генерировать данные достаточно быстро, чтобы превзойти тайм-аут.

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

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

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

person Chris Koston    schedule 10.12.2011

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

person HannahMitt    schedule 02.04.2012

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

person user1856874    schedule 27.11.2012
comment
В этом и смысл — заполнять буфер данными перед вызовом play. Затем убедитесь, что вы можете генерировать данные вовремя. У вас будет задержка, и она зависит от вашего телефона (минимальный размер буфера), используемой частоты дискретизации и динамического разрешения. В моем случае (HTC Desire) 6kB. Это около 3000 16-битных монофонических сэмплов. Вы можете легко рассчитать результирующую задержку, принимая во внимание частоту дискретизации. Если вы используете собственный аудио API, вы можете получить гораздо меньшие задержки, но все же далеко от крошечных 5 мс iPhone... - person Chris Koston; 03.12.2012

Я решил это

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