]> code.delx.au - pulseaudio/blob - src/pulsecore/resampler.c
Add new option to disable remixing from/to LFE and set it to on by default
[pulseaudio] / src / pulsecore / resampler.c
1 /***
2 This file is part of PulseAudio.
3
4 Copyright 2004-2006 Lennart Poettering
5
6 PulseAudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation; either version 2 of the License,
9 or (at your option) any later version.
10
11 PulseAudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with PulseAudio; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19 USA.
20 ***/
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <string.h>
27
28 #if HAVE_LIBSAMPLERATE
29 #include <samplerate.h>
30 #endif
31
32 #include <speex/speex_resampler.h>
33
34 #include <liboil/liboilfuncs.h>
35 #include <liboil/liboil.h>
36
37 #include <pulse/xmalloc.h>
38 #include <pulsecore/sconv.h>
39 #include <pulsecore/log.h>
40 #include <pulsecore/macro.h>
41 #include <pulsecore/strbuf.h>
42
43 #include "ffmpeg/avcodec.h"
44
45 #include "resampler.h"
46
47 /* Number of samples of extra space we allow the resamplers to return */
48 #define EXTRA_FRAMES 128
49
50 struct pa_resampler {
51 pa_resample_method_t method;
52 pa_resample_flags_t flags;
53
54 pa_sample_spec i_ss, o_ss;
55 pa_channel_map i_cm, o_cm;
56 size_t i_fz, o_fz, w_sz;
57 pa_mempool *mempool;
58
59 pa_memchunk buf1, buf2, buf3, buf4;
60 unsigned buf1_samples, buf2_samples, buf3_samples, buf4_samples;
61
62 pa_sample_format_t work_format;
63
64 pa_convert_func_t to_work_format_func;
65 pa_convert_func_t from_work_format_func;
66
67 float map_table[PA_CHANNELS_MAX][PA_CHANNELS_MAX];
68 pa_bool_t map_required;
69
70 void (*impl_free)(pa_resampler *r);
71 void (*impl_update_rates)(pa_resampler *r);
72 void (*impl_resample)(pa_resampler *r, const pa_memchunk *in, unsigned in_samples, pa_memchunk *out, unsigned *out_samples);
73 void (*impl_reset)(pa_resampler *r);
74
75 struct { /* data specific to the trivial resampler */
76 unsigned o_counter;
77 unsigned i_counter;
78 } trivial;
79
80 struct { /* data specific to the peak finder pseudo resampler */
81 unsigned o_counter;
82 unsigned i_counter;
83
84 float max_f[PA_CHANNELS_MAX];
85 int16_t max_i[PA_CHANNELS_MAX];
86
87 } peaks;
88
89 #ifdef HAVE_LIBSAMPLERATE
90 struct { /* data specific to libsamplerate */
91 SRC_STATE *state;
92 } src;
93 #endif
94
95 struct { /* data specific to speex */
96 SpeexResamplerState* state;
97 } speex;
98
99 struct { /* data specific to ffmpeg */
100 struct AVResampleContext *state;
101 pa_memchunk buf[PA_CHANNELS_MAX];
102 } ffmpeg;
103 };
104
105 static int copy_init(pa_resampler *r);
106 static int trivial_init(pa_resampler*r);
107 static int speex_init(pa_resampler*r);
108 static int ffmpeg_init(pa_resampler*r);
109 static int peaks_init(pa_resampler*r);
110 #ifdef HAVE_LIBSAMPLERATE
111 static int libsamplerate_init(pa_resampler*r);
112 #endif
113
114 static void calc_map_table(pa_resampler *r);
115
116 static int (* const init_table[])(pa_resampler*r) = {
117 #ifdef HAVE_LIBSAMPLERATE
118 [PA_RESAMPLER_SRC_SINC_BEST_QUALITY] = libsamplerate_init,
119 [PA_RESAMPLER_SRC_SINC_MEDIUM_QUALITY] = libsamplerate_init,
120 [PA_RESAMPLER_SRC_SINC_FASTEST] = libsamplerate_init,
121 [PA_RESAMPLER_SRC_ZERO_ORDER_HOLD] = libsamplerate_init,
122 [PA_RESAMPLER_SRC_LINEAR] = libsamplerate_init,
123 #else
124 [PA_RESAMPLER_SRC_SINC_BEST_QUALITY] = NULL,
125 [PA_RESAMPLER_SRC_SINC_MEDIUM_QUALITY] = NULL,
126 [PA_RESAMPLER_SRC_SINC_FASTEST] = NULL,
127 [PA_RESAMPLER_SRC_ZERO_ORDER_HOLD] = NULL,
128 [PA_RESAMPLER_SRC_LINEAR] = NULL,
129 #endif
130 [PA_RESAMPLER_TRIVIAL] = trivial_init,
131 [PA_RESAMPLER_SPEEX_FLOAT_BASE+0] = speex_init,
132 [PA_RESAMPLER_SPEEX_FLOAT_BASE+1] = speex_init,
133 [PA_RESAMPLER_SPEEX_FLOAT_BASE+2] = speex_init,
134 [PA_RESAMPLER_SPEEX_FLOAT_BASE+3] = speex_init,
135 [PA_RESAMPLER_SPEEX_FLOAT_BASE+4] = speex_init,
136 [PA_RESAMPLER_SPEEX_FLOAT_BASE+5] = speex_init,
137 [PA_RESAMPLER_SPEEX_FLOAT_BASE+6] = speex_init,
138 [PA_RESAMPLER_SPEEX_FLOAT_BASE+7] = speex_init,
139 [PA_RESAMPLER_SPEEX_FLOAT_BASE+8] = speex_init,
140 [PA_RESAMPLER_SPEEX_FLOAT_BASE+9] = speex_init,
141 [PA_RESAMPLER_SPEEX_FLOAT_BASE+10] = speex_init,
142 [PA_RESAMPLER_SPEEX_FIXED_BASE+0] = speex_init,
143 [PA_RESAMPLER_SPEEX_FIXED_BASE+1] = speex_init,
144 [PA_RESAMPLER_SPEEX_FIXED_BASE+2] = speex_init,
145 [PA_RESAMPLER_SPEEX_FIXED_BASE+3] = speex_init,
146 [PA_RESAMPLER_SPEEX_FIXED_BASE+4] = speex_init,
147 [PA_RESAMPLER_SPEEX_FIXED_BASE+5] = speex_init,
148 [PA_RESAMPLER_SPEEX_FIXED_BASE+6] = speex_init,
149 [PA_RESAMPLER_SPEEX_FIXED_BASE+7] = speex_init,
150 [PA_RESAMPLER_SPEEX_FIXED_BASE+8] = speex_init,
151 [PA_RESAMPLER_SPEEX_FIXED_BASE+9] = speex_init,
152 [PA_RESAMPLER_SPEEX_FIXED_BASE+10] = speex_init,
153 [PA_RESAMPLER_FFMPEG] = ffmpeg_init,
154 [PA_RESAMPLER_AUTO] = NULL,
155 [PA_RESAMPLER_COPY] = copy_init,
156 [PA_RESAMPLER_PEAKS] = peaks_init,
157 };
158
159 static inline size_t sample_size(pa_sample_format_t f) {
160 pa_sample_spec ss = {
161 .format = f,
162 .rate = 0,
163 .channels = 1
164 };
165
166 return pa_sample_size(&ss);
167 }
168
169 pa_resampler* pa_resampler_new(
170 pa_mempool *pool,
171 const pa_sample_spec *a,
172 const pa_channel_map *am,
173 const pa_sample_spec *b,
174 const pa_channel_map *bm,
175 pa_resample_method_t method,
176 pa_resample_flags_t flags) {
177
178 pa_resampler *r = NULL;
179
180 pa_assert(pool);
181 pa_assert(a);
182 pa_assert(b);
183 pa_assert(pa_sample_spec_valid(a));
184 pa_assert(pa_sample_spec_valid(b));
185 pa_assert(method >= 0);
186 pa_assert(method < PA_RESAMPLER_MAX);
187
188 /* Fix method */
189
190 if (!(flags & PA_RESAMPLER_VARIABLE_RATE) && a->rate == b->rate) {
191 pa_log_info("Forcing resampler 'copy', because of fixed, identical sample rates.");
192 method = PA_RESAMPLER_COPY;
193 }
194
195 if (!pa_resample_method_supported(method)) {
196 pa_log_warn("Support for resampler '%s' not compiled in, reverting to 'auto'.", pa_resample_method_to_string(method));
197 method = PA_RESAMPLER_AUTO;
198 }
199
200 if (method == PA_RESAMPLER_FFMPEG && (flags & PA_RESAMPLER_VARIABLE_RATE)) {
201 pa_log_info("Resampler 'ffmpeg' cannot do variable rate, reverting to resampler 'auto'.");
202 method = PA_RESAMPLER_AUTO;
203 }
204
205 if (method == PA_RESAMPLER_COPY && ((flags & PA_RESAMPLER_VARIABLE_RATE) || a->rate != b->rate)) {
206 pa_log_info("Resampler 'copy' cannot change sampling rate, reverting to resampler 'auto'.");
207 method = PA_RESAMPLER_AUTO;
208 }
209
210 if (method == PA_RESAMPLER_AUTO)
211 method = PA_RESAMPLER_SPEEX_FLOAT_BASE + 3;
212
213 r = pa_xnew(pa_resampler, 1);
214 r->mempool = pool;
215 r->method = method;
216 r->flags = flags;
217
218 r->impl_free = NULL;
219 r->impl_update_rates = NULL;
220 r->impl_resample = NULL;
221 r->impl_reset = NULL;
222
223 /* Fill sample specs */
224 r->i_ss = *a;
225 r->o_ss = *b;
226
227 if (am)
228 r->i_cm = *am;
229 else if (!pa_channel_map_init_auto(&r->i_cm, r->i_ss.channels, PA_CHANNEL_MAP_DEFAULT))
230 goto fail;
231
232 if (bm)
233 r->o_cm = *bm;
234 else if (!pa_channel_map_init_auto(&r->o_cm, r->o_ss.channels, PA_CHANNEL_MAP_DEFAULT))
235 goto fail;
236
237 r->i_fz = pa_frame_size(a);
238 r->o_fz = pa_frame_size(b);
239
240 pa_memchunk_reset(&r->buf1);
241 pa_memchunk_reset(&r->buf2);
242 pa_memchunk_reset(&r->buf3);
243 pa_memchunk_reset(&r->buf4);
244
245 r->buf1_samples = r->buf2_samples = r->buf3_samples = r->buf4_samples = 0;
246
247 calc_map_table(r);
248
249 pa_log_info("Using resampler '%s'", pa_resample_method_to_string(method));
250
251 if ((method >= PA_RESAMPLER_SPEEX_FIXED_BASE && method <= PA_RESAMPLER_SPEEX_FIXED_MAX) ||
252 (method == PA_RESAMPLER_FFMPEG))
253 r->work_format = PA_SAMPLE_S16NE;
254 else if (method == PA_RESAMPLER_TRIVIAL || method == PA_RESAMPLER_COPY || method == PA_RESAMPLER_PEAKS) {
255
256 if (r->map_required || a->format != b->format || method == PA_RESAMPLER_PEAKS) {
257
258 if (a->format == PA_SAMPLE_S32NE || a->format == PA_SAMPLE_S32RE ||
259 a->format == PA_SAMPLE_FLOAT32NE || a->format == PA_SAMPLE_FLOAT32RE ||
260 b->format == PA_SAMPLE_S32NE || b->format == PA_SAMPLE_S32RE ||
261 b->format == PA_SAMPLE_FLOAT32NE || b->format == PA_SAMPLE_FLOAT32RE)
262 r->work_format = PA_SAMPLE_FLOAT32NE;
263 else
264 r->work_format = PA_SAMPLE_S16NE;
265
266 } else
267 r->work_format = a->format;
268
269 } else
270 r->work_format = PA_SAMPLE_FLOAT32NE;
271
272 pa_log_info("Using %s as working format.", pa_sample_format_to_string(r->work_format));
273
274 r->w_sz = sample_size(r->work_format);
275
276 if (r->i_ss.format == r->work_format)
277 r->to_work_format_func = NULL;
278 else if (r->work_format == PA_SAMPLE_FLOAT32NE) {
279 if (!(r->to_work_format_func = pa_get_convert_to_float32ne_function(r->i_ss.format)))
280 goto fail;
281 } else {
282 pa_assert(r->work_format == PA_SAMPLE_S16NE);
283 if (!(r->to_work_format_func = pa_get_convert_to_s16ne_function(r->i_ss.format)))
284 goto fail;
285 }
286
287 if (r->o_ss.format == r->work_format)
288 r->from_work_format_func = NULL;
289 else if (r->work_format == PA_SAMPLE_FLOAT32NE) {
290 if (!(r->from_work_format_func = pa_get_convert_from_float32ne_function(r->o_ss.format)))
291 goto fail;
292 } else {
293 pa_assert(r->work_format == PA_SAMPLE_S16NE);
294 if (!(r->from_work_format_func = pa_get_convert_from_s16ne_function(r->o_ss.format)))
295 goto fail;
296 }
297
298 /* initialize implementation */
299 if (init_table[method](r) < 0)
300 goto fail;
301
302 return r;
303
304 fail:
305 if (r)
306 pa_xfree(r);
307
308 return NULL;
309 }
310
311 void pa_resampler_free(pa_resampler *r) {
312 pa_assert(r);
313
314 if (r->impl_free)
315 r->impl_free(r);
316
317 if (r->buf1.memblock)
318 pa_memblock_unref(r->buf1.memblock);
319 if (r->buf2.memblock)
320 pa_memblock_unref(r->buf2.memblock);
321 if (r->buf3.memblock)
322 pa_memblock_unref(r->buf3.memblock);
323 if (r->buf4.memblock)
324 pa_memblock_unref(r->buf4.memblock);
325
326 pa_xfree(r);
327 }
328
329 void pa_resampler_set_input_rate(pa_resampler *r, uint32_t rate) {
330 pa_assert(r);
331 pa_assert(rate > 0);
332
333 if (r->i_ss.rate == rate)
334 return;
335
336 r->i_ss.rate = rate;
337
338 r->impl_update_rates(r);
339 }
340
341 void pa_resampler_set_output_rate(pa_resampler *r, uint32_t rate) {
342 pa_assert(r);
343 pa_assert(rate > 0);
344
345 if (r->o_ss.rate == rate)
346 return;
347
348 r->o_ss.rate = rate;
349
350 r->impl_update_rates(r);
351 }
352
353 size_t pa_resampler_request(pa_resampler *r, size_t out_length) {
354 pa_assert(r);
355
356 return (((out_length / r->o_fz)*r->i_ss.rate)/r->o_ss.rate) * r->i_fz;
357 }
358
359 size_t pa_resampler_result(pa_resampler *r, size_t in_length) {
360 pa_assert(r);
361
362 return (((in_length / r->i_fz)*r->o_ss.rate)/r->i_ss.rate) * r->o_fz;
363 }
364
365 size_t pa_resampler_max_block_size(pa_resampler *r) {
366 size_t block_size_max;
367 pa_sample_spec ss;
368 size_t fs;
369
370 pa_assert(r);
371
372 block_size_max = pa_mempool_block_size_max(r->mempool);
373
374 /* We deduce the "largest" sample spec we're using during the
375 * conversion */
376 ss.channels = (uint8_t) (PA_MAX(r->i_ss.channels, r->o_ss.channels));
377
378 /* We silently assume that the format enum is ordered by size */
379 ss.format = PA_MAX(r->i_ss.format, r->o_ss.format);
380 ss.format = PA_MAX(ss.format, r->work_format);
381
382 ss.rate = PA_MAX(r->i_ss.rate, r->o_ss.rate);
383
384 fs = pa_frame_size(&ss);
385
386 return (((block_size_max/fs - EXTRA_FRAMES)*r->i_ss.rate)/ss.rate)*r->i_fz;
387 }
388
389 void pa_resampler_reset(pa_resampler *r) {
390 pa_assert(r);
391
392 if (r->impl_reset)
393 r->impl_reset(r);
394 }
395
396 pa_resample_method_t pa_resampler_get_method(pa_resampler *r) {
397 pa_assert(r);
398
399 return r->method;
400 }
401
402 static const char * const resample_methods[] = {
403 "src-sinc-best-quality",
404 "src-sinc-medium-quality",
405 "src-sinc-fastest",
406 "src-zero-order-hold",
407 "src-linear",
408 "trivial",
409 "speex-float-0",
410 "speex-float-1",
411 "speex-float-2",
412 "speex-float-3",
413 "speex-float-4",
414 "speex-float-5",
415 "speex-float-6",
416 "speex-float-7",
417 "speex-float-8",
418 "speex-float-9",
419 "speex-float-10",
420 "speex-fixed-0",
421 "speex-fixed-1",
422 "speex-fixed-2",
423 "speex-fixed-3",
424 "speex-fixed-4",
425 "speex-fixed-5",
426 "speex-fixed-6",
427 "speex-fixed-7",
428 "speex-fixed-8",
429 "speex-fixed-9",
430 "speex-fixed-10",
431 "ffmpeg",
432 "auto",
433 "copy",
434 "peaks"
435 };
436
437 const char *pa_resample_method_to_string(pa_resample_method_t m) {
438
439 if (m < 0 || m >= PA_RESAMPLER_MAX)
440 return NULL;
441
442 return resample_methods[m];
443 }
444
445 int pa_resample_method_supported(pa_resample_method_t m) {
446
447 if (m < 0 || m >= PA_RESAMPLER_MAX)
448 return 0;
449
450 #ifndef HAVE_LIBSAMPLERATE
451 if (m <= PA_RESAMPLER_SRC_LINEAR)
452 return 0;
453 #endif
454
455 return 1;
456 }
457
458 pa_resample_method_t pa_parse_resample_method(const char *string) {
459 pa_resample_method_t m;
460
461 pa_assert(string);
462
463 for (m = 0; m < PA_RESAMPLER_MAX; m++)
464 if (!strcmp(string, resample_methods[m]))
465 return m;
466
467 if (!strcmp(string, "speex-fixed"))
468 return PA_RESAMPLER_SPEEX_FIXED_BASE + 3;
469
470 if (!strcmp(string, "speex-float"))
471 return PA_RESAMPLER_SPEEX_FLOAT_BASE + 3;
472
473 return PA_RESAMPLER_INVALID;
474 }
475
476 static pa_bool_t on_left(pa_channel_position_t p) {
477
478 return
479 p == PA_CHANNEL_POSITION_FRONT_LEFT ||
480 p == PA_CHANNEL_POSITION_REAR_LEFT ||
481 p == PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER ||
482 p == PA_CHANNEL_POSITION_SIDE_LEFT ||
483 p == PA_CHANNEL_POSITION_TOP_FRONT_LEFT ||
484 p == PA_CHANNEL_POSITION_TOP_REAR_LEFT;
485 }
486
487 static pa_bool_t on_right(pa_channel_position_t p) {
488
489 return
490 p == PA_CHANNEL_POSITION_FRONT_RIGHT ||
491 p == PA_CHANNEL_POSITION_REAR_RIGHT ||
492 p == PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER ||
493 p == PA_CHANNEL_POSITION_SIDE_RIGHT ||
494 p == PA_CHANNEL_POSITION_TOP_FRONT_RIGHT ||
495 p == PA_CHANNEL_POSITION_TOP_REAR_RIGHT;
496 }
497
498 static pa_bool_t on_center(pa_channel_position_t p) {
499
500 return
501 p == PA_CHANNEL_POSITION_FRONT_CENTER ||
502 p == PA_CHANNEL_POSITION_REAR_CENTER ||
503 p == PA_CHANNEL_POSITION_TOP_CENTER ||
504 p == PA_CHANNEL_POSITION_TOP_FRONT_CENTER ||
505 p == PA_CHANNEL_POSITION_TOP_REAR_CENTER;
506 }
507
508 static pa_bool_t on_lfe(pa_channel_position_t p) {
509 return
510 p == PA_CHANNEL_POSITION_LFE;
511 }
512
513 static void calc_map_table(pa_resampler *r) {
514 unsigned oc, ic;
515 pa_bool_t ic_connected[PA_CHANNELS_MAX];
516 pa_bool_t remix;
517 pa_strbuf *s;
518 char *t;
519
520 pa_assert(r);
521
522 if (!(r->map_required = (r->i_ss.channels != r->o_ss.channels || (!(r->flags & PA_RESAMPLER_NO_REMAP) && !pa_channel_map_equal(&r->i_cm, &r->o_cm)))))
523 return;
524
525 memset(r->map_table, 0, sizeof(r->map_table));
526 memset(ic_connected, 0, sizeof(ic_connected));
527 remix = (r->flags & (PA_RESAMPLER_NO_REMAP|PA_RESAMPLER_NO_REMIX)) == 0;
528
529 for (oc = 0; oc < r->o_ss.channels; oc++) {
530 pa_bool_t oc_connected = FALSE;
531 pa_channel_position_t b = r->o_cm.map[oc];
532
533 for (ic = 0; ic < r->i_ss.channels; ic++) {
534 pa_channel_position_t a = r->i_cm.map[ic];
535
536 if (r->flags & PA_RESAMPLER_NO_REMAP) {
537 /* We shall not do any remapping. Hence, just check by index */
538
539 if (ic == oc)
540 r->map_table[oc][ic] = 1.0;
541
542 continue;
543 }
544
545 if (r->flags & PA_RESAMPLER_NO_REMIX) {
546 /* We shall not do any remixing. Hence, just check by name */
547
548 if (a == b)
549 r->map_table[oc][ic] = 1.0;
550
551 continue;
552 }
553
554 pa_assert(remix);
555
556 /* OK, we shall do the full monty: upmixing and
557 * downmixing. Our algorithm is relatively simple, does
558 * not do spacialization, delay elements or apply lowpass
559 * filters for LFE. Patches are always welcome,
560 * though. Oh, and it doesn't do any matrix
561 * decoding. (Which probably wouldn't make any sense
562 * anyway.)
563 *
564 * This code is not idempotent: downmixing an upmixed
565 * stereo stream is not identical to the original. The
566 * volume will not match, and the two channels will be a
567 * linear combination of both.
568 *
569 * This is losely based on random suggestions found on the
570 * Internet, such as this:
571 * http://www.halfgaar.net/surround-sound-in-linux and the
572 * alsa upmix plugin.
573 *
574 * The algorithm works basically like this:
575 *
576 * 1) Connect all channels with matching names.
577 *
578 * 2) Mono Handling:
579 * S:Mono: Copy into all D:channels
580 * D:Mono: Copy in all S:channels
581 *
582 * 3) Mix D:Left, D:Right:
583 * D:Left: If not connected, avg all S:Left
584 * D:Right: If not connected, avg all S:Right
585 *
586 * 4) Mix D:Center
587 * If not connected, avg all S:Center
588 * If still not connected, avg all S:Left, S:Right
589 *
590 * 5) Mix D:LFE
591 * If not connected, avg all S:*
592 *
593 * 6) Make sure S:Left/S:Right is used: S:Left/S:Right: If
594 * not connected, mix into all D:left and all D:right
595 * channels. Gain is 0.1, the current left and right
596 * should be multiplied by 0.9.
597 *
598 * 7) Make sure S:Center, S:LFE is used:
599 *
600 * S:Center, S:LFE: If not connected, mix into all
601 * D:left, all D:right, all D:center channels, gain is
602 * 0.375. The current (as result of 1..6) factors
603 * should be multiplied by 0.75. (Alt. suggestion: 0.25
604 * vs. 0.5)
605 *
606 * S: and D: shall relate to the source resp. destination channels.
607 *
608 * Rationale: 1, 2 are probably obvious. For 3: this
609 * copies front to rear if needed. For 4: we try to find
610 * some suitable C source for C, if we don't find any, we
611 * avg L and R. For 5: LFE is mixed from all channels. For
612 * 6: the rear channels should not be dropped entirely,
613 * however have only minimal impact. For 7: movies usually
614 * encode speech on the center channel. Thus we have to
615 * make sure this channel is distributed to L and R if not
616 * available in the output. Also, LFE is used to achieve a
617 * greater dynamic range, and thus we should try to do our
618 * best to pass it to L+R.
619 */
620
621 if (a == b || a == PA_CHANNEL_POSITION_MONO || b == PA_CHANNEL_POSITION_MONO) {
622 r->map_table[oc][ic] = 1.0;
623
624 oc_connected = TRUE;
625 ic_connected[ic] = TRUE;
626 }
627 }
628
629 if (!oc_connected && remix) {
630 /* OK, we shall remix */
631
632 if (on_left(b)) {
633 unsigned n = 0;
634
635 /* We are not connected and on the left side, let's
636 * average all left side input channels. */
637
638 for (ic = 0; ic < r->i_ss.channels; ic++)
639 if (on_left(r->i_cm.map[ic]))
640 n++;
641
642 if (n > 0)
643 for (ic = 0; ic < r->i_ss.channels; ic++)
644 if (on_left(r->i_cm.map[ic])) {
645 r->map_table[oc][ic] = 1.0f / (float) n;
646 ic_connected[ic] = TRUE;
647 }
648
649 /* We ignore the case where there is no left input
650 * channel. Something is really wrong in this case
651 * anyway. */
652
653 } else if (on_right(b)) {
654 unsigned n = 0;
655
656 /* We are not connected and on the right side, let's
657 * average all right side input channels. */
658
659 for (ic = 0; ic < r->i_ss.channels; ic++)
660 if (on_right(r->i_cm.map[ic]))
661 n++;
662
663 if (n > 0)
664 for (ic = 0; ic < r->i_ss.channels; ic++)
665 if (on_right(r->i_cm.map[ic])) {
666 r->map_table[oc][ic] = 1.0f / (float) n;
667 ic_connected[ic] = TRUE;
668 }
669
670 /* We ignore the case where there is no right input
671 * channel. Something is really wrong in this case
672 * anyway. */
673
674 } else if (on_center(b)) {
675 unsigned n = 0;
676
677 /* We are not connected and at the center. Let's
678 * average all center input channels. */
679
680 for (ic = 0; ic < r->i_ss.channels; ic++)
681 if (on_center(r->i_cm.map[ic]))
682 n++;
683
684 if (n > 0) {
685 for (ic = 0; ic < r->i_ss.channels; ic++)
686 if (on_center(r->i_cm.map[ic])) {
687 r->map_table[oc][ic] = 1.0f / (float) n;
688 ic_connected[ic] = TRUE;
689 }
690 } else {
691
692 /* Hmm, no center channel around, let's synthesize
693 * it by mixing L and R.*/
694
695 n = 0;
696
697 for (ic = 0; ic < r->i_ss.channels; ic++)
698 if (on_left(r->i_cm.map[ic]) || on_right(r->i_cm.map[ic]))
699 n++;
700
701 if (n > 0)
702 for (ic = 0; ic < r->i_ss.channels; ic++)
703 if (on_left(r->i_cm.map[ic]) || on_right(r->i_cm.map[ic])) {
704 r->map_table[oc][ic] = 1.0f / (float) n;
705 ic_connected[ic] = TRUE;
706 }
707
708 /* We ignore the case where there is not even a
709 * left or right input channel. Something is
710 * really wrong in this case anyway. */
711 }
712
713 } else if (on_lfe(b)) {
714
715 /* We are not connected and an LFE. Let's average all
716 * channels for LFE. */
717
718 for (ic = 0; ic < r->i_ss.channels; ic++) {
719
720 if (!(r->flags & PA_RESAMPLER_NO_LFE))
721 r->map_table[oc][ic] = 1.0f / (float) r->i_ss.channels;
722 else
723 r->map_table[oc][ic] = 0;
724
725 /* Please note that a channel connected to LFE
726 * doesn't really count as connected. */
727 }
728 }
729 }
730 }
731
732 if (remix) {
733 unsigned
734 ic_unconnected_left = 0,
735 ic_unconnected_right = 0,
736 ic_unconnected_center = 0,
737 ic_unconnected_lfe = 0;
738
739 for (ic = 0; ic < r->i_ss.channels; ic++) {
740 pa_channel_position_t a = r->i_cm.map[ic];
741
742 if (ic_connected[ic])
743 continue;
744
745 if (on_left(a))
746 ic_unconnected_left++;
747 else if (on_right(a))
748 ic_unconnected_right++;
749 else if (on_center(a))
750 ic_unconnected_center++;
751 else if (on_lfe(a))
752 ic_unconnected_lfe++;
753 }
754
755 if (ic_unconnected_left > 0) {
756
757 /* OK, so there are unconnected input channels on the
758 * left. Let's multiply all already connected channels on
759 * the left side by .9 and add in our averaged unconnected
760 * channels multplied by .1 */
761
762 for (oc = 0; oc < r->o_ss.channels; oc++) {
763
764 if (!on_left(r->o_cm.map[oc]))
765 continue;
766
767 for (ic = 0; ic < r->i_ss.channels; ic++) {
768
769 if (ic_connected[ic]) {
770 r->map_table[oc][ic] *= .9f;
771 continue;
772 }
773
774 if (on_left(r->i_cm.map[ic]))
775 r->map_table[oc][ic] = .1f / (float) ic_unconnected_left;
776 }
777 }
778 }
779
780 if (ic_unconnected_right > 0) {
781
782 /* OK, so there are unconnected input channels on the
783 * right. Let's multiply all already connected channels on
784 * the right side by .9 and add in our averaged unconnected
785 * channels multplied by .1 */
786
787 for (oc = 0; oc < r->o_ss.channels; oc++) {
788
789 if (!on_right(r->o_cm.map[oc]))
790 continue;
791
792 for (ic = 0; ic < r->i_ss.channels; ic++) {
793
794 if (ic_connected[ic]) {
795 r->map_table[oc][ic] *= .9f;
796 continue;
797 }
798
799 if (on_right(r->i_cm.map[ic]))
800 r->map_table[oc][ic] = .1f / (float) ic_unconnected_right;
801 }
802 }
803 }
804
805 if (ic_unconnected_center > 0) {
806 pa_bool_t mixed_in = FALSE;
807
808 /* OK, so there are unconnected input channels on the
809 * center. Let's multiply all already connected channels on
810 * the center side by .9 and add in our averaged unconnected
811 * channels multplied by .1 */
812
813 for (oc = 0; oc < r->o_ss.channels; oc++) {
814
815 if (!on_center(r->o_cm.map[oc]))
816 continue;
817
818 for (ic = 0; ic < r->i_ss.channels; ic++) {
819
820 if (ic_connected[ic]) {
821 r->map_table[oc][ic] *= .9f;
822 continue;
823 }
824
825 if (on_center(r->i_cm.map[ic])) {
826 r->map_table[oc][ic] = .1f / (float) ic_unconnected_center;
827 mixed_in = TRUE;
828 }
829 }
830 }
831
832 if (!mixed_in) {
833
834 /* Hmm, as it appears there was no center channel we
835 could mix our center channel in. In this case, mix
836 it into left and right. Using .375 and 0.75 as
837 factors. */
838
839 for (oc = 0; oc < r->o_ss.channels; oc++) {
840
841 if (!on_left(r->o_cm.map[oc]) && !on_right(r->o_cm.map[oc]))
842 continue;
843
844 for (ic = 0; ic < r->i_ss.channels; ic++) {
845
846 if (ic_connected[ic]) {
847 r->map_table[oc][ic] *= .75f;
848 continue;
849 }
850
851 if (on_center(r->i_cm.map[ic]))
852 r->map_table[oc][ic] = .375f / (float) ic_unconnected_center;
853 }
854 }
855 }
856 }
857
858 if (ic_unconnected_lfe > 0 && !(r->flags & PA_RESAMPLER_NO_LFE)) {
859
860 /* OK, so there is an unconnected LFE channel. Let's mix
861 * it into all channels, with factor 0.375 */
862
863 for (ic = 0; ic < r->i_ss.channels; ic++) {
864
865 if (!on_lfe(r->i_cm.map[ic]))
866 continue;
867
868 for (oc = 0; oc < r->o_ss.channels; oc++)
869 r->map_table[oc][ic] = 0.375f / (float) ic_unconnected_lfe;
870 }
871 }
872 }
873
874
875 s = pa_strbuf_new();
876
877 pa_strbuf_printf(s, " ");
878 for (ic = 0; ic < r->i_ss.channels; ic++)
879 pa_strbuf_printf(s, " I%02u ", ic);
880 pa_strbuf_puts(s, "\n +");
881
882 for (ic = 0; ic < r->i_ss.channels; ic++)
883 pa_strbuf_printf(s, "------");
884 pa_strbuf_puts(s, "\n");
885
886 for (oc = 0; oc < r->o_ss.channels; oc++) {
887 pa_strbuf_printf(s, "O%02u |", oc);
888
889 for (ic = 0; ic < r->i_ss.channels; ic++)
890 pa_strbuf_printf(s, " %1.3f", r->map_table[oc][ic]);
891
892 pa_strbuf_puts(s, "\n");
893 }
894
895 pa_log_debug("Channel matrix:\n%s", t = pa_strbuf_tostring_free(s));
896 pa_xfree(t);
897 }
898
899 static pa_memchunk* convert_to_work_format(pa_resampler *r, pa_memchunk *input) {
900 unsigned n_samples;
901 void *src, *dst;
902
903 pa_assert(r);
904 pa_assert(input);
905 pa_assert(input->memblock);
906
907 /* Convert the incoming sample into the work sample format and place them in buf1 */
908
909 if (!r->to_work_format_func || !input->length)
910 return input;
911
912 n_samples = (unsigned) ((input->length / r->i_fz) * r->i_ss.channels);
913
914 r->buf1.index = 0;
915 r->buf1.length = r->w_sz * n_samples;
916
917 if (!r->buf1.memblock || r->buf1_samples < n_samples) {
918 if (r->buf1.memblock)
919 pa_memblock_unref(r->buf1.memblock);
920
921 r->buf1_samples = n_samples;
922 r->buf1.memblock = pa_memblock_new(r->mempool, r->buf1.length);
923 }
924
925 src = (uint8_t*) pa_memblock_acquire(input->memblock) + input->index;
926 dst = (uint8_t*) pa_memblock_acquire(r->buf1.memblock);
927
928 r->to_work_format_func(n_samples, src, dst);
929
930 pa_memblock_release(input->memblock);
931 pa_memblock_release(r->buf1.memblock);
932
933 return &r->buf1;
934 }
935
936 static void vectoradd_s16_with_fraction(
937 int16_t *d, int dstr,
938 const int16_t *s1, int sstr1,
939 const int16_t *s2, int sstr2,
940 int n,
941 float s3, float s4) {
942
943 int32_t i3, i4;
944
945 i3 = (int32_t) (s3 * 0x10000);
946 i4 = (int32_t) (s4 * 0x10000);
947
948 for (; n > 0; n--) {
949 int32_t a, b;
950
951 a = *s1;
952 b = *s2;
953
954 a = (a * i3) / 0x10000;
955 b = (b * i4) / 0x10000;
956
957 *d = (int16_t) (a + b);
958
959 s1 = (const int16_t*) ((const uint8_t*) s1 + sstr1);
960 s2 = (const int16_t*) ((const uint8_t*) s2 + sstr2);
961 d = (int16_t*) ((uint8_t*) d + dstr);
962
963 }
964 }
965
966 static pa_memchunk *remap_channels(pa_resampler *r, pa_memchunk *input) {
967 unsigned in_n_samples, out_n_samples, n_frames;
968 int i_skip, o_skip;
969 unsigned oc;
970 void *src, *dst;
971
972 pa_assert(r);
973 pa_assert(input);
974 pa_assert(input->memblock);
975
976 /* Remap channels and place the result int buf2 */
977
978 if (!r->map_required || !input->length)
979 return input;
980
981 in_n_samples = (unsigned) (input->length / r->w_sz);
982 n_frames = in_n_samples / r->i_ss.channels;
983 out_n_samples = n_frames * r->o_ss.channels;
984
985 r->buf2.index = 0;
986 r->buf2.length = r->w_sz * out_n_samples;
987
988 if (!r->buf2.memblock || r->buf2_samples < out_n_samples) {
989 if (r->buf2.memblock)
990 pa_memblock_unref(r->buf2.memblock);
991
992 r->buf2_samples = out_n_samples;
993 r->buf2.memblock = pa_memblock_new(r->mempool, r->buf2.length);
994 }
995
996 src = ((uint8_t*) pa_memblock_acquire(input->memblock) + input->index);
997 dst = pa_memblock_acquire(r->buf2.memblock);
998
999 memset(dst, 0, r->buf2.length);
1000
1001 o_skip = (int) (r->w_sz * r->o_ss.channels);
1002 i_skip = (int) (r->w_sz * r->i_ss.channels);
1003
1004 switch (r->work_format) {
1005 case PA_SAMPLE_FLOAT32NE:
1006
1007 for (oc = 0; oc < r->o_ss.channels; oc++) {
1008 unsigned ic;
1009 static const float one = 1.0;
1010
1011 for (ic = 0; ic < r->i_ss.channels; ic++) {
1012
1013 if (r->map_table[oc][ic] <= 0.0)
1014 continue;
1015
1016 oil_vectoradd_f32(
1017 (float*) dst + oc, o_skip,
1018 (float*) dst + oc, o_skip,
1019 (float*) src + ic, i_skip,
1020 (int) n_frames,
1021 &one, &r->map_table[oc][ic]);
1022 }
1023 }
1024
1025 break;
1026
1027 case PA_SAMPLE_S16NE:
1028
1029 for (oc = 0; oc < r->o_ss.channels; oc++) {
1030 unsigned ic;
1031
1032 for (ic = 0; ic < r->i_ss.channels; ic++) {
1033
1034 if (r->map_table[oc][ic] <= 0.0)
1035 continue;
1036
1037 if (r->map_table[oc][ic] >= 1.0) {
1038 static const int16_t one = 1;
1039
1040 oil_vectoradd_s16(
1041 (int16_t*) dst + oc, o_skip,
1042 (int16_t*) dst + oc, o_skip,
1043 (int16_t*) src + ic, i_skip,
1044 (int) n_frames,
1045 &one, &one);
1046
1047 } else
1048
1049 vectoradd_s16_with_fraction(
1050 (int16_t*) dst + oc, o_skip,
1051 (int16_t*) dst + oc, o_skip,
1052 (int16_t*) src + ic, i_skip,
1053 (int) n_frames,
1054 1.0f, r->map_table[oc][ic]);
1055 }
1056 }
1057
1058 break;
1059
1060 default:
1061 pa_assert_not_reached();
1062 }
1063
1064 pa_memblock_release(input->memblock);
1065 pa_memblock_release(r->buf2.memblock);
1066
1067 r->buf2.length = out_n_samples * r->w_sz;
1068
1069 return &r->buf2;
1070 }
1071
1072 static pa_memchunk *resample(pa_resampler *r, pa_memchunk *input) {
1073 unsigned in_n_frames, in_n_samples;
1074 unsigned out_n_frames, out_n_samples;
1075
1076 pa_assert(r);
1077 pa_assert(input);
1078
1079 /* Resample the data and place the result in buf3 */
1080
1081 if (!r->impl_resample || !input->length)
1082 return input;
1083
1084 in_n_samples = (unsigned) (input->length / r->w_sz);
1085 in_n_frames = (unsigned) (in_n_samples / r->o_ss.channels);
1086
1087 out_n_frames = ((in_n_frames*r->o_ss.rate)/r->i_ss.rate)+EXTRA_FRAMES;
1088 out_n_samples = out_n_frames * r->o_ss.channels;
1089
1090 r->buf3.index = 0;
1091 r->buf3.length = r->w_sz * out_n_samples;
1092
1093 if (!r->buf3.memblock || r->buf3_samples < out_n_samples) {
1094 if (r->buf3.memblock)
1095 pa_memblock_unref(r->buf3.memblock);
1096
1097 r->buf3_samples = out_n_samples;
1098 r->buf3.memblock = pa_memblock_new(r->mempool, r->buf3.length);
1099 }
1100
1101 r->impl_resample(r, input, in_n_frames, &r->buf3, &out_n_frames);
1102 r->buf3.length = out_n_frames * r->w_sz * r->o_ss.channels;
1103
1104 return &r->buf3;
1105 }
1106
1107 static pa_memchunk *convert_from_work_format(pa_resampler *r, pa_memchunk *input) {
1108 unsigned n_samples, n_frames;
1109 void *src, *dst;
1110
1111 pa_assert(r);
1112 pa_assert(input);
1113
1114 /* Convert the data into the correct sample type and place the result in buf4 */
1115
1116 if (!r->from_work_format_func || !input->length)
1117 return input;
1118
1119 n_samples = (unsigned) (input->length / r->w_sz);
1120 n_frames = n_samples / r->o_ss.channels;
1121
1122 r->buf4.index = 0;
1123 r->buf4.length = r->o_fz * n_frames;
1124
1125 if (!r->buf4.memblock || r->buf4_samples < n_samples) {
1126 if (r->buf4.memblock)
1127 pa_memblock_unref(r->buf4.memblock);
1128
1129 r->buf4_samples = n_samples;
1130 r->buf4.memblock = pa_memblock_new(r->mempool, r->buf4.length);
1131 }
1132
1133 src = (uint8_t*) pa_memblock_acquire(input->memblock) + input->index;
1134 dst = pa_memblock_acquire(r->buf4.memblock);
1135 r->from_work_format_func(n_samples, src, dst);
1136 pa_memblock_release(input->memblock);
1137 pa_memblock_release(r->buf4.memblock);
1138
1139 r->buf4.length = r->o_fz * n_frames;
1140
1141 return &r->buf4;
1142 }
1143
1144 void pa_resampler_run(pa_resampler *r, const pa_memchunk *in, pa_memchunk *out) {
1145 pa_memchunk *buf;
1146
1147 pa_assert(r);
1148 pa_assert(in);
1149 pa_assert(out);
1150 pa_assert(in->length);
1151 pa_assert(in->memblock);
1152 pa_assert(in->length % r->i_fz == 0);
1153
1154 buf = (pa_memchunk*) in;
1155 buf = convert_to_work_format(r, buf);
1156 buf = remap_channels(r, buf);
1157 buf = resample(r, buf);
1158
1159 if (buf->length) {
1160 buf = convert_from_work_format(r, buf);
1161 *out = *buf;
1162
1163 if (buf == in)
1164 pa_memblock_ref(buf->memblock);
1165 else
1166 pa_memchunk_reset(buf);
1167 } else
1168 pa_memchunk_reset(out);
1169 }
1170
1171 /*** libsamplerate based implementation ***/
1172
1173 #ifdef HAVE_LIBSAMPLERATE
1174 static void libsamplerate_resample(pa_resampler *r, const pa_memchunk *input, unsigned in_n_frames, pa_memchunk *output, unsigned *out_n_frames) {
1175 SRC_DATA data;
1176
1177 pa_assert(r);
1178 pa_assert(input);
1179 pa_assert(output);
1180 pa_assert(out_n_frames);
1181
1182 memset(&data, 0, sizeof(data));
1183
1184 data.data_in = (float*) ((uint8_t*) pa_memblock_acquire(input->memblock) + input->index);
1185 data.input_frames = (long int) in_n_frames;
1186
1187 data.data_out = (float*) ((uint8_t*) pa_memblock_acquire(output->memblock) + output->index);
1188 data.output_frames = (long int) *out_n_frames;
1189
1190 data.src_ratio = (double) r->o_ss.rate / r->i_ss.rate;
1191 data.end_of_input = 0;
1192
1193 pa_assert_se(src_process(r->src.state, &data) == 0);
1194 pa_assert((unsigned) data.input_frames_used == in_n_frames);
1195
1196 pa_memblock_release(input->memblock);
1197 pa_memblock_release(output->memblock);
1198
1199 *out_n_frames = (unsigned) data.output_frames_gen;
1200 }
1201
1202 static void libsamplerate_update_rates(pa_resampler *r) {
1203 pa_assert(r);
1204
1205 pa_assert_se(src_set_ratio(r->src.state, (double) r->o_ss.rate / r->i_ss.rate) == 0);
1206 }
1207
1208 static void libsamplerate_reset(pa_resampler *r) {
1209 pa_assert(r);
1210
1211 pa_assert_se(src_reset(r->src.state) == 0);
1212 }
1213
1214 static void libsamplerate_free(pa_resampler *r) {
1215 pa_assert(r);
1216
1217 if (r->src.state)
1218 src_delete(r->src.state);
1219 }
1220
1221 static int libsamplerate_init(pa_resampler *r) {
1222 int err;
1223
1224 pa_assert(r);
1225
1226 if (!(r->src.state = src_new(r->method, r->o_ss.channels, &err)))
1227 return -1;
1228
1229 r->impl_free = libsamplerate_free;
1230 r->impl_update_rates = libsamplerate_update_rates;
1231 r->impl_resample = libsamplerate_resample;
1232 r->impl_reset = libsamplerate_reset;
1233
1234 return 0;
1235 }
1236 #endif
1237
1238 /*** speex based implementation ***/
1239
1240 static void speex_resample_float(pa_resampler *r, const pa_memchunk *input, unsigned in_n_frames, pa_memchunk *output, unsigned *out_n_frames) {
1241 float *in, *out;
1242 uint32_t inf = in_n_frames, outf = *out_n_frames;
1243
1244 pa_assert(r);
1245 pa_assert(input);
1246 pa_assert(output);
1247 pa_assert(out_n_frames);
1248
1249 in = (float*) ((uint8_t*) pa_memblock_acquire(input->memblock) + input->index);
1250 out = (float*) ((uint8_t*) pa_memblock_acquire(output->memblock) + output->index);
1251
1252 pa_assert_se(speex_resampler_process_interleaved_float(r->speex.state, in, &inf, out, &outf) == 0);
1253
1254 pa_memblock_release(input->memblock);
1255 pa_memblock_release(output->memblock);
1256
1257 pa_assert(inf == in_n_frames);
1258 *out_n_frames = outf;
1259 }
1260
1261 static void speex_resample_int(pa_resampler *r, const pa_memchunk *input, unsigned in_n_frames, pa_memchunk *output, unsigned *out_n_frames) {
1262 int16_t *in, *out;
1263 uint32_t inf = in_n_frames, outf = *out_n_frames;
1264
1265 pa_assert(r);
1266 pa_assert(input);
1267 pa_assert(output);
1268 pa_assert(out_n_frames);
1269
1270 in = (int16_t*) ((uint8_t*) pa_memblock_acquire(input->memblock) + input->index);
1271 out = (int16_t*) ((uint8_t*) pa_memblock_acquire(output->memblock) + output->index);
1272
1273 pa_assert_se(speex_resampler_process_interleaved_int(r->speex.state, in, &inf, out, &outf) == 0);
1274
1275 pa_memblock_release(input->memblock);
1276 pa_memblock_release(output->memblock);
1277
1278 pa_assert(inf == in_n_frames);
1279 *out_n_frames = outf;
1280 }
1281
1282 static void speex_update_rates(pa_resampler *r) {
1283 pa_assert(r);
1284
1285 pa_assert_se(speex_resampler_set_rate(r->speex.state, r->i_ss.rate, r->o_ss.rate) == 0);
1286 }
1287
1288 static void speex_reset(pa_resampler *r) {
1289 pa_assert(r);
1290
1291 pa_assert_se(speex_resampler_reset_mem(r->speex.state) == 0);
1292 }
1293
1294 static void speex_free(pa_resampler *r) {
1295 pa_assert(r);
1296
1297 if (!r->speex.state)
1298 return;
1299
1300 speex_resampler_destroy(r->speex.state);
1301 }
1302
1303 static int speex_init(pa_resampler *r) {
1304 int q, err;
1305
1306 pa_assert(r);
1307
1308 r->impl_free = speex_free;
1309 r->impl_update_rates = speex_update_rates;
1310 r->impl_reset = speex_reset;
1311
1312 if (r->method >= PA_RESAMPLER_SPEEX_FIXED_BASE && r->method <= PA_RESAMPLER_SPEEX_FIXED_MAX) {
1313
1314 q = r->method - PA_RESAMPLER_SPEEX_FIXED_BASE;
1315 r->impl_resample = speex_resample_int;
1316
1317 } else {
1318 pa_assert(r->method >= PA_RESAMPLER_SPEEX_FLOAT_BASE && r->method <= PA_RESAMPLER_SPEEX_FLOAT_MAX);
1319
1320 q = r->method - PA_RESAMPLER_SPEEX_FLOAT_BASE;
1321 r->impl_resample = speex_resample_float;
1322 }
1323
1324 pa_log_info("Choosing speex quality setting %i.", q);
1325
1326 if (!(r->speex.state = speex_resampler_init(r->o_ss.channels, r->i_ss.rate, r->o_ss.rate, q, &err)))
1327 return -1;
1328
1329 return 0;
1330 }
1331
1332 /* Trivial implementation */
1333
1334 static void trivial_resample(pa_resampler *r, const pa_memchunk *input, unsigned in_n_frames, pa_memchunk *output, unsigned *out_n_frames) {
1335 size_t fz;
1336 unsigned o_index;
1337 void *src, *dst;
1338
1339 pa_assert(r);
1340 pa_assert(input);
1341 pa_assert(output);
1342 pa_assert(out_n_frames);
1343
1344 fz = r->w_sz * r->o_ss.channels;
1345
1346 src = (uint8_t*) pa_memblock_acquire(input->memblock) + input->index;
1347 dst = (uint8_t*) pa_memblock_acquire(output->memblock) + output->index;
1348
1349 for (o_index = 0;; o_index++, r->trivial.o_counter++) {
1350 unsigned j;
1351
1352 j = ((r->trivial.o_counter * r->i_ss.rate) / r->o_ss.rate);
1353 j = j > r->trivial.i_counter ? j - r->trivial.i_counter : 0;
1354
1355 if (j >= in_n_frames)
1356 break;
1357
1358 pa_assert(o_index * fz < pa_memblock_get_length(output->memblock));
1359
1360 oil_memcpy((uint8_t*) dst + fz * o_index,
1361 (uint8_t*) src + fz * j, (int) fz);
1362 }
1363
1364 pa_memblock_release(input->memblock);
1365 pa_memblock_release(output->memblock);
1366
1367 *out_n_frames = o_index;
1368
1369 r->trivial.i_counter += in_n_frames;
1370
1371 /* Normalize counters */
1372 while (r->trivial.i_counter >= r->i_ss.rate) {
1373 pa_assert(r->trivial.o_counter >= r->o_ss.rate);
1374
1375 r->trivial.i_counter -= r->i_ss.rate;
1376 r->trivial.o_counter -= r->o_ss.rate;
1377 }
1378 }
1379
1380 static void trivial_update_rates_or_reset(pa_resampler *r) {
1381 pa_assert(r);
1382
1383 r->trivial.i_counter = 0;
1384 r->trivial.o_counter = 0;
1385 }
1386
1387 static int trivial_init(pa_resampler*r) {
1388 pa_assert(r);
1389
1390 r->trivial.o_counter = r->trivial.i_counter = 0;
1391
1392 r->impl_resample = trivial_resample;
1393 r->impl_update_rates = trivial_update_rates_or_reset;
1394 r->impl_reset = trivial_update_rates_or_reset;
1395
1396 return 0;
1397 }
1398
1399 /* Peak finder implementation */
1400
1401 static void peaks_resample(pa_resampler *r, const pa_memchunk *input, unsigned in_n_frames, pa_memchunk *output, unsigned *out_n_frames) {
1402 size_t fz;
1403 unsigned o_index;
1404 void *src, *dst;
1405 unsigned start = 0;
1406
1407 pa_assert(r);
1408 pa_assert(input);
1409 pa_assert(output);
1410 pa_assert(out_n_frames);
1411
1412 fz = r->w_sz * r->o_ss.channels;
1413
1414 src = (uint8_t*) pa_memblock_acquire(input->memblock) + input->index;
1415 dst = (uint8_t*) pa_memblock_acquire(output->memblock) + output->index;
1416
1417 for (o_index = 0;; o_index++, r->peaks.o_counter++) {
1418 unsigned j;
1419
1420 j = ((r->peaks.o_counter * r->i_ss.rate) / r->o_ss.rate);
1421 j = j > r->peaks.i_counter ? j - r->peaks.i_counter : 0;
1422
1423 if (j >= in_n_frames)
1424 break;
1425
1426 pa_assert(o_index * fz < pa_memblock_get_length(output->memblock));
1427
1428 if (r->work_format == PA_SAMPLE_S16NE) {
1429 unsigned i, c;
1430 int16_t *s = (int16_t*) ((uint8_t*) src + fz * j);
1431 int16_t *d = (int16_t*) ((uint8_t*) dst + fz * o_index);
1432
1433 for (i = start; i <= j; i++)
1434 for (c = 0; c < r->o_ss.channels; c++, s++) {
1435 int16_t n;
1436
1437 n = (int16_t) (*s < 0 ? -*s : *s);
1438
1439 if (n > r->peaks.max_i[c])
1440 r->peaks.max_i[c] = n;
1441 }
1442
1443 for (c = 0; c < r->o_ss.channels; c++, d++) {
1444 *d = r->peaks.max_i[c];
1445 r->peaks.max_i[c] = 0;
1446 }
1447 } else {
1448 unsigned i, c;
1449 float *s = (float*) ((uint8_t*) src + fz * j);
1450 float *d = (float*) ((uint8_t*) dst + fz * o_index);
1451
1452 pa_assert(r->work_format == PA_SAMPLE_FLOAT32NE);
1453
1454 for (i = start; i <= j; i++)
1455 for (c = 0; c < r->o_ss.channels; c++, s++) {
1456 float n = fabsf(*s);
1457
1458 if (n > r->peaks.max_f[c])
1459 r->peaks.max_f[c] = n;
1460 }
1461
1462 for (c = 0; c < r->o_ss.channels; c++, d++) {
1463 *d = r->peaks.max_f[c];
1464 r->peaks.max_f[c] = 0;
1465 }
1466 }
1467
1468 start = j+1;
1469 }
1470
1471 pa_memblock_release(input->memblock);
1472 pa_memblock_release(output->memblock);
1473
1474 *out_n_frames = o_index;
1475
1476 r->peaks.i_counter += in_n_frames;
1477
1478 /* Normalize counters */
1479 while (r->peaks.i_counter >= r->i_ss.rate) {
1480 pa_assert(r->peaks.o_counter >= r->o_ss.rate);
1481
1482 r->peaks.i_counter -= r->i_ss.rate;
1483 r->peaks.o_counter -= r->o_ss.rate;
1484 }
1485 }
1486
1487 static void peaks_update_rates_or_reset(pa_resampler *r) {
1488 pa_assert(r);
1489
1490 r->peaks.i_counter = 0;
1491 r->peaks.o_counter = 0;
1492 }
1493
1494 static int peaks_init(pa_resampler*r) {
1495 pa_assert(r);
1496
1497 r->peaks.o_counter = r->peaks.i_counter = 0;
1498 memset(r->peaks.max_i, 0, sizeof(r->peaks.max_i));
1499 memset(r->peaks.max_f, 0, sizeof(r->peaks.max_f));
1500
1501 r->impl_resample = peaks_resample;
1502 r->impl_update_rates = peaks_update_rates_or_reset;
1503 r->impl_reset = peaks_update_rates_or_reset;
1504
1505 return 0;
1506 }
1507
1508 /*** ffmpeg based implementation ***/
1509
1510 static void ffmpeg_resample(pa_resampler *r, const pa_memchunk *input, unsigned in_n_frames, pa_memchunk *output, unsigned *out_n_frames) {
1511 unsigned used_frames = 0, c;
1512
1513 pa_assert(r);
1514 pa_assert(input);
1515 pa_assert(output);
1516 pa_assert(out_n_frames);
1517
1518 for (c = 0; c < r->o_ss.channels; c++) {
1519 unsigned u;
1520 pa_memblock *b, *w;
1521 int16_t *p, *t, *k, *q, *s;
1522 int consumed_frames;
1523 unsigned in, l;
1524
1525 /* Allocate a new block */
1526 b = pa_memblock_new(r->mempool, r->ffmpeg.buf[c].length + in_n_frames * sizeof(int16_t));
1527 p = pa_memblock_acquire(b);
1528
1529 /* Copy the remaining data into it */
1530 l = (unsigned) r->ffmpeg.buf[c].length;
1531 if (r->ffmpeg.buf[c].memblock) {
1532 t = (int16_t*) ((uint8_t*) pa_memblock_acquire(r->ffmpeg.buf[c].memblock) + r->ffmpeg.buf[c].index);
1533 memcpy(p, t, l);
1534 pa_memblock_release(r->ffmpeg.buf[c].memblock);
1535 pa_memblock_unref(r->ffmpeg.buf[c].memblock);
1536 pa_memchunk_reset(&r->ffmpeg.buf[c]);
1537 }
1538
1539 /* Now append the new data, splitting up channels */
1540 t = ((int16_t*) ((uint8_t*) pa_memblock_acquire(input->memblock) + input->index)) + c;
1541 k = (int16_t*) ((uint8_t*) p + l);
1542 for (u = 0; u < in_n_frames; u++) {
1543 *k = *t;
1544 t += r->o_ss.channels;
1545 k ++;
1546 }
1547 pa_memblock_release(input->memblock);
1548
1549 /* Calculate the resulting number of frames */
1550 in = (unsigned) in_n_frames + l / (unsigned) sizeof(int16_t);
1551
1552 /* Allocate buffer for the result */
1553 w = pa_memblock_new(r->mempool, *out_n_frames * sizeof(int16_t));
1554 q = pa_memblock_acquire(w);
1555
1556 /* Now, resample */
1557 used_frames = (unsigned) av_resample(r->ffmpeg.state,
1558 q, p,
1559 &consumed_frames,
1560 (int) in, (int) *out_n_frames,
1561 c >= (unsigned) (r->o_ss.channels-1));
1562
1563 pa_memblock_release(b);
1564
1565 /* Now store the remaining samples away */
1566 pa_assert(consumed_frames <= (int) in);
1567 if (consumed_frames < (int) in) {
1568 r->ffmpeg.buf[c].memblock = b;
1569 r->ffmpeg.buf[c].index = (size_t) consumed_frames * sizeof(int16_t);
1570 r->ffmpeg.buf[c].length = (size_t) (in - (unsigned) consumed_frames) * sizeof(int16_t);
1571 } else
1572 pa_memblock_unref(b);
1573
1574 /* And place the results in the output buffer */
1575 s = (short*) ((uint8_t*) pa_memblock_acquire(output->memblock) + output->index) + c;
1576 for (u = 0; u < used_frames; u++) {
1577 *s = *q;
1578 q++;
1579 s += r->o_ss.channels;
1580 }
1581 pa_memblock_release(output->memblock);
1582 pa_memblock_release(w);
1583 pa_memblock_unref(w);
1584 }
1585
1586 *out_n_frames = used_frames;
1587 }
1588
1589 static void ffmpeg_free(pa_resampler *r) {
1590 unsigned c;
1591
1592 pa_assert(r);
1593
1594 if (r->ffmpeg.state)
1595 av_resample_close(r->ffmpeg.state);
1596
1597 for (c = 0; c < PA_ELEMENTSOF(r->ffmpeg.buf); c++)
1598 if (r->ffmpeg.buf[c].memblock)
1599 pa_memblock_unref(r->ffmpeg.buf[c].memblock);
1600 }
1601
1602 static int ffmpeg_init(pa_resampler *r) {
1603 unsigned c;
1604
1605 pa_assert(r);
1606
1607 /* We could probably implement different quality levels by
1608 * adjusting the filter parameters here. However, ffmpeg
1609 * internally only uses these hardcoded values, so let's use them
1610 * here for now as well until ffmpeg makes this configurable. */
1611
1612 if (!(r->ffmpeg.state = av_resample_init((int) r->o_ss.rate, (int) r->i_ss.rate, 16, 10, 0, 0.8)))
1613 return -1;
1614
1615 r->impl_free = ffmpeg_free;
1616 r->impl_resample = ffmpeg_resample;
1617
1618 for (c = 0; c < PA_ELEMENTSOF(r->ffmpeg.buf); c++)
1619 pa_memchunk_reset(&r->ffmpeg.buf[c]);
1620
1621 return 0;
1622 }
1623
1624 /*** copy (noop) implementation ***/
1625
1626 static int copy_init(pa_resampler *r) {
1627 pa_assert(r);
1628
1629 pa_assert(r->o_ss.rate == r->i_ss.rate);
1630
1631 return 0;
1632 }