aboutsummaryrefslogtreecommitdiff
path: root/scumm/imuse_digi.h
blob: a083f58ad4e66a0a29afe47e74b726257a23ebc3 (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
138
139
140
141
142
143
144
145
146
147
148
149
150
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2001  Ludvig Strigeus
 * Copyright (C) 2001-2003 The ScummVM project
 *
 * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header$
 *
 */

#ifndef IMUSE_DIGI_H
#define IMUSE_DIGI_H

#include "common/scummsys.h"
#include "scumm/music.h"
#include "sound/mixer.h"

namespace Scumm {

#define MAX_DIGITAL_CHANNELS 8
#define MAX_IMUSE_JUMPS 50
#define MAX_IMUSE_REGIONS 50
#define MAX_IMUSE_MARKERS 50

class ScummEngine;
class Bundle;

/**
 * iMuse Digital Implementation for SCUMM v7 and higher.
 */
class IMuseDigital : public MusicEngine {
private:

	struct _region {
		uint32 start;		// begin of region
		uint32 length;		// lenght of region
	};

	struct _jump {
		uint32 start;		// jump start position
		uint32 dest;		// jump to dest position
		uint32 hookId;		// id of hook
		uint32 fadeDelay;	// fade delay in ms
	};

	struct _marker {
		char name[256];		// name of marker
	};

	struct Channel {
		int8 pan;			// pan
		int32 vol;			// volume
		int32 volFadeDest;	//
		int32 volFadeStep;	//
		int32 volFadeDelay;	//
		bool volFadeUsed;	//

		_region region[MAX_IMUSE_REGIONS];
		_marker marker[MAX_IMUSE_MARKERS];
		_jump jump[MAX_IMUSE_JUMPS];
		int32 offsetStop;
		int32 numJumps;
		int32 numRegions;
		int32 numMarkers;

		int32 offset;
		byte *data;
		int freq;
		int channels;
		int bits;
		int32 size;
		int idSound;
		int32 mixerSize;
		int mixerFlags;
		PlayingSoundHandle handle;
		bool used;
		bool toBeRemoved;
	};

	Channel _channel[MAX_DIGITAL_CHANNELS];

	ScummEngine *_scumm;
	bool _pause;

	static void timer_handler(void *refConf);
	void mixerCallback();

	//
	// Bundle music
	//
	const char *_nameBundleMusic;
	const char *_newNameBundleMusic;
	byte _musicDisk;
	byte _voiceDisk;
	int32 _currentSampleBundleMusic;
	int32 _numberSamplesBundleMusic;
	int32 _offsetSampleBundleMusic;
	int32 _offsetBufBundleMusic;
	byte *_musicBundleBufFinal;
	byte *_musicBundleBufOutput;
	bool _pauseBundleMusic;
	PlayingSoundHandle _bundleMusicTrack;
	bool _musicBundleToBeChanged;
	int32 _bundleMusicSampleBits;
	int32 _outputMixerSize;
	int32 _bundleSampleChannels;
	int32 _bundleMusicPosition;

	static void music_handler(void *refCon);
	void bundleMusicHandler();

	void playBundleMusic(const char *song);

public:
	int32 _bundleSongPosInMs;
	Bundle *_bundle;	// FIXME: should be protected but is used by ScummEngine::askForDisk

	void pauseBundleMusic(bool state);
	void stopBundleMusic();
	void playBundleSound(const char *sound, PlayingSoundHandle *handle);
 
public:
	IMuseDigital(ScummEngine *scumm);
	~IMuseDigital();

	void setMasterVolume(int vol) {}

	void startSound(int sound);
	void stopSound(int sound);
	void stopAllSounds();
	void pause(bool pause);
	int32 doCommand(int a, int b, int c, int d, int e, int f, int g, int h);
	int getSoundStatus(int sound) const;
};

} // End of namespace Scumm

#endif