Подсистема DirectSound состоит из двух основных частей: DLL режима пользователя (User Mode) - DSOUND.DLL, DSOUND3D.DLL и так называемого HAL (Hardware Abstraction Layer, уровень абстракции от аппаратуры), который обеспечивается низкоуровневыми драйверами звуковых устройств, работающими в режиме ядра (Kernel Mode). HAL предоставляет подсистеме универсальный и единообразный базовый набор функций, с помощью которых концепция виртуальных источников реализуется аппаратными средствами с наибольшей эффективностью.
В Windows 95/98/Me, где аппаратная реализация функций HAL выполняется драйверами VxD, уровень HAL представлен драйвером-диспетчером DSOUND.VXD. В Windows 2000/XP, где HAL реализуется стандартными для системы средствами Kernel Streaming (работа с потоковыми данными на уровне ядра) и драйверов WDM (Windows Driver Model), отдельной низкоуровневой компоненты нет - подсистема работает со стандартым системным интерфейсом KsProxy.
При отсутствии у устройства низкоуровневых (специализированный VxD или WDM) драйверов подсистема DirectSound может использовать традиционные драйверы MME, эмулируя с их помощью функциональность HAL. Однако за счет существенной разницы концепций MME и DirectSound такая эмуляция неэффективна, и совокупного быстродействия в большинстве случаев оказывается недостаточно.
Подсистема DirectSound построена по объектно-ориентированному принципу в соответствии с моделью COM (Component Object Model) и состоит из группы иерархически связанных интерфейсов. По сути, интерфейс представляет собой обычный набор сервисных функций, или методов, организованных в класс объектно-ориентированного языка. Каждый интерфейс отвечает за объект определенного типа - устройство, буфер/источник, службу уведомления и т.п. Приложение запрашивает у системы интерфейс звукового устройства, затем у устройства запрашивает интерфейс источника звука (буфера) и так далее. Использование DirectSound доступно только 32-разрядным приложениям. 16-разрядные приложения для работы со звуком по-прежнему могут использовать только традиционную подсистему MME.
Источник представляется буфером в памяти, хранящим образец воспроизводимого звука (в DirectSound понятие 'буфер' употребляется вместо 'источник'), и набором параметров, описывающих поведение источника. Для источников звука применяются так называемые вторичные (secondary) буферы, в отличие от первичного (primary) - основного буфера адаптера, который используется главным образом в служебных целях. При работе с традиционными адаптерами первичный буфер служит связующим звеном между DirectSound и адаптером, а вторичные буферы источников размещаются в обычной памяти и обрабатываются программно. При работе с адаптерами, имеющими буферную память, первичный буфер может не иметь специального назначения, а вторичные буферы или часть их могут размещаться непосредственно в памяти адаптера.
Вторичные буферы источников могут быть статическими (static) и потоковыми (streaming). Статический буфер содержит неизменный (как правило, короткий) звук, который может только включаться/ выключаться и менять параметры (высоту, громкость, координаты, скорость и т.п.). Потоковый буфер является 'окном', через которое приложение пропускает непрерывный звуковой поток путем регулярного обновления содержимого буфера. При возможности DirectSound размещает статические буферы в памяти адаптера, что приводит к значительному снижению накладных расходов на пересылку. Приложение может также самостоятельно управлять размещением буферов.
Каждое приложение должно задать так называемый уровень взаимодействия (cooperative level), отражающий желаемую степень контроля над звуковым устройством. Обычный уровень означает, что приложение может пользоваться только универсальными средствами - созданием источников звука и управлением их параметрами. Формат звукового сигнала в этом режиме ограничен частотой дискретизации 22 кГц и разрядностью 8 бит, что дает посредственное качество звука, зато позволяет нескольким приложениям звучать одновременно, без конфликтов. Более высокие уровни позволяют текущему (foreground) приложению подавлять звучание фоновых (background) приложений, а также получать исключительный доступ к аппаратуре адаптера и его первичному буферу. Например, игровая программа при запуске может по максимуму заполнить встроенную память адаптера наиболее часто используемыми звуками, и, пока пользователь не переключит ее в фоновый режим, DirectSound гарантирует сохранение памяти адаптера в надлежащем состоянии. После возврата из фонового режима программа получит уведомление, по которому должна будет повторно инициализировать буферы, а подсистема перенесет их в память адаптера.
Поскольку DirectSound реализует смешивание сигналов от различных источников звука, при его использовании снижается частота конфликтов между приложениями за доступ к звуковому адаптеру, а сами конфликты приобретают более мягкий характер - происходит глушение звучания фоновых приложений вместо полного отказа в доступе к интерфейсу MME, когда адаптер уже используется.
При обработке звука подсистема DirectSound старается обеспечить как можно меньшее время реакции (latency) на изменение состояния и конфигурации источников звука. В большинстве случаев задержка обработки не превышает 10-20 мс, что вполне приемлемо даже для высокодинамичных приложений.
При наличии в структуре HAL аппаратной поддержки необходимых функций подсистема старается загрузить аппаратуру по максимуму. При отсутствии поддержки необходимая работа выполняется подсистемой самостоятельно с использованием центрального процессора и основной памяти. Таким образом, наличие аппаратного ускорения в звуковом адаптере лишь разгружает центральный процессор, а его отсутствие не вызывает отказа приложению в выполнении запрошенной функции.
Взаимодействие DirectSound и драйвера звукового адаптера.
Для поддержки DirectSound в Windows 95/98/Me необходим драйвер виртуального устройства VxD, который и так имеется практически у любого звукового адаптера. Требуется только добавить в него дополнительные точки входа из подсистемы DirectSound и реализовать относительно несложный набор функций: опрос возможностей устройства и драйвера, создание буфера, запуск/остановка, запрос/установка текущей позиции и т.п. В этом случае возможно предельно эффективное использование аппаратных возможностей адаптера.
В Windows 2000/XP и Windows 98/Me, поддерживающих стандарт WDM, подсистема DirectSound может использовать в качестве базы драйверы этого стандарта через универсальный системный интерфейс Kernel Streaming. В этом случае какая-либо доработка драйвера не требуется, однако вследствие более общей функциональности драйвера WDM по сравнению со специализированным драйвером VxD использование аппаратных возможностей адаптера может быть неполным.
Запись звука в DirectSound.
Поскольку DirectSound разрабатывался в первую очередь как инструмент для создания сложной и динамичной звуковой картины в приложениях, функциям записи звука в нем уделено минимальное внимание. Процесс записи здесь носит название Capture (захват) и реализуется путем создания единственного буфера, без разделения на первичный и вторичный. В структуре специализированного драйвера VxD для Windows 95/98/Me поддержка записи не предусмотрена, поэтому работа непосредственно через низкоуровневый драйвер возможна лишь в Windows 98/Me/2000/XP при наличии у адаптера драйвера WDM. В остальных случаях DirectSound использует для записи эмуляцию через традиционный драйвер MME.
Большинство звуковых адаптеров аппаратно поддерживает только формат PCM (Pulse-Code Modulation) - поток линейно оцифрованных значений амплитуды звука. Поскольку подсистема DirectSound ориентирована прежде всего на эффективное использование аппаратных ресурсов в широком спектре прикладных задач, в ней не используются другие форматы (нелинейно-кодированные, сжатые, речевые и т.п.). Для преобразования звука из одного формата в другой приложение может воспользоваться стандартной службой ACM (Audio Compression Manager - диспетчер сжатия звука), которая предоставляет универсальные и эффективные 32-разрядные средства для преобразования форматов независимо от установленной в компьютере аппаратуры. Например, записанный с помощью DirectSoundCapture звук может быть затем сжат, а исходный сжатый звук восстановлен в формат PCM, после чего воспроизведен любым из доступных в DirectSound способов.
Достоинства и недостатки.
Резюмируя вышесказанное, можно перечислить основные достоинства интерфейса DirectSound. К ним я бы в первую очередь отнес возможность динамичного управления генерацией звука без создания значительных задержек, поддержку развитых средств создания объемной звуковой картины, эффективное использование возможностей аппаратного ускорения (реализованных в современных адаптерах) без потери универсальности или возникновения аппаратной привязки, а также возможности одновременного доступа к одному адаптеру из нескольких приложений и смешивания звуковых сигналов, выводимых различными приложениями. Ну и, конечно, по сравнению с предшественником (MME) у DirectSound куда более естественная для большинства прикладных задач концепция работы со звуком.
К недостаткам DirectSound можно отнести слабую поддержку записи звука, что в ряде случаев не позволяет приложению обойтись только интерфейсом DirectSound, вынуждая использовать для записи старый интерфейс MME. Кроме того, DirectSound ориентирован на использование высокоскоростной магистрали доступа к звуковому адаптеру. Например, при работе с адаптерами USB, подключенными по сравнительно низкоскоростной шине (USB 1.0 и 1.1), преимущества DirectSound в загрузке аппаратуры практически сводятся на нет, и всю обработку, в том числе трехмерную, подсистеме приходится выполнять программно, загружая центральный процессор.
Несмотря на эти недостатки (менее существенные, на мой взгляд, нежели достоинства), DirectSound остается основным инструментом для работы со звуком в среде Windows - при разработке современных игр используется именно это средство. В связи с этим большинство звуковых адаптеров, поддерживающих те или иные технологии объемного звучания, способны эффективно работать с DirectSound, рост их производительности позволяет создавать все более сложные звуковые картины.