From 1a6c940ed9d7f6136da0e13148314072665342c5 Mon Sep 17 00:00:00 2001 From: manuel Date: Tue, 10 May 2011 22:28:58 +0200 Subject: - refactorized audio once more: audio is now a plugin which gets loaded at runtime - thus server has no dependency to phonon any more - remove client dependency to qtnetwork - fix enet deinitialization on windows --- pacman-c++/phononplayer/phononplayer.cpp | 169 +++++++++++++++++++++++++++++++ pacman-c++/phononplayer/phononplayer.h | 71 +++++++++++++ pacman-c++/phononplayer/phononplayer.pro | 11 ++ 3 files changed, 251 insertions(+) create mode 100644 pacman-c++/phononplayer/phononplayer.cpp create mode 100644 pacman-c++/phononplayer/phononplayer.h create mode 100644 pacman-c++/phononplayer/phononplayer.pro (limited to 'pacman-c++/phononplayer') diff --git a/pacman-c++/phononplayer/phononplayer.cpp b/pacman-c++/phononplayer/phononplayer.cpp new file mode 100644 index 0000000..1f537d6 --- /dev/null +++ b/pacman-c++/phononplayer/phononplayer.cpp @@ -0,0 +1,169 @@ +#include "phononplayer.h" +#include +#include + +AudioPlayer *PhononPlayerFactory::create(QObject *parent) +{ + return new PhononPlayer(parent); +} + +Q_EXPORT_PLUGIN2(phononplayer, PhononPlayerFactory) + +/* --------------------------------------------------------------- */ + +PhononPlayer::PhononPlayer(QObject *parent) + : AudioPlayer(parent) +{ + m_working = AudioManager::isWorking(); + m_player = new Phonon::MediaObject(this); + m_output = new Phonon::AudioOutput(Phonon::MusicCategory, this); + Phonon::createPath(m_player, m_output); +} + +bool PhononPlayer::isWorking() const +{ + return m_working; +} + +void PhononPlayer::setMuted(bool mute) +{ + if (!isWorking()) + return; + m_output->setMuted(mute); +} + +bool PhononPlayer::isMuted() const +{ + return m_output->isMuted(); +} + +void PhononPlayer::play() +{ + m_player->play(); +} + +void PhononPlayer::play(Sound::Type sound) +{ + if (!m_working) + return; + m_player->setCurrentSource(Phonon::MediaSource(AudioManager::self()->sound(sound))); + play(); +} + +bool PhononPlayer::isPlaying() +{ + return m_player->state() == Phonon::PlayingState; +} + +void PhononPlayer::enqueue(Sound::Type sound) +{ + m_player->enqueue(Phonon::MediaSource(AudioManager::self()->sound(sound))); +} + +void PhononPlayer::pause() +{ + m_player->pause(); +} + +bool PhononPlayer::isPaused() +{ + return m_player->state() == Phonon::PausedState; +} + +void PhononPlayer::stop() +{ + m_player->stop(); +} + +bool PhononPlayer::isStopped() +{ + return m_player->state() == Phonon::StoppedState; +} + +void PhononPlayer::clear() +{ + m_player->clear(); +} + +void PhononPlayer::clearQueue() +{ + m_player->clearQueue(); +} + +void PhononPlayer::setPrefinishMark(qint32 msecToEnd) +{ + connect(m_player, SIGNAL(prefinishMarkReached(qint32)), this, SLOT(prefinishMarkReached_ex(qint32)), Qt::UniqueConnection); + m_player->setPrefinishMark(msecToEnd); +} + +/* this is a simple hack to check if phonon can actually play sounds.. */ +void PhononPlayer::test(QFile *testsound, qint32 length) +{ + m_player->stop(); + m_output->setVolume(0); + m_player->setCurrentSource(Phonon::MediaSource(testsound)); + connect(m_player, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged_ex(Phonon::State, Phonon::State))); + m_player->play(); + + QTimer timer; + timer.setSingleShot(true); + connect(&timer, SIGNAL(timeout()), this, SLOT(testFinished())); + timer.start(length); + while(timer.isActive()) + { + qApp->processEvents(); + Sleeper::msleep(1); + } + clear(); +} + +void PhononPlayer::prefinishMarkReached_ex(qint32 mark) +{ + emit prefinishMarkReached(mark); +} + +void PhononPlayer::finished_ex() +{ + emit finished(); +} + +void PhononPlayer::stateChanged_ex(Phonon::State newstate, Phonon::State oldstate) +{ + if (newstate == Phonon::PlayingState) + m_player->pause(); + if (oldstate == Phonon::PlayingState && newstate == Phonon::PausedState) + m_player->stop(); + else if (oldstate == Phonon::PausedState && newstate == Phonon::StoppedState) + { + m_working = true; + m_player->stop(); + m_output->setVolume(1); + qDebug() << "Sound is working for you!"; + disconnect(m_player, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged_ex(Phonon::State, Phonon::State))); + } +} + +void PhononPlayer::testFinished() +{ + if (!m_working) + qWarning() << "There's no sound for you :("; + disconnect(m_player, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged_ex(Phonon::State, Phonon::State))); +} + +/* --------------------------------------------------------------- */ + +void PhononPlayer::Sleeper::sleep(unsigned long secs) +{ + QThread::sleep(secs); +} + +void PhononPlayer::Sleeper::msleep(unsigned long msecs) +{ + QThread::msleep(msecs); +} + +void PhononPlayer::Sleeper::usleep(unsigned long usecs) +{ + QThread::usleep(usecs); +} + diff --git a/pacman-c++/phononplayer/phononplayer.h b/pacman-c++/phononplayer/phononplayer.h new file mode 100644 index 0000000..ca56726 --- /dev/null +++ b/pacman-c++/phononplayer/phononplayer.h @@ -0,0 +1,71 @@ +#ifndef PHONONPLAYER_H +#define PHONONPLAYER_H + +#include "audio.h" +#include +#include +#include +#include +#include + +class PhononPlayerFactory + : public QObject, public AudioPlayerFactory +{ + Q_OBJECT + Q_INTERFACES(AudioPlayerFactory) + +public: + virtual AudioPlayer *create(QObject *parent = 0); +}; + +/* --------------------------------------------------------------- */ + +class PhononPlayer + : public AudioPlayer +{ + Q_OBJECT + friend class AudioManager; + +private: + class Sleeper + : public QThread + { + public: + static void sleep(unsigned long secs); + static void msleep(unsigned long msecs); + static void usleep(unsigned long usecs); + }; + +public: + PhononPlayer(QObject *parent = 0); + virtual bool isWorking() const; + virtual void setMuted(bool mute = true); + virtual bool isMuted() const; + virtual void play(); + virtual void play(Sound::Type sound); + virtual bool isPlaying(); + virtual void enqueue(Sound::Type sound); + virtual void pause(); + virtual bool isPaused(); + virtual void stop(); + virtual bool isStopped(); + virtual void clear(); + virtual void clearQueue(); + virtual void setPrefinishMark(qint32 msecToEnd); + +protected: + void test(QFile *testsound, qint32 length); + +protected slots: + virtual void prefinishMarkReached_ex(qint32 mark); + void finished_ex(); + void testFinished(); + void stateChanged_ex(Phonon::State newstate, Phonon::State oldstate); + +protected: + bool m_working; + Phonon::MediaObject *m_player; + Phonon::AudioOutput *m_output; +}; + +#endif // PHONONPLAYER_H diff --git a/pacman-c++/phononplayer/phononplayer.pro b/pacman-c++/phononplayer/phononplayer.pro new file mode 100644 index 0000000..9482454 --- /dev/null +++ b/pacman-c++/phononplayer/phononplayer.pro @@ -0,0 +1,11 @@ +TEMPLATE = lib +TARGET = $$qtLibraryTarget(phononplayer) +CONFIG += plugin + +DEFINES += PACMAN_AUDIO +QT += phonon + +include(../common.pri) + +SOURCES += phononplayer.cpp +HEADERS += phononplayer.h -- cgit v1.2.3