From ca29fc0babe8fc985a9e4656f80fc7faec4ac8a5 Mon Sep 17 00:00:00 2001 From: manuel Date: Wed, 11 May 2011 17:38:29 +0200 Subject: - fix audio plugin and make that a real interface - that fixes a duplicate statis audiomanager (1x pacman, 1x audio plugin) on windows - display won/lost dialog upon gameend --- pacman-c++/common/audio.cpp | 109 +++++++++++++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 37 deletions(-) (limited to 'pacman-c++/common/audio.cpp') diff --git a/pacman-c++/common/audio.cpp b/pacman-c++/common/audio.cpp index d29303d..eddbace 100644 --- a/pacman-c++/common/audio.cpp +++ b/pacman-c++/common/audio.cpp @@ -23,7 +23,7 @@ AudioManager::AudioManager() } preload(); - if (!tryLoadPhononPlugin()) + if (!tryLoadAudioPlugin("*phononplayer*")) { qWarning() << "Unable to load audio plugin. Audio disabled.."; m_players.append(new NoopAudioPlayer(this)); @@ -31,6 +31,7 @@ AudioManager::AudioManager() } AudioPlayer *firstplayer = m_factory->create(this); + firstplayer->setWorking(m_working); firstplayer->test(m_sounds[Sound::EatingFruit], Sound::length[Sound::EatingFruit] * 2); m_working = firstplayer->isWorking(); m_players.append(firstplayer); @@ -118,6 +119,33 @@ void AudioManager::unregisterAudioPlayer(AudioPlayer *player) m_players.removeAll(player); } + +void AudioManager::unregisterAudioPlayer_helper(QObject *player) +{ + unregisterAudioPlayer(static_cast(player)); +} + +void AudioManager::play(Sound::Type sound, AudioPlayer *player) +{ + if (player == NULL) + player = audioPlayer(); + player->play(this->sound(sound), length(sound)); +} + +void AudioManager::setSource(Sound::Type sound, AudioPlayer *player) +{ + if (player == NULL) + player = audioPlayer(); + player->setSource(this->sound(sound), length(sound)); +} + +void AudioManager::enqueue(Sound::Type sound, AudioPlayer *player) +{ + if (player == NULL) + player = audioPlayer(); + player->enqueue(this->sound(sound), length(sound)); +} + QFile *AudioManager::sound(Sound::Type sound) { if (!isWorking()) @@ -125,9 +153,9 @@ QFile *AudioManager::sound(Sound::Type sound) return m_sounds.at(sound); } -void AudioManager::unregisterAudioPlayer_helper(QObject *player) +unsigned int AudioManager::length(Sound::Type sound) { - unregisterAudioPlayer(static_cast(player)); + return Sound::length[sound]; } void AudioManager::preload() @@ -137,13 +165,14 @@ void AudioManager::preload() Q_ASSERT(sounds.count() > 0); for(unsigned i = 1; i <= sounds.count(); ++i) m_sounds.append(new QFile(QString(":/sound/sound%1").arg(i), this)); + Q_ASSERT(m_sounds.count() != (sizeof(Sound::length) / sizeof(unsigned int))); } -bool AudioManager::tryLoadPhononPlugin() +bool AudioManager::tryLoadAudioPlugin(const QString &libraryname) { QDir dir = qApp->applicationDirPath(); QStringList filters; - filters << "*phononplayer*"; + filters << libraryname; foreach (QString file, dir.entryList(filters, QDir::Files)) { file = dir.absoluteFilePath(file); @@ -163,25 +192,19 @@ bool AudioManager::tryLoadPhononPlugin() return false; } -AudioPlayer *AudioManager::createAudioPlayer() +AudioPlayer *AudioManager::createAudioPlayer(QObject *parent) { if (m_factory == NULL) return NULL; - AudioPlayer *player = m_factory->create(this); + AudioPlayer *player = m_factory->create(parent != NULL ? parent : this); + player->setWorking(m_working); registerAudioPlayer(player); return player; } /* --------------------------------------------------------------- */ -AudioPlayer *NoopAudioPlayerFactory::create(QObject *parent) -{ - return new FakeAudioPlayer(parent); -} - -/* --------------------------------------------------------------- */ - NoopAudioPlayer::NoopAudioPlayer(QObject *parent) : AudioPlayer(parent), m_working(false), m_muted(false), m_playing(false), m_paused(false) {} @@ -209,19 +232,6 @@ void NoopAudioPlayer::play() m_playing = false; } -void NoopAudioPlayer::play(Sound::Type /* sound */) -{ - play(); -} - -bool NoopAudioPlayer::isPlaying() -{ - return m_playing; -} - -void NoopAudioPlayer::enqueue(Sound::Type /* sound */) -{} - void NoopAudioPlayer::pause() { m_paused = true; @@ -258,7 +268,32 @@ void NoopAudioPlayer::prefinishMarkReached_ex(qint32 mark) emit prefinishMarkReached(mark); } -void NoopAudioPlayer::test(QFile * /* testsound */, qint32 /* length */) +void NoopAudioPlayer::seek(qint64 /* time */) +{} + +void NoopAudioPlayer::setWorking(bool working) +{ + m_working = working; +} + +void NoopAudioPlayer::test(QFile * /* sound */, unsigned int /* length */) +{} + +void NoopAudioPlayer::play(QFile *sound, unsigned int length) +{ + setSource(sound, length); + play(); +} + +void NoopAudioPlayer::setSource(QFile * /* sound */, unsigned int /* length */) +{} + +bool NoopAudioPlayer::isPlaying() +{ + return m_playing; +} + +void NoopAudioPlayer::enqueue(QFile * /* sound */, unsigned int /* length */) {} /* --------------------------------------------------------------- */ @@ -270,13 +305,13 @@ FakeAudioPlayer::FakeAudioPlayer(QObject *parent) connect(&m_timer, SIGNAL(timeout()), this, SLOT(finished_ex())); } -void FakeAudioPlayer::play(Sound::Type sound) +void FakeAudioPlayer::play(QFile * /* sound */, unsigned int length) { m_playing = true; m_paused = false; m_timer.setSingleShot(true); - unsigned int interval = Sound::length[sound]; + unsigned int interval = length; /* add a small delay server side only */ if (Constants::server) interval += Constants::tick; @@ -299,17 +334,15 @@ GaplessAudioPlayer::GaplessAudioPlayer(Sound::Type sound, qint32 mark, QObject * if (!m_working) return; - m_player1 = AudioManager::self()->createAudioPlayer(); - m_player2 = AudioManager::self()->createAudioPlayer(); + m_player1 = AudioManager::self()->createAudioPlayer(this); + m_player2 = AudioManager::self()->createAudioPlayer(this); + /* this doesn't work reliable on all platforms (e.g. windows) */ m_player2->setPrefinishMark(mark); m_player1->setPrefinishMark(mark); connect(m_player1, SIGNAL(prefinishMarkReached(qint32)), this, SLOT(startPlayer2())); connect(m_player2, SIGNAL(prefinishMarkReached(qint32)), this, SLOT(startPlayer1())); - - AudioManager::self()->registerAudioPlayer(m_player1); - AudioManager::self()->registerAudioPlayer(m_player2); } bool GaplessAudioPlayer::isWorking() const @@ -350,10 +383,12 @@ void GaplessAudioPlayer::pause() void GaplessAudioPlayer::startPlayer1() { - m_player1->play(m_sound); + AudioManager::self()->play(m_sound, m_player1); + m_player2->pause(); } void GaplessAudioPlayer::startPlayer2() { - m_player2->play(m_sound); + AudioManager::self()->play(m_sound, m_player2); + m_player1->pause(); } -- cgit v1.2.3