1
/*
2
 * Copyright 2011 Various Authors
3
 * Copyright 2011 Johannes Weißl
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License as
7
 * published by the Free Software Foundation; either version 2 of the
8
 * License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful, but
11
 * WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
 * General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
17
 */
18
19
#ifndef _CHANNELMAP_H
20
#define _CHANNELMAP_H
21
22
#include <string.h>
23
24
#define CHANNELS_MAX 32
25
26
/* Modelled after PulseAudio */
27
enum channel_position {
28
	CHANNEL_POSITION_INVALID = -1,
29
	CHANNEL_POSITION_MONO = 0,
30
	CHANNEL_POSITION_FRONT_LEFT,
31
	CHANNEL_POSITION_FRONT_RIGHT,
32
	CHANNEL_POSITION_FRONT_CENTER,
33
34
	CHANNEL_POSITION_LEFT = CHANNEL_POSITION_FRONT_LEFT,
35
	CHANNEL_POSITION_RIGHT = CHANNEL_POSITION_FRONT_RIGHT,
36
	CHANNEL_POSITION_CENTER = CHANNEL_POSITION_FRONT_CENTER,
37
38
	CHANNEL_POSITION_REAR_CENTER,
39
	CHANNEL_POSITION_REAR_LEFT,
40
	CHANNEL_POSITION_REAR_RIGHT,
41
42
	CHANNEL_POSITION_LFE,
43
	CHANNEL_POSITION_SUBWOOFER = CHANNEL_POSITION_LFE,
44
45
	CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
46
	CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
47
48
	CHANNEL_POSITION_SIDE_LEFT,
49
	CHANNEL_POSITION_SIDE_RIGHT,
50
51
	CHANNEL_POSITION_TOP_CENTER,
52
53
	CHANNEL_POSITION_TOP_FRONT_LEFT,
54
	CHANNEL_POSITION_TOP_FRONT_RIGHT,
55
	CHANNEL_POSITION_TOP_FRONT_CENTER,
56
57
	CHANNEL_POSITION_TOP_REAR_LEFT,
58
	CHANNEL_POSITION_TOP_REAR_RIGHT,
59
	CHANNEL_POSITION_TOP_REAR_CENTER,
60
61
	CHANNEL_POSITION_MAX
62
};
63
64
typedef enum channel_position	channel_position_t;
65
66
#define CHANNEL_MAP_INIT	{ CHANNEL_POSITION_INVALID }
67
68
#define CHANNEL_MAP(name) \
69
	channel_position_t name[CHANNELS_MAX] = CHANNEL_MAP_INIT
70
71
static inline int channel_map_valid(const channel_position_t *map)
72
{
73
	return map[0] != CHANNEL_POSITION_INVALID;
74
}
75
76
static inline int channel_map_equal(const channel_position_t *a, const channel_position_t *b, int channels)
77
{
78
	return memcmp(a, b, sizeof(*a) * channels) == 0;
79
}
80
81
static inline channel_position_t *channel_map_copy(channel_position_t *dst, const channel_position_t *src)
82
{
83
	return memcpy(dst, src, sizeof(*dst) * CHANNELS_MAX);
84
}
85
86
static inline void channel_map_init_stereo(channel_position_t *map)
87
{
88
	map[0] = CHANNEL_POSITION_LEFT;
89
	map[1] = CHANNEL_POSITION_RIGHT;
90
}
91
92
void channel_map_init_waveex(int channels, unsigned int mask, channel_position_t *map);
93
94
#endif