Я пишу приложение для iPhone, которое должно записывать звук со встроенного микрофона, а затем отправлять эти аудиоданные на сервер для обработки.
Приложение использует сокетное соединение для подключения к серверу и Audio Queue Services для записи. Я не уверен, когда отправлять данные. Audio Queue Services запускает обратный вызов каждый раз, когда он заполняет буфер некоторыми аудиоданными. NSOutputStream запускает событие каждый раз, когда у него есть доступное пространство.
Моей первой мыслью было отправить данные на сервер с помощью обратного вызова Audio Queue. Но похоже, что это вызовет проблему, если у NSOutputStream в это время нет свободного места.
Затем я подумал о буферизации данных, когда они возвращаются из аудио-очереди, и отправке их каждый раз, когда NSOutputStream запускает событие свободного места. Но, похоже, возникнет проблема, если отправка на сервер опережает аудиозапись, тогда возникнет ситуация, когда нечего писать в событии доступного пространства, поэтому событие не будет запущено снова и передача данных будет эффективно остановлен.
Итак, как лучше всего с этим справиться? Должен ли я иметь таймер, который срабатывает неоднократно и проверять, есть ли свободное место и есть ли данные, которые необходимо отправить? Кроме того, я думаю, что мне нужно будет выполнить некоторую синхронизацию потоков, чтобы я мог извлекать фрагменты данных из моего буфера для отправки по сети, а также добавлять фрагменты данных в буфер по мере продолжения записи, не рискуя испортить мой буфер.