ScummVM API documentation
music.h
1/* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22#ifndef GROOVIE_MUSIC_H
23#define GROOVIE_MUSIC_H
24
25#include "common/array.h"
26#include "common/mutex.h"
27#include "common/file.h"
28#include "audio/mididrv.h"
29#include "audio/mididrv_ms.h"
30#include "audio/mixer.h"
31#include "audio/miles.h"
32
33class MidiParser;
34
35namespace Groovie {
36
37class GroovieEngine;
38class TlcGame;
39
41public:
43 virtual ~MusicPlayer();
44
45 void playSong(uint32 fileref);
46 // Stops all music playback. Clears the current
47 // background song.
48 void stop();
49 void setBackgroundSong(uint32 fileref);
50 void playCD(uint8 track);
51 void startBackground();
52 bool isPlaying() { return _isPlaying; }
53 // Pause or resume the music. Note that digital music
54 // already pauses when the ScummVM menu is open, so
55 // it does not seem to need an implementation.
56 virtual void pause(bool pause) { }
57
58 // Set the MIDI initialization state
59 void setMidiInit(bool midiInit) { _midiInit = midiInit; }
60 // Returns true if MIDI has been fully initialized
61 bool isMidiInit() { return _midiInit; }
62
63 void frameTick();
64 void setBackgroundDelay(uint16 delay);
65
66 // Volume
67 virtual void setUserVolume(uint16 volume);
68 void setGameVolume(uint16 volume, uint16 time);
69
70private:
71 // Song playback
72 bool play(uint32 fileref, bool loop);
73 bool _isPlaying;
74 uint32 _backgroundFileRef;
75 uint8 _prevCDtrack;
76
77 uint16 _backgroundDelay;
78
79 // T7G iOS credits mp3 stream
80 void playCreditsIOS();
81 void stopCreditsIOS();
82 Audio::SoundHandle _handleCreditsIOS;
83
84 // Volume fading
85 uint32 _fadingStartTime;
86 uint16 _fadingStartVolume;
87 uint16 _fadingEndVolume;
88 uint16 _fadingDuration;
89 void applyFading();
90
91protected:
92 GroovieEngine *_vm;
93
94 // True if the MIDI initialization has completed
95 bool _midiInit;
96
97 // Callback
98 static void onTimer(void *data);
99 virtual void onTimerInternal() {}
100 Common::Mutex _mutex;
101
102 // User volume
103 uint16 _userVolume;
104 // Game volume
105 uint16 _gameVolume;
106
107 // These are specific for each type of music
108 virtual void updateVolume() = 0;
109 virtual bool load(uint32 fileref, bool loop) = 0;
110 virtual void unload(bool updateState = true);
111};
112
114public:
116 ~MusicPlayerMidi() override;
117
118 // MidiDriver_BASE interface
119 void send(uint32 b) override;
120 void sysEx(const byte* msg, uint16 length) override;
121 uint16 sysExNoDelay(const byte *msg, uint16 length) override;
122 void metaEvent(byte type, const byte *data, uint16 length) override;
123
124 void pause(bool pause) override;
125
126private:
127 // Channel volumes
128 byte _chanVolumes[0x10];
129 void updateChanVolume(byte channel);
130
131protected:
132 byte *_data;
133 MidiParser *_midiParser;
134 MidiDriver *_driver;
135
136 void onTimerInternal() override;
137 void updateVolume() override;
138 void unload(bool updateState = true) override;
139 void endTrack();
140
141 bool loadParser(Common::SeekableReadStream *stream, bool loop);
142};
143
145public:
146 MusicPlayerXMI(GroovieEngine *vm, const Common::String &gtlName);
148
150 void send(int8 source, uint32 b) override;
151 using MusicPlayerMidi::metaEvent;
152 void metaEvent(int8 source, byte type, const byte *data, uint16 length) override;
153 void stopAllNotes(bool stopSustainedNotes) override;
154 void processXMIDITimbreChunk(const byte *timbreListPtr, uint32 timbreListSize) override {
155 if (_milesXmidiTimbres)
156 _milesXmidiTimbres->processXMIDITimbreChunk(timbreListPtr, timbreListSize);
157 };
158 bool isReady(int8 source = -1) override;
159
160 void setUserVolume(uint16 volume) override;
161
162protected:
163 void updateVolume() override;
164 bool load(uint32 fileref, bool loop) override;
165 void unload(bool updateState = true) override;
166
167private:
168 // Output music type
169 uint8 _musicType;
170
171 MidiDriver_Multisource *_multisourceDriver;
172 MidiDriver_Miles_Xmidi_Timbres *_milesXmidiTimbres;
173};
174
176public:
178
179protected:
180 bool load(uint32 fileref, bool loop) override;
181
182private:
184};
185
187public:
189
190protected:
191 bool load(uint32 fileref, bool loop) override;
192};
193
195public:
197 ~MusicPlayerIOS() override;
198
199protected:
200 void updateVolume() override;
201 bool load(uint32 fileref, bool loop) override;
202 void unload(bool updateState = true) override;
203
204private:
205 Audio::SoundHandle _handle;
206};
207
209public:
212
213protected:
214 virtual Common::String getFilename(uint32 fileref);
215 void updateVolume() override;
216 bool load(uint32 fileref, bool loop) override;
217 void unload(bool updateState = true) override;
218
219private:
220 Audio::SoundHandle _handle;
221 Common::File *_file;
222};
223
225public:
227
228protected:
229 Common::String getFilename(uint32 fileref) override;
230};
231
232} // End of Groovie namespace
233
234#endif // GROOVIE_MUSIC_H
Definition: mixer.h:49
Definition: file.h:47
Definition: mutex.h:67
Definition: stream.h:745
Definition: str.h:59
Definition: groovie.h:116
Definition: music.h:224
Definition: music.h:40
Definition: music.h:194
Definition: music.h:175
Definition: music.h:186
Definition: music.h:113
void send(uint32 b) override
void sysEx(const byte *msg, uint16 length) override
uint16 sysExNoDelay(const byte *msg, uint16 length) override
Definition: music.h:208
Definition: music.h:144
void send(int8 source, uint32 b) override
void stopAllNotes(bool stopSustainedNotes) override
bool isReady(int8 source=-1) override
void metaEvent(int8 source, byte type, const byte *data, uint16 length) override
void processXMIDITimbreChunk(const byte *timbreListPtr, uint32 timbreListSize) override
Definition: music.h:154
Definition: mididrv.h:114
Definition: mididrv_ms.h:86
Definition: mididrv.h:313
Definition: midiparser.h:354
Definition: cursor.h:32