Звук фононной игры QT

Я работаю над игровым проектом для школы в составе команды. Мне нужно настроить одноэлементный класс, который воспроизводит звук для игры. Мы используем QT для переносимости на мобильные устройства и, возможно, на телефоны Android. Мы решили использовать фонон для игрового звука. Я очень новичок в этом и только начал использовать QT в первый раз, а также новичок в программировании игр.

Аудиосистема должна быть в состоянии обрабатывать более одного звука одновременно. По крайней мере, он должен обрабатывать фоновую музыку и звуковые эффекты. Эффекты будут подключены через Сигналы к слотам.

Вот мой код:

/************** audiosystem.h***/

class AudioSystem : public QWidget
{
     Q_OBJECT
 public:
     static AudioSystem *instance();
     void setMusicFile(const QString &filename);

 signals:
     bool finishedMusic();    ///< For looping

public slots:
     void playMusic();       ///< BG music triggered at Level start?
     void stopMusic();       ///< Triggered by level finish
     void click_sound();     ///< Menu button clicks
     void step_sound();      ///< Other character sounds
     void wall_sound();      ///< Hitting the wall  or collision sound
     void jump_sound();      ///< Jumping sound     
     void sound(int);        ///< Level specific custom sounds

private:
    // Singleton - constructors made private
    AudioSystem(QWidget *parent = 0);
    ~AudioSystem();
    AudioSystem(const AudioSystem &);
    AudioSystem& operator=(const AudioSystem &);

    static AudioSystem *m_Instance;

    // media objects
    Phonon::MediaObject *m_BgPlayer;
    Phonon::MediaObject *m_EffectPlayer;
    // audio sinks
    Phonon::AudioOutput *m_BgAudioOutput;
    Phonon::AudioOutput *m_EffectAudioOutput;
    // audio paths
    Phonon::Path m_BgAudioPath, m_EffAudioPath;
};

/****** audiosystem.cpp**/

AudioSystem* AudioSystem::m_Instance = 0;

AudioSystem* AudioSystem::instance()
{
    if (!m_Instance)
    {
        m_Instance = new AudioSystem();
    }
    return m_Instance;
}

AudioSystem::AudioSystem(QWidget *parent) :
    QWidget(parent)
{
    // create new instance of player and audio sinks then connect with paths
    m_BgPlayer = new Phonon::MediaObject(this);
    m_EffectPlayer = new Phonon::MediaObject(this);
    m_BgAudioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
    m_EffectAudioOutput= new Phonon::AudioOutput(Phonon::MusicCategory, this);
    m_BgAudioPath = Phonon::createPath(m_BgPlayer, m_BgAudioOutput);
    m_EffAudioPath = Phonon::createPath(m_EffectPlayer, m_EffectAudioOutput);
}

void AudioSystem::setMusicFile(const QString &filename)
{
    m_BgPlayer->setCurrentSource(QString(filename));
}

void AudioSystem::playMusic()
{
    m_BgPlayer->play();
}

void AudioSystem::stopMusic()
{
    m_BgPlayer->stop();
}

void AudioSystem::click_sound()
{
    m_EffectPlayer->setCurrentSource(QString(":/button.wav"));
    m_EffectPlayer->play();
}

........................... и т.д

typical implementation:
AudioSystem::instance()->playMusic  
AudioSystem::instance(), SLOT(click_sound())

Код, который я настроил, кажется, работает нормально в простой ситуации с простым главным окном, но когда я помещаю любое место в наш код, он ничего не делает. Есть что-то, что мне не хватает?

полный проект: git://gitorious.org/gamecs340project/gamecs340project.git


person Venk    schedule 17.11.2012    source источник
comment
Я обнаружил, что это действительно работает. ...Вроде, как бы, что-то вроде. Операция непоследовательна, но будет воспроизводиться два звука одновременно. Я нашел хороший пример того, что я хочу сделать, в каталоге QtSDK/Demos/4.7/mobile/quickhit. Они используют GE (игровой активатор). Он также имеет буферизацию звука, которая мне нужна. Хотел бы я найти это раньше. Game enabler, похоже, использует мультимедийные библиотеки QT.   -  person Venk    schedule 19.11.2012


Ответы (1)


Фонон не может этого сделать. По крайней мере, не в здравом уме; он пытается открыть звуковое устройство системы несколько раз, если вы пытаетесь воспроизвести несколько звуков. Это не гарантирует работу везде.

Для игр обычно требуется собственное микширование звука. Один из самых простых способов сделать это — использовать SDL и SDL_mixer. SDL_mixer может одновременно воспроизводить несколько аудиосэмплов, но не несколько музыкальных потоков. Если хотите, можете использовать мою модифицированную версию SDL_mixer.

Конечно, для этого есть много других библиотек. Но SDL_mixer, пожалуй, самый простой в использовании.

person Nikos C.    schedule 17.11.2012