Помню время, когда я обрадовался мультимедийным возможностям Qt… phonon хорош, это да. Но помню и время разочарования: слишком мало всего умеет этот самый phonon. Как минимум, он не умеет воспроизводить два звука одновременно. Да и интерфейсы у него хромают…
Как бы то ни было, а начал я искать что-то получше, причём кроссплатформенное. После пары неудачных находок, я наткнулся на FMOD Library. Не смотря на отсутствие исходного кода, это бесплатная (для некоммерческого использования) кроссплатформенная библиотека.
Список возможностей огромен: это тебе и микшер, и low-latency DSP (включая даже pitch shifter), и чтение целой кучи форматов (mp3, wav, ogg, aiff, MIDI и т.д.), и звукогенерация, и запись звука, и поддержка многоканального звука (например, 5.1), и то, и это, и пятое, и десятое… в общем, функционал. И интерфейс есть как для C, так и для C++.
А кроме того, большой плюс — малый вес самой библиотеки (под виндой всего ~370 кило).
Итак, приступим. Я делал под виндой, но в других системах будет примерно то же самое. Скачал я их API для разработчиков, скинул fmodex.dll и папки inc и lib в папку FMOD в своём проекте. Выбрал, что буду использовать C++-интерфейсы, подключил #include <fmod.hpp>, и далее делаю так:
1. в классе своего окна объявляю переменную FMOD::System * system;
2. в конструкторе класса инициализирую:
3. создаю звук:
При этом к одной системе можно подключить много звуков (каждый на свой канал), звуки могут быть зациклены (флаг FMOD_LOOP_NORMAL).
Теперь сборка проекта. К сожалению, C++-интерфейсы в винде доступны только для компилятора Microsoft Visual Studio, а для MinGW доступны только C-интерфейсы. Поэтому проект я собирал с помощью Qt for VS2008. В принципе, C-интерфейсы не сильно отличаются от C++, например, вместо FMOD::System пишем FMOD_System, а вместо system->init() пишем FMOD_System_init(), так что перейти от одного к другому достаточно легко.
Чтобы проект собрался, в файле .pro пишем:
Из базового набора возможностей стоит отметить FMOD::Channel::setVolume() и setPan() — установка громкости и баланса между каналами (левый — правый).
Ещё из плюсов FMOD: документация вполне адекватная, примеры есть почти на все случаи жизни.
Чтобы небыть голословным, привожу мою программу, написанную с помощью Qt + FMOD: DamnSampler. Это такой своеобразный музыкальный инструмент — на каждую клавишу клавиатуры вешается звук (или даже несколько), звуки могут быть простыми, а могут быть зацикленными. Исходники прилагаются.
Как бы то ни было, а начал я искать что-то получше, причём кроссплатформенное. После пары неудачных находок, я наткнулся на FMOD Library. Не смотря на отсутствие исходного кода, это бесплатная (для некоммерческого использования) кроссплатформенная библиотека.
Список возможностей огромен: это тебе и микшер, и low-latency DSP (включая даже pitch shifter), и чтение целой кучи форматов (mp3, wav, ogg, aiff, MIDI и т.д.), и звукогенерация, и запись звука, и поддержка многоканального звука (например, 5.1), и то, и это, и пятое, и десятое… в общем, функционал. И интерфейс есть как для C, так и для C++.
А кроме того, большой плюс — малый вес самой библиотеки (под виндой всего ~370 кило).
Итак, приступим. Я делал под виндой, но в других системах будет примерно то же самое. Скачал я их API для разработчиков, скинул fmodex.dll и папки inc и lib в папку FMOD в своём проекте. Выбрал, что буду использовать C++-интерфейсы, подключил #include <fmod.hpp>, и далее делаю так:
1. в классе своего окна объявляю переменную FMOD::System * system;
2. в конструкторе класса инициализирую:
- FMOD::System_Create(&system);
- system->init(32 /*maximum number of channels*/, FMOD_INIT_NORMAL, 0);
* This source code was highlighted with Source Code Highlighter.
3. создаю звук:
- // sound
- FMOD::Sound * sound;
- // sound channel
- FMOD::Channel * channel;
- // creating sound
- system->system->createSound("mysound.mp3", FMOD_SOFTWARE | FMOD_LOOP_OFF, 0, &sound);
- // playing sound (assigning it to a channel)
- system->playSound(1 /*channel #1*/, sound, true /*start paused*/, &channel);
- // actually play sound
- channel->setPaused(false);
* This source code was highlighted with Source Code Highlighter.
При этом к одной системе можно подключить много звуков (каждый на свой канал), звуки могут быть зациклены (флаг FMOD_LOOP_NORMAL).
Теперь сборка проекта. К сожалению, C++-интерфейсы в винде доступны только для компилятора Microsoft Visual Studio, а для MinGW доступны только C-интерфейсы. Поэтому проект я собирал с помощью Qt for VS2008. В принципе, C-интерфейсы не сильно отличаются от C++, например, вместо FMOD::System пишем FMOD_System, а вместо system->init() пишем FMOD_System_init(), так что перейти от одного к другому достаточно легко.
Чтобы проект собрался, в файле .pro пишем:
- INCLUDEPATH += FMOD/inc
- LIBS += -LFMOD/lib -lfmodex_vc
* This source code was highlighted with Source Code Highlighter.
Из базового набора возможностей стоит отметить FMOD::Channel::setVolume() и setPan() — установка громкости и баланса между каналами (левый — правый).
Ещё из плюсов FMOD: документация вполне адекватная, примеры есть почти на все случаи жизни.
Чтобы небыть голословным, привожу мою программу, написанную с помощью Qt + FMOD: DamnSampler. Это такой своеобразный музыкальный инструмент — на каждую клавишу клавиатуры вешается звук (или даже несколько), звуки могут быть простыми, а могут быть зацикленными. Исходники прилагаются.