Skip to content

Commit 0b4938d

Browse files
committed
Fix serial and 64bit granule pos
1 parent f71b4bb commit 0b4938d

File tree

5 files changed

+137
-7
lines changed

5 files changed

+137
-7
lines changed

dist-unminified/encoderWorker.js

+1-1
Large diffs are not rendered by default.

dist/encoderWorker.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "opus-recorder",
3-
"version": "4.1.1",
3+
"version": "4.1.2",
44
"description": "A library for recording opus encoded audio",
55
"homepage": "https://github.com/chris-rudmin/opus-recorder",
66
"author": "Chris Rudmin",

src/encoderWorker.js

+8-4
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ var OggOpusEncoder = function( config, Module ){
4848
numberOfChannels: 1,
4949
originalSampleRate: 44100,
5050
resampleQuality: 3, // Value between 0 and 10 inclusive. 10 being highest quality.
51-
serial: Math.floor( Math.random() * Math.pow(2,32) )
51+
serial: Math.floor( Math.random() * (Math.pow(2,32) - 1) )
5252
}, config );
5353

5454
this._opus_encoder_create = Module._opus_encoder_create;
@@ -171,10 +171,14 @@ OggOpusEncoder.prototype.generatePage = function(){
171171
pageBufferView.setUint8( 4, 0, true ); // Version
172172
pageBufferView.setUint8( 5, this.headerType, true ); // 1 = continuation, 2 = beginning of stream, 4 = end of stream
173173

174-
// Number of samples upto and including this page at 48000Hz, into 64 bits
174+
// Number of samples upto and including this page at 48000Hz, into signed 64 bit Little Endian integer
175+
// Javascript Number maximum value is 53 bits or 2^53 - 1
175176
pageBufferView.setUint32( 6, granulePosition, true );
176-
if ( granulePosition > 4294967296 || granulePosition < 0 ) {
177-
pageBufferView.setUint32( 10, Math.floor( granulePosition/4294967296 ), true );
177+
if (granulePosition < 0) {
178+
pageBufferView.setInt32( 10, Math.ceil(granulePosition/4294967297) - 1, true );
179+
}
180+
else {
181+
pageBufferView.setInt32( 10, Math.floor(granulePosition/4294967296), true );
178182
}
179183

180184
pageBufferView.setUint32( 14, this.config.serial, true ); // Bitstream serial number

test/encoderWorker.js

+126
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,130 @@ describe('encoderWorker', function() {
139139
getEncoder();
140140
});
141141

142+
it('should set granule position to 0', function (done) {
143+
var pageBufferCount = 0;
144+
145+
global.postMessage = function(page) {
146+
pageBufferCount++;
147+
148+
if (pageBufferCount == 3) {
149+
var dataView = new DataView(page.buffer);
150+
expect(dataView.getUint32(6, true)).to.equal(0);
151+
expect(dataView.getInt32(10, true)).to.equal(0);
152+
done();
153+
}
154+
};
155+
156+
getEncoder().then(function(encoder) {
157+
encoder.lastPositiveGranulePosition = 1;
158+
encoder.granulePosition = 0;
159+
encoder.generatePage();
160+
});
161+
});
162+
163+
it('should set granule position to -1', function (done) {
164+
var pageBufferCount = 0;
165+
166+
global.postMessage = function(page) {
167+
pageBufferCount++;
168+
169+
if (pageBufferCount == 3) {
170+
var dataView = new DataView(page.buffer);
171+
expect(dataView.getUint32(6, true)).to.equal(4294967295);
172+
expect(dataView.getInt32(10, true)).to.equal(-1);
173+
done();
174+
}
175+
};
176+
177+
getEncoder().then(function(encoder) {
178+
encoder.lastPositiveGranulePosition = 1;
179+
encoder.granulePosition = -1;
180+
encoder.generatePage();
181+
});
182+
});
183+
184+
it('should set granule position to -2^32', function (done) {
185+
var pageBufferCount = 0;
186+
187+
global.postMessage = function(page) {
188+
pageBufferCount++;
189+
190+
if (pageBufferCount == 3) {
191+
var dataView = new DataView(page.buffer);
192+
expect(dataView.getUint32(6, true)).to.equal(0);
193+
expect(dataView.getInt32(10, true)).to.equal(-1);
194+
done();
195+
}
196+
};
197+
198+
getEncoder().then(function(encoder) {
199+
encoder.lastPositiveGranulePosition = 1;
200+
encoder.granulePosition = -4294967296;
201+
encoder.generatePage();
202+
});
203+
});
204+
205+
it('should set granule position to -2^32 - 1', function (done) {
206+
var pageBufferCount = 0;
207+
208+
global.postMessage = function(page) {
209+
pageBufferCount++;
210+
211+
if (pageBufferCount == 3) {
212+
var dataView = new DataView(page.buffer);
213+
expect(dataView.getUint32(6, true)).to.equal(4294967295);
214+
expect(dataView.getInt32(10, true)).to.equal(-2);
215+
done();
216+
}
217+
};
218+
219+
getEncoder().then(function(encoder) {
220+
encoder.lastPositiveGranulePosition = 1;
221+
encoder.granulePosition = -4294967297;
222+
encoder.generatePage();
223+
});
224+
});
225+
226+
it('should set granule position to 2^32 - 1', function (done) {
227+
var pageBufferCount = 0;
228+
229+
global.postMessage = function(page) {
230+
pageBufferCount++;
231+
232+
if (pageBufferCount == 3) {
233+
var dataView = new DataView(page.buffer);
234+
expect(dataView.getUint32(6, true)).to.equal(4294967295);
235+
expect(dataView.getInt32(10, true)).to.equal(0);
236+
done();
237+
}
238+
};
239+
240+
getEncoder().then(function(encoder) {
241+
encoder.lastPositiveGranulePosition = 1;
242+
encoder.granulePosition = 4294967295;
243+
encoder.generatePage();
244+
});
245+
});
246+
247+
it('should set granule position to 2^32', function (done) {
248+
var pageBufferCount = 0;
249+
250+
global.postMessage = function(page) {
251+
pageBufferCount++;
252+
253+
if (pageBufferCount == 3) {
254+
var dataView = new DataView(page.buffer);
255+
expect(dataView.getUint32(6, true)).to.equal(0);
256+
expect(dataView.getInt32(10, true)).to.equal(1);
257+
done();
258+
}
259+
};
260+
261+
getEncoder().then(function(encoder) {
262+
encoder.lastPositiveGranulePosition = 1;
263+
encoder.granulePosition = 4294967296;
264+
encoder.generatePage();
265+
});
266+
});
267+
142268
});

0 commit comments

Comments
 (0)