/* booster-simple.c */ /* Includes: */ #include #include #include #include "ladspa.h" /* The port numbers for the plugin: */ #define BOOSTER_GAIN 0 #define BOOSTER_INPUT1 1 #define BOOSTER_OUTPUT1 2 #define BOOSTER_INPUT2 3 #define BOOSTER_OUTPUT2 4 #define MAX_GAIN 96 /* The structure used to hold port connection information and state */ typedef struct { LADSPA_Data * m_pfGainValue; LADSPA_Data * m_pfInputBuffer1; LADSPA_Data * m_pfOutputBuffer1; LADSPA_Data * m_pfInputBuffer2; LADSPA_Data * m_pfOutputBuffer2; } Booster; /* Construct a new plugin instance. */ LADSPA_Handle instantiateBooster(const LADSPA_Descriptor * Descriptor, unsigned long SampleRate) { return malloc(sizeof(Booster)); } /* Connect a port to a data location. */ void connectPortToBooster(LADSPA_Handle Instance, unsigned long Port, LADSPA_Data * DataLocation) { Booster * psBooster; psBooster = (Booster *)Instance; switch (Port) { case BOOSTER_GAIN: psBooster->m_pfGainValue = DataLocation; break; case BOOSTER_INPUT1: psBooster->m_pfInputBuffer1 = DataLocation; break; case BOOSTER_OUTPUT1: psBooster->m_pfOutputBuffer1 = DataLocation; break; case BOOSTER_INPUT2: psBooster->m_pfInputBuffer2 = DataLocation; break; case BOOSTER_OUTPUT2: psBooster->m_pfOutputBuffer2 = DataLocation; break; } } /* Booster mono */ void runMonoBooster(LADSPA_Handle Instance, unsigned long SampleCount) { LADSPA_Data * pfInput; LADSPA_Data * pfOutput; LADSPA_Data fGain; LADSPA_Data inputData; LADSPA_Data boosterGain; Booster * psBooster; unsigned long lSampleIndex; psBooster = (Booster *)Instance; fGain = *(psBooster->m_pfGainValue); boosterGain = powf( 10, fGain/20 ); if( boosterGain < 0) boosterGain = 0; pfInput = psBooster->m_pfInputBuffer1; pfOutput = psBooster->m_pfOutputBuffer1; for (lSampleIndex = 0; lSampleIndex < SampleCount; lSampleIndex++){ inputData = *(pfInput++) * boosterGain; if ( inputData > 1.0f ) { *(pfOutput++) = 1.0f; } if ( inputData < -1.0f ) { *(pfOutput++) = -1.0f; } if( inputData <= 1.0f && inputData >= -1.0f ){ *(pfOutput++) = inputData; } } } /* Booster stereo */ void runStereoBooster(LADSPA_Handle Instance, unsigned long SampleCount) { LADSPA_Data * pfInput; LADSPA_Data * pfOutput; LADSPA_Data fGain; LADSPA_Data inputData; LADSPA_Data boosterGain; Booster * psBooster; unsigned long lSampleIndex; psBooster = (Booster *)Instance; fGain = *(psBooster->m_pfGainValue); boosterGain = powf( 10, fGain/20 ); if( boosterGain < 0) boosterGain = 0; pfInput = psBooster->m_pfInputBuffer1; pfOutput = psBooster->m_pfOutputBuffer1; for (lSampleIndex = 0; lSampleIndex < SampleCount; lSampleIndex++){ inputData = *(pfInput++) * boosterGain; if ( inputData > 1.0f ) { *(pfOutput++) = 1.0f; } if ( inputData < -1.0f ) { *(pfOutput++) = -1.0f; } if( inputData <= 1.0f && inputData >= -1.0f ){ *(pfOutput++) = inputData; } } pfInput = psBooster->m_pfInputBuffer2; pfOutput = psBooster->m_pfOutputBuffer2; for (lSampleIndex = 0; lSampleIndex < SampleCount; lSampleIndex++){ inputData = *(pfInput++) * boosterGain; if ( inputData > 1.0f ) { *(pfOutput++) = 1.0f; } if ( inputData < -1.0f ) { *(pfOutput++) = -1.0f; } if( inputData <= 1.0f && inputData >= -1.0f ){ *(pfOutput++) = inputData; } } } /* Booster cleanup */ void cleanupBooster(LADSPA_Handle Instance) { Booster * psBooster; psBooster = (Booster *)Instance; free(psBooster); } LADSPA_Descriptor * g_psMonoDescriptor = NULL; LADSPA_Descriptor * g_psStereoDescriptor = NULL; /* Booster _init() function */ void _init() { char ** pcPortNames; LADSPA_PortDescriptor * piPortDescriptors; LADSPA_PortRangeHint * psPortRangeHints; g_psMonoDescriptor = (LADSPA_Descriptor *)malloc(sizeof(LADSPA_Descriptor)); g_psStereoDescriptor = (LADSPA_Descriptor *)malloc(sizeof(LADSPA_Descriptor)); if (g_psMonoDescriptor) { g_psMonoDescriptor->UniqueID = 101; g_psMonoDescriptor->Label = strdup("BoosterMono"); g_psMonoDescriptor->Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE; g_psMonoDescriptor->Name = strdup("Booster (mono)"); g_psMonoDescriptor->Maker = strdup("Artemiy Pavlov"); g_psMonoDescriptor->Copyright = strdup("(c)2005 SineShine"); g_psMonoDescriptor->PortCount = 3; piPortDescriptors = (LADSPA_PortDescriptor *)calloc(3, sizeof(LADSPA_PortDescriptor)); g_psMonoDescriptor->PortDescriptors = (const LADSPA_PortDescriptor *)piPortDescriptors; piPortDescriptors[BOOSTER_GAIN] = LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL; piPortDescriptors[BOOSTER_INPUT1] = LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO; piPortDescriptors[BOOSTER_OUTPUT1] = LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO; pcPortNames = (char **)calloc(3, sizeof(char *)); g_psMonoDescriptor->PortNames = (const char **)pcPortNames; pcPortNames[BOOSTER_GAIN] = strdup("Gain (dB)"); pcPortNames[BOOSTER_INPUT1] = strdup("Input"); pcPortNames[BOOSTER_OUTPUT1] = strdup("Output"); psPortRangeHints = ((LADSPA_PortRangeHint *) calloc(3, sizeof(LADSPA_PortRangeHint))); g_psMonoDescriptor->PortRangeHints = (const LADSPA_PortRangeHint *)psPortRangeHints; psPortRangeHints[BOOSTER_GAIN].HintDescriptor = (LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_INTEGER | LADSPA_HINT_DEFAULT_0); psPortRangeHints[BOOSTER_GAIN].LowerBound = 0; psPortRangeHints[BOOSTER_GAIN].UpperBound = MAX_GAIN; psPortRangeHints[BOOSTER_INPUT1].HintDescriptor = 0; psPortRangeHints[BOOSTER_OUTPUT1].HintDescriptor = 0; g_psMonoDescriptor->instantiate = instantiateBooster; g_psMonoDescriptor->connect_port = connectPortToBooster; g_psMonoDescriptor->activate = NULL; g_psMonoDescriptor->run = runMonoBooster; g_psMonoDescriptor->run_adding = NULL; g_psMonoDescriptor->set_run_adding_gain = NULL; g_psMonoDescriptor->deactivate = NULL; g_psMonoDescriptor->cleanup = cleanupBooster; } if (g_psStereoDescriptor) { g_psStereoDescriptor->UniqueID = 102; g_psStereoDescriptor->Label = strdup("BoosterStereo"); g_psStereoDescriptor->Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE; g_psStereoDescriptor->Name = strdup("Booster (stereo)"); g_psStereoDescriptor->Maker = strdup("Artemiy Pavlov"); g_psStereoDescriptor->Copyright = strdup("(c)2005 SineShine"); g_psStereoDescriptor->PortCount = 5; piPortDescriptors = (LADSPA_PortDescriptor *)calloc(5, sizeof(LADSPA_PortDescriptor)); g_psStereoDescriptor->PortDescriptors = (const LADSPA_PortDescriptor *)piPortDescriptors; piPortDescriptors[BOOSTER_GAIN] = LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL; piPortDescriptors[BOOSTER_INPUT1] = LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO; piPortDescriptors[BOOSTER_OUTPUT1] = LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO; piPortDescriptors[BOOSTER_INPUT2] = LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO; piPortDescriptors[BOOSTER_OUTPUT2] = LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO; pcPortNames = (char **)calloc(5, sizeof(char *)); g_psStereoDescriptor->PortNames = (const char **)pcPortNames; pcPortNames[BOOSTER_GAIN] = strdup("Gain (dB)"); pcPortNames[BOOSTER_INPUT1] = strdup("Input L"); pcPortNames[BOOSTER_OUTPUT1] = strdup("Output L"); pcPortNames[BOOSTER_INPUT2] = strdup("Input R"); pcPortNames[BOOSTER_OUTPUT2] = strdup("Output R"); psPortRangeHints = ((LADSPA_PortRangeHint *) calloc(5, sizeof(LADSPA_PortRangeHint))); g_psStereoDescriptor->PortRangeHints = (const LADSPA_PortRangeHint *)psPortRangeHints; psPortRangeHints[BOOSTER_GAIN].HintDescriptor = (LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_INTEGER | LADSPA_HINT_DEFAULT_0); psPortRangeHints[BOOSTER_GAIN].LowerBound = 0; psPortRangeHints[BOOSTER_GAIN].UpperBound = MAX_GAIN; psPortRangeHints[BOOSTER_INPUT1].HintDescriptor = 0; psPortRangeHints[BOOSTER_OUTPUT1].HintDescriptor = 0; psPortRangeHints[BOOSTER_INPUT2].HintDescriptor = 0; psPortRangeHints[BOOSTER_OUTPUT2].HintDescriptor = 0; g_psStereoDescriptor->instantiate = instantiateBooster; g_psStereoDescriptor->connect_port = connectPortToBooster; g_psStereoDescriptor->activate = NULL; g_psStereoDescriptor->run = runStereoBooster; g_psStereoDescriptor->run_adding = NULL; g_psStereoDescriptor->set_run_adding_gain = NULL; g_psStereoDescriptor->deactivate = NULL; g_psStereoDescriptor->cleanup = cleanupBooster; } } void deleteDescriptor(LADSPA_Descriptor * psDescriptor) { unsigned long lIndex; if (psDescriptor) { free((char *)psDescriptor->Label); free((char *)psDescriptor->Name); free((char *)psDescriptor->Maker); free((char *)psDescriptor->Copyright); free((LADSPA_PortDescriptor *)psDescriptor->PortDescriptors); for (lIndex = 0; lIndex < psDescriptor->PortCount; lIndex++) free((char *)(psDescriptor->PortNames[lIndex])); free((char **)psDescriptor->PortNames); free((LADSPA_PortRangeHint *)psDescriptor->PortRangeHints); free(psDescriptor); } } void _fini() { deleteDescriptor(g_psMonoDescriptor); deleteDescriptor(g_psStereoDescriptor); } const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index) { switch (Index) { case 0: return g_psMonoDescriptor; case 1: return g_psStereoDescriptor; default: return NULL; } }