1 /* GStreamer Jack utility functions
2 * Copyright (C) 2010 Tristan Matthews <tristan@sat.qc.ca>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20 #include "gstjackutil.h"
21 #include <gst/audio/audio.h>
22
23 static const GstAudioChannelPosition default_positions[8][8] = {
24 /* 1 channel */
25 {
26 GST_AUDIO_CHANNEL_POSITION_MONO,
27 },
28 /* 2 channels */
29 {
30 GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
31 GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
32 },
33 /* 3 channels (2.1) */
34 {
35 GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
36 GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
37 GST_AUDIO_CHANNEL_POSITION_LFE1, /* or FRONT_CENTER for 3.0? */
38 },
39 /* 4 channels (4.0 or 3.1?) */
40 {
41 GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
42 GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
43 GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
44 GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
45 },
46 /* 5 channels */
47 {
48 GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
49 GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
50 GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
51 GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
52 GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
53 },
54 /* 6 channels */
55 {
56 GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
57 GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
58 GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
59 GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
60 GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
61 GST_AUDIO_CHANNEL_POSITION_LFE1,
62 },
63 /* 7 channels */
64 {
65 GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
66 GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
67 GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
68 GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
69 GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
70 GST_AUDIO_CHANNEL_POSITION_LFE1,
71 GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
72 },
73 /* 8 channels */
74 {
75 GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
76 GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
77 GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
78 GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
79 GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
80 GST_AUDIO_CHANNEL_POSITION_LFE1,
81 GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
82 GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
83 }
84 };
85
86
87 /* if channels are less than or equal to 8, we set a default layout,
88 * otherwise set layout to an array of GST_AUDIO_CHANNEL_POSITION_NONE */
89 void
gst_jack_set_layout(GstAudioRingBuffer * buffer,GstAudioRingBufferSpec * spec)90 gst_jack_set_layout (GstAudioRingBuffer * buffer, GstAudioRingBufferSpec * spec)
91 {
92 gint i;
93
94 if (spec->info.channels <= 8) {
95 for (i = 0; i < spec->info.channels; i++)
96 spec->info.position[i] = default_positions[spec->info.channels - 1][i];
97 gst_audio_channel_positions_to_valid_order (spec->info.position,
98 spec->info.channels);
99 gst_audio_ring_buffer_set_channel_positions (buffer,
100 default_positions[spec->info.channels - 1]);
101 } else {
102 spec->info.flags |= GST_AUDIO_FLAG_UNPOSITIONED;
103 for (i = 0; i < G_N_ELEMENTS (spec->info.position); i++)
104 spec->info.position[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
105 gst_audio_ring_buffer_set_channel_positions (buffer, spec->info.position);
106 }
107
108 gst_caps_unref (spec->caps);
109 spec->caps = gst_audio_info_to_caps (&spec->info);
110 }
111