-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpcmMixer.js
More file actions
91 lines (80 loc) · 2.05 KB
/
pcmMixer.js
File metadata and controls
91 lines (80 loc) · 2.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
var util = require('util');
var stream = require('stream');
var Readable = stream.Readable;
var Mixer = function(options) {
this.streams = [];
this.connection = options.mumbleClient.connection;
Readable.call(this, options);
}
util.inherits(Mixer, Readable);
Mixer.prototype._read = function(size) {
if(this.streams.length > 0) {
this.doRead(size);
}
};
Mixer.prototype.doRead = function(size) {
var self = this;
var anyData = false;;
var buffers = self.streams.map(function(stream) {
var data = stream.read(size);
if(!data) {
if(!stream.hasReadableEvent) {
stream.once('readable', function() {
self.doRead();
stream.hasReadableEvent = false;
});
stream.hasReadableEvent = true;
}
return new Buffer([0]);
}
anyData = true;
return data;
})
if(!anyData) {
return;
}
var emptyBuffer = new Buffer(2);
emptyBuffer.fill(0);
var combinedBuffer = buffers.reduce(function(buffA, buffB) {
var maxLength = Math.max(buffA.length, buffB.length);
var combinedBuff = new Buffer(maxLength);
for(var i = 0; i < maxLength; i+=2) {
var int = 0;
if(i + 1 < buffA.length) {
int += buffA.readUInt16LE(i);
}
if(i + 1 < buffB.length) {
int = buffB.readUInt16LE(i);
}
combinedBuff.writeUInt16LE(int, i);
}
return combinedBuff;
/*
var parts = [];
for(var i = 0; i < buff.length; i += self.connection.packetBuffer.length)
{
part = buff.slice(i, i + self.connection.packetBuffer.length);
parts.push(part);
}
return parts;*/
}, emptyBuffer);
self.push(combinedBuffer);
};
Mixer.prototype.capWave = function(integer) {
if(integer < -32768) {
return -32768;
}
if(integer > 32767) {
return 32767;
}
return integer;
}
Mixer.prototype.addStream = function(stream) {
console.log("Add stream");
this.streams.push(stream);
this.doRead();
};
Mixer.prototype.removeStream = function(stream) {
this.streams.splice(this.streams.indexOf(stream));
};
module.exports = Mixer;