Я использую блок аудиовыхода для захвата данных микрофона. Я получаю уведомление о том, что есть данные для чтения с помощью обратного вызова, который я установил с помощью свойства kAudioOutputUnit_SetInputCallback, и в обратном вызове я читаю данные, вызывая AudioUnitRender().
В конечном счете, я буду обновлять пользовательский интерфейс своего приложения на основе некоторой информации, извлеченной путем анализа этих данных. Поэтому на каком-то этапе мне нужно будет выполнить dispatch_async в основной очереди. Анализ занимает умеренное время и выполняется фрагментами, которые намного больше, чем те, которые я получаю от AudioUnitRender(), поэтому нагрузка носит скачкообразный характер.
Мой вопрос: какие операции считаются приемлемыми при реализации самого входного обратного вызова? Я нашел множество источников со строгими ограничениями на обратные вызовы render (без выделения памяти, ввода-вывода, синхронизации с другими потоками и т. д.), но никакой информации о input< /em> обратные вызовы.
Если я буду следовать тем же правилам, что и для обратных вызовов рендеринга, у меня возникнет небольшая проблема. Сам по себе dispatch_async() нежелателен, так как он выделяет память, а загрузка в любом случае носит скачкообразный характер (может быть длиннее одного цикла рендеринга на одних ходах и практически равна нулю на других). Поэтому представляется необходимым отправить мои данные в рабочий поток для обработки и выполнения вызовов dispatch_async(). Однако мне все еще нужно управлять передачей данных в этот рабочий поток. Самый простой способ (в C++) — использовать циклический буфер, а также мьютекс и условную переменную для сигнализации о доступности данных. Однако для этого потребовался бы обратный вызов ввода для блокировки мьютекса, что явно не рекомендуется в рекомендациях по обратным вызовам рендеринга.
Избегание этой блокировки мьютекса приведет меня к циклическим буферам без блокировки, семафорам (POSIX или GCD), спин-блокировкам и тому подобному, и мне интересно, не слишком ли это для простого прослушивания микрофона. Ужасно мало документации по этому делу, и я понятия не имею, что на самом деле происходит за кулисами. Мне действительно нужно беспокоиться об ожидании мьютекса (только ненадолго и редко блокируемого другим потоком) в моей реализации обратного вызова ввода?