annotate libaudacious/xconvert.c @ 2087:bc47a2129067 trunk

[svn] - update these files
author nenolod
date Mon, 11 Dec 2006 04:30:50 -0800
parents 53a3d5db6b58
children f18a5b617c34
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2056
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
1 /* Audacious
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
2 * Copyright (C) 2005-2007 Audacious team
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
3 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
4 * XMMS - Cross-platform multimedia player
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
5 * Copyright (C) 1998-2003 Peter Alm, Mikael Alm, Olle Hallnas,
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
6 * Thomas Nilsson and 4Front Technologies
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
7 * Copyright (C) 1999-2003 Haavard Kvaalen
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
8 *
2056
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
9 * This program is free software; you can redistribute it and/or modify
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
10 * it under the terms of the GNU General Public License as published by
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
12 * (at your option) any later version.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
13 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
14 * This program is distributed in the hope that it will be useful,
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
17 * GNU General Public License for more details.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
18 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
19 * You should have received a copy of the GNU General Public License
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
20 * along with this program; if not, write to the Free Software
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
22 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
23
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
24 #include "config.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
25 #include <stdlib.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
26 #include <audacious/plugin.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
27 #include "xconvert.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
28
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
29 #define IS_BIG_ENDIAN (G_BYTE_ORDER==G_BIG_ENDIAN)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
30
2060
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
31 /**
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
32 * buffer:
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
33 *
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
34 * Contains data for conversion.
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
35 *
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
36 * @buffer: A pointer to the memory being used in the conversion process.
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
37 * @size: The size of the memory being referenced.
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
38 **/
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
39 struct buffer {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
40 void *buffer;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
41 int size;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
42 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
43
2060
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
44 /**
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
45 * xmms_convert_buffers:
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
46 *
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
47 * Stores data for conversion.
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
48 *
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
49 * @format_buffer: A buffer for converting formats.
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
50 * @stereo_buffer: A buffer for downmixing or upmixing.
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
51 * @freq_buffer: A buffer used for resampling.
53a3d5db6b58 [svn] - finish documenting the libaudacious API
nenolod
parents: 2056
diff changeset
52 **/
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
53 struct xmms_convert_buffers {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
54 struct buffer format_buffer, stereo_buffer, freq_buffer;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
55 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
56
2056
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
57 /**
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
58 * xmms_convert_buffers_new:
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
59 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
60 * Factory for an #xmms_convert_buffers struct.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
61 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
62 * Return value: An #xmms_convert_buffers struct.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
63 **/
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
64 struct xmms_convert_buffers *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
65 xmms_convert_buffers_new(void)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
66 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
67 return g_malloc0(sizeof(struct xmms_convert_buffers));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
68 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
69
2056
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
70 /**
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
71 * convert_get_buffer:
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
72 * @buffer: A buffer to resize.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
73 * @size: The new size for that buffer.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
74 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
75 * Resizes a conversion buffer.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
76 **/
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
77 static void *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
78 convert_get_buffer(struct buffer *buffer, size_t size)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
79 {
625
0a73d1faeb4e [svn] GCC 4.1 warning fixes by Diego 'Flameeyes' Petteno from Gentoo.
chainsaw
parents: 0
diff changeset
80 if (size > 0 && size <= (size_t)buffer->size)
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
81 return buffer->buffer;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
82
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
83 buffer->size = size;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
84 buffer->buffer = g_realloc(buffer->buffer, size);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
85 return buffer->buffer;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
86 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
87
2056
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
88 /**
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
89 * xmms_convert_buffers_free:
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
90 * @buf: An xmms_convert_buffers structure to free.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
91 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
92 * Frees the actual buffers contained inside the buffer struct.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
93 **/
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
94 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
95 xmms_convert_buffers_free(struct xmms_convert_buffers *buf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
96 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
97 convert_get_buffer(&buf->format_buffer, 0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
98 convert_get_buffer(&buf->stereo_buffer, 0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
99 convert_get_buffer(&buf->freq_buffer, 0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
100 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
101
2056
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
102 /**
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
103 * xmms_convert_buffers_destroy:
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
104 * @buf: An xmms_convert_buffers structure to destroy.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
105 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
106 * Destroys an xmms_convert_buffers structure.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
107 **/
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
108 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
109 xmms_convert_buffers_destroy(struct xmms_convert_buffers *buf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
110 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
111 if (!buf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
112 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
113 xmms_convert_buffers_free(buf);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
114 g_free(buf);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
115 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
116
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
117 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
118 convert_swap_endian(struct xmms_convert_buffers *buf, void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
119 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
120 guint16 *ptr = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
121 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
122 for (i = 0; i < length; i += 2, ptr++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
123 *ptr = GUINT16_SWAP_LE_BE(*ptr);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
124
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
125 return i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
126 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
127
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
128 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
129 convert_swap_sign_and_endian_to_native(struct
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
130 xmms_convert_buffers
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
131 *buf, void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
132 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
133 guint16 *ptr = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
134 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
135 for (i = 0; i < length; i += 2, ptr++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
136 *ptr = GUINT16_SWAP_LE_BE(*ptr) ^ 1 << 15;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
137
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
138 return i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
139 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
140
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
141 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
142 convert_swap_sign_and_endian_to_alien(struct
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
143 xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
144 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
145 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
146 guint16 *ptr = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
147 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
148 for (i = 0; i < length; i += 2, ptr++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
149 *ptr = GUINT16_SWAP_LE_BE(*ptr ^ 1 << 15);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
150
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
151 return i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
152 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
153
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
154 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
155 convert_swap_sign16(struct xmms_convert_buffers *buf, void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
156 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
157 gint16 *ptr = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
158 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
159 for (i = 0; i < length; i += 2, ptr++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
160 *ptr ^= 1 << 15;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
161
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
162 return i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
163 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
164
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
165 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
166 convert_swap_sign8(struct xmms_convert_buffers *buf, void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
167 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
168 gint8 *ptr = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
169 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
170 for (i = 0; i < length; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
171 *ptr++ ^= 1 << 7;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
172
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
173 return i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
174 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
175
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
176 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
177 convert_to_8_native_endian(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
178 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
179 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
180 gint8 *output = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
181 gint16 *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
182 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
183 for (i = 0; i < length / 2; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
184 *output++ = *input++ >> 8;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
185
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
186 return i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
187 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
188
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
189 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
190 convert_to_8_native_endian_swap_sign(struct xmms_convert_buffers
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
191 *buf, void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
192 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
193 gint8 *output = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
194 gint16 *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
195 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
196 for (i = 0; i < length / 2; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
197 *output++ = (*input++ >> 8) ^ (1 << 7);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
198
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
199 return i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
200 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
201
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
202
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
203 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
204 convert_to_8_alien_endian(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
205 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
206 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
207 gint8 *output = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
208 gint16 *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
209 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
210 for (i = 0; i < length / 2; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
211 *output++ = *input++ & 0xff;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
212
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
213 return i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
214 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
215
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
216 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
217 convert_to_8_alien_endian_swap_sign(struct xmms_convert_buffers
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
218 *buf, void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
219 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
220 gint8 *output = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
221 gint16 *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
222 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
223 for (i = 0; i < length / 2; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
224 *output++ = (*input++ & 0xff) ^ (1 << 7);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
225
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
226 return i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
227 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
228
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
229 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
230 convert_to_16_native_endian(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
231 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
232 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
233 guint8 *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
234 guint16 *output;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
235 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
236 *data = convert_get_buffer(&buf->format_buffer, length * 2);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
237 output = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
238 for (i = 0; i < length; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
239 *output++ = *input++ << 8;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
240
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
241 return i * 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
242 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
243
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
244 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
245 convert_to_16_native_endian_swap_sign(struct
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
246 xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
247 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
248 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
249 guint8 *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
250 guint16 *output;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
251 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
252 *data = convert_get_buffer(&buf->format_buffer, length * 2);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
253 output = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
254 for (i = 0; i < length; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
255 *output++ = (*input++ << 8) ^ (1 << 15);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
256
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
257 return i * 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
258 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
259
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
260
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
261 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
262 convert_to_16_alien_endian(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
263 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
264 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
265 guint8 *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
266 guint16 *output;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
267 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
268 *data = convert_get_buffer(&buf->format_buffer, length * 2);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
269 output = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
270 for (i = 0; i < length; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
271 *output++ = *input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
272
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
273 return i * 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
274 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
275
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
276 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
277 convert_to_16_alien_endian_swap_sign(struct xmms_convert_buffers
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
278 *buf, void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
279 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
280 guint8 *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
281 guint16 *output;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
282 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
283 *data = convert_get_buffer(&buf->format_buffer, length * 2);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
284 output = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
285 for (i = 0; i < length; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
286 *output++ = *input++ ^ (1 << 7);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
287
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
288 return i * 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
289 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
290
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
291 static AFormat
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
292 unnativize(AFormat fmt)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
293 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
294 if (fmt == FMT_S16_NE) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
295 if (IS_BIG_ENDIAN)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
296 return FMT_S16_BE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
297 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
298 return FMT_S16_LE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
299 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
300 if (fmt == FMT_U16_NE) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
301 if (IS_BIG_ENDIAN)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
302 return FMT_U16_BE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
303 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
304 return FMT_U16_LE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
305 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
306 return fmt;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
307 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
308
2056
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
309 /**
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
310 * xmms_convert_get_func:
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
311 * @output: A format to output data as.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
312 * @input: The format of the inbound data.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
313 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
314 * Looks up the proper conversion method to use.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
315 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
316 * Return value: A function pointer to the desired conversion function.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
317 **/
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
318 convert_func_t
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
319 xmms_convert_get_func(AFormat output, AFormat input)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
320 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
321 output = unnativize(output);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
322 input = unnativize(input);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
323
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
324 if (output == input)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
325 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
326
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
327 if ((output == FMT_U16_BE && input == FMT_U16_LE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
328 (output == FMT_U16_LE && input == FMT_U16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
329 (output == FMT_S16_BE && input == FMT_S16_LE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
330 (output == FMT_S16_LE && input == FMT_S16_BE))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
331 return convert_swap_endian;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
332
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
333 if ((output == FMT_U16_BE && input == FMT_S16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
334 (output == FMT_U16_LE && input == FMT_S16_LE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
335 (output == FMT_S16_BE && input == FMT_U16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
336 (output == FMT_S16_LE && input == FMT_U16_LE))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
337 return convert_swap_sign16;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
338
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
339 if ((IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
340 ((output == FMT_U16_BE && input == FMT_S16_LE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
341 (output == FMT_S16_BE && input == FMT_U16_LE))) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
342 (!IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
343 ((output == FMT_U16_LE && input == FMT_S16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
344 (output == FMT_S16_LE && input == FMT_U16_BE))))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
345 return convert_swap_sign_and_endian_to_native;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
346
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
347 if ((!IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
348 ((output == FMT_U16_BE && input == FMT_S16_LE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
349 (output == FMT_S16_BE && input == FMT_U16_LE))) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
350 (IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
351 ((output == FMT_U16_LE && input == FMT_S16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
352 (output == FMT_S16_LE && input == FMT_U16_BE))))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
353 return convert_swap_sign_and_endian_to_alien;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
354
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
355 if ((IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
356 ((output == FMT_U8 && input == FMT_U16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
357 (output == FMT_S8 && input == FMT_S16_BE))) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
358 (!IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
359 ((output == FMT_U8 && input == FMT_U16_LE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
360 (output == FMT_S8 && input == FMT_S16_LE))))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
361 return convert_to_8_native_endian;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
362
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
363 if ((IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
364 ((output == FMT_U8 && input == FMT_S16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
365 (output == FMT_S8 && input == FMT_U16_BE))) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
366 (!IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
367 ((output == FMT_U8 && input == FMT_S16_LE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
368 (output == FMT_S8 && input == FMT_U16_LE))))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
369 return convert_to_8_native_endian_swap_sign;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
370
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
371 if ((!IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
372 ((output == FMT_U8 && input == FMT_U16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
373 (output == FMT_S8 && input == FMT_S16_BE))) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
374 (IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
375 ((output == FMT_U8 && input == FMT_U16_LE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
376 (output == FMT_S8 && input == FMT_S16_LE))))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
377 return convert_to_8_alien_endian;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
378
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
379 if ((!IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
380 ((output == FMT_U8 && input == FMT_S16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
381 (output == FMT_S8 && input == FMT_U16_BE))) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
382 (IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
383 ((output == FMT_U8 && input == FMT_S16_LE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
384 (output == FMT_S8 && input == FMT_U16_LE))))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
385 return convert_to_8_alien_endian_swap_sign;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
386
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
387 if ((output == FMT_U8 && input == FMT_S8) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
388 (output == FMT_S8 && input == FMT_U8))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
389 return convert_swap_sign8;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
390
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
391 if ((IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
392 ((output == FMT_U16_BE && input == FMT_U8) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
393 (output == FMT_S16_BE && input == FMT_S8))) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
394 (!IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
395 ((output == FMT_U16_LE && input == FMT_U8) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
396 (output == FMT_S16_LE && input == FMT_S8))))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
397 return convert_to_16_native_endian;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
398
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
399 if ((IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
400 ((output == FMT_U16_BE && input == FMT_S8) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
401 (output == FMT_S16_BE && input == FMT_U8))) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
402 (!IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
403 ((output == FMT_U16_LE && input == FMT_S8) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
404 (output == FMT_S16_LE && input == FMT_U8))))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
405 return convert_to_16_native_endian_swap_sign;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
406
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
407 if ((!IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
408 ((output == FMT_U16_BE && input == FMT_U8) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
409 (output == FMT_S16_BE && input == FMT_S8))) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
410 (IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
411 ((output == FMT_U16_LE && input == FMT_U8) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
412 (output == FMT_S16_LE && input == FMT_S8))))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
413 return convert_to_16_alien_endian;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
414
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
415 if ((!IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
416 ((output == FMT_U16_BE && input == FMT_S8) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
417 (output == FMT_S16_BE && input == FMT_U8))) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
418 (IS_BIG_ENDIAN &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
419 ((output == FMT_U16_LE && input == FMT_S8) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
420 (output == FMT_S16_LE && input == FMT_U8))))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
421 return convert_to_16_alien_endian_swap_sign;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
422
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
423 g_warning("Translation needed, but not available.\n"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
424 "Input: %d; Output %d.", input, output);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
425 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
426 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
427
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
428 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
429 convert_mono_to_stereo(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
430 void **data, int length, int b16)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
431 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
432 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
433 void *outbuf = convert_get_buffer(&buf->stereo_buffer, length * 2);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
434
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
435 if (b16) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
436 guint16 *output = outbuf, *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
437 for (i = 0; i < length / 2; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
438 *output++ = *input;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
439 *output++ = *input;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
440 input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
441 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
442 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
443 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
444 guint8 *output = outbuf, *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
445 for (i = 0; i < length; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
446 *output++ = *input;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
447 *output++ = *input;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
448 input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
449 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
450 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
451 *data = outbuf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
452
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
453 return length * 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
454 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
455
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
456 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
457 convert_mono_to_stereo_8(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
458 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
459 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
460 return convert_mono_to_stereo(buf, data, length, FALSE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
461 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
462
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
463 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
464 convert_mono_to_stereo_16(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
465 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
466 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
467 return convert_mono_to_stereo(buf, data, length, TRUE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
468 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
469
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
470 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
471 convert_stereo_to_mono_u8(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
472 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
473 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
474 guint8 *output = *data, *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
475 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
476 for (i = 0; i < length / 2; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
477 guint16 tmp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
478 tmp = *input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
479 tmp += *input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
480 *output++ = tmp / 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
481 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
482 return length / 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
483 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
484 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
485 convert_stereo_to_mono_s8(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
486 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
487 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
488 gint8 *output = *data, *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
489 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
490 for (i = 0; i < length / 2; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
491 gint16 tmp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
492 tmp = *input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
493 tmp += *input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
494 *output++ = tmp / 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
495 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
496 return length / 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
497 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
498 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
499 convert_stereo_to_mono_u16le(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
500 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
501 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
502 guint16 *output = *data, *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
503 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
504 for (i = 0; i < length / 4; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
505 guint32 tmp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
506 guint16 stmp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
507 tmp = GUINT16_FROM_LE(*input);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
508 input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
509 tmp += GUINT16_FROM_LE(*input);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
510 input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
511 stmp = tmp / 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
512 *output++ = GUINT16_TO_LE(stmp);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
513 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
514 return length / 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
515 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
516
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
517 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
518 convert_stereo_to_mono_u16be(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
519 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
520 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
521 guint16 *output = *data, *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
522 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
523 for (i = 0; i < length / 4; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
524 guint32 tmp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
525 guint16 stmp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
526 tmp = GUINT16_FROM_BE(*input);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
527 input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
528 tmp += GUINT16_FROM_BE(*input);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
529 input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
530 stmp = tmp / 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
531 *output++ = GUINT16_TO_BE(stmp);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
532 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
533 return length / 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
534 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
535
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
536 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
537 convert_stereo_to_mono_s16le(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
538 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
539 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
540 gint16 *output = *data, *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
541 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
542 for (i = 0; i < length / 4; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
543 gint32 tmp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
544 gint16 stmp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
545 tmp = GINT16_FROM_LE(*input);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
546 input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
547 tmp += GINT16_FROM_LE(*input);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
548 input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
549 stmp = tmp / 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
550 *output++ = GINT16_TO_LE(stmp);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
551 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
552 return length / 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
553 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
554
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
555 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
556 convert_stereo_to_mono_s16be(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
557 void **data, int length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
558 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
559 gint16 *output = *data, *input = *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
560 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
561 for (i = 0; i < length / 4; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
562 gint32 tmp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
563 gint16 stmp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
564 tmp = GINT16_FROM_BE(*input);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
565 input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
566 tmp += GINT16_FROM_BE(*input);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
567 input++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
568 stmp = tmp / 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
569 *output++ = GINT16_TO_BE(stmp);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
570 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
571 return length / 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
572 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
573
2056
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
574 /**
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
575 * xmms_convert_get_channel_func:
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
576 * @fmt: The format of the data.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
577 * @output: The number of channels to output as.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
578 * @input: The number of channels inbound.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
579 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
580 * Looks up the proper conversion method to use.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
581 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
582 * Return value: A function pointer to the desired conversion function.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
583 **/
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
584 convert_channel_func_t
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
585 xmms_convert_get_channel_func(AFormat fmt, int output, int input)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
586 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
587 fmt = unnativize(fmt);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
588
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
589 if (output == input)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
590 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
591
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
592 if (input == 1 && output == 2)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
593 switch (fmt) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
594 case FMT_U8:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
595 case FMT_S8:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
596 return convert_mono_to_stereo_8;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
597 case FMT_U16_LE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
598 case FMT_U16_BE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
599 case FMT_S16_LE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
600 case FMT_S16_BE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
601 return convert_mono_to_stereo_16;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
602 default:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
603 g_warning("Unknown format: %d" "No conversion available.", fmt);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
604 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
605 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
606 if (input == 2 && output == 1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
607 switch (fmt) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
608 case FMT_U8:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
609 return convert_stereo_to_mono_u8;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
610 case FMT_S8:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
611 return convert_stereo_to_mono_s8;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
612 case FMT_U16_LE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
613 return convert_stereo_to_mono_u16le;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
614 case FMT_U16_BE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
615 return convert_stereo_to_mono_u16be;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
616 case FMT_S16_LE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
617 return convert_stereo_to_mono_s16le;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
618 case FMT_S16_BE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
619 return convert_stereo_to_mono_s16be;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
620 default:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
621 g_warning("Unknown format: %d. "
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
622 "No conversion available.", fmt);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
623 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
624
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
625 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
626
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
627 g_warning("Input has %d channels, soundcard uses %d channels\n"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
628 "No conversion is available", input, output);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
629 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
630 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
631
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
632
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
633 #define RESAMPLE_STEREO(sample_type, bswap) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
634 const int shift = sizeof (sample_type); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
635 int i, in_samples, out_samples, x, delta; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
636 sample_type *inptr = *data, *outptr; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
637 guint nlen = (((length >> shift) * ofreq) / ifreq); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
638 void *nbuf; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
639 if (nlen == 0) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
640 return 0; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
641 nlen <<= shift; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
642 if (bswap) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
643 convert_swap_endian(NULL, data, length); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
644 nbuf = convert_get_buffer(&buf->freq_buffer, nlen); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
645 outptr = nbuf; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
646 in_samples = length >> shift; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
647 out_samples = nlen >> shift; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
648 delta = (in_samples << 12) / out_samples; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
649 for (x = 0, i = 0; i < out_samples; i++) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
650 { \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
651 int x1, frac; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
652 x1 = (x >> 12) << 12; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
653 frac = x - x1; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
654 *outptr++ = \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
655 ((inptr[(x1 >> 12) << 1] * \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
656 ((1<<12) - frac) + \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
657 inptr[((x1 >> 12) + 1) << 1] * \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
658 frac) >> 12); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
659 *outptr++ = \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
660 ((inptr[((x1 >> 12) << 1) + 1] * \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
661 ((1<<12) - frac) + \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
662 inptr[(((x1 >> 12) + 1) << 1) + 1] * \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
663 frac) >> 12); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
664 x += delta; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
665 } \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
666 if (bswap) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
667 convert_swap_endian(NULL, &nbuf, nlen); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
668 *data = nbuf; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
669 return nlen; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
670
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
671
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
672 #define RESAMPLE_MONO(sample_type, bswap) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
673 const int shift = sizeof (sample_type) - 1; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
674 int i, x, delta, in_samples, out_samples; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
675 sample_type *inptr = *data, *outptr; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
676 guint nlen = (((length >> shift) * ofreq) / ifreq); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
677 void *nbuf; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
678 if (nlen == 0) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
679 return 0; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
680 nlen <<= shift; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
681 if (bswap) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
682 convert_swap_endian(NULL, data, length); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
683 nbuf = convert_get_buffer(&buf->freq_buffer, nlen); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
684 outptr = nbuf; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
685 in_samples = length >> shift; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
686 out_samples = nlen >> shift; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
687 delta = ((length >> shift) << 12) / out_samples; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
688 for (x = 0, i = 0; i < out_samples; i++) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
689 { \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
690 int x1, frac; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
691 x1 = (x >> 12) << 12; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
692 frac = x - x1; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
693 *outptr++ = \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
694 ((inptr[x1 >> 12] * ((1<<12) - frac) + \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
695 inptr[(x1 >> 12) + 1] * frac) >> 12); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
696 x += delta; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
697 } \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
698 if (bswap) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
699 convert_swap_endian(NULL, &nbuf, nlen); \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
700 *data = nbuf; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
701 return nlen; \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
702
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
703 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
704 convert_resample_stereo_s16ne(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
705 void **data, int length, int ifreq, int ofreq)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
706 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
707 RESAMPLE_STEREO(gint16, FALSE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
708 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
709
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
710 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
711 convert_resample_stereo_s16ae(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
712 void **data, int length, int ifreq, int ofreq)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
713 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
714 RESAMPLE_STEREO(gint16, TRUE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
715 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
716
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
717 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
718 convert_resample_stereo_u16ne(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
719 void **data, int length, int ifreq, int ofreq)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
720 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
721 RESAMPLE_STEREO(guint16, FALSE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
722 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
723
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
724 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
725 convert_resample_stereo_u16ae(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
726 void **data, int length, int ifreq, int ofreq)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
727 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
728 RESAMPLE_STEREO(guint16, TRUE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
729 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
730
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
731 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
732 convert_resample_mono_s16ne(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
733 void **data, int length, int ifreq, int ofreq)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
734 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
735 RESAMPLE_MONO(gint16, FALSE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
736 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
737
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
738 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
739 convert_resample_mono_s16ae(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
740 void **data, int length, int ifreq, int ofreq)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
741 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
742 RESAMPLE_MONO(gint16, TRUE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
743 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
744
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
745 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
746 convert_resample_mono_u16ne(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
747 void **data, int length, int ifreq, int ofreq)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
748 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
749 RESAMPLE_MONO(guint16, FALSE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
750 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
751
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
752 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
753 convert_resample_mono_u16ae(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
754 void **data, int length, int ifreq, int ofreq)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
755 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
756 RESAMPLE_MONO(guint16, TRUE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
757 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
758
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
759 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
760 convert_resample_stereo_u8(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
761 void **data, int length, int ifreq, int ofreq)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
762 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
763 RESAMPLE_STEREO(guint8, FALSE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
764 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
765
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
766 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
767 convert_resample_mono_u8(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
768 void **data, int length, int ifreq, int ofreq)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
769 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
770 RESAMPLE_MONO(guint8, FALSE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
771 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
772
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
773 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
774 convert_resample_stereo_s8(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
775 void **data, int length, int ifreq, int ofreq)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
776 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
777 RESAMPLE_STEREO(gint8, FALSE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
778 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
779
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
780 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
781 convert_resample_mono_s8(struct xmms_convert_buffers *buf,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
782 void **data, int length, int ifreq, int ofreq)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
783 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
784 RESAMPLE_MONO(gint8, FALSE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
785 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
786
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
787
2056
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
788 /**
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
789 * xmms_convert_get_frequency_func:
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
790 * @fmt: The format of the data.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
791 * @channels: The number of channels inbound.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
792 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
793 * Looks up the proper conversion method to use.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
794 *
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
795 * Return value: A function pointer to the desired conversion function.
6f1346ce2764 [svn] - document xconvert
nenolod
parents: 625
diff changeset
796 **/
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
797 convert_freq_func_t
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
798 xmms_convert_get_frequency_func(AFormat fmt, int channels)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
799 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
800 fmt = unnativize(fmt);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
801 g_message("fmt %d, channels: %d", fmt, channels);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
802
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
803 if (channels < 1 || channels > 2) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
804 g_warning("Unsupported number of channels: %d. "
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
805 "Resample function not available", channels);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
806 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
807 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
808 if ((IS_BIG_ENDIAN && fmt == FMT_U16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
809 (!IS_BIG_ENDIAN && fmt == FMT_U16_LE)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
810 if (channels == 1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
811 return convert_resample_mono_u16ne;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
812 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
813 return convert_resample_stereo_u16ne;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
814 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
815 if ((IS_BIG_ENDIAN && fmt == FMT_S16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
816 (!IS_BIG_ENDIAN && fmt == FMT_S16_LE)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
817 if (channels == 1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
818 return convert_resample_mono_s16ne;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
819 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
820 return convert_resample_stereo_s16ne;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
821 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
822 if ((!IS_BIG_ENDIAN && fmt == FMT_U16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
823 (IS_BIG_ENDIAN && fmt == FMT_U16_LE)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
824 if (channels == 1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
825 return convert_resample_mono_u16ae;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
826 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
827 return convert_resample_stereo_u16ae;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
828 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
829 if ((!IS_BIG_ENDIAN && fmt == FMT_S16_BE) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
830 (IS_BIG_ENDIAN && fmt == FMT_S16_LE)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
831 if (channels == 1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
832 return convert_resample_mono_s16ae;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
833 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
834 return convert_resample_stereo_s16ae;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
835 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
836 if (fmt == FMT_U8) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
837 if (channels == 1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
838 return convert_resample_mono_u8;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
839 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
840 return convert_resample_stereo_u8;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
841 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
842 if (fmt == FMT_S8) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
843 if (channels == 1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
844 return convert_resample_mono_s8;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
845 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
846 return convert_resample_stereo_s8;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
847 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
848 g_warning("Resample function not available" "Format %d.", fmt);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
849 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
850 }