summaryrefslogtreecommitdiffstats
path: root/src/pulsecore/resampler.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pulsecore/resampler.c')
-rw-r--r--src/pulsecore/resampler.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c
index 248d7337..a43c7c7c 100644
--- a/src/pulsecore/resampler.c
+++ b/src/pulsecore/resampler.c
@@ -48,6 +48,7 @@ struct pa_resampler {
void (*impl_free)(pa_resampler *r);
void (*impl_update_input_rate)(pa_resampler *r, uint32_t rate);
+ void (*impl_update_output_rate)(pa_resampler *r, uint32_t rate);
void (*impl_run)(pa_resampler *r, const pa_memchunk *in, pa_memchunk *out);
void *impl_data;
};
@@ -165,6 +166,19 @@ void pa_resampler_set_input_rate(pa_resampler *r, uint32_t rate) {
r->impl_update_input_rate(r, rate);
}
+void pa_resampler_set_output_rate(pa_resampler *r, uint32_t rate) {
+ assert(r);
+ assert(rate > 0);
+
+ if (r->o_ss.rate == rate)
+ return;
+
+ r->o_ss.rate = rate;
+
+ if (r->impl_update_output_rate)
+ r->impl_update_output_rate(r, rate);
+}
+
void pa_resampler_run(pa_resampler *r, const pa_memchunk *in, pa_memchunk *out) {
assert(r && in && out && r->impl_run);
@@ -512,6 +526,25 @@ static void libsamplerate_update_input_rate(pa_resampler *r, uint32_t rate) {
}
}
+
+static void libsamplerate_update_output_rate(pa_resampler *r, uint32_t rate) {
+ struct impl_libsamplerate *u;
+
+ assert(r);
+ assert(rate > 0);
+ assert(r->impl_data);
+ u = r->impl_data;
+
+ if (!u->src_state) {
+ int err;
+ u->src_state = src_new(r->resample_method, r->o_ss.channels, &err);
+ assert(u->src_state);
+ } else {
+ int ret = src_set_ratio(u->src_state, (double) rate / r->i_ss.rate);
+ assert(ret == 0);
+ }
+}
+
static int libsamplerate_init(pa_resampler *r) {
struct impl_libsamplerate *u = NULL;
int err;
@@ -541,6 +574,7 @@ static int libsamplerate_init(pa_resampler *r) {
r->impl_free = libsamplerate_free;
r->impl_update_input_rate = libsamplerate_update_input_rate;
+ r->impl_update_output_rate = libsamplerate_update_output_rate;
r->impl_run = libsamplerate_run;
calc_map_table(r);
@@ -631,7 +665,7 @@ static void trivial_free(pa_resampler *r) {
pa_xfree(r->impl_data);
}
-static void trivial_update_input_rate(pa_resampler *r, uint32_t rate) {
+static void trivial_update_rate(pa_resampler *r, uint32_t rate) {
struct impl_trivial *u;
assert(r);
@@ -655,7 +689,8 @@ static int trivial_init(pa_resampler*r) {
r->impl_run = trivial_run;
r->impl_free = trivial_free;
- r->impl_update_input_rate = trivial_update_input_rate;
+ r->impl_update_input_rate = trivial_update_rate;
+ r->impl_update_output_rate = trivial_update_rate;
return 0;
}