diff options
author | Lennart Poettering <lennart@poettering.net> | 2007-06-13 22:08:14 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2007-06-13 22:08:14 +0000 |
commit | be4a8828360b3607414c3ebfd836494e6490267d (patch) | |
tree | 765c44df62326769c1356483f79f5d300ddab9b3 /src/pulsecore/resampler.c | |
parent | 69115687ad1604ddfa9fa7cd86eb286e6bb5ea9a (diff) |
A lot of more work to get the lock-free stuff in place
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1474 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src/pulsecore/resampler.c')
-rw-r--r-- | src/pulsecore/resampler.c | 39 |
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; } |