#ifndef AUDIO_H #define AUDIO_H #include #include #include #include namespace Sound { enum Type { Intro = 0, WakaWaka, EatingFruit, EatingGhost, Die, Ambient }; const unsigned int length[] = { 4310, 2090, 570, 570, 1720, }; }; /* --------------------------------------------------------------- */ class AudioPlayer : public QObject { Q_OBJECT friend class AudioManager; public: AudioPlayer(QObject *parent = 0) : QObject(parent) {} virtual ~AudioPlayer() {} virtual bool isWorking() const = 0; virtual void setMuted(bool mute = true) = 0; virtual bool isMuted() const = 0; virtual void play() = 0; virtual void play(Sound::Type sound) = 0; virtual bool isPlaying() = 0; virtual void enqueue(Sound::Type sound) = 0; virtual void pause() = 0; virtual bool isPaused() = 0; virtual void stop() = 0; virtual bool isStopped() = 0; virtual void clear() = 0; virtual void clearQueue() = 0; virtual void setPrefinishMark(qint32 msecToEnd) = 0; protected slots: virtual void prefinishMarkReached_ex(qint32 mark) = 0; signals: void finished(); void prefinishMarkReached(qint32 mark); protected: virtual void test(QFile *testsound, qint32 length) = 0; }; /* --------------------------------------------------------------- */ class NoopAudioPlayer : public AudioPlayer { Q_OBJECT friend class AudioManager; public: NoopAudioPlayer(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 slots: virtual void prefinishMarkReached_ex(qint32 mark); protected: virtual void test(QFile *testsound, qint32 length); protected: bool m_working; bool m_muted; bool m_playing; bool m_paused; }; /* --------------------------------------------------------------- */ class FakeAudioPlayer : public NoopAudioPlayer { Q_OBJECT friend class AudioManager; public: FakeAudioPlayer(QObject *parent = 0); virtual void play(Sound::Type sound); protected slots: void finished_ex(); protected: QTimer m_timer; }; /* --------------------------------------------------------------- */ 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 AudioPlayerFactory { public: virtual ~AudioPlayerFactory() {} virtual AudioPlayer *create(QObject *parent = 0) = 0; }; Q_DECLARE_INTERFACE(AudioPlayerFactory, "at.ac.tuwien.foop.pacman.AudioPlayerFactory/1.0"); /* --------------------------------------------------------------- */ class NoopAudioPlayerFactory : public AudioPlayerFactory { public: virtual AudioPlayer *create(QObject *parent = 0); }; /* --------------------------------------------------------------- */ class AudioManager : public QObject { Q_OBJECT friend class GaplessAudioPlayer; public: AudioManager(); static AudioManager *self(); static bool isWorking(); void setMuted(bool mute = true); bool isMuted() const; void pause(); void stop(); void clear(); void clearQueue() const; AudioPlayer *audioPlayer(); void registerAudioPlayer(AudioPlayer *player); void unregisterAudioPlayer(AudioPlayer *player); QFile *sound(Sound::Type sound); signals: void mutedChanged(bool muted); private slots: void unregisterAudioPlayer_helper(QObject *player); protected: void preload(); bool tryLoadPhononPlugin(); AudioPlayer *createAudioPlayer(); private: bool m_muted; static bool m_working; static AudioManager *m_instance; QList m_sounds; QList m_players; AudioPlayerFactory *m_factory; }; #endif // AUDIOPLAYER_H