From 2877834d120c13697c1d051f449e0567df3c6791 Mon Sep 17 00:00:00 2001 From: Rohan Biju Date: Fri, 19 Sep 2025 17:19:20 +0530 Subject: [PATCH 1/4] unsuspend --- src/modules/rdp/module-rdp-sink.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/modules/rdp/module-rdp-sink.c b/src/modules/rdp/module-rdp-sink.c index 0bfd32960c..5bb85da3ef 100644 --- a/src/modules/rdp/module-rdp-sink.c +++ b/src/modules/rdp/module-rdp-sink.c @@ -295,9 +295,18 @@ static char* SinkMsgToString(int code) { return "unknown"; } +static void rdp_sink_unsuspend(struct userdata *u) { + /* Attempt to reopen socket and reset timestamp/latency */ + if (u->fd == -1) { + open_socket(u); + } + u->timestamp = pa_rtclock_now(); + reset_latency(u); + pa_log_debug("RDP Sink unsuspended: socket reopened, timestamp and latency reset"); +} + static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { - struct userdata *u = PA_SINK(o)->userdata; uint32_t latency; @@ -309,17 +318,19 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, *((pa_usec_t*) data) = (pa_usec_t)latency; pa_log_debug("Current Latency: %d us", latency); return 0; - - case PA_SINK_MESSAGE_SET_STATE: - switch (*(int*)(data)) - { - case PA_SINK_IDLE: - case PA_SINK_SUSPENDED: - reset_latency(u); - pa_log_debug("Reset latency"); - break; + + case PA_SINK_MESSAGE_SET_STATE: { + pa_sink_state_t new_state = *(int*)(data); + pa_sink_state_t old_state = PA_SINK(o)->thread_info.state; + if (old_state == PA_SINK_SUSPENDED && (new_state == PA_SINK_IDLE || new_state == PA_SINK_RUNNING)) { + rdp_sink_unsuspend(u); + } + if (new_state == PA_SINK_IDLE || new_state == PA_SINK_SUSPENDED) { + reset_latency(u); + pa_log_debug("Reset latency"); } break; + } } return pa_sink_process_msg(o, code, data, offset, chunk); From 58c5e663d2dafb6b39e3cda2ef1c3f1438f3cb94 Mon Sep 17 00:00:00 2001 From: Rohan B Date: Mon, 13 Oct 2025 20:19:22 +0530 Subject: [PATCH 2/4] Revert "unsuspend" This reverts commit 2877834d120c13697c1d051f449e0567df3c6791. --- src/modules/rdp/module-rdp-sink.c | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/src/modules/rdp/module-rdp-sink.c b/src/modules/rdp/module-rdp-sink.c index 5bb85da3ef..0bfd32960c 100644 --- a/src/modules/rdp/module-rdp-sink.c +++ b/src/modules/rdp/module-rdp-sink.c @@ -295,18 +295,9 @@ static char* SinkMsgToString(int code) { return "unknown"; } -static void rdp_sink_unsuspend(struct userdata *u) { - /* Attempt to reopen socket and reset timestamp/latency */ - if (u->fd == -1) { - open_socket(u); - } - u->timestamp = pa_rtclock_now(); - reset_latency(u); - pa_log_debug("RDP Sink unsuspended: socket reopened, timestamp and latency reset"); -} - static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK(o)->userdata; uint32_t latency; @@ -318,19 +309,17 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, *((pa_usec_t*) data) = (pa_usec_t)latency; pa_log_debug("Current Latency: %d us", latency); return 0; - - case PA_SINK_MESSAGE_SET_STATE: { - pa_sink_state_t new_state = *(int*)(data); - pa_sink_state_t old_state = PA_SINK(o)->thread_info.state; - if (old_state == PA_SINK_SUSPENDED && (new_state == PA_SINK_IDLE || new_state == PA_SINK_RUNNING)) { - rdp_sink_unsuspend(u); - } - if (new_state == PA_SINK_IDLE || new_state == PA_SINK_SUSPENDED) { - reset_latency(u); - pa_log_debug("Reset latency"); + + case PA_SINK_MESSAGE_SET_STATE: + switch (*(int*)(data)) + { + case PA_SINK_IDLE: + case PA_SINK_SUSPENDED: + reset_latency(u); + pa_log_debug("Reset latency"); + break; } break; - } } return pa_sink_process_msg(o, code, data, offset, chunk); From 3417f8b8c44e13f7e64a5cfbf8d729f3ccb21885 Mon Sep 17 00:00:00 2001 From: Rohan B Date: Mon, 13 Oct 2025 20:32:46 +0530 Subject: [PATCH 3/4] Re-implement RDP sink unsuspend --- src/modules/rdp/module-rdp-sink.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/modules/rdp/module-rdp-sink.c b/src/modules/rdp/module-rdp-sink.c index 0bfd32960c..3518521052 100644 --- a/src/modules/rdp/module-rdp-sink.c +++ b/src/modules/rdp/module-rdp-sink.c @@ -313,6 +313,11 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, case PA_SINK_MESSAGE_SET_STATE: switch (*(int*)(data)) { + case PA_SINK_RUNNING: + pa_log_debug("Sink Running"); + if (u->fd == -1) { + open_socket(u); + } case PA_SINK_IDLE: case PA_SINK_SUSPENDED: reset_latency(u); From 31bcfe8c1c833d2c389dedf284a428ffff532373 Mon Sep 17 00:00:00 2001 From: Rohan B Date: Mon, 13 Oct 2025 21:27:22 +0530 Subject: [PATCH 4/4] update timestamp on unsuspend --- src/modules/rdp/module-rdp-sink.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/modules/rdp/module-rdp-sink.c b/src/modules/rdp/module-rdp-sink.c index 3518521052..38ee044a2e 100644 --- a/src/modules/rdp/module-rdp-sink.c +++ b/src/modules/rdp/module-rdp-sink.c @@ -314,10 +314,11 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, switch (*(int*)(data)) { case PA_SINK_RUNNING: - pa_log_debug("Sink Running"); - if (u->fd == -1) { - open_socket(u); - } + pa_log_debug("Sink Running"); + if (u->fd == -1) { + open_socket(u); + } + u->timestamp = pa_rtclock_now(); case PA_SINK_IDLE: case PA_SINK_SUSPENDED: reset_latency(u);