DirectSound использует для адресации в звуковых буферах понятие текущих позиций, или курсоров.
Позиция воспроизведения (play) следует за позицией записи (write) в буфер, а позиция чтения (read) — за позицией захвата (capture). Достижение позицией воспроизведения позиции записи означает полное проигрывание буфера воспроизведения, при этом начинают воспроизводиться «старые» данные, которые приложение не успело перезаписать. Достижение позицией захвата позиции чтения означает переполнение буфера захвата, и последующие данные накладываются на «старые», которые приложение не успело извлечь из буфера.
. . .
Достижение одной из заданных позиций в звуковом буфере считается событием в подсистеме DirectSound. Для запроса уведомления о наступлении таких событий приложение может использовать специальный интерфейс IDirectSoundNotify, создавая соответствующие ему следящие объекты.
При достижении указанных позиций следящий объект активизирует (set) заданные объекты события (event objects), которые могут быть опрошены приложением непосредственно, либо может быть создана отдельная задача (thread), ожидающая активизации одного или нескольких объектов событий.
23.4. Уровни взаимодействия
DirectSound вводит четыре уровня взаимодействия (cooperation levels) приложений между собой и звуковым адаптером. Когда несколько приложений одновременно используют один и тот же адаптер, соотношение уровней взаимодействия определяет их приоритетность в использовании аппаратуры и создании звучания.
1) Обычный (normal) уровень фиксирует формат первичного буфера адаптера:
• 22050 Гц;
• стерео;
• 8-разрядные отсчеты.
Форматы вторичных буферов преобразуются в этот формат, и при переключении приложений подсистеме нет необходимости изменять формат первичного буфера.
На этом уровне достигается наибольшая универсальность и эффективность. Качество звука в таком формате посредственно и не допускается уплотнение внутренней памяти адаптера.
2) Приоритетный (priority) уровень позволяет приложению устанавливать формат первичного буфера и уплотнять внутреннюю память адаптера. Предоставляет приоритетный доступ к аппаратным ресурсам, когда окно приложения становится активным (foreground).
Если происходит переключение между приложениями этого уровня, установившими различные форматы первичного буфера — подсистема вынуждена переключать форматы, для чего необходим перезапуск адаптера, нередко порождающий щелчки и тому подобные помехи.
3) Исключительный (exclusive) уровень подобен приоритетному, но на время активности окна приложения ему предоставляется исключительный доступ к адаптеру, и звучание источников всех остальных приложений заглушается (но не останавливается).
4) Уровень доступа к первичному буферу (write-primary) разрешает приложению прямую запись в первичный буфер адаптера. На этом уровне приложение может работать только с первичным буфером, активизация вторичных буферов запрещена.
Этот уровень доступен только для устройств, имеющих специализированный DirectSound-драйвер.
23.5. Наборы свойств
DirectSound вводит понятие набора свойств (property set) — параметров, описывающих виды обработки звука. При помощи набора свойств можно описать
• параметры зала,
• голоса исполнителя,
• манеры пения,
• звучания инструментов и т.п.
При наличии необходимых средств обработки одну и ту же звуковую картину можно представлять в разных ракурсах, активизируя нужные наборы свойств.
В данное время эти виды обработки почти не поддерживаются; наборы свойств введены в основном на будущее.
23.6. Идентификация устройств
В отличие от подсистем MME, идентификация устройств в DirectSound следует правилам COM и использует GUID (Globally Unique IDentifier — идентификатор, уникальный в мировом масштабе). Любой объект COM имеет свой идентификатор, по которому приложения могут обращаться к нему. Идентификаторы доступных устройств приложение получает в процессе перебора (enumeration) устройств заданного класса.
23.7. Системные особенности
Интерфейсы DirecSound доступны для платформ Windows 98 или 2000 и
выше.
Стоит заметить, что интерфейсы DirecSound и его модификации ддя Windows Vista являются базовыми. Поддержки MME в Vista уже нет.
Очевидно, нет ее и в Windows 7.
23.8. Алгоритм взаимодействия
Рассмотрим упрощенный алгоритм взаимодействия программы и звуковой подсистемы:
23.8.1. Воспроизведение
1: идентификатор ← «устройство по умолчанию»;
2: Если <конкретное устройство> то
3: идентификатор ← перебор; /* DirectSoundEnumerate */
4: устройство /* IDirectSound */ ← создать( <идентификатор> );
5: /** Созданный объект устройства может быть опрошен методом GetCaps, возвращающим его характеристики и возможности. Таким образом может быть, например, найдено минимально и оптимально подходящее для целей приложения устройство из всех имеющихся в системе. **/
6: установить уровень взаимодействия; /* SetCooperativeLevel */
7: Если <уровень != normal > то
8: создать первичный буфер; /* CreateSoundBuffer */
9: задать его формат; /* SetFormat */
10: /** На обычном уровне взаимодействия формат первичного буфера фиксирован
— 22 050 Гц, стерео, восемь разрядов. **/
11: Для всех <источники звука> выполняем
12: создать вторичные буферы; /* CreateSoundBuffer */
13: Пока заполнение данными выполняем
14: указатели доступных участков буфера ←Lock;
15: Пока <есть потерянный буфер> /* от методов Lock или Play */
выполняем
16: Restore;
17: заполнить участки данными;
18: UnLock;
19: /** При желании приложение может разделить один и тот же экземпляр звучания между несколькими объектами буферов, создавая объекты-копии методом DuplicateSoundBuffer. **/
20: Если <определить звучащий фрагмент> то
21: GetCurrentPosition;
22: Если <запуск воспроизведения > то
23: Play;
24: Если <запуск с фрагмента> то
25: SetCurrentPosition;
26: Если <остановка воспроизведения > то
27: Stop;
28: Если <изменить частоту дискретизации> 29: SetFrequency( <частота> ); 30: Если <изменить громкость> то 31: SetVolume( <громкость> ); | то |
32: Если <изменить положение на панораме> | то |
33: SetPan( <координаты> , <ориентация> , | <скорость> ); |
34: уничтожить объекты буферов; /* Release */
35: уничтожить объекты устройств;
23.8.2. Запись
1: идентификатор ← «устройство по умолчанию»;
2: Если <конкретное устройство> то
3: идентификатор ← перебор; /* DirectSoundCaptureEnumerate */
4: устройство /* IDirectSoundCapture */ ←создать(<идентификатор>
);
5: создать буфер захвата; /* CreateCaptureBuffer */
6: задать его формат; /* CreateCaptureBuffer */
7: Пока заполнение данными выполняем
8: указатели доступных участков буфера ← Lock;
9: Пока <есть потерянный буфер> выполняем
10: Restore;
11: заполнить участки данными;
12: UnLock;
13: Если < запуск записи > то
14: запустить захват звука; /* Start */
15: Если < остановка записи > то
16: остановить запись; /* Stop */
17: уничтожить объекты буферов; /* Release */
18: уничтожить объекты устройств;
Функции перебора требуют указания локальной перебирающей функции приложения (callback), которая будет вызываться для каждого доступного устройства. Перебирающая функция может либо самостоятельно выбрать подходящее устройство, либо сформировать полный список устройств, из которого пользователь сделает выбор по своему усмотрению.
Приложение может разделить один и тот же экземпляр звучания между несколькими объектами буферов, создавая объекты-копии методом DuplicateSoundBuffer. Изменяя параметры звучания, можно получать различные звуки на основе одной и той же оцифровки, не расходуя дополнительную память.
Приложение может воспользоваться интерфейсом уведомления
IDirectSoundNotify, запрашивая его у объектов тех буферов, для которых требуются уведомления, и заказывая установку заданных объектов программных событий (event objects) по достижении определенных позиций в буфере
44.1 кГц 15
48.0 кГц 15
A
AAC 62
Ableton Live 57
ACM 66
ACM Codec 66
Advanced Audio Coding 62
ALSA 63
Amplitube X-Gear 39
ASIO 63 AT&T 62
attack 18, 19
Audio CD 15
B
BPF 21, 23