[node.js][javascript] node ffiで構造体を扱う

node ffiで構造体を扱うなら、ref-structを使用する

npm install --save ffi
npm install --save ref
npm install --save ref-struct
var StructType = require('ref-struct');

// 型を定義
var AQTK_VOICE = StructType({
  bas: ref.types.int,
  spd: ref.types.int,
  vol: ref.types.int,
  pit: ref.types.int,
  acc: ref.types.int,
  lmd: ref.types.int,
  fsc: ref.types.int
});
// ポインタ
var ptr_AQTK_VOICE = ref.refType(AQTK_VOICE);

// 構造体作る
var aqtk_voice_val = new AQTK_VOICE;
aqtk_voice_val.bas = bas;
aqtk_voice_val.spd = spd;
aqtk_voice_val.vol = vol;
aqtk_voice_val.pit = pit;
aqtk_voice_val.acc = acc;
aqtk_voice_val.lmd = lmd;
aqtk_voice_val.fsc = fsc;
// ポインタ
ptr_aqtk_voice_val = aqtk_voice_val.ref();

あとはこいつを使って、色々やりとりすれば良い。

var ptr_int   = ref.refType(ref.types.int);
var ptr_uchar = ref.refType(ref.types.uchar);

// AquesTalk10
// unsigned char * AquesTalk_Synthe_Utf8(const AQTK_VOICE *pParam, const char *koe, int *size)
var framework_path = 'path/AquesTalk.framework/Versions/A/AquesTalk';
var ptr_AquesTalk10_Synthe_Utf8 = ffi.DynamicLibrary(framework_path).get('AquesTalk_Synthe_Utf8');
var fn_AquesTalk10_Synthe_Utf8  = ffi.ForeignFunction(ptr_AquesTalk10_Synthe_Utf8, ptr_uchar, [ ptr_AQTK_VOICE, 'string', ptr_int ]);

// AquesTalk_Synthe_Utf8の呼び出し
var alloc_int = ref.alloc('int');
var r = fn_AquesTalk10_Synthe_Utf8(ptr_aqtk_voice_val, text, alloc_int);
var buf_wav = ref.reinterpret(r, alloc_int.deref(), 0);

おわり