示例#1
0
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();
}
示例#2
0
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);
  }
}
示例#3
0
bool AsyncUsbReceiver::Start() {
  if (!m_usb_handle) {
    OLA_WARN << "AsyncUsbReceiver hasn't been initialized";
    return false;
  }
  ola::thread::MutexLocker locker(&m_mutex);
  return PerformTransfer();
}
示例#4
0
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;
}