Decoder.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. var util = require( 'util' );
  2. var Transform = require( 'stream' ).Transform;
  3. var ogg_packet = require( 'ogg-packet' );
  4. var OpusEncoder = require( './OpusEncoder' );
  5. var Decoder = function( rate, channels, frameSize ) {
  6. Transform.call( this, { writableObjectMode: true } );
  7. this.rate = rate || 48000;
  8. this.channels = channels || 1;
  9. this.frameSize = frameSize || this.rate * 0.04;
  10. this.encoder = null;
  11. this.header = {};
  12. this.tags = null;
  13. this.pos = 0;
  14. this.samplesWritten = 0;
  15. this.packetBuffer = [];
  16. };
  17. util.inherits( Decoder, Transform );
  18. /**
  19. * Transform stream callback
  20. */
  21. Decoder.prototype._transform = function( packet, encoding, done ) {
  22. // Write the header if it hasn't been written yet
  23. if( !this.encoder ) {
  24. this._parseHeader( packet );
  25. } else if( !this.tags ) {
  26. // TODO: Not implemented
  27. // this._parseTags( packet );
  28. this.tags = {};
  29. } else {
  30. this._processInput( packet );
  31. }
  32. done();
  33. };
  34. Decoder.prototype._parseHeader = function( packet ) {
  35. var header = packet.packet;
  36. var signature = header.slice( 0, 8 );
  37. if( signature.toString( 'ascii' ) !== 'OpusHead' ) {
  38. return this.emit( 'error', 'Bad header' );
  39. }
  40. this.header.version = header.readUInt8( 8 );
  41. this.header.channels = header.readUInt8( 9 );
  42. this.header.preSkip = header.readUInt16LE( 10 );
  43. this.header.rate = header.readUInt32LE( 12 );
  44. this.header.gain = header.readUInt16LE( 16 );
  45. this.header.channelMap = header.readUInt8( 18 );
  46. this.emit( 'format', {
  47. channels: this.channels,
  48. sampleRate: this.rate,
  49. bitDepth: 16,
  50. float: false,
  51. signed: true,
  52. gain: this.header.gain,
  53. preSkip: this.header.preSkip,
  54. version: this.header.version
  55. });
  56. this.encoder = new OpusEncoder( this.rate, this.channels );
  57. };
  58. Decoder.prototype._processInput = function( packet ) {
  59. var frame = packet.packet;
  60. var pcm = this.encoder.decode( frame );
  61. this.push( pcm );
  62. };
  63. module.exports = Decoder;