|
|
||
|
Музыка по жанрам Еще по теме Материалы о музыке |
Теги страницы: Вторичный буфер - это место фактического хранения аудио данных. DirectSound использует первичный буфер для соединения всех вторичных буферов вместе, перед тем как они отправляются к звуковой карте. Приятно, наверное, будет узнать, что, так как вызывается та же самая функция, вы уже знаете 90 % того, что нужно знать о создании вторичного буфера. Для того чтобы его создать, вызовите метод CreaTeSoundHu'Yci'. Большая часть кода описывает заполнение структуры DSBUFFERDESC, которая конкретно объясняет DireetSounci, что вы хотите создать. Назначение большинства членов структуры DSBUFFERDESC очевидно, но если что-то вам непонятно, наберите DSBUFFERDESC в индексе справочного файла DirectX SDK, и вы окажетесь на страничке, где все будет подробно объяснено. Код создает буфер, используя флаг WAVIi _S < ЖМЛТ РСМ. Этот флаг говорит DirectSound, что формат данных в буфере будет в модуляции импульсного кода (pulse code modulation (PCM)). Когда вы создаете обычный звуковой эффект, без всякого сжатия и забавных кодеков, вы подразумеваете РСМ. Создание буфера РСМ требует некоторых вычислений. Например, посмотрите на выравнивание блоков, nBlockAlign, структуры волнового формата. Вероятно, оно выглядит довольно странно, но оно правильно, потому что в документации говорится, что для буфера с форматом РСМ nBlockAlign должен быть равен произведению nChannels и wBiisPerSample, разделенному на 8. Тут вы пожмете плечами и скажете: «Ну, это было просто». Какой-то части кода DirectSound это необходимо, поэтому вам действительно проще дать ей то, что ей нужно, нежели разбираться, почему это так. Совет. Обратите внимание на обработку ошибок, включенную в код создания буфера. Вам следует всегда использовать макрос FAILED для проверки возвращаемого значения интерфейсных методов DirectSound. Если что-то будет неправильно, макрос возвратит true, давая вам возможность предпринять соответствующее действие. Большей частью, вы захотите использовать функцию ОХС}егЕггог81г1щ'для того, чтобы ошибочный код, полученный вами, всегда сопровождался наглядным сообщением с описанием ошибки. Двигаясь далее, посмотрите вычисления для члена dwBufferByte структуры описания буфера. Обычно, когда вы имеете дело с WAV файлом, который вы загружаете с диска, вы знаете, сколько байт вам потребуется, но этот пример программы генерирует звуковые данные самостоятельно, поэтому она должна вычислить это количество. Переменные sarnplerale, bilspersample, channels и sees являются аргументами функции Create Secondary Buffer. Функция перемножает их, чтобы определить общее количество байт, необходимых выборке, затем помещает это число в dwBuffer-Bytes. За каждую секунду звука, получаем samplerate выборок, поэтому получаем sees * samplerate. Количество каналов выборки сохраняется в channels, и на каждый из этих каналов есть bitspersample бит, поэтому получаем channels * biispersampk / 8 байт на каждую выборку. А теперь напишите все это вместе, и вы получите длинную цепь перемножений, показывающую, почему все-таки так полезно МРЗ сжатие; без него, стерео (двухканальная), CD качества (16 бит на выборку, 44,010Гц частота) трехминутная песня Защитите себя от себя самого, давая своим переменным длинные, информативные имена. Переменная, называющаяся bitspersample, говорит вам, что нужно разделить на восемь. Переменная, названная bps, гораздо более опасна, потому что вы не знаете, имеются ли в виду под «Ь» биты или байты. Возвращаясь к коду, после того как структура DSBUPPERDPSC заполнена, код вызывает CreateSoLindBuHei метод I Direct SoundS, который создает буфер и помещает его интерфейс в ppBuffer. Обратите внимание на двойное перенаправление. ppBuffer - это указатель на указатель на IDirectSoundBuffer. |
|