Hello everyone, I have a node js service that calls into a native C library. The native library, fire events repeatedly and continuously. These events are delivered to a C callback function. My goal is to call a Javascript callback from this native C callback.
Based on my reading, I am using uv_async_init and uv_async_send to accomplish this goal. The problem I am encountering is that my native C callback function gets called many times and in there uv_async_send is called many times, but the function passed to uv_async_init is called only once and only when my program exits. Here is my C code: ===================================================== #include "jsaudio.h" #include <iostream> using namespace v8; static void recordAudioCallback(int index); void asyncmsg(uv_async_t* handle); Callback* cbPeriodic; uv_async_t async; uv_loop_t* loop; NAN_METHOD(createEngine) { std::cout << "==> createEngine\n" ; } void createAudioRecorder(const Nan::FunctionCallbackInfo<v8::Value>& info) { std::cout << "==> createAudioRecorder\n"; } void startRecording(const Nan::FunctionCallbackInfo<v8::Value>& info) { std::cout << "==> startRecording\n"; cbPeriodic = new Callback(info[0].As<Function>()); loop = uv_default_loop(); *uv_async_init*(loop, &async, *asyncmsg*); } void *asyncmsg*(uv_async_t* handle) { std::cout << "==> asyncmsg \n"; Nan::HandleScope scope; v8::Isolate* isolate = v8::Isolate::GetCurrent(); Local<Value> argv[] = { v8::String::NewFromUtf8(isolate, "Hello world") }; cbPeriodic->Call(1, argv); } /* This my callback that gets called many times, by a native library(/ static void *recordAudioCallback*(int index) { std::cout << "==> recordAudioCallback " << index << "\n"; *uv_async_send*(&async); } ====================================================== Here is my test node.js code that calls the above native code const jsAudio = new JsAudio({sampleRate: 48000, bufferSize: 8192}) function Test () { jsAudio.createEngine(); jsAudio.createAudioRecorder(); jsAudio.startRecording(function(error, result) { if (error) { console.log('startRecording failed: ' + error); } else { console.log('startRecording result: ' + result); } }); } Test(); var waitTill = new Date(new Date().getTime() + 3 * 1000); while(waitTill > new Date()){} jsAudio.shutdown(); console.log('program exit...'); ========================================================== Here is the out: ==> createEngine ==> createAudioRecorder ==> startRecording ==> recordAudioCallback 0 ==> recordAudioCallback 1 ==> recordAudioCallback 0 ==> recordAudioCallback 1 ==> recordAudioCallback 0 ==> shutdown program exit... ==> asyncmsg startRecording failed: Hello world =========================================================== Why *asyncmsg* is called only once! even though *recordAudioCallback* is called several times! Any why is it called after program exits! Any help is appreciated. Regards, Shahriar -- Job board: http://jobs.nodejs.org/ New group rules: https://gist.github.com/othiym23/9886289#file-moderation-policy-md Old group rules: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines --- You received this message because you are subscribed to the Google Groups "nodejs" group. To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscr...@googlegroups.com. To post to this group, send email to nodejs@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/nodejs/1d59f542-257e-41ca-800c-f142925bc040%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.