Теперь я реализовал запись, используя
"OnRecordPositionUpdateListener". Это выглядит очень многообещающе и
правильный способ сделать это в соответствии с SDK Docs. Кажется, все работает
(открытие аудиоустройства, чтение () данных и т. д.), но Listner
никогда не звонил.
Кто-нибудь знает почему?
Я обнаружил, что OnRecordPositionUpdateListener игнорируется, пока вы не сделаете свой первый .read()
.
Другими словами, я обнаружил, что если я настрою все на документы, мой Слушатель никогда не будет вызван. Однако, если я сначала позвонил .read()
сразу после выполнения моего начального .start()
, тогда будет вызван Слушатель - при условии, что я делал .read()
каждый раз, когда Слушатель вызывался.
Другими словами, кажется, что событие Listener подходит только один раз за .read()
или что-то подобное.
Я также обнаружил, что если бы я запрашивал чтение сэмплов меньше, чем buffSize / 2, прослушиватель не вызывался бы. Таким образом, кажется, что слушатель называется только ПОСЛЕ .read()
как минимум половины размера буфера. Чтобы продолжать использовать функцию обратного вызова Listener, необходимо вызывать read каждый раз, когда слушатель запускается. (Другими словами, поместите вызов для чтения в коде слушателя.)
Однако слушатель, кажется, вызывается в то время, когда данные еще не готовы, что вызывает блокировку.
Кроме того, если ваш период уведомления или время больше половины вашего bufferSize, они никогда не будут вызваны, кажется.
UPDATE:
Продолжая копать глубже, я обнаружил, что обратный вызов, кажется, вызывается ТОЛЬКО после завершения .read()
......!
Я не знаю, это ошибка или особенность. Моей первоначальной мыслью было бы, что я хочу перезвонить, когда пришло время читать. Но, возможно, у разработчиков Android возникла иная идея: вы просто помещаете while(1){xxxx.read(...)}
в отдельный поток, и чтобы избавить вас от необходимости отслеживать каждый раз, когда read () завершается, обратный вызов может по существу сказать вам, когда чтение закончилось.
О. Может, меня осенило. И я думаю, что другие указывали на это здесь до меня, но это не отражалось: обратный вызов позиции или периода должен работать с байтами, которые уже прочитаны ...
Наверное, я застрял с использованием потоков.
В этом стиле поток будет непрерывно вызывать read (), как только он вернется, поскольку read блокируется и терпеливо ждет достаточного количества данных для возврата.
Затем, независимо, обратный вызов будет вызывать указанную вами функцию каждые x сэмплов.