LADSPA 設定ファイル読込みテスト
LADSPAで設定ファイルが読めるかどうかテストしてみた。
結構あっけなく完成。プラグインと同じディレクトリ内に設定ファイルを入れておけば、Applyを押したときに読み込まれて、その設定ファイルに書かれた内容で適用されるというもの。今回のテスト用では設定値はゲインの調整値とした。
また下のようにインターフェイスにスライダーはあるが、完全にダミーで何も機能しない。何かスライダーがないと、メニュー選択と同時に適用されてしまうので、ダミーを付けておいただけ。
内容としてはrun関数で、特定名称のファイルを開き、内容を文字列として取り込み、floatに変換し、パラメーターとして扱った。
プラグインを起動させたまま、設定ファイルの書換えができるので、多くのパラメーターで試行錯誤する開発では便利。リバーブとか、FIRとか、膨大な係数を必要とする場合などね。
今回の設定ファイルは1行だけ数字を入れてたもの。Audacity\Plug-Ins 内に入れておけば読み込める。
内容としてはrun関数で、特定名称のファイルを開き、内容を文字列として取り込み、floatに変換し、パラメーターとして扱った。
プラグインを起動させたまま、設定ファイルの書換えができるので、多くのパラメーターで試行錯誤する開発では便利。リバーブとか、FIRとか、膨大な係数を必要とする場合などね。
設定ファイルリーダー
/* namagi_reader.c 2017.8.15 compile windows gcc -shared -o namagi_reader.dll namagi_reader.c -ID compile Ubuntu gcc -fPIC -DPIC -shared -nostartfiles -o namagi_reader.so namagi_reader.c */ /**********************************************************/ #include <stdlib.h> #include <string.h> #include <stdio.h> #include <math.h> #include "ladspa.h" #define AMP_CONTROL1 0 #define AMP_INPUT1 1 #define AMP_OUTPUT1 2 /**********************************************************/ #ifdef WIN32 int bIsFirstTime = 1; void _init(); #endif #ifdef WIN32 #define _WINDOWS_DLL_EXPORT_ __declspec(dllexport) #else #define _WINDOWS_DLL_EXPORT_ #endif /**********************************************************/ typedef struct { float m_pfControlValue1; LADSPA_Data *m_pfInputBuffer1; LADSPA_Data *m_pfOutputBuffer1; } Reader; /**********************************************************/ LADSPA_Handle instantiateReader(const LADSPA_Descriptor *Descriptor, unsigned long SampleRate){ return malloc(sizeof(Reader)); } /**********************************************************/ void connectPortToReader( LADSPA_Handle Instance,unsigned long Port, LADSPA_Data *DataLocation) { Reader *psReader; psReader = (Reader *)Instance; switch (Port){ case AMP_INPUT1: psReader -> m_pfInputBuffer1 = DataLocation; break; case AMP_OUTPUT1: psReader -> m_pfOutputBuffer1 = DataLocation; break; } } /**********************************************************/ void runReader(LADSPA_Handle Instance, unsigned long SampleCount){ LADSPA_Data fGain1; LADSPA_Data *pfInput; LADSPA_Data *pfOutput; Reader *psReader; unsigned long lSampleIndex; psReader = (Reader *)Instance; fGain1 = psReader -> m_pfControlValue1; pfInput = psReader -> m_pfInputBuffer1; pfOutput = psReader -> m_pfOutputBuffer1; FILE *fp; char str[128];// fp = fopen("reader.ini", "r"); if (fp != NULL) { fgets(str, 128, fp); fGain1= atof(str); } fclose(fp); for (lSampleIndex = 0; lSampleIndex < SampleCount; lSampleIndex++){ *(pfOutput++) = *(pfInput++) * fGain1; } printf("%f",fGain1); } /**********************************************************/ void cleanupReader(LADSPA_Handle Instance) { free(Instance); } /**********************************************************/ LADSPA_Descriptor * g_psDescriptor = NULL; /**********************************************************/ void _init() { char ** pcPortNames; LADSPA_PortDescriptor * piPortDescriptors; LADSPA_PortRangeHint * psPortRangeHints; g_psDescriptor = (LADSPA_Descriptor *)malloc(sizeof(LADSPA_Descriptor)); if (g_psDescriptor) { g_psDescriptor -> UniqueID = 170815; g_psDescriptor -> Label = strdup("reader"); g_psDescriptor -> Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE; g_psDescriptor -> Name = strdup("Namagi: Reader ver.170815"); g_psDescriptor -> Maker = strdup("Namagi Products"); g_psDescriptor -> Copyright = strdup("None"); g_psDescriptor -> PortCount = 3; piPortDescriptors = (LADSPA_PortDescriptor *)calloc(3, sizeof(LADSPA_PortDescriptor)); g_psDescriptor -> PortDescriptors = (const LADSPA_PortDescriptor *)piPortDescriptors; piPortDescriptors[AMP_CONTROL1] = LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL; piPortDescriptors[AMP_INPUT1] = LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO; piPortDescriptors[AMP_OUTPUT1] = LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO; pcPortNames = (char **)calloc(3, sizeof(char *)); g_psDescriptor -> PortNames = (const char **)pcPortNames; pcPortNames[AMP_CONTROL1] = strdup("Dummy"); pcPortNames[AMP_INPUT1] = strdup("Input"); pcPortNames[AMP_OUTPUT1] = strdup("Output"); psPortRangeHints = ((LADSPA_PortRangeHint *) calloc(3, sizeof(LADSPA_PortRangeHint))); g_psDescriptor -> PortRangeHints = (const LADSPA_PortRangeHint *)psPortRangeHints; psPortRangeHints[AMP_CONTROL1].HintDescriptor = (LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_0); psPortRangeHints[AMP_CONTROL1].LowerBound =(LADSPA_Data)-1; psPortRangeHints[AMP_CONTROL1].UpperBound =(LADSPA_Data)1; psPortRangeHints[AMP_INPUT1].HintDescriptor = 0; psPortRangeHints[AMP_OUTPUT1].HintDescriptor = 0; g_psDescriptor -> instantiate = instantiateReader; g_psDescriptor -> connect_port = connectPortToReader; g_psDescriptor -> activate = NULL; g_psDescriptor -> run = runReader; g_psDescriptor -> run_adding = NULL; g_psDescriptor -> set_run_adding_gain = NULL; g_psDescriptor -> deactivate = NULL; g_psDescriptor -> cleanup = cleanupReader; } } /**********************************************************/ 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_psDescriptor); } /**********************************************************/ _WINDOWS_DLL_EXPORT_ const LADSPA_Descriptor *ladspa_descriptor(unsigned long Index){ #ifdef WIN32 if (bIsFirstTime) { _init(); bIsFirstTime = 0; } #endif if (Index == 0) return g_psDescriptor; else return NULL; } |
今回の設定ファイルは1行だけ数字を入れてたもの。Audacity\Plug-Ins 内に入れておけば読み込める。
設定ファイル reader.ini
0.5 |