2017/08/15

LADSPA 設定ファイル読込みテスト

LADSPAで設定ファイルが読めるかどうかテストしてみた。 結構あっけなく完成。プラグインと同じディレクトリ内に設定ファイルを入れておけば、Applyを押したときに読み込まれて、その設定ファイルに書かれた内容で適用されるというもの。今回のテスト用では設定値はゲインの調整値とした。 また下のようにインターフェイスにスライダーはあるが、完全にダミーで何も機能しない。何かスライダーがないと、メニュー選択と同時に適用されてしまうので、ダミーを付けておいただけ。

内容としては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