mirror of
https://github.com/morgan9e/UxPlay
synced 2026-04-14 00:04:13 +09:00
detect if client is offline using feedback instead of ntp signal
This commit is contained in:
@@ -64,7 +64,6 @@ struct raop_s {
|
||||
uint8_t clientFPSdata;
|
||||
|
||||
int audio_delay_micros;
|
||||
int max_ntp_timeouts;
|
||||
|
||||
/* for temporary storage of pin during pair-pin start */
|
||||
unsigned short pin;
|
||||
@@ -554,7 +553,6 @@ raop_init(raop_callbacks_t *callbacks) {
|
||||
/* initialize switch for display of client's streaming data records */
|
||||
raop->clientFPSdata = 0;
|
||||
|
||||
raop->max_ntp_timeouts = 0;
|
||||
raop->audio_delay_micros = 250000;
|
||||
|
||||
raop->hls_support = false;
|
||||
@@ -662,9 +660,6 @@ int raop_set_plist(raop_t *raop, const char *plist_item, const int value) {
|
||||
} else if (strcmp(plist_item, "clientFPSdata") == 0) {
|
||||
raop->clientFPSdata = (value ? 1 : 0);
|
||||
if ((int) raop->clientFPSdata != value) retval = 1;
|
||||
} else if (strcmp(plist_item, "max_ntp_timeouts") == 0) {
|
||||
raop->max_ntp_timeouts = (value > 0 ? value : 0);
|
||||
if (raop->max_ntp_timeouts != value) retval = 1;
|
||||
} else if (strcmp(plist_item, "audio_delay_micros") == 0) {
|
||||
if (value >= 0 && value <= 10 * SECOND_IN_USECS) {
|
||||
raop->audio_delay_micros = value;
|
||||
|
||||
@@ -67,11 +67,12 @@ struct raop_callbacks_s {
|
||||
void (*video_process)(void *cls, raop_ntp_t *ntp, video_decode_struct *data);
|
||||
void (*video_pause)(void *cls);
|
||||
void (*video_resume)(void *cls);
|
||||
void (*conn_feedback) (void *cls);
|
||||
|
||||
/* Optional but recommended callback functions */
|
||||
void (*conn_init)(void *cls);
|
||||
void (*conn_destroy)(void *cls);
|
||||
void (*conn_reset) (void *cls, int timeouts, bool reset_video);
|
||||
void (*conn_reset) (void *cls);
|
||||
void (*conn_teardown)(void *cls, bool *teardown_96, bool *teardown_110 );
|
||||
void (*audio_flush)(void *cls);
|
||||
void (*video_flush)(void *cls);
|
||||
|
||||
@@ -742,7 +742,7 @@ raop_handler_setup(raop_conn_t *conn,
|
||||
}
|
||||
conn->raop_ntp = raop_ntp_init(conn->raop->logger, &conn->raop->callbacks, remote,
|
||||
conn->remotelen, (unsigned short) timing_rport, &time_protocol);
|
||||
raop_ntp_start(conn->raop_ntp, &timing_lport, conn->raop->max_ntp_timeouts);
|
||||
raop_ntp_start(conn->raop_ntp, &timing_lport);
|
||||
conn->raop_rtp = raop_rtp_init(conn->raop->logger, &conn->raop->callbacks, conn->raop_ntp,
|
||||
remote, conn->remotelen, aeskey, aesiv);
|
||||
conn->raop_rtp_mirror = raop_rtp_mirror_init(conn->raop->logger, &conn->raop->callbacks,
|
||||
@@ -983,6 +983,8 @@ raop_handler_feedback(raop_conn_t *conn,
|
||||
char **response_data, int *response_datalen)
|
||||
{
|
||||
logger_log(conn->raop->logger, LOGGER_DEBUG, "raop_handler_feedback");
|
||||
/* register receipt of client's "heartbeat" signal */
|
||||
conn->raop->callbacks.conn_feedback(conn->raop->callbacks.cls);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -58,8 +58,6 @@ struct raop_ntp_s {
|
||||
logger_t *logger;
|
||||
raop_callbacks_t callbacks;
|
||||
|
||||
int max_ntp_timeouts;
|
||||
|
||||
thread_handle_t thread;
|
||||
mutex_handle_t run_mutex;
|
||||
|
||||
@@ -94,6 +92,8 @@ struct raop_ntp_s {
|
||||
int tsock;
|
||||
|
||||
timing_protocol_t time_protocol;
|
||||
bool client_time_received;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -153,6 +153,7 @@ raop_ntp_t *raop_ntp_init(logger_t *logger, raop_callbacks_t *callbacks, const c
|
||||
raop_ntp->logger = logger;
|
||||
memcpy(&raop_ntp->callbacks, callbacks, sizeof(raop_callbacks_t));
|
||||
raop_ntp->timing_rport = timing_rport;
|
||||
raop_ntp->client_time_received = false;
|
||||
|
||||
if (raop_ntp_parse_remote(raop_ntp, remote, remote_addr_len) < 0) {
|
||||
free(raop_ntp);
|
||||
@@ -274,8 +275,6 @@ raop_ntp_thread(void *arg)
|
||||
};
|
||||
raop_ntp_data_t data_sorted[RAOP_NTP_DATA_COUNT];
|
||||
const unsigned two_pow_n[RAOP_NTP_DATA_COUNT] = {2, 4, 8, 16, 32, 64, 128, 256};
|
||||
int timeout_counter = 0;
|
||||
bool conn_reset = false;
|
||||
bool logger_debug = (logger_get_level(raop_ntp->logger) >= LOGGER_DEBUG);
|
||||
|
||||
while (1) {
|
||||
@@ -308,20 +307,15 @@ raop_ntp_thread(void *arg)
|
||||
// Read response
|
||||
response_len = recvfrom(raop_ntp->tsock, (char *)response, sizeof(response), 0, NULL, NULL);
|
||||
if (response_len < 0) {
|
||||
timeout_counter++;
|
||||
char time[30];
|
||||
int level = (timeout_counter == 1 ? LOGGER_DEBUG : LOGGER_ERR);
|
||||
ntp_timestamp_to_time(send_time, time, sizeof(time));
|
||||
logger_log(raop_ntp->logger, level, "raop_ntp receive timeout %d (limit %d) (request sent %s)",
|
||||
timeout_counter, raop_ntp->max_ntp_timeouts, time);
|
||||
if (timeout_counter == raop_ntp->max_ntp_timeouts) {
|
||||
conn_reset = true; /* client is no longer responding */
|
||||
break;
|
||||
}
|
||||
logger_log(raop_ntp->logger, LOGGER_DEBUG , "raop_ntp receive timeout (request sent %s)", time);
|
||||
} else {
|
||||
if (!raop_ntp->client_time_received) {
|
||||
raop_ntp->client_time_received = true;
|
||||
}
|
||||
//local time of the server when the NTP response packet returns
|
||||
int64_t t3 = (int64_t) raop_ntp_get_local_time(raop_ntp);
|
||||
timeout_counter = 0;
|
||||
|
||||
// Local time of the server when the NTP request packet leaves the server
|
||||
int64_t t0 = (int64_t) byteutils_get_ntp_timestamp(response, 8);
|
||||
@@ -391,15 +385,11 @@ raop_ntp_thread(void *arg)
|
||||
MUTEX_UNLOCK(raop_ntp->run_mutex);
|
||||
|
||||
logger_log(raop_ntp->logger, LOGGER_DEBUG, "raop_ntp exiting thread");
|
||||
if (conn_reset && raop_ntp->callbacks.conn_reset) {
|
||||
const bool video_reset = false; /* leave "frozen video" in place */
|
||||
raop_ntp->callbacks.conn_reset(raop_ntp->callbacks.cls, timeout_counter, video_reset);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
raop_ntp_start(raop_ntp_t *raop_ntp, unsigned short *timing_lport, int max_ntp_timeouts)
|
||||
raop_ntp_start(raop_ntp_t *raop_ntp, unsigned short *timing_lport)
|
||||
{
|
||||
logger_log(raop_ntp->logger, LOGGER_DEBUG, "raop_ntp starting time");
|
||||
int use_ipv6 = 0;
|
||||
@@ -407,7 +397,6 @@ raop_ntp_start(raop_ntp_t *raop_ntp, unsigned short *timing_lport, int max_ntp_t
|
||||
assert(raop_ntp);
|
||||
assert(timing_lport);
|
||||
|
||||
raop_ntp->max_ntp_timeouts = max_ntp_timeouts;
|
||||
raop_ntp->timing_lport = *timing_lport;
|
||||
|
||||
MUTEX_LOCK(raop_ntp->run_mutex);
|
||||
|
||||
@@ -27,7 +27,7 @@ typedef struct raop_ntp_s raop_ntp_t;
|
||||
|
||||
typedef enum timing_protocol_e { NTP, TP_NONE, TP_OTHER, TP_UNSPECIFIED } timing_protocol_t;
|
||||
|
||||
void raop_ntp_start(raop_ntp_t *raop_ntp, unsigned short *timing_lport, int max_ntp_timeouts);
|
||||
void raop_ntp_start(raop_ntp_t *raop_ntp, unsigned short *timing_lport);
|
||||
|
||||
void raop_ntp_stop(raop_ntp_t *raop_ntp);
|
||||
|
||||
|
||||
@@ -804,9 +804,8 @@ raop_rtp_mirror_thread(void *arg)
|
||||
MUTEX_UNLOCK(raop_rtp_mirror->run_mutex);
|
||||
|
||||
logger_log(raop_rtp_mirror->logger, LOGGER_DEBUG, "raop_rtp_mirror exiting TCP thread");
|
||||
if (conn_reset && raop_rtp_mirror->callbacks.conn_reset) {
|
||||
const bool video_reset = false; /* leave "frozen video" showing */
|
||||
raop_rtp_mirror->callbacks.conn_reset(raop_rtp_mirror->callbacks.cls, 0, video_reset);
|
||||
if (conn_reset&& raop_rtp_mirror->callbacks.conn_reset) {
|
||||
raop_rtp_mirror->callbacks.conn_reset(raop_rtp_mirror->callbacks.cls);
|
||||
}
|
||||
|
||||
if (unsupported_codec) {
|
||||
|
||||
Reference in New Issue
Block a user