[PATCH 09/10] raop-sink: Allow module-raop-sink to use alternative smoother code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is untested.
---
 src/modules/raop/raop-sink.c | 40 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 39 insertions(+), 1 deletion(-)

diff --git a/src/modules/raop/raop-sink.c b/src/modules/raop/raop-sink.c
index ec6f8262..5103e8e7 100644
--- a/src/modules/raop/raop-sink.c
+++ b/src/modules/raop/raop-sink.c
@@ -59,7 +59,12 @@
 #include <pulsecore/thread-mq.h>
 #include <pulsecore/poll.h>
 #include <pulsecore/rtpoll.h>
+
+#ifdef USE_SMOOTHER_2
+#include <pulsecore/time-smoother_2.h>
+#else
 #include <pulsecore/time-smoother.h>
+#endif
 
 #include "raop-sink.h"
 #include "raop-client.h"
@@ -87,7 +92,11 @@ struct userdata {
 
     pa_usec_t delay;
     pa_usec_t start;
+#ifdef USE_SMOOTHER_2
+    pa_smoother_2 *smoother;
+#else
     pa_smoother *smoother;
+#endif
     uint64_t write_count;
 
     uint32_t latency;
@@ -112,16 +121,22 @@ static void raop_state_cb(pa_raop_state_t state, void *userdata) {
 }
 
 static int64_t sink_get_latency(const struct userdata *u) {
+#ifndef USE_SMOOTHER_2
     pa_usec_t now;
+#endif
     int64_t latency;
 
     pa_assert(u);
     pa_assert(u->smoother);
 
+#ifdef USE_SMOOTHER_2
+    latency = pa_smoother_2_get_delay(u->smoother, pa_rtclock_now(), u->write_count);
+#else
     now = pa_rtclock_now();
     now = pa_smoother_get(u->smoother, now);
 
     latency = pa_bytes_to_usec(u->write_count, &u->sink->sample_spec) - (int64_t) now;
+#endif
 
     /* RAOP default latency */
     latency += u->latency * PA_USEC_PER_MSEC;
@@ -262,7 +277,11 @@ static int sink_set_state_in_io_thread_cb(pa_sink *s, pa_sink_state_t new_state,
             pa_log_debug("RAOP: RUNNING");
 
             now = pa_rtclock_now();
+#ifdef USE_SMOOTHER_2
+            pa_smoother_2_reset(u->smoother, now);
+#else
             pa_smoother_reset(u->smoother, now, false);
+#endif
 
             if (!pa_raop_client_is_alive(u->raop)) {
                 /* Connecting will trigger a RECORD and start steaming */
@@ -347,15 +366,22 @@ static void thread_func(void *userdata) {
     pa_log_debug("Thread starting up");
 
     pa_thread_mq_install(&u->thread_mq);
+#ifdef USE_SMOOTHER_2
+    pa_smoother_2_reset(u->smoother, pa_rtclock_now());
+#else
     pa_smoother_set_time_offset(u->smoother, pa_rtclock_now());
+#endif
 
     for (;;) {
         struct pollfd *pollfd = NULL;
         unsigned int i, nbfds = 0;
-        pa_usec_t now, estimated, intvl;
+        pa_usec_t now, intvl;
         uint64_t position;
         size_t index;
         int ret;
+#ifndef USE_SMOOTHER_2
+        pa_usec_t estimated;
+#endif
 
         if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
             if (u->sink->thread_info.rewind_requested)
@@ -444,8 +470,12 @@ static void thread_func(void *userdata) {
             position = u->write_count - pa_usec_to_bytes(u->delay, &u->sink->sample_spec);
 
             now = pa_rtclock_now();
+#ifdef USE_SMOOTHER_2
+            pa_smoother_2_put(u->smoother, now, position);
+#else
             estimated = pa_bytes_to_usec(position, &u->sink->sample_spec);
             pa_smoother_put(u->smoother, now, estimated);
+#endif
 
             if (u->oob && !pollfd->revents) {
                 /* Sleep until next packet transmission */
@@ -601,6 +631,9 @@ pa_sink* pa_raop_sink_new(pa_module *m, pa_modargs *ma, const char *driver) {
     pa_memchunk_reset(&u->memchunk);
 
     u->delay = 0;
+#ifdef USE_SMOOTHER_2
+    u->smoother = pa_smoother_2_new(5*PA_USEC_PER_SEC, pa_rtclock_now(), pa_frame_size(&ss), ss.rate);
+#else
     u->smoother = pa_smoother_new(
             PA_USEC_PER_SEC,
             PA_USEC_PER_SEC*2,
@@ -609,6 +642,7 @@ pa_sink* pa_raop_sink_new(pa_module *m, pa_modargs *ma, const char *driver) {
             10,
             0,
             false);
+#endif
     u->write_count = 0;
 
     if (pa_streq(protocol, "TCP")) {
@@ -785,7 +819,11 @@ static void userdata_free(struct userdata *u) {
     u->raop = NULL;
 
     if (u->smoother)
+#ifdef USE_SMOOTHER_2
+        pa_smoother_2_free(u->smoother);
+#else
         pa_smoother_free(u->smoother);
+#endif
     u->smoother = NULL;
 
     if (u->card)
-- 
2.14.1



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux