aboutsummaryrefslogtreecommitdiff
path: root/engines/scumm/smush/channel.h
blob: b873bbdb30cd77bfbd8713432da1b3a8687f0786 (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
/* 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.
 *
 * $URL$
 * $Id$
 *
 */

#ifndef SCUMM_SMUSH_CHANNEL_H
#define SCUMM_SMUSH_CHANNEL_H

#include "common/util.h"

namespace Common {
	class SeekableReadStream;
}

namespace Scumm {

class SmushChannel {
protected:
	int32 _track;				///< the track number
	byte *_tbuffer;	///< data temporary buffer
	int32 _tbufferSize;			///< temporary buffer size
	byte *_sbuffer;	///< sound buffer
	int32 _sbufferSize;			///< sound buffer size

	int32 _dataSize;			///< remaining size of sound data in the iMUS buffer

	bool _inData;

	int32 _volume;
	int32 _pan;

	void processBuffer();

	virtual bool handleSubTags(int32 &offset) = 0;

public:
	SmushChannel(int32 track);
	virtual ~SmushChannel();
	virtual bool appendData(Common::SeekableReadStream &b, int32 size) = 0;
	virtual bool setParameters(int32, int32, int32, int32, int32) = 0;
	virtual bool checkParameters(int32, int32, int32, int32, int32) = 0;
	virtual bool isTerminated() const = 0;
	virtual byte *getSoundData() = 0;
	virtual int32 getRate() = 0;
	virtual bool getParameters(bool &stereo, bool &is_16bit, int32 &vol, int32 &pan) = 0;

	int32 getAvailableSoundDataSize() const { return _sbufferSize; }
	int32 getTrackIdentifier() const { return _track; }
};

class SaudChannel : public SmushChannel {
private:
	int32 _nbframes;
	bool _markReached;
	int32 _flags;
	int32 _index;
	bool _keepSize;

protected:
	bool handleSubTags(int32 &offset);

public:
	SaudChannel(int32 track);
	bool isTerminated() const;
	bool setParameters(int32 duration, int32 flags, int32 vol1, int32 vol2, int32 index);
	bool checkParameters(int32 index, int32 duration, int32 flags, int32 vol1, int32 vol2);
	bool appendData(Common::SeekableReadStream &b, int32 size);
	byte *getSoundData();
	int32 getRate() { return 22050; }
	bool getParameters(bool &stereo, bool &is_16bit, int32 &vol, int32 &pan) {
		stereo = false;
		is_16bit = false;
		vol = _volume;
		pan = _pan;
		return true;
	};
};

class ImuseChannel : public SmushChannel {
private:
	int32 _srbufferSize;

	int32 _bitsize;			///< the bitsize of the original data
	int32 _rate;				///< the sampling rate of the original data
	int32 _channels;			///< the number of channels of the original data

protected:
	void decode();
	bool handleMap(byte *data);
	bool handleSubTags(int32 &offset);

public:
	ImuseChannel(int32 track);
	bool isTerminated() const;
	bool setParameters(int32 nbframes, int32 size, int32 track_flags, int32 unk1, int32);
	bool checkParameters(int32 index, int32 nbframes, int32 size, int32 track_flags, int32 unk1);
	bool appendData(Common::SeekableReadStream &b, int32 size);
	byte *getSoundData();
	int32 getRate() { return _rate; }
	bool getParameters(bool &stereo, bool &is_16bit, int32 &vol, int32 &pan) {
		stereo = (_channels == 2);
		is_16bit = (_bitsize > 8);
		vol = _volume;
		pan = _pan;
		return true;
	};
};

} // End of namespace Scumm

#endif