summaryrefslogtreecommitdiffstats
path: root/src/converter.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/converter.c')
-rw-r--r--src/converter.c58
1 files changed, 29 insertions, 29 deletions
diff --git a/src/converter.c b/src/converter.c
index d895d83..90dba34 100644
--- a/src/converter.c
+++ b/src/converter.c
@@ -21,7 +21,7 @@
#include "malloc.h"
#include "resample.h"
-/* Steps: byteswap -> convert -> volscale -> remap -> resample -> convert -> byteswap -> interleave */
+/* Steps: byteswap -> convert -> volscale -> remap -> resample -> convert -> byteswap -> interleave|serialize */
/* Sample formats we know to process natively */
static int native_pcm_format_process(sa_pcm_format_t f) {
@@ -333,6 +333,8 @@ int sa_converter_init(
if (sa_bbuffer_init(&c->bb_tmp, 1, 1) < 0)
goto fail;
+ if (c
+
return 0;
fail:
@@ -391,8 +393,8 @@ void* sa_converter_get_zero_buffer(sa_converter_t *c, size_t size) {
int sa_converter_go(
sa_converter_t *c,
- const void *const src[], const size_t sstr[], sa_bool_t sinterleave,
- void **dst[], size_t *dstr[], sa_bool_t dinterleave,
+ const void *const src[], const size_t sstr[], sa_interleave_t sinterleave,
+ void **dst[], size_t *dstr[], sa_interleave_t dinterleave,
size_t *size) {
size_t* stride;
@@ -406,8 +408,6 @@ int sa_converter_go(
is_bounce = FALSE;
stride = (size_t*) sstr;
process_data = (void**) src;
- interleave = !!sinterleave;
- dinterleave = !!dinterleave;
if (c->no_volume &&
!c->remap_required &&
@@ -422,12 +422,12 @@ int sa_converter_go(
if (c->pre_byteswap_func) {
size_t k;
- k = dinterleave ? c->from_sample_size*c->from_nchannels : c->from_sample_size;
+ k = dinterleave == SA_INTERLEAVE_YES ? c->from_sample_size*c->from_nchannels : c->from_sample_size;
for (i = 0; i < c->from_nchannels; i++) {
void *b;
- if (!(b = sa_bbuffer_get(&c->bb_pre_byteswap, i, *size, dinterleave)))
+ if (!(b = sa_bbuffer_get(&c->bb_pre_byteswap, i, *size, dinterleave == SA_INTERLEAVE_YES)))
return SA_ERROR_OOM;
c->pre_byteswap_func(b, k, process_data[i], stride[i], *size);
@@ -455,12 +455,12 @@ int sa_converter_go(
size_t k, new_size;
new_size = *size / c->from_sample_size * c->work_sample_size;
- k = dinterleave ? c->work_sample_size*c->from_nchannels : c->work_sample_size;
+ k = dinterleave == SA_INTERLEAVE_YES ? c->work_sample_size*c->from_nchannels : c->work_sample_size;
for (i = 0; i < c->from_nchannels; i++) {
void *b;
- if (!(b = sa_bbuffer_get(&c->bb_pre_format, i, new_size, dinterleave)))
+ if (!(b = sa_bbuffer_get(&c->bb_pre_format, i, new_size, dinterleave == SA_INTERLEAVE_YES)))
return SA_ERROR_OOM;
c->pre_format_func(&c->bb_tmp, b, k, process_data[i], stride[i], *size);
@@ -491,12 +491,12 @@ int sa_converter_go(
} else {
size_t k;
- k = dinterleave ? c->work_sample_size*c->from_nchannels : c->work_sample_size;
+ k = dinterleave == SA_INTERLEAVE_YES ? c->work_sample_size*c->from_nchannels : c->work_sample_size;
for (i = 0; i < c->from_nchannels; i++) {
void *b;
- if (!(b = sa_bbuffer_get(&c->bb_volscale, i, *size, dinterleave)))
+ if (!(b = sa_bbuffer_get(&c->bb_volscale, i, *size, dinterleave == SA_INTERLEAVE_YES)))
return SA_ERROR_OOM;
c->volscale_func(b, k, process_data[i], stride[i], c->volume_factor[i], c->volume_divisor[i], *size);
@@ -513,9 +513,9 @@ int sa_converter_go(
if (c->remap_required) {
size_t k;
- int need_proper_interleave = 0;
+ sa_bool_t need_proper_interleave = FALSE;
- k = dinterleave ? c->work_sample_size*c->to_nchannels : c->work_sample_size;
+ k = dinterleave == SA_INTERLEAVE_YES ? c->work_sample_size*c->to_nchannels : c->work_sample_size;
for (i = 0; i < c->to_nchannels; i++) {
void *b;
@@ -530,20 +530,20 @@ int sa_converter_go(
c->to_process_data[i] = b;
c->to_stride[i] = c->work_sample_size;
- need_proper_interleave = 1;
+ need_proper_interleave = TRUE;
} else if (p[1] == -1) {
/* Just one channel, nothing to mix */
c->to_process_data[i] = process_data[p[0]];
c->to_stride[i] = stride[p[0]];
- need_proper_interleave = 1;
+ need_proper_interleave = TRUE;
} else {
int j;
/* We have to mix two or more channels */
- if (!(b = sa_bbuffer_get(&c->bb_remap, i, *size, dinterleave)))
+ if (!(b = sa_bbuffer_get(&c->bb_remap, i, *size, dinterleave == SA_INTERLEAVE_YES)))
return SA_ERROR_OOM;
c->add_func(b, k, process_data[p[0]], stride[p[0]], process_data[p[1]], stride[p[1]], *size);
@@ -558,7 +558,7 @@ int sa_converter_go(
process_data = c->to_process_data;
stride = c->to_stride;
- interleave = need_proper_interleave ? -1 : dinterleave;
+ interleave = need_proper_interleave ? SA_INTERLEAVE_ANY : dinterleave;
is_bounce = TRUE;
}
@@ -566,14 +566,14 @@ int sa_converter_go(
size_t k;
size_t new_size;
- k = dinterleave ? c->work_sample_size*c->to_nchannels : c->work_sample_size;
+ k = dinterleave == SA_INTERLEAVE_YES ? c->work_sample_size*c->to_nchannels : c->work_sample_size;
new_size = (size_t) (((((uint64_t) *size+c->work_sample_size-1)/c->work_sample_size)*c->to_rate)/c->from_rate+1)*c->work_sample_size; /* FIXME */
for (i = 0; i < c->to_nchannels; i++) {
void *b;
- if (!(b = sa_bbuffer_get(&c->bb_resample, i, new_size, dinterleave)))
+ if (!(b = sa_bbuffer_get(&c->bb_resample, i, new_size, dinterleave == SA_INTERLEAVE_YES)))
return SA_ERROR_OOM;
c->resample_func(c->speex, i, b, k, process_data[i], stride[i], *size, &new_size);
@@ -601,13 +601,13 @@ int sa_converter_go(
} else {
size_t k, new_size;
- k = dinterleave ? c->to_sample_size*c->to_nchannels : c->to_sample_size;
+ k = dinterleave == SA_INTERLEAVE_YES ? c->to_sample_size*c->to_nchannels : c->to_sample_size;
new_size = *size / c->work_sample_size * c->to_sample_size;
for (i = 0; i < c->to_nchannels; i++) {
void *b;
- if (!(b = sa_bbuffer_get(&c->bb_post_format, i, new_size, dinterleave)))
+ if (!(b = sa_bbuffer_get(&c->bb_post_format, i, new_size, dinterleave == SA_INTERLEAVE_YES)))
return SA_ERROR_OOM;
c->post_format_func(&c->bb_tmp, b, k, process_data[i], stride[i], *size);
@@ -636,12 +636,12 @@ int sa_converter_go(
} else {
size_t k;
- k = dinterleave ? c->to_sample_size*c->to_nchannels : c->to_sample_size;
+ k = dinterleave == SA_INTERLEAVE_YES ? c->to_sample_size*c->to_nchannels : c->to_sample_size;
for (i = 0; i < c->to_nchannels; i++) {
void *b;
- if (!(b = sa_bbuffer_get(&c->bb_post_byteswap, i, *size, dinterleave)))
+ if (!(b = sa_bbuffer_get(&c->bb_post_byteswap, i, *size, dinterleave == SA_INTERLEAVE_YES)))
return SA_ERROR_OOM;
c->post_byteswap_func(b, k, process_data[i], stride[i], *size);
@@ -659,15 +659,15 @@ int sa_converter_go(
do_interleave:
- if (interleave != dinterleave) {
+ if (dinterleave != SA_INTERLEAVE_ANY && interleave != dinterleave) {
size_t k;
- k = dinterleave ? c->to_sample_size*c->to_nchannels : c->to_sample_size;
+ k = dinterleave == SA_INTERLEAVE_YES ? c->to_sample_size*c->to_nchannels : c->to_sample_size;
for (i = 0; i < c->to_nchannels; i++) {
void *b;
- if (!(b = sa_bbuffer_get(&c->bb_interleave, i, *size, dinterleave)))
+ if (!(b = sa_bbuffer_get(&c->bb_interleave, i, *size, dinterleave == SA_INTERLEAVE_ANY)))
return SA_ERROR_OOM;
c->interleave_func(b, k, process_data[i], stride[i], *size);
@@ -723,7 +723,7 @@ void sa_converter_set_volume(sa_converter_t *c, const int32_t vol[]) {
int sa_converter_go_interleaved(
sa_converter_t *c,
const void *const data,
- void **dst[], size_t *dstr[], int dinterleave,
+ void **dst[], size_t *dstr[], sa_bool_t dinterleave,
size_t *size) {
unsigned i;
@@ -731,12 +731,12 @@ int sa_converter_go_interleaved(
unsigned stride = c->from_nchannels * c->from_sample_size;
for (i = 0; i < c->from_nchannels; i++) {
- c->from_process_data[i] = (void*) data;
+ c->from_process_data[i] = (void*) d;
d += c->from_sample_size;
c->from_stride[i] = stride;
}
- return sa_converter_go(c, (const void *const*) c->from_process_data, c->from_stride, 1, dst, dstr, dinterleave, size);
+ return sa_converter_go(c, (const void *const*) c->from_process_data, c->from_stride, SA_INTERLEAVE_YES, dst, dstr, dinterleave, size);
}
void sa_converter_set_ratio(sa_converter_t *c, unsigned rate1, unsigned rate2) {