РАПИДОГРАФ ФИОЛЕТОВОГО КВАРЦА


Новости
Статьи
Файлы
О себе
Гостевая







BASS Photo Gallery Dumpy home page




E-mail

 

DirectX 8 - Урок 9. Звук

Что-то слишком сильно увлеклись мы с вами графикой, а ведь кроме нее DirectX умеет и многое другое, например, работать со звуком. Именно этому и будет посвящена сегодняшняя статья - мы напишем программу, которая будет проигрывать WAV-файлы.

Традиционно в DirectX, за низкоуровневые операциям со звуком отвечает DirectSound, а все остальное сосредоточено в DirectMusic, причем в DirectX 8.0 эти два компонента объединены вместе в DirectAudio. Другими словами DirectSound позволяет работать непосредственно со звуковыми данными, что бывает полезно, когда нужно сделать со звуком что-то нестандартное, например, очистить звук от шумов (применив свой алгоритм шумоочистки). С другой стороны DirectMusic используется, когда нужно просто воспроизвести звуковой файл.

Вряд ли надо говорить, что работать с DirectMusic проще, и, так как обычно редко бывает нужно сделать что-то сложнее, чем простое проигрывание звукового файла, то мы остановимся на работе с DirectMusic. Тем более, в DirectMusic есть несколько стандартных эффектов (эхо, дисторшн, изменение темпа) , которые можно применить к любому звуку.

Для начала, в функции Init() мы создаем так называемый проигрыватель (m_performance)

    // Создаем проигрыватель звуков, задав для него стандартный
    // AudioPath. Также инициализируем DirectMusic и DirectSounds
    // и подготавливаем синхронизатор.
    hResult = m_performance->InitAudio( NULL, NULL, NULL, 
        DMUS_APATH_DYNAMIC_STEREO,
        64, DMUS_AUDIOF_ALL, NULL );

    // Если у пользователя нет звуковой карты или 
        карта не настроена
    if( hResult == DSERR_NODRIVER )
        return false;
    

    // Если какая-то другая ошибка
    if( hResult != S_OK )
        return false;

Помимо проигрывателя, InitAudio() создает некий "стандартный AudioPath", т.е. набор настроек параметров звука. Стандартный AudioPath позволяет всего лишь проигрывать звук, в то время как AudioPath создаваемый вручную позволяет изменять, например громкость звука, его темп, добавлять эхо, менять настройки 3DSound и т.п.

Далее мы создаем загрузчик (m_loader), т.е. устанавливаем директорию из которой DirectMedia будет читать звуковые файлы.

Вот собственно и всё, что касается инициализации. По окончании работы со звуком не забудьте освободить созданные ресурсы.

Следующая функция - LoadSound. В качестве параметра она получает имя загружаемого файла и единственное действие, которое она производит это вызов функции LoadObjectFromFile(), которая читает заданный звуковой файл и создает на его основе звуковой фрагмент (IDirectMusicSegment8) - фактически весь звук целиком.

 // если имя файла есть, конвертируем его в UNICODE
    MultiByteToWideChar( CP_ACP, 0, fileName,
        -1, fName, MAX_PATH );

    // Считываем звуковой фрагмент из файла
    hResult = m_loader->
        LoadObjectFromFile( CLSID_DirectMusicSegment,
        IID_IDirectMusicSegment8,
        fName, 
        (LPVOID*)&m_sounds);
    if(hResult != S_OK)
        return false;

А теперь можно переходить к той самой функции, ради которой все это и начиналось: PlaySound()

void PlaySound(bool isLooped=true)
{
    HRESULT hResult;

    // Если нет звуковой карты - просто ничего не делаем
    if( !m_performance )
        return;

    // Если нужно, устанавливаем режим повторного воспроизведения
    // для текущего звукового фрагмента
    if( isLooped )
    {
        hResult = m_sounds->SetRepeats( DMUS_SEG_REPEAT_INFINITE );
        if( hResult != S_OK )                         
            return;
    }

    // Загружаем инструменты звукового фрагмента в синхронизатор
    hResult = m_sounds->Download( m_performance );
    if( hResult != S_OK )
        return;

    // Проигрываем звуковой фрагмент
    hResult = m_performance->PlaySegmentEx( m_sounds, NULL, NULL, 
        DMUS_SEGF_SECONDARY, 0,
        NULL, NULL, NULL );
    if( hResult != S_OK )
        return;
}

В начале проверяется аргумент, переданный PlaySound() и если он равен true, включается режим циклического прослушивания. Потом, с помощью метода Download() загружается звук в проигрыватель. После этого вызывается функция PlaySegmentEx(), которая запускает проиграватель на воспроизведение.

Остановить проигрывание звука можно вызвав функцию StopSound()

Как видите, ничего сложного в работе со звуком нет. Пример к статье можно взять здесь.


StasH

Все права проигнорированны © 2002, StasH
Сайт создан в системе uCoz