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

    Помню время, когда я обрадовался мультимедийным возможностям 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. Это такой своеобразный музыкальный инструмент — на каждую клавишу клавиатуры вешается звук (или даже несколько), звуки могут быть простыми, а могут быть зацикленными. Исходники прилагаются.
    Поделиться публикацией
    Похожие публикации
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 5
    • 0
      Не смотря на отсутствие исходного кода, это бесплатная (для некоммерческого использования) кроссплатформенная библиотека.

      Если честно, это достаточно существенное ограничение.
      • 0
        Отсутствие исходного кода или платность для коммерческого использования?
        • 0
          Оу, сорри, и правда как-то неоднозначно написал.
          В свете того, что Qt распространяется под LGPL, то есть ПО можно использовать в коммерческих целях, от FMOD толку в таком случае не слишком много. Отсутствие исходного кода, пожалуй, не проблема.
          • 0
            Кто в чём ищет толк. Для бесплатных проектов лучшую альтернативу видимо трудно найти… Аудио движок профессионального уровня, используемый Blizzard и Microsoft в играх задаром — вроде бы неплохо звучит.
      • 0
        Ну, не совсем кросс-платформенная. От всех мобильных версий Qt придётся отказаться.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое