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
|
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef SOUND_H_
#define SOUND_H_
#include "audio/audiostream.h"
#include "audio/mixer.h"
#include "common/str.h"
namespace Myst3 {
class Myst3Engine;
enum SoundType {
kAny,
kAmbient,
kCue,
kEffect,
kMusic
};
enum SoundNextCommand {
kRandom,
kNext,
kRandomIfOtherStarting,
kNextIfOtherStarting
};
class SoundChannel {
public:
SoundChannel(Myst3Engine *vm);
virtual ~SoundChannel();
void play(uint32 id, uint32 volume, uint16 heading, uint16 attenuation, bool loop, SoundType type);
void setVolume3D(uint32 volume, uint16 heading, uint16 attenuation);
void fade(uint32 targetVolume, int32 targetHeading, int32 targetAttenuation, uint32 fadeDelay);
void fadeOut(uint32 fadeDelay);
void update();
void stop();
void age(uint32 maxAge);
uint32 playedFrames();
uint32 adjustVolume(uint32 volume);
uint32 _id;
bool _playing;
bool _stopWhenSilent;
bool _fading;
SoundType _type;
uint32 _age;
uint32 _ambientFadeOutDelay;
uint _fadeLastTick;
int32 _fadeDuration; // In frames (@30 fps)
int32 _fadePosition;
int32 _fadeSourceVolume;
int32 _fadeTargetVolume;
int32 _fadeSourceHeading;
int32 _fadeTargetHeading;
int32 _fadeSourceAttenuation;
int32 _fadeTargetAttenuation;
bool _hasFadeArray;
uint32 _fadeArrayPosition;
uint32 _fadeDurations[4];
uint32 _fadeVolumes[4];
private:
Myst3Engine *_vm;
Common::String _name;
uint32 _volume;
int32 _heading;
uint32 _headingAngle;
Audio::AudioStream *_stream;
Audio::SoundHandle _handle;
Audio::Timestamp _length;
Audio::RewindableAudioStream *makeAudioStream(const Common::String &name) const;
void updateFading();
Audio::Mixer::SoundType mixerSoundType();
};
class Sound {
public:
Sound(Myst3Engine *vm);
virtual ~Sound();
SoundChannel *getChannelForSound(uint32 id, SoundType type, bool *found = nullptr);
void playEffect(uint32 id, uint32 volume, uint16 heading = 0, uint16 attenuation = 0);
void playEffectLooping(uint32 id, uint32 volume, uint16 heading = 0, uint16 attenuation = 0);
void playEffectFadeInOut(uint32 id, uint32 volume, uint16 heading, uint16 attenuation,
uint32 fadeInDuration, uint32 playDuration, uint32 fadeOutDuration);
void stopEffect(uint32 id, uint32 fadeDuration);
void playCue(uint32 id, uint32 volume, uint16 heading, uint16 attenuation);
void stopCue(uint32 fadeDelay);
void stopMusic(uint32 fadeDelay);
bool isPlaying(uint32 id);
int32 playedFrames(uint32 id);
void update();
void age();
void fadeOutOldSounds(uint32 fadeDelay);
void computeVolumeBalance(int32 volume, int32 heading, uint attenuation, int32 *mixerVolume, int32 *balance);
void setupNextSound(SoundNextCommand command, int16 controlVar, int16 startSoundId, int16 soundCount,
int32 soundMinDelay, int32 soundMaxDelay, int32 controlSoundId = 0, int32 controlSoundMaxPosition = 0);
void resetSoundVars();
private:
static const uint kNumChannels = 14;
Myst3Engine *_vm;
SoundChannel *_channels[kNumChannels];
void compute3DVolumes(int32 heading, uint angle, int32 *left, int32 *right);
};
} // End of namespace Myst3
#endif // SOUND_H_
|