summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/modules/raop/module-raop-sink.c8
-rw-r--r--src/modules/raop/raop_client.c26
-rw-r--r--src/modules/raop/raop_client.h1
3 files changed, 30 insertions, 5 deletions
diff --git a/src/modules/raop/module-raop-sink.c b/src/modules/raop/module-raop-sink.c
index a8a466d8..e251f2fc 100644
--- a/src/modules/raop/module-raop-sink.c
+++ b/src/modules/raop/module-raop-sink.c
@@ -332,10 +332,14 @@ static int udp_sink_process_msg(pa_msgobject *o, int code, void *data, int64_t o
pa_smoother_resume(u->smoother, pa_rtclock_now(), true);
- if (!pa_raop_client_udp_can_stream(u->raop)) {
- /* Connecting will trigger a RECORD */
+ if (!pa_raop_client_udp_is_alive(u->raop)) {
+ /* Connecting will trigger a RECORD and start steaming */
pa_raop_client_connect(u->raop);
+ } else if (!pa_raop_client_udp_can_stream(u->raop)) {
+ /* RECORD alredy sent, simply start streaming */
+ pa_raop_client_udp_stream(u->raop);
}
+
udp_start_wakeup_clock(u);
break;
diff --git a/src/modules/raop/raop_client.c b/src/modules/raop/raop_client.c
index d17cc44a..16a59cca 100644
--- a/src/modules/raop/raop_client.c
+++ b/src/modules/raop/raop_client.c
@@ -952,8 +952,6 @@ static void udp_rtsp_cb(pa_rtsp_client *rtsp, pa_rtsp_state state, pa_headerlist
pa_log_debug("RAOP: RECORD");
- c->is_recording = true;
-
alt = pa_xstrdup(pa_headerlist_gets(headers, "Audio-Latency"));
/* Generate a random synchronization source identifier from this session. */
pa_random(&rand, sizeof(rand));
@@ -965,6 +963,8 @@ static void udp_rtsp_cb(pa_rtsp_client *rtsp, pa_rtsp_state state, pa_headerlist
c->udp_first_packet = true;
c->udp_sync_count = 0;
+ c->is_recording = true;
+
c->udp_record_callback(c->udp_setup_userdata);
pa_xfree(alt);
@@ -1168,11 +1168,12 @@ int pa_raop_client_connect(pa_raop_client *c) {
int pa_raop_client_flush(pa_raop_client *c) {
int rv = 0;
+
pa_assert(c);
if (c->rtsp != NULL) {
rv = pa_rtsp_flush(c->rtsp, c->seq, c->rtptime);
- c->udp_sync_count = -1;
+ c->udp_sync_count = 0;
}
return rv;
@@ -1211,6 +1212,25 @@ int pa_raop_client_udp_can_stream(pa_raop_client *c) {
return rv;
}
+int pa_raop_client_udp_stream(pa_raop_client *c) {
+ int rv = 0;
+
+ pa_assert(c);
+
+ if (c->rtsp != NULL && c->udp_stream_fd > 0) {
+ if (!c->is_recording) {
+ c->udp_first_packet = true;
+ c->udp_sync_count = 0;
+
+ c->is_recording = true;
+ }
+
+ rv = 1;
+ }
+
+ return rv;
+}
+
int pa_raop_client_udp_handle_timing_packet(pa_raop_client *c, const uint8_t packet[], ssize_t size) {
const uint32_t * data = NULL;
uint8_t payload = 0;
diff --git a/src/modules/raop/raop_client.h b/src/modules/raop/raop_client.h
index 6ab6d325..d49c1462 100644
--- a/src/modules/raop/raop_client.h
+++ b/src/modules/raop/raop_client.h
@@ -43,6 +43,7 @@ int pa_raop_client_teardown(pa_raop_client *c);
int pa_raop_client_udp_is_alive(pa_raop_client *c);
int pa_raop_client_udp_can_stream(pa_raop_client *c);
+int pa_raop_client_udp_stream(pa_raop_client *c);
void pa_raop_client_set_encryption(pa_raop_client *c, int encryption);
pa_volume_t pa_raop_client_adjust_volume(pa_raop_client *c, pa_volume_t volume);