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

ChannelMapperReader.h « respec « include « audaspace « extern - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 00739ee995f816b11b82d883e749eb2c2f0adda6 (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
151
/*******************************************************************************
 * Copyright 2009-2016 Jörg Müller
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

#pragma once

/**
 * @file ChannelMapperReader.h
 * @ingroup respec
 * The ChannelMapperReader class.
 */

#include "fx/EffectReader.h"
#include "util/Buffer.h"

AUD_NAMESPACE_BEGIN

/**
 * This class maps a sound source's channels to a specific output channel count.
 * \note The input sample format must be float.
 */
class AUD_API ChannelMapperReader : public EffectReader
{
private:
	/**
	 * The sound reading buffer.
	 */
	Buffer m_buffer;

	/**
	 * The output specification.
	 */
	Channels m_target_channels;

	/**
	 * The channel count of the reader.
	 */
	Channels m_source_channels;

	/**
	 * The mapping specification.
	 */
	float* m_mapping;

	/**
	 * The size of the mapping.
	 */
	int m_map_size;

	/**
	 * The mono source angle.
	 */
	float m_mono_angle;

	static const Channel MONO_MAP[];
	static const Channel STEREO_MAP[];
	static const Channel STEREO_LFE_MAP[];
	static const Channel SURROUND4_MAP[];
	static const Channel SURROUND5_MAP[];
	static const Channel SURROUND51_MAP[];
	static const Channel SURROUND61_MAP[];
	static const Channel SURROUND71_MAP[];
	static const Channel* CHANNEL_MAPS[];

	static const float MONO_ANGLES[];
	static const float STEREO_ANGLES[];
	static const float STEREO_LFE_ANGLES[];
	static const float SURROUND4_ANGLES[];
	static const float SURROUND5_ANGLES[];
	static const float SURROUND51_ANGLES[];
	static const float SURROUND61_ANGLES[];
	static const float SURROUND71_ANGLES[];
	static const float* CHANNEL_ANGLES[];

	// delete copy constructor and operator=
	ChannelMapperReader(const ChannelMapperReader&) = delete;
	ChannelMapperReader& operator=(const ChannelMapperReader&) = delete;

	/**
	 * Calculates the mapping matrix.
	 */
	void AUD_LOCAL calculateMapping();

	/**
	 * Calculates the distance between two angles.
	 */
	float AUD_LOCAL angleDistance(float alpha, float beta);

public:
	/**
	 * Creates a channel mapper reader.
	 * \param reader The reader to map.
	 * \param channels The target channel count this reader should map to.
	 */
	ChannelMapperReader(std::shared_ptr<IReader> reader, Channels channels);

	/**
	 * Destroys the reader.
	 */
	~ChannelMapperReader();

	/**
	 * Returns the channel configuration of the source reader.
	 * @return The channel configuration of the reader.
	 */
	Channels getSourceChannels() const;

	/**
	 * Returns the target channel configuration.
	 * Equals getSpecs().channels.
	 * @return The target channel configuration.
	 */
	Channels getChannels() const;

	/**
	 * Sets the requested channel output count.
	 * \param channels The channel output count.
	 */
	void setChannels(Channels channels);

	/**
	 * Returns the mapping of the source channel to the target channel.
	 * @param source The number of the source channel. Should be in the range [0, source channels).
	 * @param target The number of the target channel. Should be in the range [0, target channels).
	 * @return The mapping value which should be between 0.0 and 1.0. If source or target are out of range, NaN is returned.
	 */
	float getMapping(int source, int target);

	/**
	 * Sets the angle for mono sources.
	 * \param angle The angle for mono sources.
	 */
	void setMonoAngle(float angle);

	virtual Specs getSpecs() const;
	virtual void read(int& length, bool& eos, sample_t* buffer);
};

AUD_NAMESPACE_END