diff options
Diffstat (limited to '')
-rw-r--r-- | src/pulsecore/stream-util.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/pulsecore/stream-util.c b/src/pulsecore/stream-util.c new file mode 100644 index 0000000..2574501 --- /dev/null +++ b/src/pulsecore/stream-util.c @@ -0,0 +1,84 @@ +/*** + This file is part of PulseAudio. + + Copyright 2013 Intel Corporation + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. +***/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "stream-util.h" + +#include <pulse/def.h> + +#include <pulsecore/core-format.h> +#include <pulsecore/macro.h> + +int 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) { + int r; + pa_channel_map volume_map_local; + + pa_assert(volume); + pa_assert(format); + pa_assert(volume_map); + + if (original_map) { + if (volume->channels == original_map->channels) { + *volume_map = *original_map; + return 0; + } + + if (volume->channels == 1) { + pa_channel_map_init_mono(volume_map); + return 0; + } + + pa_log_info("Invalid stream parameters: the volume is incompatible with the channel map."); + return -PA_ERR_INVALID; + } + + r = pa_format_info_get_channel_map(format, &volume_map_local); + if (r == -PA_ERR_NOENTITY) { + if (volume->channels == 1) { + pa_channel_map_init_mono(volume_map); + return 0; + } + + pa_log_info("Invalid stream parameters: multi-channel volume is set, but channel map is not."); + return -PA_ERR_INVALID; + } + + if (r < 0) { + pa_log_info("Invalid channel map."); + return -PA_ERR_INVALID; + } + + if (volume->channels == volume_map_local.channels) { + *volume_map = volume_map_local; + return 0; + } + + if (volume->channels == 1) { + pa_channel_map_init_mono(volume_map); + return 0; + } + + pa_log_info("Invalid stream parameters: the volume is incompatible with the channel map."); + + return -PA_ERR_INVALID; +} |