ScummVM API documentation
sound.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 LURE_SOUND_H
23#define LURE_SOUND_H
24
25#include "lure/luredefs.h"
26#include "lure/disk.h"
27#include "lure/memory.h"
28
29#include "common/mutex.h"
30#include "common/singleton.h"
31#include "common/ptr.h"
32
33#include "audio/adlib_ms.h"
34#include "audio/mididrv.h"
35#include "audio/mt32gm.h"
36
37class MidiParser;
38class MidiChannel;
39
40namespace Lure {
41
42#define NUM_CHANNELS 16
43#define LURE_MAX_SOURCES 10
44
46private:
47 uint8 _soundNumber;
48 uint8 _numChannels;
49 byte _volume;
50 MemoryBlock *_decompressedSound;
51 uint8 *_soundData;
52 uint8 _soundSize;
54 MidiDriver_MT32GM *_mt32Driver;
55 int8 _source;
56 MidiParser *_parser;
57 bool _isMusic;
58 bool _loop;
59 bool _isPlaying;
60
61 void queueUpdatePos();
62 uint8 randomQueuePos();
63 uint32 songOffset(uint16 songNum) const;
64 uint32 songLength(uint16 songNum) const;
65
66public:
67 MidiMusic(MidiDriver_Multisource *driver, uint8 soundNum, bool isMus, bool loop,
68 int8 source, uint8 numChannels, void *soundData, uint32 size, uint8 volume);
69 ~MidiMusic() override;
70 void setVolume(int volume);
71 int getVolume() const { return _volume; }
72
73 void playSong(uint16 songNum);
74 void stopSong() { stopMusic(); }
75 void playMusic();
76 void stopMusic();
77 void pauseMusic();
78 void resumeMusic();
79 void queueTuneList(int16 tuneList);
80 bool queueSong(uint16 songNum);
81 void toggleVChange();
82
83 // MidiDriver_BASE interface implementation
84 void send(uint32 b) override;
85 void send(int8 source, uint32 b) override;
86 void metaEvent(byte type, const byte *data, uint16 length) override;
87 void metaEvent(int8 source, byte type, const byte *data, uint16 length) override;
88
89 void onTimer();
90
91 uint8 soundNumber() const { return _soundNumber; }
92 int8 getSource() const { return _source; }
93 bool isPlaying() const { return _isPlaying; }
94 bool isMusic() const { return _isMusic; }
95};
96
97class SoundManager : public Common::Singleton<SoundManager> {
98private:
99 // Outer sound interface properties
100 MemoryBlock *_descs;
101 MemoryBlock *_soundData;
102 uint8 _soundsTotal;
103 int _numDescs;
104 SoundDescResource *soundDescs() { return (SoundDescResource *) _descs->data(); }
105 MidiDriver_Multisource *_driver;
106 MidiDriver_MT32GM *_mt32Driver;
109 SoundList _activeSounds;
112 MusicList _playingSounds;
113 bool _sourcesInUse[LURE_MAX_SOURCES];
114 bool _nativeMT32;
115 bool _isRoland;
116 Common::Mutex _soundMutex;
117 bool _paused;
118
119 // Internal support methods
120 void bellsBodge();
121 void musicInterface_TidySounds();
122 static void onTimer(void *data);
123 void doTimer();
124
125public:
126 SoundManager();
127 ~SoundManager() override;
128
129 void saveToStream(Common::WriteStream *stream);
130 void loadFromStream(Common::ReadStream *stream);
131
132 void loadSection(uint16 sectionId);
133 bool initCustomTimbres(bool canAbort = false);
134 void killSounds();
135 void addSound(uint8 soundIndex, bool tidyFlag = true);
136 void addSound2(uint8 soundIndex);
137 void stopSound(uint8 soundIndex);
138 void killSound(uint8 soundNumber);
139 void setVolume(uint8 soundNumber, uint8 volume);
140 void syncSounds();
141 void tidySounds();
142 uint8 descIndexOf(uint8 soundNumber);
143 SoundDescResource *findSound(uint8 soundNumber);
144 void removeSounds();
145 void restoreSounds();
146 bool fadeOut();
147 void pause();
148 void resume();
149 bool getPaused() const { return _paused; }
150 bool hasNativeMT32() const { return _nativeMT32; }
151 bool isRoland() const { return _isRoland; }
152
153 // The following methods implement the external sound player module
154 //void musicInterface_Initialize();
155 void musicInterface_Play(uint8 soundNumber, bool isMusic = false, uint8 numChannels = 4, uint8 volume = 0x80);
156 void musicInterface_Stop(uint8 soundNumber);
157 bool musicInterface_CheckPlaying(uint8 soundNumber);
158 void musicInterface_SetVolume(uint8 soundNumber, uint8 volume);
159 void musicInterface_KillAll();
160 void musicInterface_ContinuePlaying();
161 void musicInterface_TrashReverb();
162};
163
164// AdLib MidiDriver subclass implementing the behavior specific to Lure of the
165// Temptress.
167protected:
168 // Lookup array for OPL frequency (F-num) values.
169 static const uint16 OPL_FREQUENCY_LOOKUP[];
170
171public:
173
174 // Channel aftertouch is used to adjust a note's volume. This is done by
175 // overriding the velocity of the active note and recalculating the volume.
176 void channelAftertouch(uint8 channel, uint8 pressure, uint8 source) override;
177 // The MIDI data uses three custom sequencer meta events; the most important
178 // one sets the instrument definition for a channel.
179 void metaEvent(int8 source, byte type, const byte *data, uint16 length) override;
180
181protected:
182 InstrumentInfo determineInstrument(uint8 channel, uint8 source, uint8 note) override;
183 uint16 calculateFrequency(uint8 channel, uint8 source, uint8 note) override;
184 // Returns the number of semitones in bits 8+ and an 8 bit fraction of a
185 // semitone.
186 int32 calculatePitchBend(uint8 channel, uint8 source, uint16 oplFrequency) override;
187 uint8 calculateUnscaledVolume(uint8 channel, uint8 source, uint8 velocity, const OplInstrumentDefinition &instrumentDef, uint8 operatorNum) override;
188
189 // Stores the instrument definitions set by sequencer meta events.
190 OplInstrumentDefinition _instrumentDefs[LURE_MAX_SOURCES][MIDI_CHANNEL_COUNT];
191 // Pitch bend sensitivity in semi-tones. This is a global setting;
192 // it cannot be specified for a specific MIDI channel.
193 uint8 _pitchBendSensitivity;
194};
195
196} // End of namespace Lure
197
198#define Sound (::Lure::SoundManager::instance())
199
200#endif
Definition: list.h:44
Definition: mutex.h:67
Definition: stream.h:385
Definition: singleton.h:42
Definition: stream.h:77
Definition: memory.h:31
Definition: sound.h:166
void metaEvent(int8 source, byte type, const byte *data, uint16 length) override
uint16 calculateFrequency(uint8 channel, uint8 source, uint8 note) override
uint8 calculateUnscaledVolume(uint8 channel, uint8 source, uint8 velocity, const OplInstrumentDefinition &instrumentDef, uint8 operatorNum) override
int32 calculatePitchBend(uint8 channel, uint8 source, uint16 oplFrequency) override
InstrumentInfo determineInstrument(uint8 channel, uint8 source, uint8 note) override
void channelAftertouch(uint8 channel, uint8 pressure, uint8 source) override
Definition: sound.h:45
void send(int8 source, uint32 b) override
void send(uint32 b) override
void metaEvent(int8 source, byte type, const byte *data, uint16 length) override
Definition: sound.h:97
Definition: mididrv.h:541
Definition: adlib_ms.h:295
Definition: mididrv.h:114
Definition: mt32gm.h:111
Definition: mididrv_ms.h:86
Definition: midiparser.h:354
Definition: animseq.h:27
Definition: list_intern.h:54
Definition: res_struct.h:240
Definition: adlib_ms.h:79