aboutsummaryrefslogtreecommitdiff
path: root/engines/zvision/scripting/effects/music_effect.h
blob: 7657be8e095c8ba2b585316e191bdc867e9055f3 (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
/* 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 2
 * 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, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#ifndef ZVISION_MUSIC_NODE_H
#define ZVISION_MUSIC_NODE_H

#include "audio/mixer.h"
#include "zvision/scripting/scripting_effect.h"
#include "zvision/text/subtitles.h"

namespace Common {
class String;
}

namespace ZVision {

class MusicNodeBASE : public ScriptingEffect {
public:
	MusicNodeBASE(ZVision *engine, uint32 key, ScriptingEffectType type) : ScriptingEffect(engine, key, type) {}
	~MusicNodeBASE() {}

	/**
	 * Decrement the timer by the delta time. If the timer is finished, set the status
	 * in _globalState and let this node be deleted
	 *
	 * @param deltaTimeInMillis    The number of milliseconds that have passed since last frame
	 * @return                     If true, the node can be deleted after process() finishes
	 */
	virtual bool process(uint32 deltaTimeInMillis) = 0;

	virtual void setVolume(uint8 volume) = 0;
	virtual uint8 getVolume() = 0;
	virtual void setDeltaVolume(uint8 volume) = 0;
	virtual void setBalance(int8 balance) = 0;

	virtual void setFade(int32 time, uint8 target) = 0;
};

class MusicNode : public MusicNodeBASE {
public:
	MusicNode(ZVision *engine, uint32 key, Common::String &file, bool loop, uint8 volume);
	~MusicNode();

	/**
	 * Decrement the timer by the delta time. If the timer is finished, set the status
	 * in _globalState and let this node be deleted
	 *
	 * @param deltaTimeInMillis    The number of milliseconds that have passed since last frame
	 * @return                     If true, the node can be deleted after process() finishes
	 */
	bool process(uint32 deltaTimeInMillis);

	void setVolume(uint8 volume);
	uint8 getVolume();
	void setDeltaVolume(uint8 volume);
	void setBalance(int8 balance);

	void setFade(int32 time, uint8 target);

private:
	uint8 _volume;
	uint8 _deltaVolume;
	int8 _balance;
	bool _loop;
	bool _crossfade;
	uint8 _crossfadeTarget;
	int32 _crossfadeTime;
	bool _stereo;
	Audio::SoundHandle _handle;
	Subtitle *_sub;
	bool _loaded;
};

// Only used by Zork: Nemesis, for the flute and piano puzzles (tj4e and ve6f, as well as vr)
class MusicMidiNode : public MusicNodeBASE {
public:
	MusicMidiNode(ZVision *engine, uint32 key, int8 program, int8 note, int8 volume);
	~MusicMidiNode();

	/**
	 * Decrement the timer by the delta time. If the timer is finished, set the status
	 * in _globalState and let this node be deleted
	 *
	 * @param deltaTimeInMillis    The number of milliseconds that have passed since last frame
	 * @return                     If true, the node can be deleted after process() finishes
	 */
	bool process(uint32 deltaTimeInMillis);

	void setVolume(uint8 volume);
	uint8 getVolume();
	void setDeltaVolume(uint8 volume);
	void setBalance(int8 balance);

	void setFade(int32 time, uint8 target);

private:
	int8 _chan;
	int8 _noteNumber;
	int8 _pan;
	int8 _volume;
	int8 _prog;
};

class PanTrackNode : public ScriptingEffect {
public:
	PanTrackNode(ZVision *engine, uint32 key, uint32 slot, int16 pos);
	~PanTrackNode();

	bool process(uint32 deltaTimeInMillis);

private:
	uint32 _slot;
	int16 _position;
};

} // End of namespace ZVision

#endif