drummer/datastruct.h
Arnaud G. GIBERT 5cce284879 - Drop local libnode version, now use the official one, V2.3.x,
- Replace internal log system with LibLog V1.0.x,
- Code cleanup,
- Add GPL Licenses files.
2024-04-21 20:21:45 +02:00

852 lines
36 KiB
C

/*----------------------------------------------------------------------------*/
/* datastruct.h */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* This file is part of Drummer. */
/* */
/* Drummer is free software: you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by */
/* the Free Software Foundation, either version 3 of the License, or */
/* (at your option) any later version. */
/* */
/* Drummer is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with Drummer. If not, see <https://www.gnu.org/licenses/>. */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* Includes */
/*----------------------------------------------------------------------------*/
#ifndef _DATASTRUCT_H_
#define _DATASTRUCT_H_
/*----------------------------------------------------------------------------*/
/* Pre definitions */
/*----------------------------------------------------------------------------*/
typedef struct DRT_Instrument DRT_Instrument;
typedef struct DRT_Kit DRT_Kit;
/*----------------------------------------------------------------------------*/
/* Global definitions */
/*----------------------------------------------------------------------------*/
#define DRD_CHANNEL_ID_DEFAULT 10
#define DRD_BASE_NOTE_DEFAULT 36
#define DRD_VELOCITY_IGNORE_NOTE_DEFAULT 24
#define DRD_NOTE_OFF_IGNORE_NOTE_DEFAULT 25
#define DRD_VELOCITY_IGNORE_FLAG_DEFAULT false
#define DRD_NOTE_OFF_IGNORE_FLAG_DEFAULT false
#define DRD_THREAD_NUMBER_DEFAULT 16L
#define DRD_TASK_LOAD_LAYER_DEFAULT DRD_TRUE
#define DRD_TASK_LOAD_INSTRUMENT_DEFAULT DRD_FALSE
#define DRD_TASK_LOAD_KIT_DEFAULT DRD_FALSE
#define DRD_TASK_SYNC_KIT_DEFAULT DRD_TRUE
#define DRD_TASK_SYNC_KITS_DEFAULT DRD_TRUE
/*----------------------------------------------------------------------------*/
/* Definitions */
/*----------------------------------------------------------------------------*/
#define NDD_CMD_ID_REFRESH ( NDT_Command) 65
#define NDD_CMD_STATS_GET ( NDT_Command) 66
#define NDD_CMD_GRAPH_PRINT ( NDT_Command) 67
#define NDD_CMD_SAMPLE_LOAD ( NDT_Command) 68
#define NDD_CMD_SAMPLE_UNLOAD ( NDT_Command) 69
#define NDD_CMD_INDEX0_PRINT ( NDT_Command) 70
#define NDD_CMD_INDEX1_PRINT ( NDT_Command) 71
#define DRD_NAME_LEN (short) 256
#define DRD_NAME_SIZE (DRD_NAME_LEN + 1)
#define DRD_DIRNAME_LEN (short) 1024
#define DRD_DIRNAME_SIZE (DRD_DIRNAME_LEN)
#define DRD_FILENAME_LEN (short) 1024
#define DRD_FILENAME_SIZE (DRD_FILENAME_LEN)
#define DRD_DESC_LEN (short) 4096
#define DRD_DESC_SIZE (DRD_DESC_LEN + 1)
typedef long DRT_Id;
typedef DRT_Id DRT_Layer_Id;
typedef DRT_Id DRT_Instrument_Id;
typedef DRT_Id DRT_Kit_Id;
typedef DRT_Id DRT_Task_Id;
#define DRD_ID_UNKNOWN (DRT_Id) -1
typedef short DRT_Load_Status;
#define DRD_LOAD_STATUS_UNKNOWN ( DRT_Load_Status) -1
#define DRD_LOAD_STATUS_UNLOADED ( DRT_Load_Status) 0
#define DRD_LOAD_STATUS_LOADED ( DRT_Load_Status) 1
#define DRD_LOAD_STATUS_TRANSIENT ( DRT_Load_Status) 2
#define DR_LOAD_STATUS_VALUE_UNKNOWN_IS( v) ( (v) == DRD_LOAD_STATUS_UNKNOWN)
#define DR_LOAD_STATUS_VALUE_UNLOADED_IS( v) ( (v) == DRD_LOAD_STATUS_UNLOADED)
#define DR_LOAD_STATUS_VALUE_LOADED_IS( v) ( (v) == DRD_LOAD_STATUS_LOADED)
#define DR_LOAD_STATUS_VALUE_TRANSIENT_IS( v) ( (v) == DRD_LOAD_STATUS_TRANSIENT)
#define DR_LOAD_STATUS_UNKNOWN_IS( s) DR_LOAD_STATUS_VALUE_UNKNOWN_IS( (s)->Status)
#define DR_LOAD_STATUS_UNLOADED_IS( s) DR_LOAD_STATUS_VALUE_UNLOADED_IS( (s)->Status)
#define DR_LOAD_STATUS_LOADED_IS( s) DR_LOAD_STATUS_VALUE_LOADED_IS( (s)->Status)
#define DR_LOAD_STATUS_TRANSIENT_IS( s) DR_LOAD_STATUS_VALUE_TRANSIENT_IS( (s)->Status)
#define DR_LOAD_STATUS_VALUE_ASCII_GET( v) ( DR_LOAD_STATUS_VALUE_UNKNOWN_IS( (v)) ? "UNKNOWN" : ( DR_LOAD_STATUS_VALUE_UNLOADED_IS( (v)) ? "UNLOADED" : ( DR_LOAD_STATUS_VALUE_LOADED_IS( (v)) ? "LOADED" : ( DR_LOAD_STATUS_VALUE_TRANSIENT_IS( (v)) ? "TRANSIENT" : "???"))))
#define DR_LOAD_STATUS_ASCII_GET( s) DR_LOAD_STATUS_VALUE_ASCII_GET( (s)->Status)
/*---------------------------------------------------------------------------------*/
/* DRT_Task */
/*---------------------------------------------------------------------------------*/
typedef short DRT_Task_Status;
#define DRD_TASK_STATUS_UNKNOWN ( DRT_Task_Status) -1
#define DRD_TASK_STATUS_UNSPAWNED ( DRT_Task_Status) 0
#define DRD_TASK_STATUS_WAITING ( DRT_Task_Status) 1
#define DRD_TASK_STATUS_RUNNING ( DRT_Task_Status) 2
#define DRD_TASK_STATUS_KILLED ( DRT_Task_Status) 3
#define DR_TASK_STATUS_VALUE_UNKNOWN_IS( v) ( (v) == DRD_TASK_STATUS_UNKNOWN)
#define DR_TASK_STATUS_VALUE_UNSPAWNED_IS( v) ( (v) == DRD_TASK_STATUS_UNSPAWNED)
#define DR_TASK_STATUS_VALUE_WAITING_IS( v) ( (v) == DRD_TASK_STATUS_WAITING)
#define DR_TASK_STATUS_VALUE_RUNNING_IS( v) ( (v) == DRD_TASK_STATUS_RUNNING)
#define DR_TASK_STATUS_VALUE_KILLED_IS( v) ( (v) == DRD_TASK_STATUS_KILLED)
#define DR_TASK_STATUS_UNKNOWN_IS( s) DR_TASK_STATUS_VALUE_UNKNOWN_IS( (s)->Status)
#define DR_TASK_STATUS_UNSPAWNED_IS( s) DR_TASK_STATUS_VALUE_UNSPAWNED_IS( (s)->Status)
#define DR_TASK_STATUS_WAITING_IS( s) DR_TASK_STATUS_VALUE_WAITING_IS( (s)->Status)
#define DR_TASK_STATUS_RUNNING_IS( s) DR_TASK_STATUS_VALUE_RUNNING_IS( (s)->Status)
#define DR_TASK_STATUS_KILLED_IS( s) DR_TASK_STATUS_VALUE_KILLED_IS( (s)->Status)
#define DR_TASK_STATUS_VALUE_ASCII_GET( v) ( DR_TASK_STATUS_VALUE_UNKNOWN_IS( (v)) ? "UNKNOWN" : ( DR_TASK_STATUS_VALUE_UNSPAWNED_IS( (v)) ? "UNUNSPAWNED" : ( DR_TASK_STATUS_VALUE_WAITING_IS( (v)) ? "WAITING" : ( DR_TASK_STATUS_VALUE_RUNNING_IS( (v)) ? "RUNNING" : ( DR_TASK_STATUS_VALUE_KILLED_IS( (v)) ? "KILLED" : "???")))))
#define DR_TASK_STATUS_ASCII_GET( s) DR_TASK_STATUS_VALUE_ASCII_GET( (s)->Status)
typedef short DRT_Task_Command;
#define DRD_TASK_CMD_UNKNOWN ( DRT_Task_Command) -1
#define DRD_TASK_CMD_NONE ( DRT_Task_Command) 0
#define DRD_TASK_CMD_TASK_SPAWN ( DRT_Task_Command) 1
#define DRD_TASK_CMD_TASK_KILL ( DRT_Task_Command) 2
#define DRD_TASK_CMD_LAYER_LOAD ( DRT_Task_Command) 3
#define DRD_TASK_CMD_INSTRUMENT_LOAD ( DRT_Task_Command) 4
#define DRD_TASK_CMD_KIT_LOAD ( DRT_Task_Command) 5
#define DR_TASK_CMD_VALUE_UNKNOWN_IS( v) ( (v) == DRD_TASK_CMD_UNKNOWN)
#define DR_TASK_CMD_VALUE_NONE_IS( v) ( (v) == DRD_TASK_CMD_NONE)
#define DR_TASK_CMD_VALUE_TASK_SPAWN_IS( v) ( (v) == DRD_TASK_CMD_TASK_SPAWN)
#define DR_TASK_CMD_VALUE_TASK_KILL_IS( v) ( (v) == DRD_TASK_CMD_TASK_KILL)
#define DR_TASK_CMD_VALUE_LAYER_LOAD_IS( v) ( (v) == DRD_TASK_CMD_LAYER_LOAD)
#define DR_TASK_CMD_VALUE_INSTRUMENT_LOAD_IS( v) ( (v) == DRD_TASK_CMD_INSTRUMENT_LOAD)
#define DR_TASK_CMD_VALUE_KIT_LOAD_IS( v) ( (v) == DRD_TASK_CMD_KIT_LOAD)
#define DR_TASK_CMD_UNKNOWN_IS( s) DR_TASK_CMD_VALUE_UNKNOWN_IS( (s)->Command)
#define DR_TASK_CMD_NONE_IS( s) DR_TASK_CMD_VALUE_NONE_IS( (s)->Command)
#define DR_TASK_CMD_TASK_SPAWN_IS( s) DR_TASK_CMD_VALUE_TASK_SPAWN_IS( (s)->Command)
#define DR_TASK_CMD_TASK_KILL_IS( s) DR_TASK_CMD_VALUE_TASK_KILL_IS( (s)->Command)
#define DR_TASK_CMD_LAYER_LOAD_IS( s) DR_TASK_CMD_VALUE_LAYER_LOAD_IS( (s)->Command)
#define DR_TASK_CMD_INSTRUMENT_LOAD_IS( s) DR_TASK_CMD_VALUE_INSTRUMENT_LOAD_IS( (s)->Command)
#define DR_TASK_CMD_KIT_LOAD_IS( s) DR_TASK_CMD_VALUE_KIT_LOAD_IS( (s)->Command)
#define DR_TASK_CMD_VALUE_ASCII_GET( v) ( DR_TASK_CMD_VALUE_UNKNOWN_IS( (v)) ? "UNKNOWN" : ( DR_TASK_CMD_VALUE_NONE_IS( (v)) ? "None" : ( DR_TASK_CMD_VALUE_TASK_SPAWN_IS( (v)) ? "Task Spawn" : ( DR_TASK_CMD_VALUE_TASK_KILL_IS( (v)) ? "Task Kill" : ( DR_TASK_CMD_VALUE_LAYER_LOAD_IS( (v)) ? "Layer Load" : ( DR_TASK_CMD_VALUE_INSTRUMENT_LOAD_IS( (v)) ? "Instrument Load" : ( DR_TASK_CMD_VALUE_KIT_LOAD_IS( (v)) ? "Kit Load" : "???")))))))
#define DR_TASK_CMD_ASCII_GET( s) DR_TASK_CMD_VALUE_ASCII_GET( (s)->Command)
typedef struct DRT_Task
{
DRT_Task_Status Status;
pthread_t Thread;
pthread_cond_t Cond;
DRT_Task_Command Command;
void *Target_Ptr;
long Count;
} DRT_Task;
/*---------------------------------------------------------------------------------*/
/* DRT_Base */
/*---------------------------------------------------------------------------------*/
typedef int DRT_SampleRate;
typedef struct DRT_Base
{
NDT_Root *Kit_DS_Ptr;
DRT_SampleRate SampleRate;
//Config
float *Channel_Id_Ptr;
float *Base_Note_Ptr;
float *Velocity_Ignore_Note_Ptr;
float *Note_Off_Ignore_Note_Ptr;
float *Velocity_Ignore_Flag_Ptr;
float *Note_Off_Ignore_Flag_Ptr;
DRT_Task_Id Task_Number;
DRT_Boolean Task_Load_Layer_Flag;
DRT_Boolean Task_Load_Instrument_Flag;
DRT_Boolean Task_Load_Kit_Flag;
DRT_Boolean Task_Sync_Kit_Flag;
DRT_Boolean Task_Sync_Kits_Flag;
DRT_Task *Task_Tab;
pthread_mutex_t Task_Mutex;
pthread_cond_t Task_Cond;
DRT_Task_Id Task_Count_Waiting;
long Task_Count_Run;
long Task_Count_Sleep;
long Task_Count_FakeWU;
} DRT_Base;
/*---------------------------------------------------------------------------------*/
/* Layer / Instrument / Kit */
/*---------------------------------------------------------------------------------*/
typedef struct DRT_Layer
{
DRT_Layer_Id Id;
char FileName[ DRD_FILENAME_SIZE];
float *Sample_Ptr;
long Sample_Size;
SF_INFO *SF_Info_Ptr;
double Min;
double Max;
double Gain;
double Pitch;
DRT_Instrument *Instrument_Ptr;
} DRT_Layer;
typedef struct DRT_Instrument
{
DRT_Instrument_Id Id;
char Name[ DRD_NAME_SIZE];
double Gain;
double Pan_Left;
double Pan_Right;
DRT_Kit *Kit_Ptr;
NDT_Root *Layer_DS_Ptr;
} DRT_Instrument;
typedef struct DRT_Kit
{
DRT_Kit_Id Id;
DRT_Kit_Id Logical_Id;
DRT_Load_Status Status;
char Name[ DRD_NAME_SIZE];
char Desc[ DRD_DESC_SIZE];
char DirName[ DRD_DIRNAME_SIZE];
DRT_Base *Base_Ptr;
NDT_Root *Instrument_DS_Ptr;
} DRT_Kit;
typedef struct DRT_Kit_Name
{
DRT_Kit_Id Id;
DRT_Kit_Id Logical_Id;
char Name[ DRD_NAME_SIZE];
} DRT_Kit_Name;
/*----------------------------------------------------------------------------*/
/* DRD DATA & API definition */
/*----------------------------------------------------------------------------*/
# ifdef _DATASTRUCT_C_
# define DRD_DS_DATA
# define DRD_DS_API
# else
# define DRD_DS_DATA extern
# define DRD_DS_API extern
# endif
/*----------------------------------------------------------------------------*/
/* Public Data */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* DRT_Base */
/*----------------------------------------------------------------------------*/
DRD_DS_DATA DRT_Base DRG_Base;
/*----------------------------------------------------------------------------*/
/* Public Prototypes */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* */
/*----------------------------------------------------------------------------*/
//DRD_DS_API DRT_Status DR_Log_Write( DRT_Log_Type_Id, char *, va_list);
/*----------------------------------------------------------------------------*/
/* DR_Log */
/*----------------------------------------------------------------------------*/
//DRD_DS_API DRT_Status DR_Log( DRT_Log_Type_Id, DRT_Log_Level, char *, char *, long, bool, char *, ...);
/*----------------------------------------------------------------------------*/
/* DR_Layer_Dump */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Layer_Dump( DRT_Layer *, long);
/*---------------------------------------------------------------------------------*/
/* DR_Kit_Id_Find */
/*---------------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kit_Id_Find( DRT_Kit **, DRT_Kit_Id);
/*----------------------------------------------------------------------------*/
/* DR_Kit_Logical_Id_Find */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kit_Logical_Id_Find( DRT_Kit **, DRT_Kit_Id);
/*---------------------------------------------------------------------------------*/
/* DR_Kit_Name_Find */
/*---------------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kit_Name_Find( DRT_Kit **, char *);
/*----------------------------------------------------------------------------*/
/* DR_Kit_Dump */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kit_Dump( DRT_Kit *, long);
/*---------------------------------------------------------------------------------*/
/* DR_Kit_Load */
/*---------------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kit_Load( char *);
/*---------------------------------------------------------------------------------*/
/* DR_Kit_Sample_Load */
/*---------------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kit_Sample_Load( DRT_Kit *);
/*---------------------------------------------------------------------------------*/
/* DR_Kit_Sample_UnLoad */
/*---------------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kit_Sample_UnLoad( DRT_Kit *);
/*----------------------------------------------------------------------------*/
/* DR_Kits_Sample_Load */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kits_Sample_Load();
/*----------------------------------------------------------------------------*/
/* DR_Kits_Sample_UnLoad */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kits_Sample_UnLoad();
/*----------------------------------------------------------------------------*/
/* DR_Kits_Load */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kits_Load();
/*----------------------------------------------------------------------------*/
/* DR_Kits_Name_Get */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kits_Name_Get( DRT_Kit_Name **, long *);
/*----------------------------------------------------------------------------*/
/* DR_Kits_Stats_Dump */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kits_Stats_Dump();
/*----------------------------------------------------------------------------*/
/* DR_Kits_Dump */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kits_Dump();
/*----------------------------------------------------------------------------*/
/* DR_Kits_Graph_Dump */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Kits_Graph_Dump();
/*----------------------------------------------------------------------------*/
/* DR_Task_Id_Run */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Task_Id_Run( DRT_Task_Id, DRT_Task_Command, void *);
/*----------------------------------------------------------------------------*/
/* DR_Task_Id_Kill */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Task_Id_Kill( DRT_Task_Id);
/*----------------------------------------------------------------------------*/
/* DR_Task_Run */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Task_Run( DRT_Task_Command, void *);
/*----------------------------------------------------------------------------*/
/* DR_Task_Wait */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Task_Wait();
/*----------------------------------------------------------------------------*/
/* DR_Tasks_Dump */
/*----------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_Tasks_Dump();
/*---------------------------------------------------------------------------------*/
/* DR_DataStruct_Init */
/*---------------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_DataStruct_Init( DRT_SampleRate, DRT_Task_Id);
/*---------------------------------------------------------------------------------*/
/* DR_DataStruct_DeInit */
/*---------------------------------------------------------------------------------*/
DRD_DS_API DRT_Status DR_DataStruct_DeInit();
# ifdef _DATASTRUCT_C_
/*----------------------------------------------------------------------------*/
/* Private Definitions */
/*----------------------------------------------------------------------------*/
#define DRD_MODULE_NAME "ds"
#define LGD_MODULE_NAME "ds"
/*----------------------------------------------------------------------------*/
/* Private Data */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* DRT_Base */
/*----------------------------------------------------------------------------*/
DRT_Base DRG_Base;
/*----------------------------------------------------------------------------*/
/* Layer_DS Indexes */
/*----------------------------------------------------------------------------*/
#define DRD_LAYER_DS_INDEX_NB (short)2
static NDT_Index_Type DRG_Layer_DS_Index_Tab_Initial[DRD_LAYER_DS_INDEX_NB] =
{
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_SORTED),
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_SORTED)
};
static NDT_Index_Type DRG_Layer_DS_Index_Tab_Final[DRD_LAYER_DS_INDEX_NB] =
{
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_TREE | NDD_INDEX_SUBTYPE_BALANCED),
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_TREE | NDD_INDEX_SUBTYPE_BALANCED)
};
/*----------------------------------------------------------------------------*/
/* Instrument_DS Indexes */
/*----------------------------------------------------------------------------*/
#define DRD_INSTRUMENT_DS_INDEX_NB (short)2
static NDT_Index_Type DRG_Instrument_DS_Index_Tab_Initial[DRD_INSTRUMENT_DS_INDEX_NB] =
{
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_SORTED),
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_SORTED)
};
static NDT_Index_Type DRG_Instrument_DS_Index_Tab_Final[DRD_INSTRUMENT_DS_INDEX_NB] =
{
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_TREE | NDD_INDEX_SUBTYPE_BALANCED),
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_TREE | NDD_INDEX_SUBTYPE_BALANCED)
};
/*----------------------------------------------------------------------------*/
/* Kit_DS Indexes */
/*----------------------------------------------------------------------------*/
#define DRD_KIT_DS_INDEX_NB (short)2
static NDT_Index_Type DRG_Kit_DS_Index_Tab_Initial[DRD_KIT_DS_INDEX_NB] =
{
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_SORTED),
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_LIST | NDD_INDEX_SUBTYPE_SORTED)
};
static NDT_Index_Type DRG_Kit_DS_Index_Tab_Final[DRD_KIT_DS_INDEX_NB] =
{
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_TREE | NDD_INDEX_SUBTYPE_BALANCED),
(NDD_INDEX_STATUS_OPENED | NDD_INDEX_TYPE_TREE | NDD_INDEX_SUBTYPE_BALANCED)
};
/*---------------------------------------------------------------------------------*/
/* XML XPATH Tags */
/*---------------------------------------------------------------------------------*/
#define DR_STR(A) #A
#define DR_TAG(A) DR_STR(A)
#define DR_XML_XPATH_ELEMENT(A) *[local-name()=(A)]
#define DRD_XML_SLASH /
#define DRD_XML_XPATH_DRUMKIT_BASE_TAG DR_XML_XPATH_ELEMENT('drumkit_info')
#define DRD_XML_XPATH_DRUMKIT_NAME_TAG DR_XML_XPATH_ELEMENT('name')
#define DRD_XML_XPATH_DRUMKIT_INFO_TAG DR_XML_XPATH_ELEMENT('info')
#define DRD_XML_XPATH_DRUMKIT_INSTRUMENTLIST_TAG DR_XML_XPATH_ELEMENT('instrumentList')
#define DRD_XML_XPATH_DRUMKIT_INSTRUMENT_TAG DR_XML_XPATH_ELEMENT('instrument')
#define DRD_XML_XPATH_DRUMKIT_ID_TAG DR_XML_XPATH_ELEMENT('id')
#define DRD_XML_XPATH_DRUMKIT_GAIN_TAG DR_XML_XPATH_ELEMENT('gain')
#define DRD_XML_XPATH_DRUMKIT_PAN_LEFT_TAG DR_XML_XPATH_ELEMENT('pan_L')
#define DRD_XML_XPATH_DRUMKIT_PAN_RIGHT_TAG DR_XML_XPATH_ELEMENT('pan_R')
#define DRD_XML_XPATH_DRUMKIT_INSTRUMENTCOMPONENT_TAG DR_XML_XPATH_ELEMENT('instrumentComponent')
#define DRD_XML_XPATH_DRUMKIT_LAYER_TAG DR_XML_XPATH_ELEMENT('layer')
#define DRD_XML_XPATH_DRUMKIT_FILENAME_TAG DR_XML_XPATH_ELEMENT('filename')
#define DRD_XML_XPATH_DRUMKIT_MIN_TAG DR_XML_XPATH_ELEMENT('min')
#define DRD_XML_XPATH_DRUMKIT_MAX_TAG DR_XML_XPATH_ELEMENT('max')
#define DRD_XML_XPATH_DRUMKIT_PITCH_TAG DR_XML_XPATH_ELEMENT('pitch')
#define DRD_XML_XPATH_DRUMKIT_BASE_STR DR_TAG(/DRD_XML_XPATH_DRUMKIT_BASE_TAG)
#define DRD_XML_XPATH_DRUMKIT_NAME_STR DR_TAG(/DRD_XML_XPATH_DRUMKIT_NAME_TAG)
#define DRD_XML_XPATH_DRUMKIT_INFO_STR DR_TAG(/DRD_XML_XPATH_DRUMKIT_INFO_TAG)
#define DRD_XML_XPATH_DRUMKIT_ID_STR DR_TAG(/DRD_XML_XPATH_DRUMKIT_ID_TAG)
#define DRD_XML_XPATH_DRUMKIT_GAIN_STR DR_TAG(/DRD_XML_XPATH_DRUMKIT_GAIN_TAG)
#define DRD_XML_XPATH_DRUMKIT_PAN_LEFT_STR DR_TAG(/DRD_XML_XPATH_DRUMKIT_PAN_LEFT_TAG)
#define DRD_XML_XPATH_DRUMKIT_PAN_RIGHT_STR DR_TAG(/DRD_XML_XPATH_DRUMKIT_PAN_RIGHT_TAG)
#define DRD_XML_XPATH_DRUMKIT_FILENAME_STR DR_TAG(/DRD_XML_XPATH_DRUMKIT_FILENAME_TAG)
#define DRD_XML_XPATH_DRUMKIT_MIN_STR DR_TAG(/DRD_XML_XPATH_DRUMKIT_MIN_TAG)
#define DRD_XML_XPATH_DRUMKIT_MAX_STR DR_TAG(/DRD_XML_XPATH_DRUMKIT_MAX_TAG)
#define DRD_XML_XPATH_DRUMKIT_PITCH_STR DR_TAG(/DRD_XML_XPATH_DRUMKIT_PITCH_TAG)
#define DRD_XML_XPATH_DRUMKIT_KIT_NAME_FULL DR_TAG(/DRD_XML_XPATH_DRUMKIT_BASE_TAG/DRD_XML_XPATH_DRUMKIT_NAME_TAG)
#define DRD_XML_XPATH_DRUMKIT_KIT_INFO_FULL DR_TAG(/DRD_XML_XPATH_DRUMKIT_BASE_TAG/DRD_XML_XPATH_DRUMKIT_INFO_TAG)
#define DRD_XML_XPATH_DRUMKIT_INSTRUMENT_FULL DR_TAG(/DRD_XML_XPATH_DRUMKIT_BASE_TAG/DRD_XML_XPATH_DRUMKIT_INSTRUMENTLIST_TAG/DRD_XML_XPATH_DRUMKIT_INSTRUMENT_TAG[%i])
#define DRD_XML_XPATH_DRUMKIT_LAYER_FULL2 DR_TAG(/DRD_XML_XPATH_DRUMKIT_BASE_TAG/DRD_XML_XPATH_DRUMKIT_INSTRUMENTLIST_TAG/DRD_XML_XPATH_DRUMKIT_INSTRUMENT_TAG[%i]/DRD_XML_XPATH_DRUMKIT_INSTRUMENTCOMPONENT_TAG/DRD_XML_XPATH_DRUMKIT_LAYER_TAG[%i])
#define DRD_XML_XPATH_DRUMKIT_LAYER_FULL DR_TAG(/DRD_XML_XPATH_DRUMKIT_BASE_TAG/DRD_XML_XPATH_DRUMKIT_INSTRUMENTLIST_TAG/DRD_XML_XPATH_DRUMKIT_INSTRUMENT_TAG[%i]DRD_XML_SLASH/DRD_XML_XPATH_DRUMKIT_LAYER_TAG[%i])
/*---------------------------------------------------------------------------------*/
/* LibSamplerate */
/*---------------------------------------------------------------------------------*/
// Quality of conversion for libsamplerate.
// See http://www.mega-nerd.com/SRC/api_misc.html#Converters
// for info about availble qualities
//#define RATE_CONV_QUALITY SRC_SINC_BEST_QUALITY
#define DRD_RATE_CONV_QUALITY SRC_SINC_MEDIUM_QUALITY
/*---------------------------------------------------------------------------------*/
/* XML_Query */
/*---------------------------------------------------------------------------------*/
#define DRD_XML_QUERY_VALUE_UNKNOWN (short) 0
#define DRD_XML_QUERY_VALUE_STRING (short) 1
#define DRD_XML_QUERY_VALUE_INT (short) 2
#define DRD_XML_QUERY_VALUE_LONG (short) 3
#define DRD_XML_QUERY_VALUE_LONGLONG (short) 4
#define DRD_XML_QUERY_VALUE_FLOAT (short) 5
#define DRD_XML_QUERY_VALUE_DOUBLE (short) 6
typedef struct DRT_XML_Query
{
char *Query_Name;
char *XPath_Query;
short Value_Type;
long Value_Offset;
short Value_Len;
} DRT_XML_Query;
DRT_XML_Query DRG_XML_Query_Tab_Layer[] =
{
{ "File Name", DRD_XML_XPATH_DRUMKIT_FILENAME_STR, DRD_XML_QUERY_VALUE_STRING, offsetof( DRT_Layer, FileName), DRD_FILENAME_LEN },
{ "Min", DRD_XML_XPATH_DRUMKIT_MIN_STR, DRD_XML_QUERY_VALUE_DOUBLE, offsetof( DRT_Layer, Min), 0 },
{ "Max", DRD_XML_XPATH_DRUMKIT_MAX_STR, DRD_XML_QUERY_VALUE_DOUBLE, offsetof( DRT_Layer, Max), 0 },
{ "Gain", DRD_XML_XPATH_DRUMKIT_GAIN_STR, DRD_XML_QUERY_VALUE_DOUBLE, offsetof( DRT_Layer, Gain), 0 },
{ "Pitch", DRD_XML_XPATH_DRUMKIT_PITCH_STR, DRD_XML_QUERY_VALUE_DOUBLE, offsetof( DRT_Layer, Pitch), 0 },
{ NULL, NULL, DRD_XML_QUERY_VALUE_UNKNOWN, 0, 0 }
};
DRT_XML_Query DRG_XML_Query_Tab_Instrument[] =
{
{ "Id", DRD_XML_XPATH_DRUMKIT_ID_STR, DRD_XML_QUERY_VALUE_LONG, offsetof( DRT_Instrument, Id), 0 },
{ "Name", DRD_XML_XPATH_DRUMKIT_NAME_STR, DRD_XML_QUERY_VALUE_STRING, offsetof( DRT_Instrument, Name), DRD_NAME_LEN },
{ "Gain", DRD_XML_XPATH_DRUMKIT_GAIN_STR, DRD_XML_QUERY_VALUE_DOUBLE, offsetof( DRT_Instrument, Gain), 0 },
{ "Pan_Left", DRD_XML_XPATH_DRUMKIT_PAN_LEFT_STR, DRD_XML_QUERY_VALUE_DOUBLE, offsetof( DRT_Instrument, Pan_Left), 0 },
{ "Pan_Right", DRD_XML_XPATH_DRUMKIT_PAN_RIGHT_STR, DRD_XML_QUERY_VALUE_DOUBLE, offsetof( DRT_Instrument, Pan_Right), 0 },
{ NULL, NULL, DRD_XML_QUERY_VALUE_UNKNOWN, 0, 0 }
};
DRT_XML_Query DRG_XML_Query_Tab_Kit[] =
{
{ "File", DRD_XML_XPATH_DRUMKIT_NAME_STR, DRD_XML_QUERY_VALUE_STRING, offsetof( DRT_Kit, Name), DRD_NAME_LEN },
{ "Desc", DRD_XML_XPATH_DRUMKIT_INFO_STR, DRD_XML_QUERY_VALUE_STRING, offsetof( DRT_Kit, Desc), DRD_DESC_LEN },
{ NULL, NULL, DRD_XML_QUERY_VALUE_UNKNOWN, 0, 0 }
};
/*----------------------------------------------------------------------------*/
/* Private Prototypes */
/*----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------*/
/* DS Managers */
/*---------------------------------------------------------------------------------*/
NDT_Status DR_Layer_Manager( NDT_Root *, NDT_Index_Id, NDT_Node *, NDT_Command, va_list *);
NDT_Status DR_Instrument_Manager( NDT_Root *, NDT_Index_Id, NDT_Node *, NDT_Command, va_list *);
NDT_Status DR_Kit_Manager( NDT_Root *, NDT_Index_Id, NDT_Node *, NDT_Command, va_list *);
/*---------------------------------------------------------------------------------*/
/* DR_Layer_Add */
/*---------------------------------------------------------------------------------*/
DRT_Status DR_Layer_Add( DRT_Layer **, NDT_Root *, DRT_Layer *);
/*---------------------------------------------------------------------------------*/
/* DR_Layer_Sample_Load */
/*---------------------------------------------------------------------------------*/
DRT_Status DR_Layer_Sample_Load( DRT_Layer *);
/*---------------------------------------------------------------------------------*/
/* DR_Layer_Sample_UnLoad */
/*---------------------------------------------------------------------------------*/
DRT_Status DR_Layer_Sample_UnLoad( DRT_Layer *);
/*----------------------------------------------------------------------------*/
/* DR_Instrument_Add */
/*----------------------------------------------------------------------------*/
DRT_Status DR_Instrument_Add( DRT_Instrument **, NDT_Root *, DRT_Instrument *);
/*---------------------------------------------------------------------------------*/
/* DR_Instrument_Dump */
/*---------------------------------------------------------------------------------*/
DRT_Status DR_Instrument_Dump( DRT_Instrument *, long);
/*----------------------------------------------------------------------------*/
/* DR_Instrument_Sample_Load */
/*----------------------------------------------------------------------------*/
DRT_Status DR_Instrument_Sample_Load( DRT_Instrument *);
/*----------------------------------------------------------------------------*/
/* DR_Instrument_Sample_Unload */
/*----------------------------------------------------------------------------*/
DRT_Status DR_Instrument_Sample_UnLoad( DRT_Instrument *);
/*----------------------------------------------------------------------------*/
/* DR_Kit_Add */
/*----------------------------------------------------------------------------*/
DRT_Status DR_Kit_Add( DRT_Kit **, NDT_Root *, DRT_Kit *);
/*---------------------------------------------------------------------------------*/
/* DR_XML_Node_Exist */
/*---------------------------------------------------------------------------------*/
DRT_Status DR_XML_Node_Exist( xmlDocPtr, xmlXPathContextPtr, char *);
/*---------------------------------------------------------------------------------*/
/* DR_XML_Query_Tab_Exec */
/*---------------------------------------------------------------------------------*/
DRT_Status DR_XML_Query_Tab_Exec( void *, xmlDocPtr, xmlXPathContextPtr, char *, DRT_XML_Query *);
/*---------------------------------------------------------------------------------*/
/* DR_XML_Value_Get */
/*---------------------------------------------------------------------------------*/
DRT_Status DR_XML_Value_Get( char *, long, xmlDocPtr, xmlXPathContextPtr, char *, char *);
/*----------------------------------------------------------------------------*/
/* DR_Task_Tread */
/*----------------------------------------------------------------------------*/
static void *DR_Task_Thread();
# else // ifdef _DATASTRUCT_C_
# endif // ifdef _DATASTRUCT_C_
/*----------------------------------------------------------------------------*/
#endif // ifndef _DATASTRUCT_H_