Управление потоками

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

WASAPI реализует несколько интерфейсов для предоставления служб управления потоками аудио клиентам. Основной интерфейс — IAudioClient. Клиент получает интерфейс IAudioClient для устройства аудио конечной точки путем вызова метода IMMDevice::Activate (с параметром iid set to REFIID IID_IAudioClient) в объекте конечной точки.

Клиент вызывает методы в интерфейсе IAudioClient для выполнения следующих действий:

  • Узнайте, какие звуковые форматы поддерживает устройство конечной точки.
  • Получение размера буфера конечной точки.
  • Получение формата потока и задержки.
  • Запуск, остановка и сброс потока, который проходит через устройство конечной точки.
  • Доступ к дополнительным звуковым службам.

Чтобы создать поток, клиент вызывает метод IAudioClient::Initialize . С помощью этого метода клиент задает формат данных для потока, размер буфера конечной точки и работает ли поток в общем или монопольном режиме.

Остальные методы в интерфейсе IAudioClient делятся на две группы:

  • Методы, которые можно вызывать только после открытия потока iAudioClient ::Initialize.
  • Методы, которые можно вызывать в любое время до или после вызова инициализации.

Следующие методы можно вызывать только после вызова IAudioClient::Initialize:

Следующие методы можно вызвать до или после вызова IAudioClient::Initialize :

Чтобы получить доступ к дополнительным службам аудио-клиентов, клиент вызывает метод IAudioClient::GetService . С помощью этого метода клиент может получить ссылки на следующие интерфейсы:

  • IAudioRenderClient

    Записывает данные отрисовки в буфер конечной точки отрисовки звука.

  • IAudioCaptureClient

    Считывает захваченные данные из буфера конечной точки записи звука.

  • IAudioSessionControl

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

  • ISimpleAudioVolume

    Управляет уровнем громкости звукового сеанса, связанного с потоком.

  • IChannelAudioVolume

    Управляет уровнями громкости отдельных каналов в звуковом сеансе, связанном с потоком.

  • IAudioClock

    Отслеживает скорость потоковой передачи данных и положение потока.

Кроме того, клиенты WASAPI, требующие уведомления о событиях, связанных с сеансом, должны реализовать следующий интерфейс:

  • IAudioSessionEvents

    Чтобы получать уведомления о событиях, клиент передает указатель на его интерфейс IAudioSessionEvents в метод IAudioSessionControl::RegisterAudioSessionNotification в качестве параметра вызова.

Наконец, клиент может использовать API более высокого уровня для создания звукового потока, но также требует доступа к элементам управления сеансом и элементам управления громкости для сеанса, содержащего поток. Api более высокого уровня обычно не предоставляет этот доступ. Клиент может получить элементы управления для определенного сеанса через интерфейс IAudioSessionManager . Этот интерфейс позволяет клиенту получать интерфейсы IAudioSessionControl и ISimpleAudioVolume для сеанса без необходимости использовать интерфейс IAudioClient для создания потока и назначения потока сеансу. Клиент получает интерфейс IAudioSessionManager для устройства аудио конечной точки путем вызова метода IMMDevice::Activate (с параметром iid, установленным для REFIID IID_IAudioSessionManager) в объекте конечной точки.

Интерфейсы IAudioSessionControl, IAudioSessionEvents и IAudioSessionManager определены в файле заголовка Audiopolicy.h. Все остальные интерфейсы WASAPI определены в файле заголовка Audioclient.h.

В следующих разделах описывается использование WASAPI для управления звуковыми потоками:

Руководство по программированию