Об аудио-очередях

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

Что такое аудио-очередь?

Аудио-очередь является программным объектом, который Вы используете для записи или игры аудио в iOS или Mac OS X. Это представлено AudioQueueRef непрозрачный тип данных, объявленный в AudioQueue.h заголовочный файл.

Аудио-очередь выполняет работу:

Можно использовать аудио-очереди с другими интерфейсами Core Audio и относительно мелкую сумму пользовательского кода, для создания полного решения для записи или воспроизведения цифрового аудио в приложении.

Архитектура аудио-очереди

Все аудио-очереди имеют ту же общую структуру, состоя из этих частей:

  • Ряд буферов аудио-очереди, каждый из которых является временным репозиторием для некоторых аудиоданных

  • Буферная очередь, упорядоченный список для буферов аудио-очереди

  • Функция обратного вызова аудио-очереди, которую Вы пишете

Архитектура варьируется в зависимости от того, является ли аудио-очередь для записи или воспроизведения. Различия находятся в том, как аудио-очередь соединяет свой ввод и вывод, и в роли функции обратного вызова.

Аудио-очереди для записи

Аудио-очередь записи, создаваемая с AudioQueueNewInput функционируйте, показали структуру на рисунке 1-1.

Рисунок 1-1  аудио-очередь записи
Architecture for a recording audio queue

Входная сторона аудио-очереди записи обычно соединяется с внешними аудио аппаратными средствами, такими как микрофон. В iOS аудио прибывает из устройства, подключенного пользователем — встроенный микрофон или микрофон гарнитуры, например. В случае по умолчанию для Mac OS X аудио прибывает из устройства аудиовхода системы по умолчанию, как установлено пользователем в Установках системы.

Выходная сторона аудио-очереди записи использует функцию обратного вызова, которую Вы пишете. При записи к диску обратный вызов пишет буферы новых аудиоданных, которые это получает от его аудио-очереди к аудиофайлу. Однако запись аудио-очередей может использоваться другими способами. Вы могли также использовать один, например, в аудио анализаторе в реальном времени. В таком случае Ваш обратный вызов обеспечил бы аудиоданные непосредственно для Вашего приложения вместо того, чтобы писать его в диск.

Вы узнаете больше об этом обратном вызове в Функции обратного вызова Аудио-очереди Записи.

Каждая аудио-очередь — имеет ли для записи или воспроизведения — один или несколько буферов аудио-очереди. Эти буферы располагаются в определенной последовательности, названной буферной очередью. В числе буферы аудио-очереди пронумерованы согласно порядку, в котором они переполнены — который является тем же порядком, в котором они переданы к обратному вызову. Вы изучите, как аудио-очередь использует свои буферы в Буферной Очереди и Постановке в очередь.

Аудио-очереди для воспроизведения

Аудио-очередь воспроизведения (создаваемый с AudioQueueNewOutput функция), показали структуру на рисунке 1-2.

Рисунок 1-2  аудио-очередь воспроизведения
Architecture for a playback audio queue

В аудио-очереди воспроизведения обратный вызов находится на входной стороне. Обратный вызов ответственен за получение аудиоданных от диска (или некоторый другой источник) и передавание он к аудио-очереди. Когда больше нет данных для игры, обратные вызовы воспроизведения также говорят их аудио-очередям останавливаться. Вы узнаете больше об этом обратном вызове в Функции обратного вызова Аудио-очереди Воспроизведения.

Вывод аудио-очереди воспроизведения обычно соединяется с внешними аудио аппаратными средствами, такими как громкоговоритель. В iOS аудио переходит к устройству, выбранному пользователем — например, получатель или гарнитура. В случае по умолчанию в Mac OS X аудио переходит к устройству аудиовыхода системы по умолчанию, как установлено пользователем в Установках системы.

Буферы аудио-очереди

Буфер аудио-очереди является структурой данных типа AudioQueueBuffer, как объявлено в AudioQueue.h заголовочный файл:

typedef struct AudioQueueBuffer {
    const UInt32   mAudioDataBytesCapacity;
    void *const    mAudioData;
    UInt32         mAudioDataByteSize;
    void           *mUserData;
} AudioQueueBuffer;
typedef AudioQueueBuffer *AudioQueueBufferRef;

mAudioData поле, выделенное в листинге кода, указывает на буфер по сути: блок памяти, служащей контейнером для переходных блоков аудиоданных, играемых или зарегистрированных. Информация в других полях помогает аудио-очереди управлять буфером.

Аудио-очередь может использовать любое число буферов. Ваше приложение указывает сколько. Типичное число равняется трем. Это позволяет быть занятым, скажем, записью в диск, в то время как другой переполнен новыми аудиоданными. Третий буфер доступен в случае необходимости для компенсации такие вещи как диск задержек I/O. Рисунок 1-3 иллюстрирует это.

Аудио-очереди выполняют управление памятью для своих буферов.

  • Когда Вы вызываете, аудио-очередь выделяет буфер AudioQueueAllocateBuffer функция.

  • Когда Вы выпускаете аудио-очередь путем вызова AudioQueueDispose функция, очередь выпускает свои буферы.

Это улучшает устойчивость опций записи и воспроизведения, которые Вы добавляете к своему приложению. Это также помогает оптимизировать использование ресурсов.

Для полного описания AudioQueueBuffer структура данных, посмотрите Ссылку Audio Queue Services.

Буферная очередь и постановка в очередь

Буферная очередь - то, что дает аудио-очереди, и действительно Audio Queue Services, их имена. Вы встретили буферную очередь — упорядоченный список буферов — в Архитектуре Аудио-очереди. Здесь Вы узнаете о том, как объект аудио-очереди, вместе с Вашей функцией обратного вызова, управляет буферной очередью во время записи или воспроизведения. В частности Вы узнаете о постановке в очередь, добавлении буфера аудио-очереди буферной очереди. Реализуете ли Вы запись или воспроизведение, постановка в очередь является задачей, которую выполняет Ваш обратный вызов.

Процесс записи

При записи один буфер аудио-очереди заполнен аудиоданными, полученными от устройства ввода данных, таков как микрофон. Остающиеся буферы в буферной очереди выстроены в линию позади текущего буфера, ожидая, чтобы быть заполненными аудиоданными поочередно.

Аудио-очередь вручает от заполненных буферов аудиоданных к Вашему обратному вызову в порядке, в котором они были получены. Рисунок 1-3 иллюстрирует как, записывая работы при использовании аудио-очереди.

Рисунок 1-3  процесс записи
Illustration of the recording process when using an audio queueIllustration of the recording process when using an audio queue

На шаге 1 рисунка 1-3 начинается запись. Аудио-очередь заполняет буфер полученными данными.

На шаге 2 первый буфер был заполнен. Аудио-очередь вызывает обратный вызов, вручая ему полный буфер (буферизуйте 1). Обратный вызов (шаг 3) пишет содержание буфера к аудиофайлу. Одновременно, аудио-очередь заполняется, другой буфер (буферизуйте 2) с недавно полученными данными.

На шаге 4 обратный вызов ставит в очередь буфер (буферизуйте 1), что это только что записало в диск, поместив его в строку, чтобы быть заполненным снова. Аудио-очередь снова вызывает обратный вызов (шаг 5), вручая ему следующий полный буфер (буферизуйте 2). Обратный вызов (шаг 6) пишет содержание этого буфера к аудиофайлу. Это устойчивое состояние цикличного выполнения продолжается, пока пользователь не останавливает запись.

Процесс воспроизведения

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

Аудио-очередь вручает от играемых буферов аудиоданных к Вашему обратному вызову в порядке, в котором они игрались. Обратный вызов читает новые аудиоданные в буфер и затем ставит в очередь их. Рисунок 1-4 иллюстрирует, как воспроизведение работает при использовании аудио-очереди.

Рисунок 1-4  процесс воспроизведения
Illustration of the playback process when using an audio queue

На шаге 1 рисунка 1-4, начала приложения аудио-очередь воспроизведения. Приложение вызывает обратный вызов один раз для каждого из буферов аудио-очереди, заполняя их и добавляя их к буферной очереди. Воспламенение гарантирует, что воспроизведение может запуститься немедленно, когда Ваше приложение вызывает AudioQueueStart функция (шаг 2).

На шаге 3 отправляет аудио-очередь, первый буфер (буферизуйте 1) выводить.

Как только первый буфер игрался, аудио-очередь воспроизведения вводит устойчивое состояние цикличного выполнения. Аудио-очередь начинает играть, следующий буфер (буферизуйте 2, шаг 4), и вызывает обратный вызов (шаг 5), вручая ему просто играемый буфер (буферизуйте 1). Обратный вызов (шаг 6) заполняет буфер от аудиофайла и затем ставит в очередь его для воспроизведения.

Управление процессом воспроизведения

Буферы аудио-очереди всегда играются в порядке, в котором они ставятся в очередь. Однако Audio Queue Services предоставляет Вам некоторое управление процессом воспроизведения сAudioQueueEnqueueBufferWithParameters функция. Эта функция позволяет Вам:

  • Установите точное время воспроизведения для буфера. Это позволяет Вам поддерживать синхронизацию.

  • Кадры для обрезки в запуске или конце буфера аудио-очереди. Это позволяет Вам удалить ведущую или запаздывающую тишину.

  • Установите усиление воспроизведения при гранулярности буфера.

Для больше об установке усиления воспроизведения, посмотрите Параметры Аудио-очереди. Для полного описания AudioQueueEnqueueBufferWithParameters функционируйте, посмотрите Ссылку Audio Queue Services.

Функция обратного вызова аудио-очереди

Как правило, объем Вашей работы программирования в использовании Audio Queue Services состоит из записи функции обратного вызова аудио-очереди.

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

Одна ответственность обратного вызова аудио-очереди, является ли это для записи или воспроизведения, состоит в том, чтобы возвратить буферы аудио-очереди буферной очереди. Обратный вызов добавляет буфер до конца буферной очереди, использующей AudioQueueEnqueueBuffer функция. Для воспроизведения можно вместо этого использовать AudioQueueEnqueueBufferWithParameters функционируйте при необходимости в большем количестве управления, как описано в Управлении Процессом Воспроизведения.

Функция обратного вызова аудио-очереди записи

Этот раздел представляет обратный вызов, который Вы записали бы для общего падежа записи аудио к дисковому файлу. Вот прототип для обратного вызова аудио-очереди записи, как объявлено в AudioQueue.h заголовочный файл:

AudioQueueInputCallback (
    void                               *inUserData,
    AudioQueueRef                      inAQ,
    AudioQueueBufferRef                inBuffer,
    const AudioTimeStamp               *inStartTime,
    UInt32                             inNumberPacketDescriptions,
    const AudioStreamPacketDescription *inPacketDescs
);

Аудио-очередь записи, в вызове Вашего обратного вызова, предоставляет все, что обратный вызов должен записать следующему набору аудиоданных к аудиофайлу:

  • inUserData является, обычно, пользовательской структурой, которую Вы установили для содержания информации состояния для аудио-очереди и ее буферов, объект аудиофайла (типа AudioFileID) представление файла Вы пишете в, и данные о формате аудиоданных для файла.

  • inAQ является аудио-очередью, вызвавшей обратный вызов.

  • inBuffer является буфером аудио-очереди, недавно заполненным аудио-очередью, содержа новые данные, которые Ваш обратный вызов должен записать в диск. Данные уже отформатированы согласно формату, который Вы указываете в пользовательской структуре (передал в inUserData параметре). Для больше на этом, посмотрите Используя Форматы Аудиоданных и Кодеки.

  • inStartTime является демонстрационным временем первой выборки в буфере. Для основной записи Ваш обратный вызов не использует этот параметр.

  • inNumberPacketDescriptions является числом описаний пакета в inPacketDescs параметр. При записи к VBR формата (с переменной скоростью передачи) аудио-очередь предоставляет значение для этого параметра к обратному вызову, поочередно передающему его на AudioFileWritePackets функция. CBR форматы (с постоянной скоростью передачи) не использует описания пакета. Для записи CBR аудио-очередь устанавливает это и inPacketDescs параметр к NULL.

  • inPacketDescs является набором описаний пакета, соответствующих выборкам в буфере. Снова, аудио-очередь предоставляет значение для этого параметра, если аудиоданные находятся в формате VBR, и Ваш обратный вызов передает его на AudioFileWritePackets функция (объявленный в AudioFile.h заголовочный файл).

Для получения дополнительной информации об обратном вызове записи посмотрите Аудио Записи в этом документе и посмотрите Ссылку Audio Queue Services.

Функция обратного вызова аудио-очереди воспроизведения

Этот раздел представляет обратный вызов, который Вы записали бы для общего падежа игры аудио от дискового файла. Вот прототип для обратного вызова аудио-очереди воспроизведения, как объявлено в AudioQueue.h заголовочный файл:

AudioQueueOutputCallback (
    void                  *inUserData,
    AudioQueueRef         inAQ,
    AudioQueueBufferRef   inBuffer
);

Аудио-очередь воспроизведения, в вызове Вашего обратного вызова, предоставляет то, что обратный вызов должен считать следующий набор аудиоданных от аудиофайла:

  • inUserData является, обычно, пользовательской структурой, которую Вы установили для содержания информации состояния для аудио-очереди и ее буферов, объект аудиофайла (типа AudioFileID) представление файла Вы пишете в, и данные о формате аудиоданных для файла.

    В случае аудио-очереди воспроизведения Ваш обратный вызов отслеживает текущий пакетный индекс с помощью поля в этой структуре.

  • inAQ является аудио-очередью, вызвавшей обратный вызов.

  • inBuffer является буфером аудио-очереди, сделанным доступный аудио-очередью, что Ваш обратный вызов должен заполниться следующим набором данных, считанных из играемого файла.

Если Ваше приложение воспроизводит данные VBR, обратный вызов должен получить пакетную информацию для аудиоданных, которые это читает. Это делает это путем вызова AudioFileReadPackets функция, объявленная в AudioFile.h заголовочный файл. Обратный вызов тогда помещает информацию о пакете в пользовательскую структуру данных для предоставления доступа к нему доступным для аудио-очереди воспроизведения.

Для получения дополнительной информации об обратном вызове воспроизведения посмотрите Аудио Игры в этом документе и посмотрите Ссылку Audio Queue Services.

Используя кодеки и форматы аудиоданных

Audio Queue Services использует кодеки (компоненты кодирования/декодирования аудиоданных) по мере необходимости для преобразования между форматами аудио. Ваше приложение записи или воспроизведения может использовать любой формат аудио, для которого существует установленный кодек. Вы не должны писать пользовательский код для обработки различных форматов аудио. В частности Ваш обратный вызов не должен знать о форматах данных.

Вот то, как это работает. Каждая аудио-очередь имеет формат аудиоданных, представленный в AudioStreamBasicDescription структура. Когда Вы указываете формат — в mFormatID поле структуры — аудио-очередь использует надлежащий кодек. Вы тогда указываете частоту дискретизации и количество каналов, и вот и все. Вы будете видеть примеры установки формата аудиоданных в Записи Аудио и Игре Аудио.

Аудио-очередь записи использует установленный кодек как показано на рисунке 1-5.

  Преобразование Формата аудио рисунка 1-5 во время записи
Using a code when recording with an audio queue

На шаге 1 рисунка 1-5 Ваше приложение говорит аудио-очереди начинать записывать, и также говорит ему формат данных для использования. На шаге 2 аудио-очередь получает новые аудиоданные и преобразовывает его, с помощью кодека, согласно формату, который Вы указали. Аудио-очередь тогда вызывает обратный вызов, вручая ему буфер, содержащий соответственно форматированные аудиоданные. На шаге 3 Ваш обратный вызов пишет отформатированные аудиоданные в диск. Снова, Ваш обратный вызов не должен знать о форматах данных.

Аудио-очередь воспроизведения использует установленный кодек как показано на рисунке 1-6.

  Преобразование Формата аудио рисунка 1-6 во время воспроизведения
Using a codec when playing a file with an audio queue

На шаге 1 рисунка 1-6 Ваше приложение говорит аудио-очереди начинать играть, и также говорит ему формат данных, содержавшийся в аудиофайле, который будет играться. На шаге 2 аудио-очередь вызывает Ваш обратный вызов, считывающий данные из аудиофайла. Обратный вызов вручает от данных, в его исходном формате, к аудио-очереди. На шаге 3 аудио-очередь использует надлежащий кодек и затем посылает аудио месту назначения.

Аудио-очередь может использовать любой установленный кодек, ли собственный компонент Mac OS X или предоставленный третьим лицом. Чтобы определять кодек использовать, Вы предоставляете его ID с четырьмя кодами символа к аудио-очереди AudioStreamBasicDescription структура. Вы будете видеть пример этого в Записи Аудио.

Mac OS X включает широкий диапазон аудиокодеков, как перечислено в перечислении идентификаторов формата в CoreAudioTypes.h заголовочный файл и, как задокументировано в Ссылку Типов данных Core Audio. Можно определить кодеки, доступные в системе при помощи интерфейсов в AudioFormat.h заголовочный файл, в Аудио Платформе Панели инструментов. Можно вывести на экран кодеки в системе с помощью приложения Fiendishthngs, доступного как пример кода в http://developer .apple.com/samplecode/Fiendishthngs/.

Управление аудио-очередью и состояние

Аудио-очередь имеет жизненный цикл между созданием и размещением. Ваше приложение управляет этим жизненным циклом — и управляет состоянием аудио-очереди — использование шести функций, объявленных в AudioQueue.h заголовочный файл:

Можно использовать AudioQueueStop функция в синхронном или асинхронном режиме:

Посмотрите Ссылку Audio Queue Services для полного описания каждой из этих функций, включая большую информацию о синхронной и асинхронной остановке аудио-очередей.

Параметры аудио-очереди

Аудио-очередь имеет вызванные параметры корректируемых настроек. Каждый параметр имеет перечисление, постоянное как его ключ и число с плавающей точкой как его значение. Параметры обычно используются в воспроизведении, не записывая.

В Mac OS X v10.5, единственный доступный параметр аудио-очереди для усиления. Значение для этого параметра установлено или получило использование kAudioQueueParam_Volume постоянный, и имеет доступный диапазон 0.0 для тишины, к 1.0 для единичного усиления.

Ваше приложение может установить параметры аудио-очереди двумя способами:

В обоих случаях установки параметров для аудио-очереди остаются в силе, пока Вы не изменяете их.

Можно получить доступ к текущим значениям параметров аудио-очереди в любое время с AudioQueueGetParameter функция. Посмотрите Ссылку Audio Queue Services для полных описаний функций для получения и установки значений параметров.