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