void AsyncUsbReceiver::TransferComplete(struct libusb_transfer *transfer) { if (transfer != m_transfer) { OLA_WARN << "Mismatched libusb transfer: " << transfer << " != " << m_transfer; return; } if (transfer->status != LIBUSB_TRANSFER_COMPLETED && transfer->status != LIBUSB_TRANSFER_TIMED_OUT ) { OLA_WARN << "Transfer returned " << transfer->status; } ola::thread::MutexLocker locker(&m_mutex); m_transfer_state = (transfer->status == LIBUSB_TRANSFER_NO_DEVICE ? DISCONNECTED : IDLE); if (m_suppress_continuation) { return; } if (transfer->status != LIBUSB_TRANSFER_TIMED_OUT) { if (TransferCompleted(&m_rx_buffer, transfer->actual_length)) { // Input changed if (m_receive_callback.get()) { m_plugin_adaptor->Execute(m_receive_callback.get()); } } } // Start next request PerformTransfer(); }
void AsyncUsbSender::TransferComplete(struct libusb_transfer *transfer) { if (transfer != m_transfer) { OLA_WARN << "Mismatched libusb transfer: " << transfer << " != " << m_transfer; return; } if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { OLA_WARN << "Transfer returned " << transfer->status; } ola::thread::MutexLocker locker(&m_mutex); m_transfer_state = (transfer->status == LIBUSB_TRANSFER_NO_DEVICE ? DISCONNECTED : IDLE); if (m_suppress_continuation) { return; } PostTransferHook(); if ((m_transfer_state == IDLE) && m_pending_tx) { m_pending_tx = false; PerformTransfer(m_tx_buffer); } }
bool AsyncUsbReceiver::Start() { if (!m_usb_handle) { OLA_WARN << "AsyncUsbReceiver hasn't been initialized"; return false; } ola::thread::MutexLocker locker(&m_mutex); return PerformTransfer(); }
bool AsyncUsbSender::SendDMX(const DmxBuffer &buffer) { if (!m_usb_handle) { OLA_WARN << "AsyncUsbSender hasn't been initialized"; return false; } ola::thread::MutexLocker locker(&m_mutex); if (m_transfer_state == IDLE) { PerformTransfer(buffer); } else { // Buffer incoming data so we can send it when the outstanding transfers // complete. m_pending_tx = true; m_tx_buffer.Set(buffer); } return true; }