2015-07-06 2 views
0

Я пытаюсь передать аудиопоток в C/C++ Addon. Но сначала я хочу понять и реализовать некоторые базовые примеры. Вся цель состоит в том, чтобы использовать stdin и stdout для передачи информации между nodeJS и аддоном. В nodejs можно увидеть стандартный вывод с этим кодом:NodeJS - C/C++ Addon communication (stdin stdout)

var fs = require('fs'); 
var readableStream = fs.createReadStream('file.txt'); 
var data = ''; 

readableStream.on('data', function(chunk) { 
    data+=chunk; 
}); 

readableStream.on('end', function() { 
    console.log(data); 
}); 

Но теперь, как я могу передать его на C/C++ аддона?

ответ

0

Вы не можете передавать данные непосредственно с NodeJS на C++. Вы можете написать/разработать свой собственный узел аддон/модуль в C++, который обнажает некоторые функции (Node) JS затем передают данные этих функций:

var myModule = require('mymodule'); // The Node addon you wrote  
myModule.processData(data); 

Теперь processData получает данные от JS, и это реализация C++ так что идите.

+0

Где я могу найти информацию для реализации этого модуля? (другими словами, как я могу «processData»?) – jdscardoso

+0

В официальной документации узла. https://nodejs.org/api/addons.html – marekful

+0

Хорошо, теперь я понимаю, что вы говорите. У меня уже есть аддон, теперь я попытаюсь найти способ интерпретировать информацию из nodejs – jdscardoso

0

Вот пример создания родного аддона в Linux. Надеюсь, что это помогает:

#include <node.h> 
using namespace v8; 

void foo(const FunctionCallbackInfo<Value>& args) { 

// extract the parameter(s) 
int value = args[0]->NumberValue(); 
// do stuff with value. 

//optionally, return a value. 
args.GetReturnValue().Set(value + 10); 
} 


void init(Handle<Object> exports) { 
    NODE_SET_METHOD(exports, "processData", foo); 
} 
NODE_MODULE(addon, init) 

Сложение: Linux (ia32): г ++ -I./deps/v8/include -I./src -shared -m32 -o mymodule.node mymodule.cc

  1. Макрос NODE_MODULE перенаправляет узел на регистрацию amodule с именем 'mymodule' и экспортирует метод под названием 'processData', который внутренне отображается на 'foo'
  2. Это делает рукопожатие между пространством JS и пространством C++ для вызовов методов.
  3. Теперь вы можете позвонить в «processData», как предполагалось, marekful.
0

Предполагая nodejs сценарий:

var addon = require('./build/Debug/addon.node'); 
var fs = require('fs'); 
var readableStream = fs.createReadStream('file.txt'); 
var data = ''; 

readableStream.on('data', function(chunk) { 
    data+=chunk; 
}); 

readableStream.on('end', function() { 
    console.log("loaded"); 
    console.log('addon invocation:', addon.read_stream(data)); 
}); 

Этот сценарий может загружать информацию о файле:

#include <node.h> 
#include <iostream> 
#include <string> 

using namespace v8; 
using namespace std; 

void read_stream(const FunctionCallbackInfo<Value>& args) { 
    Isolate* isolate = Isolate::GetCurrent(); 
    HandleScope scope(isolate); 

    if (args.Length() < 1) { 
    isolate->ThrowException(Exception::TypeError(
     String::NewFromUtf8(isolate, "Wrong number of arguments"))); 
    return; 
    } 

    v8::String::Utf8Value param1(args[0]->ToString()); 
    std::string auxiliar = std::string(*param1); //JS---->C++ 

} 


void Init(Handle<Object> exports) { 
    NODE_SET_METHOD(exports, "read_stream", read_stream); 
} 

NODE_MODULE(addon, Init) 

В отлаживать "Подсобная" строка будет иметь текст "file.txt". Теперь пришло время попробовать с wav-файлами.