drummer/lv2_plugin.h
Arnaud G. GIBERT 7cbad040ee - Add sustains support,
- Improve task wait management.
2022-04-29 20:48:54 +02:00

535 lines
15 KiB
C

/*---------------------------------------------------------------------------------*/
/* Includes */
/*---------------------------------------------------------------------------------*/
#ifndef _LV2_PLUGIN_H_
#define _LV2_PLUGIN_H_
#include <pthread.h>
#include "lv2/lv2plug.in/ns/ext/atom/forge.h"
// util includes atom.h
#include "lv2/lv2plug.in/ns/ext/atom/util.h"
#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
#include "lv2/lv2plug.in/ns/ext/urid/urid.h"
#include "lv2/lv2plug.in/ns/ext/state/state.h"
/*----------------------------------------------------------------------------*/
/* Global definitions */
/*----------------------------------------------------------------------------*/
// lv2 stuff
#define DRD_DRUMMER_URI "http://rx3.net/AlkorZ3/drummer"
#define DRD_GAIN_MIN -60.0f
#define DRD_GAIN_MAX 6.0f
#define DRD_VELOCITY_MIN 0
#define DRD_VELOCITY_MAX 127
#define DRD_DB3SCALE -0.8317830986718104f
#define DRD_DB3SCALEPO 1.8317830986718104f
// taken from lv2 example amp plugin
#define DRD_DB_CO(g) ( ( g) > DRD_GAIN_MIN ? powf( 10.0f, ( g) * 0.05f) : 0.0f)
#define DRD_PORT_NUMBER_MAX 32
#define DRD_REQ_BUF_SIZE 10
typedef enum
{
DRD_LV2_CONTROL = 0,
DRD_LV2_MASTER_LEFT,
DRD_LV2_MASTER_RIGHT,
DRD_LV2_LEFT_00,
DRD_LV2_RIGHT_00,
DRD_LV2_LEFT_01,
DRD_LV2_RIGHT_01,
DRD_LV2_LEFT_02,
DRD_LV2_RIGHT_02,
DRD_LV2_LEFT_03,
DRD_LV2_RIGHT_03,
DRD_LV2_LEFT_04,
DRD_LV2_RIGHT_04,
DRD_LV2_LEFT_05,
DRD_LV2_RIGHT_05,
DRD_LV2_LEFT_06,
DRD_LV2_RIGHT_06,
DRD_LV2_LEFT_07,
DRD_LV2_RIGHT_07,
DRD_LV2_LEFT_08,
DRD_LV2_RIGHT_08,
DRD_LV2_LEFT_09,
DRD_LV2_RIGHT_09,
DRD_LV2_LEFT_10,
DRD_LV2_RIGHT_10,
DRD_LV2_LEFT_11,
DRD_LV2_RIGHT_11,
DRD_LV2_LEFT_12,
DRD_LV2_RIGHT_12,
DRD_LV2_LEFT_13,
DRD_LV2_RIGHT_13,
DRD_LV2_LEFT_14,
DRD_LV2_RIGHT_14,
DRD_LV2_LEFT_15,
DRD_LV2_RIGHT_15,
DRD_LV2_LEFT_16,
DRD_LV2_RIGHT_16,
DRD_LV2_LEFT_17,
DRD_LV2_RIGHT_17,
DRD_LV2_LEFT_18,
DRD_LV2_RIGHT_18,
DRD_LV2_LEFT_19,
DRD_LV2_RIGHT_19,
DRD_LV2_LEFT_20,
DRD_LV2_RIGHT_20,
DRD_LV2_LEFT_21,
DRD_LV2_RIGHT_21,
DRD_LV2_LEFT_22,
DRD_LV2_RIGHT_22,
DRD_LV2_LEFT_23,
DRD_LV2_RIGHT_23,
DRD_LV2_LEFT_24,
DRD_LV2_RIGHT_24,
DRD_LV2_LEFT_25,
DRD_LV2_RIGHT_25,
DRD_LV2_LEFT_26,
DRD_LV2_RIGHT_26,
DRD_LV2_LEFT_27,
DRD_LV2_RIGHT_27,
DRD_LV2_LEFT_28,
DRD_LV2_RIGHT_28,
DRD_LV2_LEFT_29,
DRD_LV2_RIGHT_29,
DRD_LV2_LEFT_30,
DRD_LV2_RIGHT_30,
DRD_LV2_LEFT_31,
DRD_LV2_RIGHT_31,
DRD_LV2_BASENOTE,
DRD_LV2_GAIN_00,
DRD_LV2_GAIN_01,
DRD_LV2_GAIN_02,
DRD_LV2_GAIN_03,
DRD_LV2_GAIN_04,
DRD_LV2_GAIN_05,
DRD_LV2_GAIN_06,
DRD_LV2_GAIN_07,
DRD_LV2_GAIN_08,
DRD_LV2_GAIN_09,
DRD_LV2_GAIN_10,
DRD_LV2_GAIN_11,
DRD_LV2_GAIN_12,
DRD_LV2_GAIN_13,
DRD_LV2_GAIN_14,
DRD_LV2_GAIN_15,
DRD_LV2_GAIN_16,
DRD_LV2_GAIN_17,
DRD_LV2_GAIN_18,
DRD_LV2_GAIN_19,
DRD_LV2_GAIN_20,
DRD_LV2_GAIN_21,
DRD_LV2_GAIN_22,
DRD_LV2_GAIN_23,
DRD_LV2_GAIN_24,
DRD_LV2_GAIN_25,
DRD_LV2_GAIN_26,
DRD_LV2_GAIN_27,
DRD_LV2_GAIN_28,
DRD_LV2_GAIN_29,
DRD_LV2_GAIN_30,
DRD_LV2_GAIN_31,
DRD_LV2_PAN_00,
DRD_LV2_PAN_01,
DRD_LV2_PAN_02,
DRD_LV2_PAN_03,
DRD_LV2_PAN_04,
DRD_LV2_PAN_05,
DRD_LV2_PAN_06,
DRD_LV2_PAN_07,
DRD_LV2_PAN_08,
DRD_LV2_PAN_09,
DRD_LV2_PAN_10,
DRD_LV2_PAN_11,
DRD_LV2_PAN_12,
DRD_LV2_PAN_13,
DRD_LV2_PAN_14,
DRD_LV2_PAN_15,
DRD_LV2_PAN_16,
DRD_LV2_PAN_17,
DRD_LV2_PAN_18,
DRD_LV2_PAN_19,
DRD_LV2_PAN_20,
DRD_LV2_PAN_21,
DRD_LV2_PAN_22,
DRD_LV2_PAN_23,
DRD_LV2_PAN_24,
DRD_LV2_PAN_25,
DRD_LV2_PAN_26,
DRD_LV2_PAN_27,
DRD_LV2_PAN_28,
DRD_LV2_PAN_29,
DRD_LV2_PAN_30,
DRD_LV2_PAN_31,
DRD_LV2_CORE_EVENT,
DRD_LV2_NUM_PORTS
} DRT_Port_Index;
typedef struct
{
LV2_URID midi_event;
LV2_URID ui_msg;
LV2_URID kit_path;
LV2_URID atom_eventTransfer;
LV2_URID atom_object;
LV2_URID string_urid;
LV2_URID bool_urid;
LV2_URID int_urid;
LV2_URID get_state;
LV2_URID midi_info;
LV2_URID sample_trigger;
LV2_URID velocity_toggle;
LV2_URID note_off_toggle;
LV2_URID channel_nb;
LV2_URID zero_position;
LV2_URID sample_add;
LV2_URID sample_remove;
} DRT_Drummer_URIS;
/*
typedef struct
{
SF_INFO *Info;
char Active;
uint32_t Offset;
uint32_t Limit;
uint32_t Layer_Count;
float Velocity;
// drmr_layer *layers;
float *Data;
int Data_Offset;
} DRT_Sample;
*/
typedef struct
{
DRT_Instrument *Instrument_Ptr;
DRT_Layer *Layer_Ptr;
float *Data_Ptr;
uint32_t Limit;
SF_INFO *SF_Info_Ptr;
int Data_Offset;
char Active;
uint32_t Offset;
float Velocity;
bool Sustained;
} DRT_Sample;
typedef struct DRT_LV2_Base
{
DRT_Base Base;
// Ports
float *Master_Left;
float *Master_Right;
float **Left;
float **Right;
LV2_Atom_Sequence *Control_Port;
LV2_Atom_Sequence *Core_Event_Port;
LV2_Atom_Forge Forge;
// params
int Channel;
int Channel_Nb;
int Zero_Position;
float **Gains;
float **Pans;
float *BaseNote;
bool Sustain;
// URIs
LV2_URID_Map *Map_Ptr;
DRT_Drummer_URIS URIS;
// Kit info
DRT_Kit *Kit_Cur_Ptr;
uint8_t Bank_Id_LSB;
uint8_t Bank_Id_MSB;
uint8_t Program_Id;
uint8_t Bank_Id_LSB_New;
uint8_t Bank_Id_MSB_New;
uint8_t Program_Id_New;
DRT_Kit_Id Kit_Id;
char *Current_Path;
char **Request_Buf;
int CurReq;
// Samples
DRT_Sample Samples[DRD_PORT_NUMBER_MAX];
uint8_t Sample_Number;
// Loading Thread Stuff
pthread_mutex_t Load_Mutex;
pthread_cond_t Load_Cond;
pthread_t Load_Thread;
} DRT_LV2_Base;
/*
typedef struct
{
// Ports
float *master_left;
float *master_right;
float **left;
float **right;
LV2_Atom_Sequence *control_port;
LV2_Atom_Sequence *core_event_port;
LV2_Atom_Forge forge;
// params
int channel;
bool ignore_velocity;
bool ignore_note_off;
int channel_nb;
int zero_position;
float **gains;
float **pans;
float *baseNote;
double rate;
// URIs
LV2_URID_Map *map;
drmr_uris uris;
// Kit info
char *current_path;
char **request_buf;
int curReq;
// Samples
drmr_sample *samples;
uint8_t num_samples;
// loading thread stuff
pthread_mutex_t load_mutex;
pthread_cond_t load_cond;
pthread_t load_thread;
} DrMr;
*/
static inline void DR_Map_Drummer_URIS( LV2_URID_Map *Map_Ptr, DRT_Drummer_URIS *URIS)
{
URIS->midi_event = Map_Ptr->map( Map_Ptr->handle, "http://lv2plug.in/ns/ext/midi#MidiEvent");
URIS->string_urid = Map_Ptr->map( Map_Ptr->handle, LV2_ATOM__String);
URIS->bool_urid = Map_Ptr->map( Map_Ptr->handle, LV2_ATOM__Bool);
URIS->int_urid = Map_Ptr->map( Map_Ptr->handle, LV2_ATOM__Int);
URIS->ui_msg = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#uimsg");
URIS->kit_path = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#kitpath");
URIS->get_state = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#getstate");
URIS->midi_info = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#midiinfo");
URIS->sample_trigger = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#sampletrigger");
URIS->velocity_toggle = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#velocitytoggle");
URIS->note_off_toggle = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#noteofftoggle");
URIS->channel_nb = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#channelnb");
URIS->zero_position = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#zeroposition");
URIS->sample_add = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#sampleadd");
URIS->sample_remove = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#sampleremove");
URIS->atom_eventTransfer = Map_Ptr->map( Map_Ptr->handle, LV2_ATOM__eventTransfer);
URIS->atom_object = Map_Ptr->map( Map_Ptr->handle, LV2_ATOM__Object);
}
# ifdef _LV2_PLUGIN_C_
/*----------------------------------------------------------------------------*/
/* Private Definitions */
/*----------------------------------------------------------------------------*/
# endif // ifdef _LV2_PLUGIN_C_
# ifndef _LV2_PLUGIN_C_
/*----------------------------------------------------------------------------*/
/* Public Prototypes */
/*----------------------------------------------------------------------------*/
# else // ifndef _LV2_PLUGIN_C_
/*----------------------------------------------------------------------------*/
/* Private Prototypes */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static void *DR_LV2_Load_Thread( DRT_LV2_Base *);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static inline LV2_Atom *DR_LV2_Message_Midi_Info_Build( DRT_LV2_Base *, uint8_t *);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
DRT_Status DR_LV2_Kit_Samples_Load( DRT_LV2_Base *, DRT_Kit *);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
DRT_Status DR_LV2_CurKit_Samples_Load( DRT_LV2_Base *);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static inline void DR_Layer_To_Sample( DRT_Sample *, float);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static inline void DR_Sample_Trigger( DRT_LV2_Base *, int, uint8_t *const, uint32_t);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static inline void DR_Sample_Untrigger( DRT_LV2_Base *, int, uint32_t);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static inline void DR_Sample_UnSustain( DRT_LV2_Base *, uint32_t);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static LV2_Handle DR_LV2_Instantiate(const LV2_Descriptor *, double, const char *, const LV2_Feature * const *);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static void DR_LV2_Connect_Port( LV2_Handle, uint32_t, void *);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static void DR_LV2_Run( LV2_Handle, uint32_t);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static void DR_LV2_Cleanup( LV2_Handle);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static LV2_State_Status DR_LV2_Save_State( LV2_Handle, LV2_State_Store_Function, void *, uint32_t, const LV2_Feature *const *);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static LV2_State_Status DR_LV2_Restore_State( LV2_Handle, LV2_State_Retrieve_Function, void *, uint32_t, const LV2_Feature *const *);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
static const void *DR_LV2_Extension_Data( const char *);
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
LV2_SYMBOL_EXPORT const LV2_Descriptor *lv2_descriptor( uint32_t);
# endif // ifndef _LV2_PLUGIN_C_
/*----------------------------------------------------------------------------*/
#endif // ifndef _LV2_PLUGIN_H_