aboutsummaryrefslogtreecommitdiff
path: root/engines/zvision/scripting/sidefx/music_node.h
blob: 09bdc3707e249425ee78c3e23d91e9ab47013e0c (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
/* 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/sidefx.h"
#include "zvision/graphics/subtitles.h"

namespace Common {
class String;
}

namespace ZVision {

class MusicNodeBASE : public SideFX {
public:
	MusicNodeBASE(ZVision *engine, uint32 key, SideFXType type) : SideFX(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 void setPanTrack(int16 pos) = 0;
	virtual void unsetPanTrack() = 0;

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

class MusicNode : public MusicNodeBASE {
public:
	MusicNode(ZVision *engine, uint32 key, Common::String &file, bool loop, int8 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);

	void setPanTrack(int16 pos);
	void unsetPanTrack();

	void setFade(int32 time, uint8 target);

private:
	bool _pantrack;
	int32 _pantrackPosition;
	int32 _attenuate;
	uint8 _volume;
	bool _loop;
	bool _crossfade;
	uint8 _crossfadeTarget;
	int32 _crossfadeTime;
	bool _stereo;
	Audio::SoundHandle _handle;
	Subtitle *_sub;
	bool _loaded;
};

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);

	void setPanTrack(int16 pos);
	void unsetPanTrack();

	void setFade(int32 time, uint8 target);

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

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

private:
	uint32 _slot;
};

} // End of namespace ZVision

#endif