Поделиться через


Конфигурация динамиков DSSPEAKER_DIRECTOUT

примечание Эти сведения относятся к Windows XP и более ранним операционным системам. Начиная с Windows Vista IDirectSound::GetSpeakerConfig и IDirectSound::SetSpeakerConfig устарели.

Программа приложения может изменить конфигурацию динамиков DirectSound на режим прямой передачи, вызвав метод IDirectSound::SetSpeakerConfig с параметром конфигурации говорящего для DSSPEAKER_DIRECTOUT (см. документацию по пакету SDK для Microsoft Windows). Это указывает конфигурацию без динамиков, в которой каналы в потоке воспроизведения из приложения выводятся непосредственно в аудиоадаптер, не интерпретируемые как позиции динамиков. Однако входной поток по-прежнему можно изменить путем преобразования частоты выборки, аттенуации, фильтрации и других типов обработки, требующих никаких предположений о назначении динамиков каналам.

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

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

Содержимое номера канала 0

Голосовой

1

Барабаны

2

Гитара

3

Бас

...

47

Пианино

Для таких необработанных звуковых данных положение говорящего бессмысленно, а назначение позиций динамиков входным или выходным потокам может привести к нежелательным побочным эффектам. Например, компонент, такой как KMixer, может вмешиваться неправильно, применяя эффекты, относящиеся к динамику, такие как трехмерная виртуализация или кодировка Dolby Surround Pro Logic к потоку. Обратите внимание, что количество необработанных каналов данных не ограничивается количеством битов в маске канала.

Даже устройство, которое специально не предназначено для редактирования звука, обычно принимает запрос KSPROPERTY_AUDIO_CHANNEL_CONFIG set-property, чтобы изменить конфигурацию динамиков на KSAUDIO_SPEAKER_DIRECTOUT. Как правило, устройство должно избежать сбоя запроса, если он не может как-то убедиться, что его выходные данные подключены к динамикам и не могут использоваться внешним образом для любой другой цели (например, в качестве входных данных во внешний миксер).

Приложение, использующее режим прямой передачи, обычно записывается для определенного аппаратного устройства. Это позволяет приложению заранее знать, какие форматы прямых данных поддерживают устройство, включая количество каналов и способ интерпретации данных в этих каналах. Это необходимо, так как при вызове приложения IDirectSound::GetSpeakerConfig на устройстве, настроенном в режиме прямого подключения, устройство просто подтверждает, что оно находится в этом режиме; он не предоставляет дополнительных сведений о количестве каналов в форматах потоков, поддерживаемых в режиме прямого подключения. (Однако эти сведения можно получить, отправив запрос KSPROPERTY_AUDIO_MIX_LEVEL_CAPS get-property на узел супермиксера на пин-коде миксера устройства; см. статью DirectSound Node-Ordering Требования.)

При указании формата волны для прямого потока приложение должно задать элемент dwChannelMask члена WAVEFORMATEXTENSIBLE значением KSAUDIO_SPEAKER_DIRECTOUT, что равно нулю. Маска канала нуля указывает, что позиции динамиков не определены. Как всегда, количество каналов в потоке указывается в элементе Format.nChannels.

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

При перемешивание потоков для устройства, настроенного в режиме прямой передачи, KMixer применяет одно к одному сопоставление между каналами входных потоков из приложений и каналами потока смешивания, которое он выводит на устройство. Это означает, что если приложение создает несколько прямых потоков с одинаковым числом каналов, например, каждый канал N выходного набора — это просто сумма каналов N всех потоков, которые входят в KMixer.

При смешивании нескольких потоков прямой передачи, которые отличаются в количестве содержащихся каналов, алгоритм смешивания KMixer немного сложнее. В этом случае каждый канал N смеси — это сумма каналов N всех входных потоков, имеющих канал N. Например, если KMixer смешивает четыре и стерео входные потоки для формирования четырех выходных данных, каналов ноль и один из выходных смешивания являются суммами каналов ноль и один соответственно входных стерео и четырехпотоков. Поток стерео входных данных ничего не делает, однако, для каналов двух и трех из смешивания, которые принимаются исключительно из последних двух каналов четырех входных потоков.

Приложение, которое пытается выполнить одно из следующих действий, рискует непредсказуемым поведением:

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

  • Воспроизведение потока прямой передачи через устройство, которое не настроено в режиме прямой передачи.

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

Приложению разработки звука может потребоваться разрешить пользователю прослушивать данные, которые он смешал в первые несколько каналов выходного потока, но игнорировать необработанные данные, которые по-прежнему содержатся в оставшихся каналах потока. Поведение KMixer делает это простым. Например, если поток воспроизведения 24-каналов содержит стереомиксический набор в каналах 0 и 1 и необработанных данных в каналах 2–23, приложение выполняет следующее:

  • Настраивает целевое звуковое устройство (это не обязательно устройство, которое приложение использует для редактирования потока) в стерео режиме путем вызова SetSpeakerConfig с DSSPEAKER_STEREO.

  • Изменения dwChannelMask в структуре ПОТОКА воспроизведения WAVEFORMATEXTENSIBLE на KSAUDIO_SPEAKER_STEREO, но оставляет Format.nChannels значение 24, что является общим числом каналов в потоке.

KMixer смешивает только стереоканала потока воспроизведения, которые описаны в маске канала, и удаляет оставшиеся 22 канала, которые содержат необработанные данные. Помните, что любые изменения, внесенные в параметр конфигурации динамиков DirectSound, вряд ли вступают в силу до тех пор, пока текущий объект DirectSound не будет уничтожен, а другой создается (см. раздел Применение Speaker-Configuration параметров).