Как дождаться окончания асинхронного AudioTrack.write? - PullRequest
0 голосов
/ 16 сентября 2018

Я бы хотел воспроизвести звук, синтезированный с шагом 1/50 с. При использовании интерфейса асинхронной потоковой передачи AudioTrack мой план заключается в следующем:

while (!done)
{
  frame = synthesize();
  audio.waitForWrite(); // XXX
  audio.write(frame, 0, frameSize, WRITE_NON_BLOCKING);
}
audio.waitForWrite(); // XXX

Однако на AudioTrack нет waitForWrite или подобного метода, который я мог бы использовать здесь; и если я просто сделаю неблокирующую запись, второй кадр заменит первый в середине, то есть, скажем, синтез кадра 20 мс занимает 5 мс, тогда первый кадр будет воспроизводиться в течение 5 мс, а затем будет заменен вторым один после 5 мс и т. д., что явно не то, что я хочу.

С другой стороны, если я использую блокирующие записи, я не могу синтезировать следующий кадр, пока предыдущий уже воспроизводится.

1 Ответ

0 голосов
/ 16 сентября 2018

Вы неправильно понимаете режим потоковой передачи. Запись не занимает столько времени, сколько нужно для ее воспроизведения. Write копирует его в другой буфер. В режиме блокировки он будет ждать, пока весь буфер не будет скопирован, но не до его воспроизведения. В неблокирующем режиме он скопирует столько, сколько может прямо сейчас, и немедленно вернется. Нет необходимости ждать, пока он будет воспроизведен в любом режиме, и нет причин для этого.

...