send float32 to client to reduce processing, optimze pcm client, optimize junk filter for audio

This commit is contained in:
thelamer 2023-02-26 15:04:01 -08:00
parent 064be2691c
commit f13e661603
4 changed files with 5 additions and 7 deletions

View File

@ -142,15 +142,15 @@ aio.on('connection', function (socket) {
record = pulse.createRecordStream({
channels: 2,
rate: 44100,
format: 'S16LE',
format: 'F32LE',
});
record.on('connection', function(){
record.on('data', function(chunk) {
// Only send real audio data
let arr = chunk.toJSON().data;
if (! arr.every(item => item === 0)) {
if (arr.length < 26456) {
aio.sockets.to(id).emit('audio', chunk);
}
}
});
});
}

View File

@ -80,8 +80,7 @@ function audio() {
}
function processAudio(data) {
let buf = new Uint16Array(data);
player.feed(buf);
player.feed(data);
}
socket.on('audio', processAudio);

View File

@ -1 +1 @@
function PCMPlayer(t){this.init(t)}PCMPlayer.prototype.init=function(){this.option={encoding:"16bitInt",channels:2,sampleRate:44100},this.samples=new Float32Array,this.maxValue=32768,this.typedArray=Int16Array,this.audioCtx=new(window.AudioContext||window.webkitAudioContext),this.audioCtx.resume(),this.gainNode=this.audioCtx.createGain(),this.gainNode.gain.value=1,this.gainNode.connect(this.audioCtx.destination),this.startTime=this.audioCtx.currentTime},PCMPlayer.prototype.feed=function(t){t=this.getFormatedValue(t);var e=new Float32Array(this.samples.length+t.length);if(e.set(this.samples,0),e.set(t,this.samples.length),this.samples=e,this.samples.length){var i,s,a,n,o,h=this.audioCtx.createBufferSource(),r=this.samples.length/this.option.channels,l=this.audioCtx.createBuffer(this.option.channels,r,this.option.sampleRate);for(s=0;s<this.option.channels;s++)for(n=0,i=l.getChannelData(s),a=s,o=50;n<r;n++)i[n]=this.samples[a],a+=this.option.channels;this.startTime<this.audioCtx.currentTime&&(this.startTime=this.audioCtx.currentTime),h.buffer=l,h.connect(this.gainNode),h.start(this.startTime),this.startTime+=l.duration,this.samples=new Float32Array}},PCMPlayer.prototype.getFormatedValue=function(t){var e,t=new this.typedArray(t.buffer),i=new Float32Array(t.length);for(e=0;e<t.length;e++)i[e]=t[e]/this.maxValue;return i},PCMPlayer.prototype.volume=function(t){this.gainNode.gain.value=t},PCMPlayer.prototype.destroy=function(){this.interval&&clearInterval(this.interval),this.samples=null,this.audioCtx.close(),this.audioCtx=null};
function PCMPlayer(t){this.init(t)}PCMPlayer.prototype.init=function(){this.audioCtx=new(window.AudioContext||window.webkitAudioContext)({sampleRate:44100}),this.audioCtx.resume(),this.gainNode=this.audioCtx.createGain(),this.gainNode.gain.value=1,this.gainNode.connect(this.audioCtx.destination),this.startTime=this.audioCtx.currentTime},PCMPlayer.prototype.feed=function(t){t=new Float32Array(t);let i=this.audioCtx.createBufferSource(),e=t.length/2,a=this.audioCtx.createBuffer(2,e,44100),o,n,s=a.getChannelData(0),r=0;for(o=0;o<e;o++)s[o]=t[r],r+=2;let u=a.getChannelData(1),h=0;for(n=0;n<e;n++)u[n]=t[h],h+=2;this.startTime<this.audioCtx.currentTime&&(this.startTime=this.audioCtx.currentTime),i.buffer=a,i.connect(this.gainNode),i.start(this.startTime),this.startTime+=a.duration},PCMPlayer.prototype.destroy=function(){this.audioCtx.close(),this.audioCtx=null};

View File

@ -1 +0,0 @@
function PCMPlayer(t){this.init(t)}PCMPlayer.prototype.init=function(t){this.option=Object.assign({},{encoding:"16bitInt",channels:1,sampleRate:8e3,flushingTime:1e3},t),this.samples=new Float32Array,this.flush=this.flush.bind(this),this.interval=setInterval(this.flush,this.option.flushingTime),this.maxValue=this.getMaxValue(),this.typedArray=this.getTypedArray(),this.createContext()},PCMPlayer.prototype.getMaxValue=function(){var t={"8bitInt":128,"16bitInt":32768,"32bitInt":2147483648,"32bitFloat":1};return t[this.option.encoding]?t[this.option.encoding]:t["16bitInt"]},PCMPlayer.prototype.getTypedArray=function(){var t={"8bitInt":Int8Array,"16bitInt":Int16Array,"32bitInt":Int32Array,"32bitFloat":Float32Array};return t[this.option.encoding]?t[this.option.encoding]:t["16bitInt"]},PCMPlayer.prototype.createContext=function(){this.audioCtx=new(window.AudioContext||window.webkitAudioContext),this.gainNode=this.audioCtx.createGain(),this.gainNode.gain.value=1,this.gainNode.connect(this.audioCtx.destination),this.startTime=this.audioCtx.currentTime},PCMPlayer.prototype.isTypedArray=function(t){return t.byteLength&&t.buffer&&t.buffer.constructor==ArrayBuffer},PCMPlayer.prototype.feed=function(t){if(this.isTypedArray(t)){t=this.getFormatedValue(t);var e=new Float32Array(this.samples.length+t.length);e.set(this.samples,0),e.set(t,this.samples.length),this.samples=e}},PCMPlayer.prototype.getFormatedValue=function(t){t=new this.typedArray(t.buffer);var e,i=new Float32Array(t.length);for(e=0;e<t.length;e++)i[e]=t[e]/this.maxValue;return i},PCMPlayer.prototype.volume=function(t){this.gainNode.gain.value=t},PCMPlayer.prototype.destroy=function(){this.interval&&clearInterval(this.interval),this.samples=null,this.audioCtx.close(),this.audioCtx=null},PCMPlayer.prototype.flush=function(){if(this.samples.length){var t,e,i,n,a,s=this.audioCtx.createBufferSource(),r=this.samples.length/this.option.channels,o=this.audioCtx.createBuffer(this.option.channels,r,this.option.sampleRate);for(e=0;e<this.option.channels;e++)for(t=o.getChannelData(e),i=e,a=50,n=0;n<r;n++)t[n]=this.samples[i],n<50&&(t[n]=t[n]*n/50),r-51<=n&&(t[n]=t[n]*a--/50),i+=this.option.channels;this.startTime<this.audioCtx.currentTime&&(this.startTime=this.audioCtx.currentTime),console.log("start vs current "+this.startTime+" vs "+this.audioCtx.currentTime+" duration: "+o.duration),s.buffer=o,s.connect(this.gainNode),s.start(this.startTime),this.startTime+=o.duration,this.samples=new Float32Array}};