diff --git a/src/modules/raop/raop_client.c b/src/modules/raop/raop_client.c index d7158f5..f66ae10 100644 --- a/src/modules/raop/raop_client.c +++ b/src/modules/raop/raop_client.c @@ -556,19 +556,37 @@ static int send_sync_packet(pa_raop_client *c, uint32_t stamp) { static int send_audio_packet(pa_raop_client *c, uint32_t *buffer, size_t size, uint16_t retrans_seq_num, ssize_t *written) { ssize_t length = 0; int rv = 1; + int fd = c->stream_fd; + int inject = 0; + /* FIXME: these codes should be endian-independent */ memcpy(buffer, audio_header, sizeof(audio_header)); - if (c->first_packet == TRUE) - buffer[0] |= ((uint32_t) 0x80) << 8; if (retrans_seq_num) { - buffer[0] = (uint32_t) 0x5580; - buffer[0] |= htonl((uint32_t) retrans_seq_num); - } else + uint8_t x = 0x30; /* FIXME: what's this?? */ + fd = c->control_fd; + buffer[0] = (uint32_t) 0xd680; + buffer[0] |= htonl((uint32_t) 0x0100 | x); + buffer[1] = (uint32_t) 0x6080 | htonl((uint32_t) retrans_seq_num); + /*inject = 1; */ /* turn on this to disable retransmission */ + } else { + if (c->first_packet == TRUE) + buffer[0] |= ((uint32_t) 0x80) << 8; buffer[0] |= htonl((uint32_t) c->seq); - buffer[1] = htonl(c->rtptime); - buffer[2] = htonl(c->ssrc); + buffer[1] = htonl(c->rtptime); + buffer[2] = htonl(c->ssrc); + + /* Error injection -- intentionally skip 2 frames ~= 16ms per sec */ + if (c->seq % 125 > 124 - 2) { + pa_log_debug("Skipping seq=%u", c->seq); + inject = 1; + } else if (c->seq % 125 == 0) + pa_log_debug("Resume sending at seq=%u", c->seq); + } - length = pa_loop_write(c->stream_fd, buffer, size, NULL); + if (inject) + length = size; + else + length = pa_loop_write(fd, buffer, size, NULL); if (length == ((ssize_t) size)) rv = 0; if (written != NULL) @@ -1094,8 +1112,9 @@ static int resend_packets(pa_raop_client *c, uint16_t seq_num, uint16_t num_pack if ((seq_num < c->packet_buffer->first_seq_num) || (seq_num > c->seq)) return rv; for (i = seq_num; i < (seq_num + num_packets); i++) { - packet_data = malloc((FRAMES_PER_PACKET * 2 * 2) + sizeof(audio_header)); - rv = pb_get_packet(c->packet_buffer, i, packet_data, &packet_length); + /* `+4` to have additional header room for retransmission */ + packet_data = malloc((FRAMES_PER_PACKET * 2 * 2) + sizeof(audio_header) + 4); + rv = pb_get_packet(c->packet_buffer, i, packet_data + 4, &packet_length); pa_assert(packet_length);