From b18385a95f25e13c767244b494f31bd4fc238143 Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 14 Apr 2011 02:37:31 +0200 Subject: encapsulate gapless audioplayer commit from yesterday into an own class (gaplessaudioplayer) added two new menu entrys: toggle sound + toggle ambient sound (2. very useful!) --- pacman-c++/actor.cpp | 38 +++---------------- pacman-c++/actor.h | 7 +--- pacman-c++/audio.cpp | 68 +++++++++++++++++++++++++++++++++- pacman-c++/audio.h | 39 ++++++++++++++++++-- pacman-c++/client.cpp | 93 ++++++++++++++++++++++++++++++++++------------- pacman-c++/client.h | 16 ++++++-- pacman-c++/mainwidget.cpp | 23 ++---------- pacman-c++/mainwidget.h | 10 ++--- 8 files changed, 198 insertions(+), 96 deletions(-) (limited to 'pacman-c++') diff --git a/pacman-c++/actor.cpp b/pacman-c++/actor.cpp index 56e8e86..3af304c 100644 --- a/pacman-c++/actor.cpp +++ b/pacman-c++/actor.cpp @@ -10,7 +10,7 @@ static QVariant myBooleanInterpolator(const bool &start, const bool &end, qreal Actor::Actor(Color::Color color, bool local, QGraphicsItem *parent) : GameEntity(color, parent),m_direction(Actor::None), m_local(local), - m_wakaPlayer1(NULL), m_wakaPlayer2(NULL), m_roundPoints(0), m_gamePoints(0) + m_wakaPlayer(NULL), m_roundPoints(0), m_gamePoints(0) { /* DON'T set any pixmap here. we've a pixmap in the animation * but we need a sprite for the collision detection @@ -56,19 +56,7 @@ Actor::Actor(Color::Color color, bool local, QGraphicsItem *parent) /* setup waka sound */ if (local) - { - m_wakaPlayer1 = new AudioPlayer(this); - m_wakaPlayer2 = new AudioPlayer(this); - if (m_wakaPlayer1->isWorking() && m_wakaPlayer2->isWorking()) - { - m_wakaPlayer1->setPrefinishMark(100); - m_wakaPlayer2->setPrefinishMark(100); - connect(m_wakaPlayer1, SIGNAL(prefinishMarkReached(qint32)), this, SLOT(startPlayer2())); - connect(m_wakaPlayer2, SIGNAL(prefinishMarkReached(qint32)), this, SLOT(startPlayer1())); - AudioManager::self()->registerAudioPlayer(m_wakaPlayer1); - AudioManager::self()->registerAudioPlayer(m_wakaPlayer2); - } - } + m_wakaPlayer = new GaplessAudioPlayer(Sound::WakaWaka, 100, this); /* make the picture showing the current direction visible */ m_images[m_direction]->setVisible(true); @@ -237,30 +225,16 @@ void Actor::eatingPacman() void Actor::startEating() { - if (!m_local || !m_wakaPlayer1->isWorking()) + if (!m_local || !m_wakaPlayer->isWorking()) return; - if (m_wakaPlayer1->state() != Phonon::PlayingState && m_wakaPlayer2->state() != Phonon::PlayingState) - startPlayer1(); + m_wakaPlayer->play(); } void Actor::stopEating() { - if (!m_local || !m_wakaPlayer1->isWorking()) + if (!m_local || !m_wakaPlayer->isWorking()) return; - if (m_wakaPlayer1->state() != Phonon::PausedState) - m_wakaPlayer1->pause(); - if (m_wakaPlayer2->state() != Phonon::PausedState) - m_wakaPlayer2->pause(); -} - -void Actor::startPlayer1() -{ - m_wakaPlayer1->play(Sound::WakaWaka); -} - -void Actor::startPlayer2() -{ - m_wakaPlayer2->play(Sound::WakaWaka); + m_wakaPlayer->pause(); } unsigned int Actor::getRoundPoints() diff --git a/pacman-c++/actor.h b/pacman-c++/actor.h index 1739d9f..507a8e2 100644 --- a/pacman-c++/actor.h +++ b/pacman-c++/actor.h @@ -46,17 +46,12 @@ public: private: void moveByServer(Movement direction); -private slots: - void startPlayer1(); - void startPlayer2(); - private: QPixmap m_pix; Movement m_direction; PixmapItem m_icon; bool m_local; - AudioPlayer *m_wakaPlayer1; - AudioPlayer *m_wakaPlayer2; + GaplessAudioPlayer *m_wakaPlayer; unsigned int m_roundPoints; unsigned int m_gamePoints; diff --git a/pacman-c++/audio.cpp b/pacman-c++/audio.cpp index 6365a15..c0cc5b0 100644 --- a/pacman-c++/audio.cpp +++ b/pacman-c++/audio.cpp @@ -155,9 +155,9 @@ QFile *AudioManager::sound(Sound::Type sound) AudioPlayer::AudioPlayer(QObject *parent) : Phonon::MediaObject(parent) { + m_working = AudioManager::m_working; m_output = new Phonon::AudioOutput(Phonon::MusicCategory, this); Phonon::createPath(this, m_output); - m_working = AudioManager::m_working; } bool AudioPlayer::isWorking() const @@ -255,6 +255,72 @@ void AudioPlayer::loopEnqueue() /* --------------------------------------------------------------- */ +GaplessAudioPlayer::GaplessAudioPlayer(Sound::Type sound, qint32 mark, QObject *parent) + : QObject(parent), m_sound(sound) +{ + m_working = AudioManager::m_working; + if (!m_working) + return; + + m_player1 = new AudioPlayer(this); + m_player2 = new AudioPlayer(this); + + 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 +{ + return m_working; +} + +void GaplessAudioPlayer::setMuted(bool mute) +{ + m_player1->setMuted(mute); + m_player2->setMuted(mute); +} + +bool GaplessAudioPlayer::isMuted() const +{ + return m_player1->isMuted() && m_player2->isMuted(); +} + +void GaplessAudioPlayer::play() +{ + if (!m_working) + return; + if (m_player1->state() != Phonon::PlayingState && m_player2->state() != Phonon::PlayingState) + startPlayer1(); +} + +void GaplessAudioPlayer::pause() +{ + if (!m_working) + return; + if (m_player1->state() != Phonon::PausedState) + m_player1->pause(); + if (m_player2->state() != Phonon::PausedState) + m_player2->pause(); +} + +void GaplessAudioPlayer::startPlayer1() +{ + m_player1->play(m_sound); +} + +void GaplessAudioPlayer::startPlayer2() +{ + m_player2->play(m_sound); +} + +/* --------------------------------------------------------------- */ + void AudioPlayer::Sleeper::sleep(unsigned long secs) { QThread::sleep(secs); diff --git a/pacman-c++/audio.h b/pacman-c++/audio.h index 49d29a9..3e76f50 100644 --- a/pacman-c++/audio.h +++ b/pacman-c++/audio.h @@ -25,6 +25,8 @@ namespace Sound }; }; +/* --------------------------------------------------------------- */ + class AudioPlayer : public Phonon::MediaObject { @@ -46,32 +48,61 @@ public: bool isWorking() const; void setMuted(bool mute = true); bool isMuted() const; - void setLoop(QFile *sound); void setLoop(Sound::Type sound); void play(); void play(Sound::Type sound); -private: +protected: void test(QFile *testsound); + void setLoop(QFile *sound); public slots: void loopEnqueue(); -private slots: +protected slots: void testFinished(); void stateChanged_ex(Phonon::State newstate, Phonon::State oldstate); -private: +protected: bool m_working; QFile *m_loopsound; Phonon::AudioOutput *m_output; }; +/* --------------------------------------------------------------- */ + +class GaplessAudioPlayer + : public QObject +{ + Q_OBJECT + +public: + GaplessAudioPlayer(Sound::Type sound, qint32 mark, QObject *parent = 0); + bool isWorking() const; + void setMuted(bool mute = true); + bool isMuted() const; + void play(); + void pause(); + +protected slots: + void startPlayer1(); + void startPlayer2(); + +protected: + bool m_working; + Sound::Type m_sound; + AudioPlayer *m_player1; + AudioPlayer *m_player2; +}; + +/* --------------------------------------------------------------- */ + class AudioManager : public QObject { Q_OBJECT friend class AudioPlayer; + friend class GaplessAudioPlayer; public: AudioManager(); diff --git a/pacman-c++/client.cpp b/pacman-c++/client.cpp index 5cc9279..fc0fdfc 100644 --- a/pacman-c++/client.cpp +++ b/pacman-c++/client.cpp @@ -4,63 +4,106 @@ #include "pacman.pb.h" Client::Client() + : m_ambientMuted(false) { m_settings = new QSettings(qApp->organizationName(), qApp->applicationName(), this); createMenu(); m_mainWidget = new MainWidget(this); + m_mainWidget->setAmbientMuted(m_ambientMuted); setCentralWidget(m_mainWidget); } void Client::createMenu() { - QAction *quitAction = new QAction("E&xit", this); - connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); - QMenu *fileMenu = menuBar()->addMenu("File"); - fileMenu->addAction(quitAction); + bool sound = AudioManager::self()->isWorking(); + bool muted = !sound || m_settings->value("muted", false).toBool(); + AudioManager::self()->setMuted(muted); + + /* toggle sound: corner icon */ ClickLabel *toggleSound = new ClickLabel("Toggle Sound", this); toggleSound->setToolTip("Toggle Sound"); toggleSound->setFixedWidth(20); toggleSound->setFixedHeight(16); toggleSound->setAlignment(Qt::AlignBottom); - - bool sound = AudioManager::self()->isWorking(); - bool muted = !sound || m_settings->value("muted", false).toBool(); - AudioManager::self()->setMuted(muted); - - QImage img(muted ? ":/soundoff" : ":/soundon"); - img.setColor(1, menuBar()->palette().color( - muted ? QPalette::Disabled : QPalette::Active, - QPalette::ButtonText).rgba()); - toggleSound->setPixmap(QPixmap::fromImage(img)); - + toggleSound->setPixmap(soundIcon(!muted)); if (sound) { connect(toggleSound, SIGNAL(clicked()), this, SLOT(toggleSound())); connect(AudioManager::self(), SIGNAL(mutedChanged(bool)), this, SLOT(mutedChanged(bool))); } - menuBar()->setCornerWidget(toggleSound); + + /* toggle sound: menu */ + QAction *toggleSoundAction = new QAction("Sound", this); + toggleSoundAction->setToolTip("Toggle Sound"); + toggleSoundAction->setCheckable(true); + toggleSoundAction->setChecked(!muted); + toggleSoundAction->setDisabled(!sound); + fileMenu->addAction(toggleSoundAction); + if (sound) + { + connect(toggleSoundAction, SIGNAL(triggered()), this, SLOT(toggleSound())); + connect(this, SIGNAL(setMuteActionsChecked(bool)), toggleSoundAction, SLOT(setChecked(bool))); + } + + /* toggle ambient sound: menu */ + m_ambientMuted = muted || m_settings->value("ambientMuted", false).toBool(); + QAction *toggleAmbientAction = new QAction("Ambient Sound", this); + toggleAmbientAction->setToolTip("Toggle Ambient Sound"); + toggleAmbientAction->setCheckable(true); + toggleAmbientAction->setChecked(!m_ambientMuted); + toggleAmbientAction->setDisabled(!sound); + fileMenu->addAction(toggleAmbientAction); + if (sound) + { + connect(toggleAmbientAction, SIGNAL(triggered(bool)), this, SLOT(enableAmbientSound(bool))); + connect(this, SIGNAL(setMuteActionsChecked(bool)), toggleAmbientAction, SLOT(setEnabled(bool))); + } + + /* exit entry */ + fileMenu->addSeparator(); + QAction *quitAction = new QAction("E&xit", this); + connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); + fileMenu->addAction(quitAction); } -void Client::toggleSound() const +void Client::toggleSound() { if (!AudioManager::self()->isWorking()) return; - AudioManager::self()->setMuted(!AudioManager::self()->isMuted()); + bool muted = !AudioManager::self()->isMuted(); + AudioManager::self()->setMuted(muted); + /* mute ambient sound again if explicitly muted */ + if (!muted && m_ambientMuted) + m_mainWidget->setAmbientMuted(true); } -void Client::mutedChanged(bool muted) const +void Client::mutedChanged(bool muted) { - QImage img(muted ? ":/soundoff" : ":/soundon"); - img.setColor(1, menuBar()->palette().color( - muted ? QPalette::Disabled : QPalette::Active, - QPalette::ButtonText).rgba()); ClickLabel *tmp = qobject_cast(menuBar()->cornerWidget()); - tmp->setPixmap(QPixmap::fromImage(img)); - + tmp->setPixmap(soundIcon(!muted)); m_settings->setValue("muted", muted); + emit setMuteActionsChecked(!muted); +} + +void Client::enableAmbientSound(bool enabled) +{ + if (!AudioManager::self()->isWorking()) + return; + m_ambientMuted = !enabled; + m_mainWidget->setAmbientMuted(m_ambientMuted); + m_settings->setValue("ambientMuted", m_ambientMuted); +} + +QPixmap Client::soundIcon(bool enabled) const +{ + QImage img(enabled ? ":/soundon" : ":/soundoff"); + img.setColor(1, menuBar()->palette().color( + enabled ? QPalette::Active : QPalette::Disabled, + QPalette::ButtonText).rgba()); + return QPixmap::fromImage(img); } bool Constants::server = false; diff --git a/pacman-c++/client.h b/pacman-c++/client.h index 2d507e2..2583826 100644 --- a/pacman-c++/client.h +++ b/pacman-c++/client.h @@ -12,16 +12,26 @@ public: Client(); QSettings *settings(); -public slots: - void toggleSound() const; - void mutedChanged(bool) const; +signals: + /* signal gets emitted if mute buttons should update their checked-state */ + void setMuteActionsChecked(bool enabled); + +private slots: + /* toggles sound */ + void toggleSound(); + /* mute was changed (emitted by audioplayer/phonon) */ + void mutedChanged(bool); + /* enable ambient (emitted by action) */ + void enableAmbientSound(bool); private: void createMenu(); + QPixmap soundIcon(bool enabled = true) const; private: MainWidget *m_mainWidget; QSettings *m_settings; + bool m_ambientMuted; }; #endif // CLIENT_H diff --git a/pacman-c++/mainwidget.cpp b/pacman-c++/mainwidget.cpp index 9507e85..6930b1a 100644 --- a/pacman-c++/mainwidget.cpp +++ b/pacman-c++/mainwidget.cpp @@ -9,17 +9,7 @@ MainWidget::MainWidget(QWidget *parent) : QWidget(parent), m_currentKey(Transmission::none), m_running(false) { /* create audio player */ - m_sirenPlayer1 = new AudioPlayer(this); - m_sirenPlayer2 = new AudioPlayer(this); - if (m_sirenPlayer1->isWorking() && m_sirenPlayer2->isWorking()) - { - m_sirenPlayer1->setPrefinishMark(100); - m_sirenPlayer2->setPrefinishMark(100); - connect(m_sirenPlayer1, SIGNAL(prefinishMarkReached(qint32)), this, SLOT(startPlayer2())); - connect(m_sirenPlayer2, SIGNAL(prefinishMarkReached(qint32)), this, SLOT(startPlayer1())); - AudioManager::self()->registerAudioPlayer(m_sirenPlayer1); - AudioManager::self()->registerAudioPlayer(m_sirenPlayer2); - } + m_ambientPlayer = new GaplessAudioPlayer(Sound::Ambient, 100, this); Color::Color color = connectToServer(); if (color == Color::none) @@ -209,17 +199,12 @@ void MainWidget::keyReleaseEvent(QKeyEvent* event) void MainWidget::startGame() { m_running = true; - startPlayer1(); -} - -void MainWidget::startPlayer1() -{ - m_sirenPlayer1->play(Sound::Ambient); + m_ambientPlayer->play(); } -void MainWidget::startPlayer2() +void MainWidget::setAmbientMuted(bool muted) { - m_sirenPlayer2->play(Sound::Ambient); + m_ambientPlayer->setMuted(muted); } void MainWidget::playerScoreClicked() diff --git a/pacman-c++/mainwidget.h b/pacman-c++/mainwidget.h index a316d9e..6ecd812 100644 --- a/pacman-c++/mainwidget.h +++ b/pacman-c++/mainwidget.h @@ -19,19 +19,18 @@ class MainWidget public: MainWidget(QWidget *parent = 0); bool connected(); + void setAmbientMuted(bool muted); protected: /* handling of current key */ - virtual void keyPressEvent(QKeyEvent* ); - virtual void keyReleaseEvent(QKeyEvent* ); + virtual void keyPressEvent(QKeyEvent *); + virtual void keyReleaseEvent(QKeyEvent *); private slots: void startGame(); void playerScoreClicked(); void tick(); void sendKeyUpdate(); - void startPlayer1(); - void startPlayer2(); private: void createGui(); @@ -51,8 +50,7 @@ private: /* game running */ bool m_running; - AudioPlayer *m_sirenPlayer1; - AudioPlayer *m_sirenPlayer2; + GaplessAudioPlayer *m_ambientPlayer; QTcpSocket *m_socket; SceneHolder *m_scene; -- cgit v1.2.3