[pulseaudio-discuss] [PATCH v6 25/25] loopback: Add log_interval parameter

Georg Chini georg at chini.tk
Sun Jun 5 19:05:28 UTC 2016


Add a log_interval parameter to control the amount of logging. Default is
no logging. Like the adjust_time parameter, values below 100 are considered
seconds while larger values are ms. If the log interval is too small, logging
will occur on every iteration.

---
 src/modules/module-loopback.c | 59 +++++++++++++++++++++++++++++++++----------
 1 file changed, 46 insertions(+), 13 deletions(-)

diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c
index f4e2c2f..e67e9a8 100644
--- a/src/modules/module-loopback.c
+++ b/src/modules/module-loopback.c
@@ -49,6 +49,7 @@ PA_MODULE_USAGE(
         "latency_msec=<latency in ms> "
         "adjust_threshold_usec=<threshold for latency adjustment in usec> "
         "low_device_latency=<boolean, use half of the normal device latency> "
+        "log_interval=<how often to log, values < 100 are seconds, else ms> "
         "format=<sample format> "
         "rate=<sample rate> "
         "channels=<number of channels> "
@@ -97,12 +98,14 @@ struct userdata {
     uint32_t iteration_counter;
     uint32_t underrun_counter;
     uint32_t adjust_counter;
+    uint32_t log_counter;
 
     /* Values from command line configuration */
     pa_usec_t latency;
     uint32_t adjust_threshold;
     pa_usec_t adjust_time;
     bool low_device_latency;
+    uint32_t log_interval;
 
     /* Latency boundaries and current values */
     pa_usec_t min_source_latency;
@@ -157,6 +160,7 @@ static const char* const valid_modargs[] = {
     "latency_msec",
     "adjust_threshold_usec",
     "low_device_latency",
+    "log_interval",
     "format",
     "rate",
     "channels",
@@ -373,18 +377,25 @@ static void adjust_rates(struct userdata *u) {
     /* Calculate new rate */
     new_rate = rate_controller(u, base_rate, old_rate, (int)(filtered_latency - final_latency), latency_difference);
 
-    pa_log_debug("Loopback status %s to %s:\n    Source latency: %0.2f ms\n    Buffer: %0.2f ms\n    Sink latency: %0.2f ms\n    End-to-end latency: %0.2f ms\n"
-                 "    Deviation from target latency at optimum rate: %0.2f usec\n    Average prediction error: ± %0.2f usec\n    Optimum rate: %0.2f Hz\n    Deviation from base rate: %i Hz",
-                u->source_output->source->name,
-                u->sink_input->sink->name,
-                (double) u->latency_snapshot.source_latency / PA_USEC_PER_MSEC,
-                (double) current_buffer_latency / PA_USEC_PER_MSEC,
-                (double) u->latency_snapshot.sink_latency / PA_USEC_PER_MSEC,
-                (double) current_latency / PA_USEC_PER_MSEC,
-                (double) latency_at_optimum_rate - final_latency,
-                (double) u->latency_error,
-                u->drift_compensation_rate + base_rate,
-                (int32_t)(new_rate - base_rate));
+    /* Log every log_interval iterations if the log_interval parameter is set */
+    if (u->log_interval != 0) {
+        u->log_counter--;
+        if (u->log_counter == 0) {
+            pa_log_debug("Loopback status %s to %s:\n    Source latency: %0.2f ms\n    Buffer: %0.2f ms\n    Sink latency: %0.2f ms\n    End-to-end latency: %0.2f ms\n"
+                         "    Deviation from target latency at optimum rate: %0.2f usec\n    Average prediction error: ± %0.2f usec\n    Optimum rate: %0.2f Hz\n    Deviation from base rate: %i Hz",
+                        u->source_output->source->name,
+                        u->sink_input->sink->name,
+                        (double) u->latency_snapshot.source_latency / PA_USEC_PER_MSEC,
+                        (double) current_buffer_latency / PA_USEC_PER_MSEC,
+                        (double) u->latency_snapshot.sink_latency / PA_USEC_PER_MSEC,
+                        (double) current_latency / PA_USEC_PER_MSEC,
+                        (double) latency_at_optimum_rate - final_latency,
+                        (double) u->latency_error,
+                        u->drift_compensation_rate + base_rate,
+                        (int32_t)(new_rate - base_rate));
+            u->log_counter = u->log_interval;
+        }
+    }
 
     /* Save current latency difference at new rate for next cycle and reset flags */
     u->last_latency_difference = current_source_sink_latency + current_buffer_latency * old_rate / new_rate - final_latency;
@@ -660,6 +671,7 @@ static void source_output_detach_cb(pa_source_output *o) {
     u->underrun_counter = 0;
     u->extra_latency = 0;
     u->latency_error = 0;
+    u->log_counter = u->log_interval;
 }
 
 /* Called from main thread */
@@ -964,6 +976,7 @@ static void sink_input_detach_cb(pa_sink_input *i) {
     u->underrun_counter = 0;
     u->extra_latency = 0;
     u->latency_error = 0;
+    u->log_counter = u->log_interval;
 }
 
 /* Called from output thread context */
@@ -1128,7 +1141,7 @@ int pa__init(pa_module *m) {
     pa_source *source = NULL;
     pa_source_output_new_data source_output_data;
     bool source_dont_move;
-    uint32_t latency_msec, adjust_threshold;
+    uint32_t latency_msec, adjust_threshold, log_interval;
     pa_sample_spec ss;
     pa_channel_map map;
     bool format_set = false;
@@ -1257,6 +1270,26 @@ int pa__init(pa_module *m) {
     u->real_adjust_time_sum = 0;
     u->adjust_counter = 0;
 
+    /* Get log interval, default is 0, which means no logging */
+    log_interval = 0;
+    if (pa_modargs_get_value_u32(ma, "log_interval", &log_interval) < 0) {
+        pa_log_info("Invalid log interval specification");
+        goto fail;
+    }
+    if (log_interval != 0 && u->adjust_time != 0) {
+        /* Convert to ms */
+        if (log_interval < 100)
+            log_interval = log_interval * PA_MSEC_PER_SEC;
+        /* Esimate number of iterations */
+        log_interval = (int)((double)log_interval * PA_USEC_PER_MSEC / u->adjust_time + 0.5);
+        /* if log interval is too small, log every iteration */
+        if (log_interval == 0)
+            log_interval = 1;
+    }
+    u->log_interval = log_interval;
+    u->log_counter = log_interval;
+
+
     pa_sink_input_new_data_init(&sink_input_data);
     sink_input_data.driver = __FILE__;
     sink_input_data.module = m;
-- 
2.8.1



More information about the pulseaudio-discuss mailing list