Как стать автором
Обновить

Встраиваем качественный звук в Qt приложение (Qt + FMOD)

Время на прочтение2 мин
Количество просмотров8.7K
Помню время, когда я обрадовался мультимедийным возможностям 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. в конструкторе класса инициализирую:
  1. FMOD::System_Create(&system);
  2. system->init(32 /*maximum number of channels*/, FMOD_INIT_NORMAL, 0);
* This source code was highlighted with Source Code Highlighter.

3. создаю звук:
  1. // sound
  2. FMOD::Sound * sound;
  3. // sound channel
  4. FMOD::Channel * channel;
  5. // creating sound
  6. system->system->createSound("mysound.mp3", FMOD_SOFTWARE | FMOD_LOOP_OFF, 0, &sound);
  7. // playing sound (assigning it to a channel)
  8. system->playSound(1 /*channel #1*/, sound, true /*start paused*/, &channel);
  9. // actually play sound
  10. 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 пишем:

  1. INCLUDEPATH += FMOD/inc
  2. LIBS += -LFMOD/lib -lfmodex_vc
* This source code was highlighted with Source Code Highlighter.

Из базового набора возможностей стоит отметить FMOD::Channel::setVolume() и setPan() — установка громкости и баланса между каналами (левый — правый).

Ещё из плюсов FMOD: документация вполне адекватная, примеры есть почти на все случаи жизни.

Чтобы небыть голословным, привожу мою программу, написанную с помощью Qt + FMOD: DamnSampler. Это такой своеобразный музыкальный инструмент — на каждую клавишу клавиатуры вешается звук (или даже несколько), звуки могут быть простыми, а могут быть зацикленными. Исходники прилагаются.
Теги:
Хабы:
+6
Комментарии5

Публикации

Истории

Работа

QT разработчик
8 вакансий

Ближайшие события