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); } })
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; } })