void cdda_send_event(int event_type, char * drive) { cdda_notify_t notify; /* If there is no space for the message, it is dropped. * This may happen if GUI gets blocked (unable to run cdda_timeout_callback() * for several seconds), however it is not anticipated to happen very often. * In such case these events are not very much of use, anyway. */ if (rb_write_space(cdda_notify_rb) >= sizeof(cdda_notify_t)) { notify.event_type = event_type; notify.device_path = strdup(drive); rb_write(cdda_notify_rb, (char *)¬ify, sizeof(cdda_notify_t)); } }
size_t rb_write (rb_t * rb, const char *src, size_t cnt) { size_t free_cnt; size_t cnt2; size_t to_write; size_t n1, n2; if ((free_cnt = rb_write_space (rb)) == 0) { return 0; } to_write = cnt > free_cnt ? free_cnt : cnt; cnt2 = rb->write_ptr + to_write; if (cnt2 > rb->size) { n1 = rb->size - rb->write_ptr; n2 = cnt2 & rb->size_mask; } else { n1 = to_write; n2 = 0; } memcpy (&(rb->buf[rb->write_ptr]), src, n1); rb->write_ptr += n1; rb->write_ptr &= rb->size_mask; if (n2) { memcpy (&(rb->buf[rb->write_ptr]), src + n1, n2); rb->write_ptr += n2; rb->write_ptr &= rb->size_mask; } return to_write; }