mirror of
https://github.com/linuxserver/kclient.git
synced 2026-03-23 00:00:56 +08:00
send float32 to client to reduce processing, optimze pcm client, optimize junk filter for audio
This commit is contained in:
parent
064be2691c
commit
f13e661603
6
index.js
6
index.js
@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@ -80,8 +80,7 @@ function audio() {
|
||||
}
|
||||
|
||||
function processAudio(data) {
|
||||
let buf = new Uint16Array(data);
|
||||
player.feed(buf);
|
||||
player.feed(data);
|
||||
}
|
||||
|
||||
socket.on('audio', processAudio);
|
||||
|
||||
@ -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};
|
||||
|
||||
1
public/js/pcm-player.min.js
vendored
1
public/js/pcm-player.min.js
vendored
@ -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}};
|
||||
Loading…
x
Reference in New Issue
Block a user