File: audio_mixer.h

package info (click to toggle)
scummvm 2.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 450,580 kB
  • sloc: cpp: 4,299,825; asm: 28,322; python: 12,901; sh: 11,302; java: 9,289; xml: 7,895; perl: 2,639; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (120 lines) | stat: -rw-r--r-- 4,319 bytes parent folder | download | duplicates (2)
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
/* 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 BLADERUNNER_AUDIO_MIXER_H
#define BLADERUNNER_AUDIO_MIXER_H

#include "audio/audiostream.h"
#include "audio/mixer.h"

#include "common/mutex.h"

#include "bladerunner/bladerunner.h" // For BLADERUNNER_ORIGINAL_BUGS symbol

namespace BladeRunner {

class BladeRunnerEngine;

#if !BLADERUNNER_ORIGINAL_BUGS
enum audioMixerAppTimers {
	kAudioMixerAppTimerMusicNext    =  0,
	kAudioMixerAppTimerMusicFadeOut =  1
};
#endif

class AudioMixer {
#if BLADERUNNER_ORIGINAL_BUGS
	static const int kChannels         = 9;
	static const int kUsableChannels   = 8;
	static const int kMusicChannel     = 8;
#else
	static const int kChannels         = 15;
	static const int kUsableChannels   = 14;
	static const int kMusicChannel     = 14;

	static const int kAudioMixerAppTimersNum = 2;
#endif // BLADERUNNER_ORIGINAL_BUGS
	static const int kUpdatesPerSecond = 40;

	struct Channel {
		bool                isPresent;
		int                 priority;
		bool                loop;
		Audio::SoundHandle  handle;
		Audio::AudioStream *stream;
		float               volume;       // should be in [0.0f, 100.0f]. It's percent for the Audio::Mixer::kMaxChannelVolume
		float               volumeDelta;
		float               volumeTarget; // should be in [0.0f, 100.0f], as for volume field.
		float               pan;          // should be in [-100.0f, 100.0f]. It's percent for 127 (max absolute balance value)
		float               panDelta;
		float               panTarget;    // should be in [-100.0f, 100.0f], as for pan field.
		void              (*endCallback)(int channel, void *data);
		void               *callbackData;
		uint32              timeStarted;
		uint32              trackDurationMs;
		bool                sentToMixer;
	};

	BladeRunnerEngine *_vm;

	Channel       _channels[kChannels];
	Common::Mutex _mutex;

#if !BLADERUNNER_ORIGINAL_BUGS
	struct audioMixerAppTimer {
		bool                started;
		uint32              intervalMillis; // expiration interval in milliseconds
		uint32              lastFired;      // time of last time the timer expired in milliseconds
	};

	audioMixerAppTimer      _audioMixerAppTimers[kAudioMixerAppTimersNum];
#endif // !BLADERUNNER_ORIGINAL_BUGS

public:
	AudioMixer(BladeRunnerEngine *vm);
	~AudioMixer();

	int play(Audio::Mixer::SoundType type, Audio::RewindableAudioStream *stream, int priority, bool loop, int volume, int pan, void(*endCallback)(int, void *), void *callbackData, uint32 trackDurationMs);
	int playMusic(Audio::RewindableAudioStream *stream, int volume, void(*endCallback)(int, void *), void *callbackData, uint32 trackDurationMs);
	void stop(int channel, uint32 time);

	void adjustVolume(int channel, int targetVolume, uint32 time);
	void adjustPan(int channel, int targetPan, uint32 time);

#if !BLADERUNNER_ORIGINAL_BUGS
	void startAppTimerProc(int audioMixAppTimerId, uint32 intervalMillis);
	void stopAppTimerProc(int audioMixAppTimerId);
#endif // !BLADERUNNER_ORIGINAL_BUGS
	// TODO Are these completely unused?
//	void resume(int channel, uint32 delay);
//	void pause(int channel, uint32 delay);

private:
	int playInChannel(int channel, Audio::Mixer::SoundType type, Audio::RewindableAudioStream *stream, int priority, bool loop, int volume, int pan, void(*endCallback)(int, void *), void *callbackData, uint32 trackDurationMs);

	bool isActive(int channel) const;
	void tick();
	static void timerCallback(void *refCon);
};

} // End of namespace BladeRunner

#endif