diff --git a/lib/camera.js b/lib/camera.js index 73e59ae..0ef48e9 100644 --- a/lib/camera.js +++ b/lib/camera.js @@ -123,8 +123,10 @@ class Camera extends Stream { ]); }, stop() { - state.process.kill('SIGTERM'); - state.process = null; + if (state.process) { + state.process.kill('SIGTERM'); + state.process = null; + } } }; @@ -170,20 +172,22 @@ class Camera extends Stream { state.stream = null; this.stream(); }); - } - - let incoming = state.stream.pipe(new MjpegConsumer()); - - incoming.on('data', frame => state.frame = frame); - incoming.on('error', () => this.stream()); - incoming.pipe(this); + let incoming = state.stream.pipe(new MjpegConsumer()); + incoming.on('data', frame => state.frame = frame); + incoming.on('error', () => { + state.stream = null; + this.stream(); + }); + incoming.pipe(this); + } return this; } capture() { let cs = new CaptureStream(this); + this.stream(); this.once('data', data => { cs.push(data); cs.push(null); diff --git a/test/unit/camera.js b/test/unit/camera.js index 1e76229..5058359 100644 --- a/test/unit/camera.js +++ b/test/unit/camera.js @@ -68,7 +68,7 @@ exports['av.Camera'] = { }); cam.on('stop', () => { - test.equal(this.write.lastCall.args[0], buffer); + test.ok(this.write.lastCall.args[0].equals(buffer)); test.equal(this.write.callCount, 1); // This is null because we bypassed the frame setting // mechanism below when `cam.emit('data', buffer);` @@ -80,6 +80,37 @@ exports['av.Camera'] = { cam.emit('data', buffer); }, + captureMultiple(test) { + test.expect(8); + + var buffer = new Buffer([0]); + var cam = new av.Camera(); + var writable = new Writable(); + + this.sandbox.spy(cam, 'capture'); + this.sandbox.spy(cam, 'stream'); + + cam.on('stop', () => { + test.ok(buffer.equals(buffer)); + buffer.writeInt8(cam.capture.callCount, 0); + + if (cam.capture.callCount === 4) { + test.equal(cam.stream.callCount, 4); + test.done(); + } else { + let cs = cam.capture(); + cam.emit('data', buffer); + + test.equal(cs.read(1).readUInt8(0), cam.capture.callCount - 1); + + cs.pipe(writable); + } + }); + + cam.capture().pipe(writable); + cam.emit('data', buffer); + }, + spawned(test) { test.expect(3);