Ответ 1
AudioTrack.write() возвращает "количество байтов, записанных" как int, и вы определяете количество байтов в буфере при построении AudioTrack.
Таким образом, чтобы отслеживать, сколько буферного пространства осталось, вы можете сохранить переменную аккумулятора, чтобы вы знали, сколько байтов было записано в общей сложности, и установите эту переменную равной нулю, когда вы вызываете AudioTrack.flush(). Однако связанная документация гласит, что "типично использовать куски 1/2 от общего размера, чтобы разрешить двойную буферизацию", поэтому может быть достаточно просто запомнить, если вы написали нуль один или два раза с момента вызова flush.
Чтобы узнать, сколько из буфера было воспроизведено, используйте AudioTrack.getPlaybackHeadPosition(), который возвращает количество фреймов, которые были текущего буфера (т.е. reset до нуля при остановке, сбросе или перезагрузке) в качестве подписанного 32-битного целого, но для интерпретации как unsigned 32 -битное целое число. Все это на самом деле означает, что вы назначаете его int следующим образом.
int bufferPlaybackFrame = myAudioTrack.getPlaybackHeadPosition() & 0xFF;
Вы можете думать о кадрах как эквивалентных образцам. т.е. вы можете работать с AudioFormat, используемым для построения AudioTrack, сколько бит (и, следовательно, байтов) используется для каждого образца.
Наконец, на случай, если кто-то задается вопросом, вы никогда не сможете сказать, сколько исходного файла или потока осталось играть через этот объект (одна из причин, по которой он предназначен для работы с постоянными 24/7 потоками, с без конца), поэтому, если вы хотите сделать расчет, как вы видите на некоторых видеоиграх на веб-сайтах, которые приостанавливают поток до тех пор, пока достаточное количество буферизированных буферов для просмотра всего видео в вашей текущей скорости загрузки, вам придется передать эту информацию в некоторых другой путь.