AudioTrack: как определить конец звука?


person Seva Alekseyev    schedule 04.10.2011    source источник
comment
Я не знаю никаких руководств, но вы всегда можете перейти прямо к источнику: github.com/android/platform_frameworks_base/blob/master/media/   -  person JesusFreke    schedule 04.10.2011
comment
Там почти нет Java-логики — все вызовы нативных функций.   -  person Seva Alekseyev    schedule 04.10.2011
comment
Верно, но это отправная точка, чтобы понять, как это работает. Вы всегда можете посмотреть на нативный код.   -  person JesusFreke    schedule 04.10.2011
comment
Который находится по адресу github.com/android/platform_frameworks_base/blob/master. /медиа/ . Теперь давайте посмотрим, смогу ли я понять логику, если я ничего не знаю о базовом API.   -  person Seva Alekseyev    schedule 04.10.2011


Ответы (1)


По моему опыту, вызов AudioTrack.write() блокируется до тех пор, пока данные не будут записаны в аудиобуфер HW.

Таким образом, после завершения write() звук гарантированно будет воспроизводиться. В принципе работает хорошо.

Чтобы точнее определить конец звука, используйте AudioTrack.setNotificationMarkerPosition() и AudioTrack.setPlaybackPositionUpdateListener(). Примечание. setNotificationMarkerPosition() подсчитывайте аудиосэмплы (не байты), поэтому, если ваш аудио имеет 16-битный сэмпл, позиция будет dataSize/2.

В моем проекте есть пример: https://github.com/mine260309/android-sexypsf-player/blob/psf2/src/com/mine/psf/sexypsf/MineSexyPsfPlayer.java

person Mine    schedule 11.09.2012
comment
В большинстве простых случаев вы, безусловно, правы, но ваши утверждения неверны. write() не всегда гарантирует, что он воспроизводит то, что получает. Смотрите следующий комментарий. - person Janos Vinceller; 25.03.2020
comment
Прочтите документ: в потоковом режиме поведение блокировки зависит от режима записи. Если режим записи WRITE_BLOCKING, запись обычно блокируется до тех пор, пока все данные не будут поставлены в очередь для воспроизведения, и будет возвращаться полный счетчик передачи. Однако, если режим записи WRITE_NON_BLOCKING, или дорожка остановлена ​​или приостановлена ​​при записи, или другой поток прерывает запись, вызывая остановку или паузу, или во время записи возникает ошибка ввода-вывода, запись может вернуть короткую передачу. считать. - person Janos Vinceller; 25.03.2020
comment
Кроме того, утверждение, что если ваш звук представляет собой 16-битный образец, позиция будет dataSize/2, не является точной, это зависит от более чем одной вещи. Количество каналов и байтов на данные на канал. И этот простой расчет работает только для линейного несжатого звука, такого как PCM, см. AudioFormat#getBytesPerSample(). - person Janos Vinceller; 25.03.2020