Конфигурация динамиков DSSPEAKER_DIRECTOUT
Примечание Эти сведения относятся к Windows XP и более ранним операционным системам. Начиная с Windows Vista, IDirectSound::GetSpeakerConfig и IDirectSound::SetSpeakerConfig устарели.
Приложение может изменить конфигурацию динамиков DirectSound на прямой, вызвав метод IDirectSound::SetSpeakerConfig с параметром конфигурации говорящего DSSPEAKER_DIRECTOUT (см. документацию по Microsoft Windows SDK). Это указывает конфигурацию без динамиков, в которой каналы в потоке воспроизведения из приложения передаются непосредственно в аудиоадаптер без интерпретации как положения говорящего. Однако входной поток по-прежнему можно изменить путем преобразования частоты выборки, затухания, фильтрации и других типов обработки, для которых не требуется никаких предположений о назначении динамиков каналам.
После того как он вступит в силу, параметр конфигурации 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 смешивает входные потоки quad и stereo для формирования четырехугольника вывода, то каналы нулевого и одного выходного набора — это суммы каналов, равных нулю и единице, соответственно, входных стереопотоков и четырехпотоков. Однако входной стереопоток не вносит никакого вклада в каналы 2 и 3 смеси, которые берутся исключительно из двух последних каналов входного потока четырехугольника.
Приложение, которое пытается выполнить одно из следующих действий, рискует непредсказуемого поведения:
Воспроизведение потока, который не находится в формате прямой передачи, через устройство, настроенное в режиме прямой передачи.
Воспроизведение прямого потока через устройство, которое не настроено в режиме прямого вывода.
При столкновении с одним из этих случаев 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).