DirectX 8 - Урок 9. Звук
Что-то слишком сильно увлеклись мы с вами графикой, а ведь кроме нее DirectX умеет и многое другое, например, работать со звуком.
Именно этому и будет посвящена сегодняшняя статья - мы напишем программу, которая будет проигрывать WAV-файлы.
Традиционно в DirectX, за низкоуровневые операциям со звуком отвечает DirectSound, а все остальное сосредоточено в DirectMusic, причем в DirectX 8.0 эти два компонента объединены вместе в DirectAudio. Другими словами DirectSound позволяет работать непосредственно со звуковыми данными, что бывает полезно, когда нужно сделать со звуком что-то нестандартное, например, очистить звук от шумов (применив свой алгоритм шумоочистки). С другой стороны DirectMusic используется, когда нужно просто воспроизвести звуковой файл.
Вряд ли надо говорить, что работать с DirectMusic проще, и, так как обычно редко бывает нужно сделать что-то сложнее, чем простое проигрывание звукового файла, то мы остановимся на работе с DirectMusic. Тем более, в DirectMusic есть несколько стандартных эффектов (эхо, дисторшн, изменение темпа) , которые можно применить к любому звуку.
Для начала, в функции Init() мы создаем так называемый проигрыватель (m_performance)
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) - фактически весь звук целиком.
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
|