+ ret = sendto(raop_rtp->csock, (const char *)packet, sizeof(packet), 0, addr, addrlen);
+ if (ret == -1) {
+ logger_log(raop_rtp->logger, LOGGER_WARNING, "Resend failed: %d", SOCKET_GET_ERROR());
+ }
+
+ return 0;
+}
+
+static int
+raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data)
+{
+ int flush;
+ float volume;
+ int volume_changed;
+ unsigned char *metadata;
+ int metadata_len;
+ unsigned char *coverart;
+ int coverart_len;
+
+ assert(raop_rtp);
+
+ MUTEX_LOCK(raop_rtp->run_mutex);
+ if (!raop_rtp->running) {
+ MUTEX_UNLOCK(raop_rtp->run_mutex);
+ return 1;
+ }
+
+ /* Read the volume level */
+ volume = raop_rtp->volume;
+ volume_changed = raop_rtp->volume_changed;
+ raop_rtp->volume_changed = 0;
+
+ /* Read the flush value */
+ flush = raop_rtp->flush;
+ raop_rtp->flush = NO_FLUSH;
+
+ /* Read the metadata */
+ metadata = raop_rtp->metadata;
+ metadata_len = raop_rtp->metadata_len;
+ raop_rtp->metadata = NULL;
+ raop_rtp->metadata_len = 0;
+
+ /* Read the coverart */
+ coverart = raop_rtp->coverart;
+ coverart_len = raop_rtp->coverart_len;
+ raop_rtp->coverart = NULL;
+ raop_rtp->coverart_len = 0;
+ MUTEX_UNLOCK(raop_rtp->run_mutex);
+
+ /* Call set_volume callback if changed */
+ if (volume_changed) {
+ if (raop_rtp->callbacks.audio_set_volume) {
+ raop_rtp->callbacks.audio_set_volume(raop_rtp->callbacks.cls, cb_data, volume);
+ }
+ }
+
+ /* Handle flush if requested */
+ if (flush != NO_FLUSH) {
+ raop_buffer_flush(raop_rtp->buffer, flush);
+ if (raop_rtp->callbacks.audio_flush) {
+ raop_rtp->callbacks.audio_flush(raop_rtp->callbacks.cls, cb_data);
+ }
+ }
+ if (metadata != NULL) {
+ if (raop_rtp->callbacks.audio_set_metadata) {
+ raop_rtp->callbacks.audio_set_metadata(raop_rtp->callbacks.cls, cb_data, metadata, metadata_len);
+ }
+ free(metadata);
+ metadata = NULL;
+ }
+ if (coverart != NULL) {
+ if (raop_rtp->callbacks.audio_set_coverart) {
+ raop_rtp->callbacks.audio_set_coverart(raop_rtp->callbacks.cls, cb_data, coverart, coverart_len);
+ }
+ free(coverart);
+ coverart = NULL;
+ }