Интернет магазин музыки, mp3 почтой, заказать mp3 диски

баннер интернет-магазина ножей nifovka.ru

RSS - RSS,
Карта сайта

Rambler's Top100

Написать на e-mail © 2007-2012 г.

Бижутерия в Новосибирске



Теги страницы:

Инициализация состоит из трех главных частей: создание интерфейса, настройка уровня кооперации (cooperative level) и настройка структуры первичного буфера. Disclaimer - официальный отказ от несения ответственности. Как программа использует ресурсы: делясь ими с другими приложениями или только сама. Когда вы вызываете SetCooperativeLevel, один из требуемых параметров — это дескриптор главного окна вашего приложения. Так как генератор шума запускается, как консольное окно, он использует некоторую черную магию Windows, чтобы получить свой HWND. Используйте функцию GetConsoleWindowHandle в примерной программе Ch2pl_ToneGeneratorcpp. Эта функция спрашивает у Windows его название (заголовок окна), а затем находит первый дескриптор окна, который имеет такой заголовок. Это отчасти окольный путь к получению дескриптора, но только он pat тает, если есть только один запущенный экземпляр приложения. Как бы то ни было, с целью создания примерной программы, это работает как заклинание.

Первые два очень просты, вы можете пропустить всю канитель перечисления (enumeration) звуковых карт и выбора одной из них и объявить NULL первым параметром DireclSoundCi'eateX. Настройка уровня кооперации аналогично проста: для большинства игр достаточно использовать который позволит вам настроить формат первичного буфера. Если вы пишете профессиональное аудио приложение, вроде Winamp или ACiD, вам лучше использовать DSSCL_NORMAL, который не позволяет вам менять формат первичного буфера, но существенно облегчает быстрое переключение между приложениями и в целом гораздо лучше для системы. Вот, в общем-то, то, что касалось задачи выбора формата первичного буфера. Это немного сложно, потому что вам нужно использовать интерфейс первичного буфера.

Допустим мы выполнили код, он выполняет три действия. Во-первых, он получает первичный буфер. Метод, который он использует для этого, называется CreateSoundBuffer. CreateSoundBuffer берет структуру и, в зависимости от флагов в этой структуре, или создает вторичный буфер и возвращает его интерфейс, или возвращает интерфейс первичного буфера. В этом случае мы получаем интерфейс первичного буфера и сохраняем его в pDSBPrimary. Теперь нужно заполнить структуру WAVkFORMATHX свойствами аудио формата, которые вам нужны. В нашем случае это 2 канала (стерео), -2,050Гц (половина CD качества), с 16 битами на выборку. Это значит, что на каждую секунду звука у нас получается 22,050 выборок, в каждой из них по 6 бит (2 байта), поэтому в итоге мы тратим 44.100 байт на секунду звука. 22,050Гц - это частота «среднего» качества; для сравнения, музыка на CD записывается с частотой выборки 44.100Hz. Ознакомьтесь с самыми распространенными частотами дискретизации.

После того как wfx правильно заполнен, код обращается к методу интерфейса первичного буфера. Он превращает первичный буфер в то, что установлено в wfx. В заключение обратите внимание на что код освобождает интерфейс буфера вызовом макроса. Обратите внимание, что это действие, на самом деле, не удаляет первичный буфер, а просто освобождает интерфейс, созданный нами вызовом CreateSoyndBuiYer. Объект DirectX (и, вообще-то, любой объект СОМ) удаляется, только если все его интерфейсы общие, а поскольку DirectX Audio сохраняет внутренний интерфейс для первичного буфера, это не происходит до тех пор, пока код сам не деинициализирует DirectSound.

Однако если код не освободит интерфейс, то теоретически первичный буфер никогда не будет удален и произойдет утечка памяти (memory leak). В действительности, DirectX Audio достаточно разумен для того, чтобы зафиксировать, если такое произошло, и привести все в порядок, но, не взирая на это, так делать неправильно; никогда не забывайте освобождать первичный буфер после того, как вы закончите работать с ним.