Example #1
0
    strtok.parse(self.stream, function(v, cb) {
      if (!v) {
        cb.commentsRead = 0;
        cb.position = 'header'; //read first OggS header
        return new strtok.BufferType(27);
      }
          
      if (cb.position === 'header') {
        cb.header = {
          type: v.toString('utf-8', 0, 4),
          version: v[4],
          packet_flag: v[5],
          pcm_sample_pos: 'not_implemented',
          stream_serial_num: strtok.UINT32_LE.get(v, 14),
          page_number: strtok.UINT32_LE.get(v, 18),
          check_sum: strtok.UINT32_LE.get(v, 22),
          segments: v[26]
        };

        //read segment table
        cb.position = 'segments';
        return new strtok.BufferType(cb.header.segments);
      }
          
      if (cb.position === 'segments') {
        var pageLen = 0;
        for (var i=0; i < v.length; i++) {
          pageLen += v[i];
        }

        cb.position = 'page_data';
        return new strtok.BufferType(pageLen);
      }      

      //TODO: fix this crappy hack, we should be emitting
      //      data and parsing it with another parser
      //      but that isn't working atm. What we are doing
      //      here is attempting to read all the metadata
      //      everytime we read a ogg page.
      //      
      if (cb.position === 'page_data') {
        if (cb.header.page_number >= 1) {
          v.copy(bigBuf, copy_offset);
          copy_offset += v.length;
          try {
            parseMetadata();
            self.emit('done');
            return strtok.DONE;
          } catch (ex) {}
        }

        cb.position = 'header';
        return new strtok.BufferType(27);
      }
    })
Example #2
0
  strtok.parse(stream, function (v, cb) {
    try {
      if (!v) {
        cb.state = 0;
        return new strtok.BufferType(27);
      }

      switch (cb.state) {
        case 0: // header
          cb.header = {
            type: v.toString(0, 4),
            version: v[4],
            packet_flag: v[5],
            pcm_sample_pos: 'not_implemented',
            stream_serial_num: strtok.UINT32_LE.get(v, 14),
            page_number: strtok.UINT32_LE.get(v, 18),
            check_sum: strtok.UINT32_LE.get(v, 22),
            segments: v[26]
          }
          cb.state++;
          return new strtok.BufferType(cb.header.segments);

        case 1: // segments
          var pageLen = 0;
          for (var i = 0; i < v.length; i++) {
            pageLen += v[i];
          }
          cb.state++;
          return new strtok.BufferType(pageLen);

        case 2: // page data
          if (cb.header.page_number >= 1) {
            innerStream.emit('data', new Buffer(v));
          }
          cb.state = 0;
          return new strtok.BufferType(27);
      }
    } catch (exception) {
      callback('done', exception);
      return strtok.DONE;
    }
  })