summaryrefslogtreecommitdiff
path: root/ext/pulse/pulseutil.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pulse/pulseutil.c')
-rw-r--r--ext/pulse/pulseutil.c151
1 files changed, 63 insertions, 88 deletions
diff --git a/ext/pulse/pulseutil.c b/ext/pulse/pulseutil.c
index e29e7e970..607fdd436 100644
--- a/ext/pulse/pulseutil.c
+++ b/ext/pulse/pulseutil.c
@@ -24,7 +24,6 @@
#endif
#include "pulseutil.h"
-#include <gst/audio/multichannel.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h> /* getpid on UNIX */
@@ -33,60 +32,39 @@
# include <process.h> /* getpid on win32 */
#endif
-static const pa_channel_position_t gst_pos_to_pa[GST_AUDIO_CHANNEL_POSITION_NUM]
- = {
- [GST_AUDIO_CHANNEL_POSITION_FRONT_MONO] = PA_CHANNEL_POSITION_MONO,
- [GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT] = PA_CHANNEL_POSITION_FRONT_LEFT,
- [GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT] = PA_CHANNEL_POSITION_FRONT_RIGHT,
- [GST_AUDIO_CHANNEL_POSITION_REAR_CENTER] = PA_CHANNEL_POSITION_REAR_CENTER,
- [GST_AUDIO_CHANNEL_POSITION_REAR_LEFT] = PA_CHANNEL_POSITION_REAR_LEFT,
- [GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT] = PA_CHANNEL_POSITION_REAR_RIGHT,
- [GST_AUDIO_CHANNEL_POSITION_LFE] = PA_CHANNEL_POSITION_LFE,
- [GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER] = PA_CHANNEL_POSITION_FRONT_CENTER,
- [GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER] =
- PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
- [GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER] =
- PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
- [GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT] = PA_CHANNEL_POSITION_SIDE_LEFT,
- [GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT] = PA_CHANNEL_POSITION_SIDE_RIGHT,
- [GST_AUDIO_CHANNEL_POSITION_TOP_CENTER] = PA_CHANNEL_POSITION_TOP_CENTER,
- [GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT] =
- PA_CHANNEL_POSITION_TOP_FRONT_LEFT,
- [GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT] =
- PA_CHANNEL_POSITION_TOP_FRONT_RIGHT,
- [GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER] =
- PA_CHANNEL_POSITION_TOP_FRONT_CENTER,
- [GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT] =
- PA_CHANNEL_POSITION_TOP_REAR_LEFT,
- [GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT] =
- PA_CHANNEL_POSITION_TOP_REAR_RIGHT,
- [GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER] =
- PA_CHANNEL_POSITION_TOP_REAR_CENTER,
- [GST_AUDIO_CHANNEL_POSITION_NONE] = PA_CHANNEL_POSITION_INVALID
-};
-
-/* All index are increased by one because PA_CHANNEL_POSITION_INVALID == -1 */
-static const GstAudioChannelPosition
- pa_to_gst_pos[GST_AUDIO_CHANNEL_POSITION_NUM]
- = {
- [PA_CHANNEL_POSITION_MONO + 1] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO,
- [PA_CHANNEL_POSITION_FRONT_LEFT + 1] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
- [PA_CHANNEL_POSITION_FRONT_RIGHT + 1] =
- GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
- [PA_CHANNEL_POSITION_REAR_CENTER + 1] =
- GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
- [PA_CHANNEL_POSITION_REAR_LEFT + 1] = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
- [PA_CHANNEL_POSITION_REAR_RIGHT + 1] = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
- [PA_CHANNEL_POSITION_LFE + 1] = GST_AUDIO_CHANNEL_POSITION_LFE,
- [PA_CHANNEL_POSITION_FRONT_CENTER + 1] =
- GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
- [PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER + 1] =
- GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
- [PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER + 1] =
- GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
- [PA_CHANNEL_POSITION_SIDE_LEFT + 1] = GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
- [PA_CHANNEL_POSITION_SIDE_RIGHT + 1] = GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
- [PA_CHANNEL_POSITION_INVALID + 1] = GST_AUDIO_CHANNEL_POSITION_NONE,
+static const struct
+{
+ GstAudioChannelPosition gst_pos;
+ pa_channel_position_t pa_pos;
+} gst_pa_pos_table[] = {
+ {
+ GST_AUDIO_CHANNEL_POSITION_MONO, PA_CHANNEL_POSITION_MONO}, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_LEFT}, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, PA_CHANNEL_POSITION_FRONT_RIGHT}, {
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER, PA_CHANNEL_POSITION_REAR_CENTER}, {
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_LEFT}, {
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, PA_CHANNEL_POSITION_REAR_RIGHT}, {
+ GST_AUDIO_CHANNEL_POSITION_LFE1, PA_CHANNEL_POSITION_LFE}, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_FRONT_CENTER}, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+ PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER}, {
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
+ PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER}, {
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, PA_CHANNEL_POSITION_SIDE_LEFT}, {
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, PA_CHANNEL_POSITION_SIDE_RIGHT}, {
+ GST_AUDIO_CHANNEL_POSITION_TOP_CENTER, PA_CHANNEL_POSITION_TOP_CENTER}, {
+ GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT,
+ PA_CHANNEL_POSITION_TOP_FRONT_LEFT}, {
+ GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT,
+ PA_CHANNEL_POSITION_TOP_FRONT_RIGHT}, {
+ GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER,
+ PA_CHANNEL_POSITION_TOP_FRONT_CENTER}, {
+ GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT, PA_CHANNEL_POSITION_TOP_REAR_LEFT}, {
+ GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT,
+ PA_CHANNEL_POSITION_TOP_REAR_RIGHT}, {
+ GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER,
+ PA_CHANNEL_POSITION_TOP_REAR_CENTER}, {
+ GST_AUDIO_CHANNEL_POSITION_NONE, PA_CHANNEL_POSITION_INVALID}
};
static gboolean
@@ -235,29 +213,30 @@ pa_channel_map *
gst_pulse_gst_to_channel_map (pa_channel_map * map,
const GstAudioRingBufferSpec * spec)
{
- int i;
- GstAudioChannelPosition *pos;
+ gint i, j;
+ gint channels;
+ const GstAudioChannelPosition *pos;
pa_channel_map_init (map);
- if (!(pos =
- gst_audio_get_channel_positions (gst_caps_get_structure (spec->caps,
- 0)))) {
- return NULL;
+ channels = GST_AUDIO_INFO_CHANNELS (&spec->info);
+ pos = spec->info.position;
+
+ for (j = 0; j < channels; j++) {
+ for (i = 0; i < G_N_ELEMENTS (gst_pa_pos_table); i++) {
+ if (pos[j] == gst_pa_pos_table[i].gst_pos) {
+ map->map[j] = gst_pa_pos_table[i].pa_pos;
+ break;
+ }
+ }
+ if (i == G_N_ELEMENTS (gst_pa_pos_table))
+ return NULL;
}
- for (i = 0; i < spec->info.channels; i++) {
- if (pos[i] == GST_AUDIO_CHANNEL_POSITION_NONE) {
- /* no valid mappings for these channels */
- g_free (pos);
- return NULL;
- } else if (pos[i] < GST_AUDIO_CHANNEL_POSITION_NUM)
- map->map[i] = gst_pos_to_pa[pos[i]];
- else
- map->map[i] = PA_CHANNEL_POSITION_INVALID;
+ if (j != spec->info.channels) {
+ return NULL;
}
- g_free (pos);
map->channels = spec->info.channels;
if (!pa_channel_map_valid (map)) {
@@ -271,30 +250,30 @@ GstAudioRingBufferSpec *
gst_pulse_channel_map_to_gst (const pa_channel_map * map,
GstAudioRingBufferSpec * spec)
{
- int i;
- GstAudioChannelPosition *pos;
+ gint i, j;
gboolean invalid = FALSE;
gint channels;
+ GstAudioChannelPosition *pos;
channels = GST_AUDIO_INFO_CHANNELS (&spec->info);
g_return_val_if_fail (map->channels == channels, NULL);
- pos = g_new0 (GstAudioChannelPosition, channels + 1);
+ pos = spec->info.position;
- for (i = 0; i < channels; i++) {
- if (map->map[i] == PA_CHANNEL_POSITION_INVALID) {
- invalid = TRUE;
- break;
- } else if ((int) map->map[i] < (int) GST_AUDIO_CHANNEL_POSITION_NUM) {
- pos[i] = pa_to_gst_pos[map->map[i] + 1];
- } else {
- invalid = TRUE;
- break;
+ for (j = 0; j < channels; j++) {
+ for (i = 0; j < channels && i < G_N_ELEMENTS (gst_pa_pos_table); i++) {
+ if (map->map[j] == gst_pa_pos_table[i].pa_pos) {
+ pos[j] = gst_pa_pos_table[i].gst_pos;
+ break;
+ }
}
+ if (i == G_N_ELEMENTS (gst_pa_pos_table))
+ return NULL;
}
- if (!invalid && !gst_audio_check_channel_positions (pos, channels))
+ if (!invalid
+ && !gst_audio_check_valid_channel_positions (pos, channels, FALSE))
invalid = TRUE;
if (invalid) {
@@ -302,10 +281,6 @@ gst_pulse_channel_map_to_gst (const pa_channel_map * map,
pos[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
}
- gst_audio_set_channel_positions (gst_caps_get_structure (spec->caps, 0), pos);
-
- g_free (pos);
-
return spec;
}