mirror of
https://github.com/owntone/owntone-server.git
synced 2024-12-29 08:33:23 -05:00
Implement RAOP retransmission
This commit is contained in:
parent
10a0b16573
commit
3abf62179e
68
src/raop.c
68
src/raop.c
@ -2227,6 +2227,10 @@ raop_v2_control_send_sync(uint64_t next_pkt, struct timespec *init)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Forward */
|
||||||
|
static void
|
||||||
|
raop_v2_resend_range(struct raop_session *rs, uint16_t seqnum, uint16_t len);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
raop_v2_control_cb(int fd, short what, void *arg)
|
raop_v2_control_cb(int fd, short what, void *arg)
|
||||||
{
|
{
|
||||||
@ -2322,6 +2326,8 @@ raop_v2_control_cb(int fd, short what, void *arg)
|
|||||||
|
|
||||||
DPRINTF(E_DBG, L_RAOP, "Got retransmit request, seq_start %u len %u\n", seq_start, seq_len);
|
DPRINTF(E_DBG, L_RAOP, "Got retransmit request, seq_start %u len %u\n", seq_start, seq_len);
|
||||||
|
|
||||||
|
raop_v2_resend_range(rs, seq_start, seq_len);
|
||||||
|
|
||||||
readd:
|
readd:
|
||||||
ret = event_add(&svc->ev, NULL);
|
ret = event_add(&svc->ev, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -2656,6 +2662,68 @@ raop_v2_write(uint8_t *buf, uint64_t rtptime)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
raop_v2_resend_range(struct raop_session *rs, uint16_t seqnum, uint16_t len)
|
||||||
|
{
|
||||||
|
struct raop_v2_packet *pktbuf;
|
||||||
|
int ret;
|
||||||
|
uint16_t distance;
|
||||||
|
|
||||||
|
/* Check that seqnum is in the retransmit buffer */
|
||||||
|
if ((seqnum > pktbuf_head->seqnum) && (seqnum < pktbuf_tail->seqnum))
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_RAOP, "RAOP device %s asking for seqnum %u; not in buffer (h %u t %u)\n", rs->devname, seqnum, pktbuf_head->seqnum, pktbuf_tail->seqnum);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (seqnum > pktbuf_head->seqnum)
|
||||||
|
{
|
||||||
|
distance = seqnum - pktbuf_tail->seqnum;
|
||||||
|
|
||||||
|
if (distance > (RETRANSMIT_BUFFER_SIZE / 2))
|
||||||
|
pktbuf = pktbuf_head;
|
||||||
|
else
|
||||||
|
pktbuf = pktbuf_tail;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
distance = pktbuf_head->seqnum - seqnum;
|
||||||
|
|
||||||
|
if (distance > (RETRANSMIT_BUFFER_SIZE / 2))
|
||||||
|
pktbuf = pktbuf_tail;
|
||||||
|
else
|
||||||
|
pktbuf = pktbuf_head;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pktbuf == pktbuf_head)
|
||||||
|
{
|
||||||
|
while (seqnum != pktbuf->seqnum)
|
||||||
|
pktbuf = pktbuf->next;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (seqnum != pktbuf->seqnum)
|
||||||
|
pktbuf = pktbuf->prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (len && pktbuf)
|
||||||
|
{
|
||||||
|
ret = raop_v2_send_packet(rs, pktbuf);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_RAOP, "Error retransmit packet, aborting retransmission\n");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pktbuf = pktbuf->prev;
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len != 0)
|
||||||
|
DPRINTF(E_LOG, L_RAOP, "WARNING: len non-zero at end of retransmission\n");
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
raop_v2_stream_open(struct raop_session *rs)
|
raop_v2_stream_open(struct raop_session *rs)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user