From 507f8b6ca5679c4898b721520dd4011f6b9e5824 Mon Sep 17 00:00:00 2001 From: manuel Date: Fri, 8 Apr 2011 15:18:38 +0200 Subject: make audioplayer useful --- pacman-c++/actor.cpp | 28 ++++--------- pacman-c++/actor.h | 4 -- pacman-c++/audioplayer.cpp | 97 ++++++++++++++++++++++++++++++++++++++++++---- pacman-c++/audioplayer.h | 22 ++++++++++- pacman-c++/client.cpp | 1 + pacman-c++/mainwidget.cpp | 6 +-- pacman-c++/pacman.qrc | 8 ++-- 7 files changed, 123 insertions(+), 43 deletions(-) (limited to 'pacman-c++') diff --git a/pacman-c++/actor.cpp b/pacman-c++/actor.cpp index 7358756..2b65528 100644 --- a/pacman-c++/actor.cpp +++ b/pacman-c++/actor.cpp @@ -1,8 +1,8 @@ #include "actor.h" #include "animationmanager.h" +#include "audioplayer.h" #include #include -#include #include static QVariant myBooleanInterpolator(const bool &start, const bool &end, qreal progress) @@ -47,15 +47,7 @@ Actor::Actor(Color::Color color, bool local, QGraphicsItem *parent) m_eating.append(setupEatingAnimation(Actor::Down)); /* setup player */ - m_player = new Phonon::MediaObject(this); - Phonon::AudioOutput *audio_output = new Phonon::AudioOutput(Phonon::MusicCategory, this); - Phonon::createPath(m_player, audio_output); - connect(m_player, SIGNAL(finished()), this, SLOT(enqueue())); - - /* preload sounds */ - m_sounds.append(new QFile(":/sound/wakawaka")); - m_sounds.append(new QFile(":/sound/die")); - m_sounds.append(new QFile(":/sound/eatingcherry")); + connect(AudioPlayer::self(), SIGNAL(finished()), this, SLOT(enqueue())); /* make the picture showing the current direction visible */ m_images[m_direction]->setVisible(true); @@ -114,11 +106,9 @@ void Actor::move(Actor::Movement direction) if (isMoving()) return; - if (m_local && m_player->state() != Phonon::PlayingState) + if (m_local && AudioPlayer::self()->state() != Phonon::PlayingState) { - m_player->stop(); - m_player->setCurrentSource(m_sounds[0]); - m_player->play(); + AudioPlayer::self()->play(AudioPlayer::WakaWaka); } /* stop current animation */ @@ -184,23 +174,19 @@ bool Actor::isMoving() void Actor::enqueue() { if (isMoving()) - m_player->enqueue(m_sounds[0]); + AudioPlayer::self()->enqueue(AudioPlayer::WakaWaka); } void Actor::die() { if (!m_local) return; - m_player->stop(); - m_player->setCurrentSource(m_sounds[1]); - m_player->play(); + AudioPlayer::self()->play(AudioPlayer::Die); } void Actor::eatingCherry() { if (!m_local) return; - m_player->stop(); - m_player->setCurrentSource(m_sounds[2]); - m_player->play(); + AudioPlayer::self()->play(AudioPlayer::EatingCherry); } diff --git a/pacman-c++/actor.h b/pacman-c++/actor.h index 36b2a49..77a5b34 100644 --- a/pacman-c++/actor.h +++ b/pacman-c++/actor.h @@ -6,8 +6,6 @@ #include #include #include -#include -#include class Actor : public PixmapItem @@ -48,8 +46,6 @@ private: QList m_images; QList m_eating; QParallelAnimationGroup *m_moving; - Phonon::MediaObject *m_player; - QList m_sounds; }; #endif // ACTOR_H diff --git a/pacman-c++/audioplayer.cpp b/pacman-c++/audioplayer.cpp index 8620190..32988e6 100644 --- a/pacman-c++/audioplayer.cpp +++ b/pacman-c++/audioplayer.cpp @@ -1,21 +1,47 @@ #include "audioplayer.h" #include #include +#include +#include +#include #include +#include #include +class Sleeper + : public QThread +{ +public: + static void sleep(unsigned long secs) + { + QThread::sleep(secs); + } + + static void msleep(unsigned long msecs) + { + QThread::msleep(msecs); + } + + static void usleep(unsigned long usecs) + { + QThread::usleep(usecs); + } +}; + // the universe's only audio player AudioPlayer *AudioPlayer::m_instance = 0; AudioPlayer::AudioPlayer() + : m_working(false) { m_player = new Phonon::MediaObject(this); - connect(m_player, SIGNAL(finished()), this, SLOT(finished_p())); - connect(m_player, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged_p(Phonon::State, Phonon::State))); - m_output = new Phonon::AudioOutput(Phonon::MusicCategory, this); + m_output = new Phonon::AudioOutput(Phonon::MusicCategory, m_player); Phonon::createPath(m_player, m_output); + + preload(); + test(); } AudioPlayer *AudioPlayer::self() @@ -35,21 +61,76 @@ void AudioPlayer::setMuted(bool mute) m_output->setMuted(mute); } -void AudioPlayer::playIntro() +void AudioPlayer::play(AudioPlayer::Sound sound) { + if (!m_working) + emit finished_p(); + m_player->stop(); - m_player->setCurrentSource(new QFile(":/sound/intro")); + m_player->setCurrentSource(Phonon::MediaSource(m_sounds[sound])); m_player->play(); } +void AudioPlayer::enqueue(AudioPlayer::Sound sound) +{ + if (!m_working) + return + m_player->enqueue(Phonon::MediaSource(m_sounds[sound])); +} + +Phonon::State AudioPlayer::state() +{ + return m_player->state(); +} + +void AudioPlayer::preload() +{ + m_sounds.clear(); + QDir sounds(":/sound"); + for(unsigned i = 1; i <= sounds.count(); ++i) + m_sounds.append(new QFile(QString(":/sound/sound%1").arg(i), m_player)); +} + +/* this is a simple hack to check if phonon can actually play sounds.. */ +void AudioPlayer::test() +{ + m_player->stop(); + connect(m_player, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged_p(Phonon::State, Phonon::State))); + m_output->setVolume(0); + m_player->setCurrentSource(Phonon::MediaSource(m_sounds[AudioPlayer::WakaWaka])); + m_player->play(); + + QTimer timer; + timer.setSingleShot(true); + connect(&timer, SIGNAL(timeout()), this, SLOT(testFinished())); + timer.start(500); + while(timer.isActive()) + { + qApp->processEvents(); + Sleeper::msleep(1); + } +} + void AudioPlayer::finished_p() { - qDebug() << "finished"; emit finished(); } -void AudioPlayer::stateChanged_p(Phonon::State newstate, Phonon::State oldstate) +void AudioPlayer::stateChanged_p(Phonon::State newstate, Phonon::State /* oldstate */) { - qDebug() << "old=" << oldstate << "new=" << newstate; + if (newstate != Phonon::ErrorState) + { + m_working = true; + m_output->setVolume(1); + qDebug() << "Sound is working for you!"; + } + disconnect(m_player, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged_p(Phonon::State, Phonon::State))); + m_player->stop(); } +void AudioPlayer::testFinished() +{ + if (!m_working) + qDebug() << "There's no sound for you :("; + disconnect(m_player, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged_p(Phonon::State, Phonon::State))); +} diff --git a/pacman-c++/audioplayer.h b/pacman-c++/audioplayer.h index 3dc3cfd..dd128c5 100644 --- a/pacman-c++/audioplayer.h +++ b/pacman-c++/audioplayer.h @@ -2,6 +2,8 @@ #define AUDIOPLAYER_H #include +#include +#include #include namespace Phonon @@ -15,24 +17,42 @@ class AudioPlayer { Q_OBJECT +public: + enum Sound { + Intro = 0, + WakaWaka, + EatingCherry, + Die + }; + public: AudioPlayer(); static AudioPlayer *self(); + bool isWorking(); void stop(); void setMuted(bool mute = true); - void playIntro(); + void play(Sound sound); + void enqueue(Sound sound); + Phonon::State state(); signals: void finished(); +private: + void test(); + void preload(); + private slots: void finished_p(); void stateChanged_p(Phonon::State newstate, Phonon::State oldstate); + void testFinished(); private: + bool m_working; Phonon::MediaObject *m_player; Phonon::AudioOutput *m_output; static AudioPlayer *m_instance; + QList m_sounds; }; #endif // AUDIOPLAYER_H diff --git a/pacman-c++/client.cpp b/pacman-c++/client.cpp index 814e5e1..e4978f7 100644 --- a/pacman-c++/client.cpp +++ b/pacman-c++/client.cpp @@ -1,4 +1,5 @@ #include "client.h" +#include "audioplayer.h" Client::Client() { diff --git a/pacman-c++/mainwidget.cpp b/pacman-c++/mainwidget.cpp index ddce051..b421c36 100644 --- a/pacman-c++/mainwidget.cpp +++ b/pacman-c++/mainwidget.cpp @@ -92,12 +92,8 @@ MainWidget::MainWidget() createGui(); updateMap(createDummyMap()); -#if 0 - emit startGame(); -#else - AudioPlayer::self()->playIntro(); connect(AudioPlayer::self(), SIGNAL(finished()), this, SLOT(startGame())); -#endif + AudioPlayer::self()->play(AudioPlayer::Intro); } void MainWidget::createGui() diff --git a/pacman-c++/pacman.qrc b/pacman-c++/pacman.qrc index ceb032a..98b495d 100644 --- a/pacman-c++/pacman.qrc +++ b/pacman-c++/pacman.qrc @@ -19,9 +19,9 @@ pics/actor4icon.png - sound/waka_waka.ogg - sound/die.ogg - sound/eating_cherry.ogg - sound/intro.ogg + sound/waka_waka.ogg + sound/die.ogg + sound/eating_cherry.ogg + sound/intro.ogg -- cgit v1.2.3