1 /***
2 This file is part of PulseAudio.
3
4 Copyright 2013 Intel Corporation
5
6 PulseAudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation; either version 2.1 of the License,
9 or (at your option) any later version.
10
11 PulseAudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #ifdef HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23
24 #include "stream-util.h"
25
26 #include <pulse/def.h>
27
28 #include <pulsecore/core-format.h>
29 #include <pulsecore/macro.h>
30
pa_stream_get_volume_channel_map(const pa_cvolume * volume,const pa_channel_map * original_map,const pa_format_info * format,pa_channel_map * volume_map)31 int pa_stream_get_volume_channel_map(const pa_cvolume *volume, const pa_channel_map *original_map, const pa_format_info *format,
32 pa_channel_map *volume_map) {
33 int r;
34 pa_channel_map volume_map_local;
35
36 pa_assert(volume);
37 pa_assert(format);
38 pa_assert(volume_map);
39
40 if (original_map) {
41 if (volume->channels == original_map->channels) {
42 *volume_map = *original_map;
43 return 0;
44 }
45
46 if (volume->channels == 1) {
47 pa_channel_map_init_mono(volume_map);
48 return 0;
49 }
50
51 pa_log_info("Invalid stream parameters: the volume is incompatible with the channel map.");
52 return -PA_ERR_INVALID;
53 }
54
55 r = pa_format_info_get_channel_map(format, &volume_map_local);
56 if (r == -PA_ERR_NOENTITY) {
57 if (volume->channels == 1) {
58 pa_channel_map_init_mono(volume_map);
59 return 0;
60 }
61
62 pa_log_info("Invalid stream parameters: multi-channel volume is set, but channel map is not.");
63 return -PA_ERR_INVALID;
64 }
65
66 if (r < 0) {
67 pa_log_info("Invalid channel map.");
68 return -PA_ERR_INVALID;
69 }
70
71 if (volume->channels == volume_map_local.channels) {
72 *volume_map = volume_map_local;
73 return 0;
74 }
75
76 if (volume->channels == 1) {
77 pa_channel_map_init_mono(volume_map);
78 return 0;
79 }
80
81 pa_log_info("Invalid stream parameters: the volume is incompatible with the channel map.");
82
83 return -PA_ERR_INVALID;
84 }
85