summaryrefslogtreecommitdiffstats
path: root/src/modules/module-loopback.c
diff options
context:
space:
mode:
authorColin Guthrie <cguthrie@mandriva.org>2011-01-31 11:45:50 +0000
committerColin Guthrie <cguthrie@mandriva.org>2011-01-31 11:45:50 +0000
commit8534149fbe87c63a5af85f5610c0f62b45500d90 (patch)
treea3888fd56a11a2ed29657852608c82459cb8e335 /src/modules/module-loopback.c
parent74eb4d892137f6ba4d87b011e46118668187307b (diff)
parent72b90ea8ac53e23862284991a2ce355de250f585 (diff)
Merge remote branch 'mkbosmans/rate-adjustment'
Diffstat (limited to 'src/modules/module-loopback.c')
-rw-r--r--src/modules/module-loopback.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c
index a6553f7d..8cabf71b 100644
--- a/src/modules/module-loopback.c
+++ b/src/modules/module-loopback.c
@@ -108,6 +108,7 @@ struct userdata {
static const char* const valid_modargs[] = {
"source",
"sink",
+ "adjust_time",
"latency_msec",
"format",
"rate",
@@ -178,13 +179,13 @@ static void adjust_rates(struct userdata *u) {
buffer_latency = pa_bytes_to_usec(buffer, &u->sink_input->sample_spec);
- pa_log_info("Loopback overall latency is %0.2f ms + %0.2f ms + %0.2f ms = %0.2f ms",
+ pa_log_debug("Loopback overall latency is %0.2f ms + %0.2f ms + %0.2f ms = %0.2f ms",
(double) u->latency_snapshot.sink_latency / PA_USEC_PER_MSEC,
(double) buffer_latency / PA_USEC_PER_MSEC,
(double) u->latency_snapshot.source_latency / PA_USEC_PER_MSEC,
((double) u->latency_snapshot.sink_latency + buffer_latency + u->latency_snapshot.source_latency) / PA_USEC_PER_MSEC);
- pa_log_info("Should buffer %zu bytes, buffered at minimum %zu bytes",
+ pa_log_debug("Should buffer %zu bytes, buffered at minimum %zu bytes",
u->latency_snapshot.max_request*2,
u->latency_snapshot.min_memblockq_length);
@@ -197,9 +198,21 @@ static void adjust_rates(struct userdata *u) {
else
new_rate = base_rate + (((u->latency_snapshot.min_memblockq_length - u->latency_snapshot.max_request*2) / fs) *PA_USEC_PER_SEC)/u->adjust_time;
- pa_log_info("Old rate %lu Hz, new rate %lu Hz", (unsigned long) old_rate, (unsigned long) new_rate);
+ if (new_rate < (uint32_t) (base_rate*0.8) || new_rate > (uint32_t) (base_rate*1.25)) {
+ pa_log_warn("Sample rates too different, not adjusting (%u vs. %u).", base_rate, new_rate);
+ new_rate = base_rate;
+ } else {
+ if (base_rate < new_rate + 20 && new_rate < base_rate + 20)
+ new_rate = base_rate;
+ /* Do the adjustment in small steps; 2‰ can be considered inaudible */
+ if (new_rate < (uint32_t) (old_rate*0.998) || new_rate > (uint32_t) (old_rate*1.002)) {
+ pa_log_info("New rate of %u Hz not within 2‰ of %u Hz, forcing smaller adjustment", new_rate, old_rate);
+ new_rate = PA_CLAMP(new_rate, (uint32_t) (old_rate*0.998), (uint32_t) (old_rate*1.002));
+ }
+ }
pa_sink_input_set_rate(u->sink_input, new_rate);
+ pa_log_debug("[%s] Updated sampling rate to %lu Hz.", u->sink_input->sink->name, (unsigned long) new_rate);
pa_core_rttime_restart(u->core, u->time_event, pa_rtclock_now() + u->adjust_time);
}