diff --git a/examples/mp32wav.js b/examples/mp32wav.js index 2cad1a8..3f1184e 100644 --- a/examples/mp32wav.js +++ b/examples/mp32wav.js @@ -47,8 +47,8 @@ decoder.on('format', onFormat); input.pipe(decoder); function onFormat (format) { - console.error('MP3 format: %j', format); - + console.error('MP3 info: %j', decoder.info()); + console.error('output format: %j', format); // write the decoded MP3 data into a WAV file var writer = new wav.Writer(format); decoder.pipe(writer).pipe(output); diff --git a/lib/decoder.js b/lib/decoder.js index 1e5bf69..1462915 100644 --- a/lib/decoder.js +++ b/lib/decoder.js @@ -153,3 +153,14 @@ Decoder.prototype._transform = function (chunk, encoding, done) { read(); } }; + + +/** + * Calls `mpg123_info()` to get info about the input mp3 format. + */ + +Decoder.prototype.info = function () { + var info = binding.mpg123_info(this.mh); + debug('info: %j', info); + return info; +}; diff --git a/src/node_mpg123.cc b/src/node_mpg123.cc index 45e3cb4..f732dfc 100644 --- a/src/node_mpg123.cc +++ b/src/node_mpg123.cc @@ -134,6 +134,32 @@ NAN_METHOD(node_mpg123_getformat) { } +NAN_METHOD(node_mpg123_info) { + UNWRAP_MH; + mpg123_frameinfo frameinfo; + int ret; + Local rtn; + ret = mpg123_info(mh, &frameinfo); + if (ret == MPG123_OK) { + Local o = Nan::New(); + Nan::Set(o, Nan::New("version").ToLocalChecked(), Nan::New(frameinfo.version)); + Nan::Set(o, Nan::New("layer").ToLocalChecked(), Nan::New(frameinfo.layer)); + Nan::Set(o, Nan::New("bitRate").ToLocalChecked(), Nan::New(frameinfo.bitrate)); + Nan::Set(o, Nan::New("sampleRate").ToLocalChecked(), Nan::New(frameinfo.rate)); + Nan::Set(o, Nan::New("mode").ToLocalChecked(), Nan::New(frameinfo.mode)); + Nan::Set(o, Nan::New("modeExtension").ToLocalChecked(), Nan::New(frameinfo.mode_ext)); + Nan::Set(o, Nan::New("frameSize").ToLocalChecked(), Nan::New(frameinfo.framesize)); + Nan::Set(o, Nan::New("emphasis").ToLocalChecked(), Nan::New(frameinfo.emphasis)); + Nan::Set(o, Nan::New("vbr").ToLocalChecked(), Nan::New(frameinfo.vbr)); + Nan::Set(o, Nan::New("averageBitRate").ToLocalChecked(), Nan::New(frameinfo.abr_rate)); + rtn = o; + } else { + rtn = Nan::New(ret); + } + info.GetReturnValue().Set(rtn); +} + + NAN_METHOD(node_mpg123_safe_buffer) { info.GetReturnValue().Set(Nan::New(mpg123_safe_buffer())); } @@ -490,6 +516,7 @@ void InitMPG123(Handle target) { Nan::SetMethod(target, "mpg123_current_decoder", node_mpg123_current_decoder); Nan::SetMethod(target, "mpg123_supported_decoders", node_mpg123_supported_decoders); Nan::SetMethod(target, "mpg123_getformat", node_mpg123_getformat); + Nan::SetMethod(target, "mpg123_info", node_mpg123_info); Nan::SetMethod(target, "mpg123_safe_buffer", node_mpg123_safe_buffer); Nan::SetMethod(target, "mpg123_outblock", node_mpg123_outblock); Nan::SetMethod(target, "mpg123_framepos", node_mpg123_framepos);