summaryrefslogtreecommitdiffstats
path: root/pacman-c++/audio.h
blob: 6aec42d4e1c886d24d8bc96987ecb14647c428a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#ifndef AUDIO_H
#define AUDIO_H

#include <QObject>
#include <QList>
#include <QFile>
#include <QThread>
#include <phonon/MediaObject>

namespace Phonon
{
  class AudioOutput;
}

namespace Sound
{
  enum Type
  {
    Intro = 0,
    WakaWaka,
    EatingFruit,
    EatingGhost,
    Die,
    Ambient
  };

  const unsigned int length[] = {
    4310, 2090, 570, 570, 1720,
  };
};

/* --------------------------------------------------------------- */

class AudioPlayer
  : public Phonon::MediaObject
{
  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:
  AudioPlayer(QObject *parent = 0);
  bool isWorking() const;
  void setMuted(bool mute = true);
  bool isMuted() const;
  void setLoop(Sound::Type sound);
  void play();
  void play(Sound::Type sound, bool wait = false);

protected:
  void test(QFile *testsound);
  void setLoop(QFile *sound);

public slots:
  void loopEnqueue();

protected slots:
  void finished_ex();
  void testFinished();
  void stateChanged_ex(Phonon::State newstate, Phonon::State oldstate);

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();
  static AudioManager *self();
  bool isWorking() const;
  void setMuted(bool mute = true);
  bool isMuted() const;
  void pause();
  void stop();
  void clear();
  void clearQueue() const;

  AudioPlayer *audioPlayer();
  void play(Sound::Type sound, bool wait = false);
  void enqueue(Sound::Type sound);

  void registerAudioPlayer(AudioPlayer *player);
  void unregisterAudioPlayer(AudioPlayer *player);

signals:
  void mutedChanged(bool muted);

private slots:
  void unregisterAudioPlayer_helper(QObject *player);

private:
  void preload();
  QFile *sound(Sound::Type sound);

private:
  bool m_muted;
  static bool m_working;
  static AudioManager *m_instance;
  QList<QFile *> m_sounds;
  QList<AudioPlayer *> m_players;
};

#endif // AUDIOPLAYER_H