diff --git a/lib/raop_buffer.c b/lib/raop_buffer.c index 4fbe58a..317319e 100644 --- a/lib/raop_buffer.c +++ b/lib/raop_buffer.c @@ -207,14 +207,16 @@ raop_buffer_decrypt(raop_buffer_t *raop_buffer, unsigned char *data, unsigned ch } int -raop_buffer_enqueue(raop_buffer_t *raop_buffer, unsigned char *data, unsigned short datalen, uint32_t timestamp, int use_seqnum) { +raop_buffer_enqueue(raop_buffer_t *raop_buffer, unsigned char *data, unsigned short datalen, int use_seqnum) { + unsigned char empty_packet_marker[] = { 0x00, 0x68, 0x34, 0x00 }; assert(raop_buffer); /* Check packet data length is valid */ if (datalen < 12 || datalen > RAOP_PACKET_LEN) { return -1; } - if (datalen == 16 && data[12] == 0x0 && data[13] == 0x68 && data[14] == 0x34 && data[15] == 0x0) { + /* before time is synchronized, some empty data packets are sent */ + if (datalen == 16 && !memcmp(&data[12], empty_packet_marker, 4)) { return 0; } int payload_size = datalen - 12; @@ -246,7 +248,7 @@ raop_buffer_enqueue(raop_buffer_t *raop_buffer, unsigned char *data, unsigned sh /* Update the raop_buffer entry header */ entry->seqnum = seqnum; - entry->timestamp = timestamp; + entry->timestamp = byteutils_get_int_be(data, 4); entry->filled = 1; entry->payload_data = malloc(payload_size); diff --git a/lib/raop_buffer.h b/lib/raop_buffer.h index 3395f93..d28f3b1 100644 --- a/lib/raop_buffer.h +++ b/lib/raop_buffer.h @@ -25,7 +25,7 @@ typedef int (*raop_resend_cb_t)(void *opaque, unsigned short seqno, unsigned sho raop_buffer_t *raop_buffer_init(logger_t *logger, const unsigned char *aeskey, const unsigned char *aesiv); -int raop_buffer_enqueue(raop_buffer_t *raop_buffer, unsigned char *data, unsigned short datalen, uint32_t timestamp, int use_seqnum); +int raop_buffer_enqueue(raop_buffer_t *raop_buffer, unsigned char *data, unsigned short datalen, int use_seqnum); void *raop_buffer_dequeue(raop_buffer_t *raop_buffer, unsigned int *length, uint32_t *timestamp, unsigned short *seqnum, int no_resend); void raop_buffer_handle_resends(raop_buffer_t *raop_buffer, raop_resend_cb_t resend_cb, void *opaque); void raop_buffer_flush(raop_buffer_t *raop_buffer, int next_seq); diff --git a/lib/raop_rtp.c b/lib/raop_rtp.c index 19a9e2c..819dec2 100644 --- a/lib/raop_rtp.c +++ b/lib/raop_rtp.c @@ -482,12 +482,12 @@ raop_rtp_thread_udp(void *arg) /* Handle resent data packet */ const int offset = 4; if (packetlen > offset + 12) { - uint32_t rtp_timestamp = byteutils_get_int_be(packet + offset, 4); + unsigned short seqnum = byteutils_get_short_be(packet + offset, 2); if (packetlen == offset + 16 && !memcmp(&packet[offset + 12], no_data, 4)) { /* skip packet */ } else { - logger_log(raop_rtp->logger, LOGGER_DEBUG, "raop_rtp audio resent: rtp=%u", rtp_timestamp); - int result = raop_buffer_enqueue(raop_rtp->buffer, packet + offset, packetlen - offset, rtp_timestamp, 1); + logger_log(raop_rtp->logger, LOGGER_DEBUG, "raop_rtp audio resent: seqnum=%u", seqnum); + int result = raop_buffer_enqueue(raop_rtp->buffer, packet + offset, packetlen - offset, 1); assert(result >= 0); } } else { @@ -604,7 +604,7 @@ raop_rtp_thread_udp(void *arg) logger_log(raop_rtp->logger, LOGGER_DEBUG, "First audio packet received, have_synced = true"); } } - int result = raop_buffer_enqueue(raop_rtp->buffer, packet, packetlen, rtp_timestamp, 1); + int result = raop_buffer_enqueue(raop_rtp->buffer, packet, packetlen, 1); assert(result >= 0); } // Render continuous buffer entries