Welcome to mirror list, hosted at ThFree Co, Russian Federation.

AUD_Mixer.h « intern « audaspace « intern - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: a24422a8a21c81c3351441616e5ed3ed74b4477f (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
/*
 * $Id$
 *
 * ***** BEGIN LGPL LICENSE BLOCK *****
 *
 * Copyright 2009 Jörg Hermann Müller
 *
 * This file is part of AudaSpace.
 *
 * AudaSpace is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * AudaSpace 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with AudaSpace.  If not, see <http://www.gnu.org/licenses/>.
 *
 * ***** END LGPL LICENSE BLOCK *****
 */

#ifndef AUD_MIXER
#define AUD_MIXER

#define AUD_MIXER_RESAMPLER AUD_LinearResampleFactory

#include "AUD_ConverterFunctions.h"
class AUD_ConverterFactory;
class AUD_MIXER_RESAMPLER;
class AUD_ChannelMapperFactory;
class AUD_Buffer;
class AUD_IReader;
#include <list>

struct AUD_MixerBuffer
{
	sample_t* buffer;
	int start;
	int length;
	float volume;
};

/**
 * This class is able to mix audiosignals of different channel count and sample
 * rate and convert it to a specific output format.
 * It uses a default ChannelMapperFactory and a SRCResampleFactory for
 * the perparation.
 */
class AUD_Mixer
{
private:
	/**
	 * The resampling factory that resamples all readers for superposition.
	 */
	AUD_MIXER_RESAMPLER* m_resampler;

	/**
	 * The channel mapper factory that maps all readers for superposition.
	 */
	AUD_ChannelMapperFactory* m_mapper;

	/**
	 * The list of buffers to superpose.
	 */
	std::list<AUD_MixerBuffer> m_buffers;

	/**
	 * The output specification.
	 */
	AUD_DeviceSpecs m_specs;

	/**
	 * The temporary mixing buffer.
	 */
	AUD_Buffer* m_buffer;

	/**
	 * Converter function.
	 */
	AUD_convert_f m_convert;

public:
	/**
	 * Creates the mixer.
	 */
	AUD_Mixer();

	/**
	 * Destroys the mixer.
	 */
	~AUD_Mixer();

	/**
	 * This funuction prepares a reader for playback.
	 * \param reader The reader to prepare.
	 * \return The reader that should be used for playback.
	 */
	AUD_IReader* prepare(AUD_IReader* reader);

	/**
	 * Returns the target specification for superposing.
	 * \return The target specification.
	 */
	AUD_DeviceSpecs getSpecs();

	/**
	 * Sets the target specification for superposing.
	 * \param specs The target specification.
	 */
	void setSpecs(AUD_DeviceSpecs specs);

	/**
	 * Adds a buffer for superposition.
	 * \param buffer The buffer to superpose.
	 * \param start The start sample of the buffer.
	 * \param length The length of the buffer in samples.
	 * \param volume The mixing volume. Must be a value between 0.0 and 1.0.
	 */
	void add(sample_t* buffer, int start, int length, float volume);

	/**
	 * Superposes all added buffers into an output buffer.
	 * \param buffer The target buffer for superposing.
	 * \param length The length of the buffer in samples.
	 * \param volume The mixing volume. Must be a value between 0.0 and 1.0.
	 */
	void superpose(data_t* buffer, int length, float volume);
};

#endif //AUD_MIXER