diff --git a/datastruct.c b/datastruct.c index 2e11d21..1d1e9cb 100644 --- a/datastruct.c +++ b/datastruct.c @@ -2537,7 +2537,7 @@ static void *DR_Task_Thread( DRT_Base *Base_Ptr) case DRD_TASK_CMD_KIT_LOAD: { Base_Ptr->Task_Tab[task_id].Status = DRD_TASK_STATUS_RUNNING; - Base_Ptr->Task_Count_Waiting--; +// Base_Ptr->Task_Count_Waiting--; pthread_mutex_unlock( &( Base_Ptr->Task_Mutex)); @@ -2570,7 +2570,7 @@ static void *DR_Task_Thread( DRT_Base *Base_Ptr) default: { - printf( "DR_Task_Thrad called with an undefined command [%d] [%s]\n", Base_Ptr->Task_Tab[task_id].Command, DR_TASK_CMD_ASCII_GET( &(Base_Ptr->Task_Tab[task_id]))); + printf( "DR_Task_Thread called with an undefined command [%d] [%s]\n", Base_Ptr->Task_Tab[task_id].Command, DR_TASK_CMD_ASCII_GET( &(Base_Ptr->Task_Tab[task_id]))); } } @@ -2624,10 +2624,12 @@ DRT_Status DR_Task_Id_Run( DRT_Task_Id Task_Id, DRT_Base *Base_Ptr, DRT_Task_ { Base_Ptr->Task_Tab[Task_Id].Command = Command; Base_Ptr->Task_Tab[Task_Id].Target_Ptr = Target_Ptr; + Base_Ptr->Task_Count_Waiting--; pthread_cond_signal( &( Base_Ptr->Task_Tab[Task_Id].Cond)); // pthread_mutex_unlock( &( Base_Ptr->Task_Mutex)); + status = DRS_OK; } @@ -2686,6 +2688,65 @@ DRT_Status DR_Task_Run( DRT_Base *Base_Ptr, DRT_Task_Command Command, void * DRT_Boolean found = DRD_FALSE; + // fprintf( stderr, "Task Run: Called!\n"); + + Base_Ptr->Task_Count_Run++; + + while( found != DRD_TRUE) + { + pthread_mutex_lock( &( Base_Ptr->Task_Mutex)); + + if( Base_Ptr->Task_Count_Waiting > 0) + { +// while( ( task_id < Base_Ptr->Task_Number) && ( found != DRD_TRUE)) + for( task_id = 0; ( task_id < Base_Ptr->Task_Number) && ( found != DRD_TRUE); task_id++) + { + if( DR_TASK_STATUS_WAITING_IS( &( Base_Ptr->Task_Tab[task_id])) && DR_TASK_CMD_NONE_IS( &( Base_Ptr->Task_Tab[task_id]))) + { +// pthread_mutex_unlock( &( Base_Ptr->Task_Mutex)); +// fprintf( stderr, "Task Run: Found (%d)!\n", task_id); + + if( DR_Task_Id_Run( task_id, Base_Ptr, Command, Target_Ptr) != DRS_OK) + { + fprintf( stderr, "Can't run task !\n"); + + pthread_mutex_unlock( &( Base_Ptr->Task_Mutex)); + return( DRS_KO); + } + + pthread_mutex_unlock( &( Base_Ptr->Task_Mutex)); + found = DRD_TRUE; + } + } + + if( found != DRD_TRUE) + { + DR_Tasks_Dump( Base_Ptr); + Base_Ptr->Task_Count_FakeWU++; + } + } + + if( found != DRD_TRUE) + { +// fprintf( stderr, "Task Run: Sleeping!\n"); + + Base_Ptr->Task_Count_Sleep++; + + pthread_cond_wait( &( Base_Ptr->Task_Cond), &( Base_Ptr->Task_Mutex)); + pthread_mutex_unlock( &( Base_Ptr->Task_Mutex)); + } + } + + return( DRS_OK); +} + +/* +DRT_Status DR_Task_Run( DRT_Base *Base_Ptr, DRT_Task_Command Command, void *Target_Ptr) +{ + DRT_Task_Id task_id; + DRT_Boolean found = DRD_FALSE; + + // fprintf( stderr, "Task Run: Called!\n"); Base_Ptr->Task_Count_Run++; @@ -2731,7 +2792,7 @@ DRT_Status DR_Task_Run( DRT_Base *Base_Ptr, DRT_Task_Command Command, void * return( DRS_OK); } - +*/ @@ -2786,7 +2847,7 @@ DRT_Status DR_Tasks_Dump( DRT_Base *Base_Ptr) DRT_Task_Id task_id; - pthread_mutex_lock( &( Base_Ptr->Task_Mutex)); +// pthread_mutex_lock( &( Base_Ptr->Task_Mutex)); fprintf( stderr, "Task Number: (%d) Task Load Layer: [%s] Task Load Instrument: [%s] Task Load Kit: [%s] Task Sync Kit: [%s] Task Sync Kits: [%s]\n", Base_Ptr->Task_Number, DR_BOOLEAN_VALUE_ASCII_GET( Base_Ptr->Task_Load_Layer_Flag), DR_BOOLEAN_VALUE_ASCII_GET( Base_Ptr->Task_Load_Instrument_Flag), DR_BOOLEAN_VALUE_ASCII_GET(Base_Ptr->Task_Load_Kit_Flag), DR_BOOLEAN_VALUE_ASCII_GET(Base_Ptr->Task_Sync_Kit_Flag), DR_BOOLEAN_VALUE_ASCII_GET(Base_Ptr->Task_Sync_Kits_Flag)); @@ -2798,9 +2859,9 @@ DRT_Status DR_Tasks_Dump( DRT_Base *Base_Ptr) task_id, DR_TASK_STATUS_ASCII_GET( &(Base_Ptr->Task_Tab[task_id])), (long)( Base_Ptr->Task_Tab[task_id].Thread), DR_TASK_CMD_ASCII_GET( &( Base_Ptr->Task_Tab[task_id])), Base_Ptr->Task_Tab[task_id].Target_Ptr, Base_Ptr->Task_Tab[task_id].Count); } - fprintf( stderr, "Task Count Waiting: (%ld) Task Count Run: (%ld) Task Count Sleep: (%ld)\n", Base_Ptr->Task_Count_Waiting, Base_Ptr->Task_Count_Run, Base_Ptr->Task_Count_Sleep); + fprintf( stderr, "Task Count Waiting: (%ld) Task Count Run: (%ld) Task Count Sleep: (%ld) Task Count FakeWU: (%ld)\n", Base_Ptr->Task_Count_Waiting, Base_Ptr->Task_Count_Run, Base_Ptr->Task_Count_Sleep, Base_Ptr->Task_Count_FakeWU); - pthread_mutex_unlock( &( Base_Ptr->Task_Mutex)); +// pthread_mutex_unlock( &( Base_Ptr->Task_Mutex)); return( DRS_OK); } @@ -2832,6 +2893,8 @@ DRT_Status DR_DataStruct_Init( DRT_Base *Base_Ptr, DRT_SampleRate SampleRate, } Base_Ptr->SampleRate = SampleRate; + Base_Ptr->Velocity_Ignore = DRD_VELOCITY_IGNORE_DEFAULT; + Base_Ptr->Note_Off_Ignore = DRD_NOTE_OFF_IGNORE_DEFAULT; Base_Ptr->Task_Number = Task_Number; Base_Ptr->Task_Load_Layer_Flag = DRD_TASK_LOAD_LAYER_DEFAULT; Base_Ptr->Task_Load_Instrument_Flag = DRD_TASK_LOAD_INSTRUMENT_DEFAULT; @@ -2841,6 +2904,7 @@ DRT_Status DR_DataStruct_Init( DRT_Base *Base_Ptr, DRT_SampleRate SampleRate, Base_Ptr->Task_Count_Waiting = 0L; Base_Ptr->Task_Count_Run = 0L; Base_Ptr->Task_Count_Sleep = 0L; + Base_Ptr->Task_Count_FakeWU = 0L; if( ( Base_Ptr->Task_Tab = malloc( sizeof( DRT_Task) * Task_Number)) == NULL) { diff --git a/datastruct.h b/datastruct.h index 0c4a8bd..4af4684 100644 --- a/datastruct.h +++ b/datastruct.h @@ -160,6 +160,10 @@ typedef struct DRT_Base NDT_Root *Kit_DS_Ptr; DRT_SampleRate SampleRate; + //Config + bool Velocity_Ignore; + bool Note_Off_Ignore; + DRT_Task_Id Task_Number; DRT_Boolean Task_Load_Layer_Flag; DRT_Boolean Task_Load_Instrument_Flag; @@ -172,6 +176,8 @@ typedef struct DRT_Base DRT_Task_Id Task_Count_Waiting; long Task_Count_Run; long Task_Count_Sleep; + long Task_Count_FakeWU; + } DRT_Base; diff --git a/drummer.c b/drummer.c index 527f4bf..7b24d9c 100644 --- a/drummer.c +++ b/drummer.c @@ -113,7 +113,7 @@ int main( int argc, char **argv) DR_Kits_Sample_Load( &base); /* - for( i = 0; i < 264; i++) + for( i = 0; i < 1; i++) { if( ( status = DR_Kit_Logical_Id_Find( &kit_ptr, base.Kit_DS_Ptr, i)) == DRS_OK) { @@ -121,7 +121,7 @@ int main( int argc, char **argv) DR_Kit_Sample_Load( kit_ptr); } } -*/ +*/ /* if( DR_Task_Wait( &base) != DRS_OK) { diff --git a/drummer.h b/drummer.h index 51d865a..283745d 100644 --- a/drummer.h +++ b/drummer.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -57,6 +58,10 @@ typedef short DRT_Boolean; #define DRD_SAMPLE_RATE_DEFAULT 44100 + +#define DRD_VELOCITY_IGNORE_DEFAULT false +#define DRD_NOTE_OFF_IGNORE_DEFAULT false + #define DRD_THREAD_NUMBER_DEFAULT 16L #define DRD_TASK_LOAD_LAYER_DEFAULT DRD_TRUE #define DRD_TASK_LOAD_INSTRUMENT_DEFAULT DRD_FALSE diff --git a/lv2_plugin.c b/lv2_plugin.c index 0271153..797d790 100644 --- a/lv2_plugin.c +++ b/lv2_plugin.c @@ -49,6 +49,7 @@ DRT_Status DR_LV2_Kit_Sample_Load( DRT_LV2_Base *LV2_Base_Ptr, DRT_Kit *Kit_P LV2_Base_Ptr->Samples[sample_id].Layer_Ptr = 0; LV2_Base_Ptr->Samples[sample_id].Data_Ptr = NULL; LV2_Base_Ptr->Samples[sample_id].Data_Offset = 0; + LV2_Base_Ptr->Samples[sample_id].Sustained = false; if( cur_node_ptr == NULL) { @@ -413,8 +414,9 @@ static inline void DR_Sample_Trigger( DRT_LV2_Base *LV2_Base_Ptr, int Sample_ LV2_Base_Ptr->Samples[Sample_Id].Active = 1; LV2_Base_Ptr->Samples[Sample_Id].Offset = 0; - LV2_Base_Ptr->Samples[Sample_Id].Velocity = LV2_Base_Ptr->Ignore_Velocity ? 1.0f : ( (float)Data[2]) / DRD_VELOCITY_MAX; + LV2_Base_Ptr->Samples[Sample_Id].Velocity = LV2_Base_Ptr->Base.Velocity_Ignore ? 1.0f : ( (float)Data[2]) / DRD_VELOCITY_MAX; LV2_Base_Ptr->Samples[Sample_Id].Data_Offset = Offset; + LV2_Base_Ptr->Samples[Sample_Id].Sustained = false; if( LV2_Base_Ptr->Samples[Sample_Id].Instrument_Ptr->Layer_DS_Ptr->Index_Tab[NDD_INDEX_PRIMARY].Node_Number > 0) { @@ -445,7 +447,16 @@ static inline void DR_Sample_Untrigger( DRT_LV2_Base *LV2_Base_Ptr, int Sampl { pthread_mutex_lock( &( LV2_Base_Ptr->Load_Mutex)); - fprintf( stderr, "UnTrigger Sample: Id: (%d) Offset: (%d)\n", Sample_Id, Offset); + if( LV2_Base_Ptr->Sustain == true) + { + fprintf( stderr, "Sustains Sample: Id: (%d) Offset: (%d)\n", Sample_Id, Offset); + + LV2_Base_Ptr->Samples[Sample_Id].Sustained = true; + } + else + { + + fprintf( stderr, "UnTrigger Sample: Id: (%d) Offset: (%d)\n", Sample_Id, Offset); /* if (nn >= 0 && nn < drmr->num_samples) { @@ -458,8 +469,10 @@ static inline void DR_Sample_Untrigger( DRT_LV2_Base *LV2_Base_Ptr, int Sampl drmr->samples[nn].dataoffset = offset; } */ - LV2_Base_Ptr->Samples[Sample_Id].Active = 0; - LV2_Base_Ptr->Samples[Sample_Id].Data_Offset = Offset; + LV2_Base_Ptr->Samples[Sample_Id].Active = 0; + LV2_Base_Ptr->Samples[Sample_Id].Data_Offset = Offset; + LV2_Base_Ptr->Samples[Sample_Id].Sustained = false; + } pthread_mutex_unlock( &( LV2_Base_Ptr->Load_Mutex)); } @@ -468,6 +481,28 @@ static inline void DR_Sample_Untrigger( DRT_LV2_Base *LV2_Base_Ptr, int Sampl +/*----------------------------------------------------------------------------*/ +/* */ +/*----------------------------------------------------------------------------*/ + +static inline void DR_Sample_UnSustain( DRT_LV2_Base *LV2_Base_Ptr, uint32_t Offset) +{ + int sample_id; + + + for( sample_id =0; sample_id < DRD_PORT_NUMBER_MAX; sample_id++) + { + if( LV2_Base_Ptr->Samples[sample_id].Sustained) + { + DR_Sample_Untrigger( LV2_Base_Ptr, sample_id, Offset); + } + } +} + + + + + /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ @@ -502,12 +537,11 @@ static LV2_Handle DR_LV2_Instantiate( const LV2_Descriptor *LV2_Descriptor lv2_base_ptr->Current_Path = NULL; lv2_base_ptr->CurReq = -1; - lv2_base_ptr->Ignore_Velocity = false; - lv2_base_ptr->Ignore_Note_Off = true; -// lv2_base_ptr->Ignore_Note_Off = false; lv2_base_ptr->Channel_Nb = 0; lv2_base_ptr->Zero_Position = 0; + lv2_base_ptr->Sustain = false; + lv2_base_ptr->Sample_Number = 0; while( *LV2_Features_Ptr != NULL) @@ -761,7 +795,7 @@ static void DR_LV2_Run( LV2_Handle Instance_Ptr, uint32_t N_Samples) { case 8: // Note Off { - if( !lv2_base_ptr->Ignore_Note_Off) + if( !lv2_base_ptr->Base.Note_Off_Ignore) { nn = data[1]; nn -= basenote; @@ -805,6 +839,27 @@ static void DR_LV2_Run( LV2_Handle Instance_Ptr, uint32_t N_Samples) break; } + case 64: // Sustain + { + fprintf( stderr, "Sustain: (%d)!\n", value); + + if( value == 127) + { + lv2_base_ptr->Sustain = true; + } + else + { + lv2_base_ptr->Sustain = false; + } + + if( !( lv2_base_ptr->Sustain)) + { + DR_Sample_UnSustain( lv2_base_ptr, offset); + } + + break; + } + default: { fprintf( stderr, "Unhandled controler: (%d) value: (%d)!\n", controler, value); @@ -919,10 +974,10 @@ static void DR_LV2_Run( LV2_Handle Instance_Ptr, uint32_t N_Samples) } if( ignvel) - lv2_base_ptr->Ignore_Velocity = ((const LV2_Atom_Bool*)ignvel)->body; + lv2_base_ptr->Base.Velocity_Ignore = ((const LV2_Atom_Bool*)ignvel)->body; if( ignno) - lv2_base_ptr->Ignore_Note_Off = ((const LV2_Atom_Bool*)ignno)->body; + lv2_base_ptr->Base.Note_Off_Ignore = ((const LV2_Atom_Bool*)ignno)->body; if( channel_nb) lv2_base_ptr->Channel_Nb = ((const LV2_Atom_Int*)channel_nb)->body; diff --git a/lv2_plugin.h b/lv2_plugin.h index 4a0a87d..cbe58fb 100644 --- a/lv2_plugin.h +++ b/lv2_plugin.h @@ -233,9 +233,9 @@ typedef struct char Active; uint32_t Offset; float Velocity; + bool Sustained; } DRT_Sample; - typedef struct DRT_LV2_Base { DRT_Base Base; @@ -252,14 +252,14 @@ typedef struct DRT_LV2_Base // params int Channel; - bool Ignore_Velocity; - bool Ignore_Note_Off; int Channel_Nb; int Zero_Position; float **Gains; float **Pans; float *BaseNote; + bool Sustain; + // URIs LV2_URID_Map *Map_Ptr; DRT_Drummer_URIS URIS; @@ -448,6 +448,16 @@ static inline void DR_Sample_Untrigger( DRT_LV2_Base *, int, uint32_t); +/*----------------------------------------------------------------------------*/ +/* */ +/*----------------------------------------------------------------------------*/ + +static inline void DR_Sample_UnSustain( DRT_LV2_Base *, uint32_t); + + + + + /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/