[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);
おわり