AudioTrack WRITE_BLOCKING против WRITE_NON_BLOCKING - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь выяснить, как именно работает Android AudioTrack.Одна из путаниц для меня - это режим записи.

Документация для метода write () указывает, что вы можете передать либо режим записи WRITE_BLOCKING, либо WRITE_NON_BLOCKING .

На основании описаний блокирует ли WRITE_BLOCKING до тех пор, пока все данные не будут воспроизведены?Так, например, если у меня есть буфер монофонического звука на 44100 с размером 2048 сэмплов, вызов записи с помощью WRITE_BLOCKING будет блокировать на 2048 * (1000.0 / 44100) миллисекунд?Не означает ли это, что как только запись завершится, вы сразу попадете в сценарий опустошения буфера?

1 Ответ

0 голосов
/ 22 февраля 2019

Как упоминал @Michael, он блокируется, пока данные не будут помещены в очередь.Это то же значение, что и в описании для WRITE_BLOCKING;он блокируется до тех пор, пока данные не будут записаны во внутренний буфер (тот, для которого вы указали размер во время построения).

write( ..., 2048, WRITE_BLOCKING ) будет блокироваться приблизительно на 2048 * (1000,0 /44100) секунд, если буфер уже заполнен (данные еще не воспроизводились).Если write() блокируется на любой промежуток времени, как только он вернется, вы можете быть уверены, что внутренний буфер максимально заполнен.При отсутствии каких-либо дальнейших действий write()s, AudioTrack будет продолжать снабжать микшер звуковым выходом до тех пор, пока не будет исчерпан внутренний буфер.

Предполагается, что этот дизайн (внутренний буфер) поможет вам избежать буфераопустошения.Чем больше ваш буфер, тем дольше вы можете обходиться без write().

...