cs-midi/MIDI_Interfaces/BLEMIDI/PollingBLEMIDISender.hpp

80 lines
2.5 KiB
C++

#pragma once
#include <Settings/NamespaceSettings.hpp>
#include <chrono>
#include "BLEAPI.hpp"
#include <MIDI_Interfaces/BLEMIDI/BLEMIDIPacketBuilder.hpp>
BEGIN_CS_NAMESPACE
/// Class that buffers MIDI BLE packets.
template <class Derived>
class PollingBLEMIDISender {
public:
PollingBLEMIDISender() = default;
PollingBLEMIDISender(const PollingBLEMIDISender &) = delete;
PollingBLEMIDISender &operator=(const PollingBLEMIDISender &) = delete;
~PollingBLEMIDISender();
/// Initialize.
void begin();
/// RAII lock for access to the packet builder.
struct ProtectedBuilder;
/// Acquire exclusive access to the buffer.
/// @return A RAII wrapper that automatically releases the buffer upon
/// destruction. Just make sure you don't keep any pointers to the
/// `packet` member.
ProtectedBuilder acquirePacket();
/// Release exclusive access to the buffer and notify the sender thread that
/// data is available.
void releasePacketAndNotify(ProtectedBuilder &lck);
/// Sends the data immediately without waiting for the timeout.
void sendNow(ProtectedBuilder &lck);
/// Set the maximum transmission unit of the Bluetooth link. Used to compute
/// the MIDI BLE packet size.
void updateMTU(uint16_t mtu);
/// Get the minimum MTU of all connected clients.
uint16_t getMinMTU() const { return min_mtu; }
/// Force the MTU to an artificially small value (used for testing).
void forceMinMTU(uint16_t mtu);
/// Set the timeout, the number of milliseconds to buffer the outgoing MIDI
/// messages.
void setTimeout(std::chrono::milliseconds timeout);
private:
/// Actually perform the BLE notification with the given data.
void sendData(BLEDataView) = delete; // should be implemented by subclass
private:
/// View of the data to send
BLEMIDIPacketBuilder packet;
/// Timeout before the sender thread sends a packet.
/// @see @ref setTimeout()
unsigned long timeout {10};
/// Time point when the packet was started.
unsigned long packet_start_time {0};
private:
/// The minimum MTU of all connected clients.
uint16_t min_mtu {23};
/// Override the minimum MTU (0 means don't override, nonzero overrides if
/// it's smaller than the minimum MTU of the clients).
/// @see @ref forceMinMTU()
uint16_t force_min_mtu {515};
public:
struct ProtectedBuilder {
BLEMIDIPacketBuilder *packet;
};
};
END_CS_NAMESPACE
#include "PollingBLEMIDISender.ipp"