From: Mauricio H. <mhe...@te...> - 2008-08-11 16:32:11
|
Hi: this is my first post to the list, so first to all hi to everyone and let me congratulate you for such a great project it help a lot with the difficult and tedious task of make wrappers.... Right now I'm trying to make a simple wrapper for c# of the C API of flite tts engine, so I use something like this to generate the wrapper: swig -csharp -namespace TTS -module flite flite.h The command above generate me the correct C# files and a flite_wrap.c C code file, I create a shared lib from flite_wrap.c like linflitewrap.so.1.0.1 and I was able to call from a C# program to the simple flite "init"function, the declaration of that function in the flite.h interfaces is like: int flite_init();, the flite_wrap.c generated file make a definition of that function like: SWIGEXPORT int SWIGSTDCALL CSharp_flite_init() { ... result = (int)flite_init(); ... And I'm able to call the function from my mono C# code like: TTS.flite.flite_init(); , so far all good, but currently my problem is with this originally function from flite.h: float flite_text_to_speech(const char *text, cst_voice *voice, const char *outtype); As you can see, I need the cst_voice type, so SWIG make this for that function (flite_wrap.c): SWIGEXPORT float SWIGSTDCALL CSharp_flite_text_to_speech(char * jarg1, void * jarg2, char * jarg3) { float jresult ; char *arg1 = (char *) 0 ; cst_voice *arg2 = (cst_voice *) 0 ; char *arg3 = (char *) 0 ; float result; arg1 = (char *)jarg1; arg2 = (cst_voice *)jarg2; arg3 = (char *)jarg3; result = (float)flite_text_to_speech((char const *)arg1,arg2,(char const *)arg3); jresult = result; return jresult;} wich seems to be ok, but in the C# code SWIG make this for the cst_voice type: public class SWIGTYPE_p_cst_voice { private HandleRef swigCPtr; internal SWIGTYPE_p_cst_voice(IntPtr cPtr, bool futureUse) { swigCPtr = new HandleRef(this, cPtr); } protected SWIGTYPE_p_cst_voice() { swigCPtr = new HandleRef(null, IntPtr.Zero); } internal static HandleRef getCPtr(SWIGTYPE_p_cst_voice obj) { return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; } } ..and here begin my problems, because I can't call to any constructor of this type, this type is originally used in C like: flite_init(); cst_voice *register_cmu_us_kal(); cst_voice *v; v = register_cmu_us_kal(); flite_text_to_speech("wellcome professor", v, "play"); So I was trying to do from C# something like: TTS.flite.flite_init(); // --> OK TTS.SWIGTYPE_p_cst_voice v; // here I have my first problem becouse I don't have any public constructor..and even if I change the swig contructor declaration //for this type from protected to public I get a really ugly SIGSEGV error without any useful info. TTS.flite.flite_text_to_speech("wellcome professor", v, "play"); //of course I can't call to this becouse "v" don't exist... Here is the original declaration of cst_voice from cst_voice.h (used by flite.h): struct cst_voice_struct { cst_features *features; cst_features *ffunctions; cst_utterance *(*utt_init)(cst_utterance *u, struct cst_voice_struct *v); }; typedef struct cst_voice_struct cst_voice; cst_voice *new_voice(); void delete_voice(cst_voice *u); So, basically I don't know where to start to look or check to make this wrapper to work, any ideas?, sugestions? Thank you very much Mauricio |