Open Lighting Architecture
Latest Git
|
Send DMX data using libusb, from a separate thread.
The synchronous libusb calls can sometimes take a while to complete, I've seen cases of up to 21ms.
To avoid blocking the main thread, we need to perform the libusb transfer calls in a separate thread. This class contains all the thread management code, leaving the subclass to implement TransmitBuffer(), which performs the actual transfer.
ThreadedUsbSender can be used as a building block for synchronous widgets.
Public Member Functions | |
ThreadedUsbSender (libusb_device *usb_device, libusb_device_handle *usb_handle, int interface_number=0) | |
Create a new ThreadedUsbSender. More... | |
bool | Start () |
Start the new thread. More... | |
void * | Run () |
Entry point for the new thread. More... | |
bool | SendDMX (const DmxBuffer &buffer) |
Buffer a DMX frame for sending. More... | |
Protected Member Functions | |
virtual bool | TransmitBuffer (libusb_device_handle *handle, const DmxBuffer &buffer)=0 |
Perform the DMX transfer. More... | |
ola::plugin::usbdmx::ThreadedUsbSender::ThreadedUsbSender | ( | libusb_device * | usb_device, |
libusb_device_handle * | usb_handle, | ||
int | interface_number = 0 |
||
) |
Create a new ThreadedUsbSender.
usb_device | The usb_device to use. The ThreadedUsbSender takes a ref on the device, while the ThreadedUsbSender object exists. |
usb_handle | The handle to use for the DMX transfer. |
interface_number | the USB interface number of the widget. Defaults to 0. |
|
virtual |
bool ola::plugin::usbdmx::ThreadedUsbSender::SendDMX | ( | const DmxBuffer & | buffer | ) |
Buffer a DMX frame for sending.
buffer | the DmxBuffer to send. |
This should be called in the main thread.
|
virtual |
Start the new thread.
Reimplemented from ola::thread::Thread.
|
protectedpure virtual |
Perform the DMX transfer.
handle | the libusb_device_handle to use for the transfer. |
buffer | The DmxBuffer to transfer. |
This is called from the sender thread.