sintonia/library/ecasound-2.7.2/libecasound/midi-server.h

117 lines
2.8 KiB
C++

#ifndef INCLUDED_MIDI_SERVER_H
#define INCLUDED_MIDI_SERVER_H
#include <deque>
#include <vector>
#include <list>
#include <string>
#include <map>
#include <pthread.h>
#include <kvu_locks.h>
#include "midiio.h"
/**
* Interface class for specifying custom MIDI-handlers.
*/
class MIDI_HANDLER {
public:
virtual void insert(unsigned char byte) = 0;
virtual ~MIDI_HANDLER(void) {}
};
/**
* MIDI i/o engine.
*
* @author Kai Vehmanen
*/
class MIDI_SERVER {
friend void* start_midi_server_io_thread(void *ptr);
public:
static const unsigned int max_queue_size_rep;
public:
bool is_running(void) const;
bool is_enabled(void) const;
void enable(void);
void disable(void);
void init(void);
void start(void);
void stop(void);
void set_schedrealtime(bool v) { schedrealtime_rep = v; }
void set_schedpriority(int v) { schedpriority_rep = v; }
void register_client(MIDI_IO* mobject);
void unregister_client(MIDI_IO* mobject);
void register_handler(MIDI_HANDLER* handler);
void unregister_handler(MIDI_HANDLER* handler);
void add_mmc_send_id(int id);
void remove_mmc_send_id(int id);
void set_mmc_receive_id(int id) { mmc_receive_id_rep = id; }
int mmc_receive_id(int id) const { return(mmc_receive_id_rep); }
void toggle_midi_sync_send(bool v) { midi_sync_send_rep = v; }
void toggle_midi_sync_receive(bool v) { midi_sync_receive_rep = v; }
bool is_midi_sync_send_enabled(void) const { return(midi_sync_send_rep); }
bool is_midi_sync_receive_enabled(void) const { return(midi_sync_receive_rep); }
void send_midi_bytes(int dev_id, unsigned char* buf, int bytes);
void add_controller_trace(int channel, int ctrl, int initial_value = 0);
void remove_controller_trace(int channel, int ctrl);
int last_controller_value(int channel, int ctrl) const;
MIDI_SERVER (void);
~MIDI_SERVER(void);
private:
std::deque<unsigned char> buffer_rep;
mutable std::map<std::pair<int,int>,int> controller_values_rep;
unsigned char running_status_rep;
int current_ctrl_channel_rep;
int current_ctrl_number;
std::list<int> mmc_send_ids_rep;
int mmc_receive_id_rep;
std::vector<MIDI_IO*> clients_rep;
bool midi_sync_send_rep;
bool midi_sync_receive_rep;
std::vector<MIDI_HANDLER*> handlers_rep;
pthread_t io_thread_rep;
bool thread_running_rep;
bool schedrealtime_rep;
int schedpriority_rep;
ATOMIC_INTEGER exit_request_rep;
ATOMIC_INTEGER stop_request_rep;
ATOMIC_INTEGER running_rep;
MIDI_SERVER& operator=(const MIDI_SERVER& x) { return *this; }
MIDI_SERVER (const MIDI_SERVER& x) { }
void io_thread(void);
void parse_receive_queue(void);
void send_mmc_command(unsigned int cmd);
void send_mmc_start(void);
void send_mmc_stop(void);
void send_midi_start(void);
void send_midi_continue(void);
void send_midi_stop(void);
};
#endif