ZZJ
2022-04-20 b4495445fbfc616a2126587ce9eec205fc1cbe19
public/libs/wasmPlayer/turbo.js
@@ -1,78 +1,78 @@
Module = {
  onRuntimeInitialized: function() {
    onWasmLoaded()
    onWasmLoaded();
  },
}
importScripts('libffmpeg.js')
};
importScripts("libffmpeg.js");
var MediaName = null
var IsStream = true
var FileLen = -1
var MediaName = null;
var IsStream = true;
var FileLen = -1;
var SocketObj //WebSocket
var CPointer_Buffer = null
var CPointer_Cap = 0
var SocketObj; //WebSocket
var CPointer_Buffer = null;
var CPointer_Cap = 0;
function onWasmLoaded() {
  DeliverVideo = Module.addFunction(function(Buf, BufLen, TimeStamp) {
    var CPointer_Array = Module.HEAPU8.subarray(Buf, Buf + BufLen)
    var CPointer_Array = Module.HEAPU8.subarray(Buf, Buf + BufLen);
    var message = {
      command: 'deliver_video',
      command: "deliver_video",
      sample: { time_stamp: TimeStamp, buf: new Uint8Array(CPointer_Array) },
    }
    self.postMessage(message, [message.sample.buf.buffer])
  }, 'viii')
    };
    self.postMessage(message, [message.sample.buf.buffer]);
  }, "viii");
  DeliverAudio = Module.addFunction(function(Buf, BufLen, TimeStamp) {
    var CPointer_Array = Module.HEAPU8.subarray(Buf, Buf + BufLen)
    var CPointer_Array = Module.HEAPU8.subarray(Buf, Buf + BufLen);
    var message = {
      command: 'deliver_audio',
      command: "deliver_audio",
      sample: { time_stamp: TimeStamp, buf: new Uint8Array(CPointer_Array) },
    }
    self.postMessage(message, [message.sample.buf.buffer])
  }, 'viii')
    };
    self.postMessage(message, [message.sample.buf.buffer]);
  }, "viii");
  GetFileLength = Module.addFunction(function() {
    if (FileLen == -1) {
      var xhr = new XMLHttpRequest()
      xhr.open('get', MediaName, false) //false: syn mode
      xhr.send()
      FileLen = xhr.getResponseHeader('Content-Length')
      xhr.abort()
      var xhr = new XMLHttpRequest();
      xhr.open("get", MediaName, false); //false: syn mode
      xhr.send();
      FileLen = xhr.getResponseHeader("Content-Length");
      xhr.abort();
    }
    return FileLen
  }, 'i')
    return FileLen;
  }, "i");
  ReadFile = Module.addFunction(function(Buf, Pos, Size) {
    var xhr = new XMLHttpRequest()
    xhr.open('get', MediaName, false)
    xhr.responseType = 'arraybuffer'
    xhr.setRequestHeader('Range', 'bytes=' + Pos + '-' + (Pos + Size - 1))
    xhr.send()
    Module.HEAPU8.set(new Uint8Array(xhr.response), Buf) //Uint8Array(xhr.response).length
    xhr.abort()
  }, 'viii')
    var xhr = new XMLHttpRequest();
    xhr.open("get", MediaName, false);
    xhr.responseType = "arraybuffer";
    xhr.setRequestHeader("Range", "bytes=" + Pos + "-" + (Pos + Size - 1));
    xhr.send();
    Module.HEAPU8.set(new Uint8Array(xhr.response), Buf); //Uint8Array(xhr.response).length
    xhr.abort();
  }, "viii");
  CreateVideo = Module.addFunction(function(Duration, Width, Height) {
    self.postMessage({
      command: 'create_video',
      command: "create_video",
      param: { duration: Duration, width: Width, height: Height },
    })
  }, 'viii')
    });
  }, "viii");
  CreateAudio = Module.addFunction(function(Channel, SampleRate) {
    self.postMessage({
      command: 'create_audio',
      command: "create_audio",
      param: { channel: Channel, sample_rate: SampleRate },
    })
  }, 'vii')
    });
  }, "vii");
  Notify = Module.addFunction(function(Type, Value) {
    //type 1:播放失败 2:文件播放到末尾
    //console.log(Type+" "+Value);
    if (Type == 1) self.postMessage({ command: 'play_failed' })
    else if (Type == 2) self.postMessage({ command: 'play_end' })
  }, 'vii')
    if (Type == 1) self.postMessage({ command: "play_failed" });
    else if (Type == 2) self.postMessage({ command: "play_end" });
  }, "vii");
  Module._Initialize(
    DeliverVideo,
@@ -82,87 +82,87 @@
    CreateVideo,
    CreateAudio,
    Notify
  )
  );
  self.postMessage({ command: 'initialized' })
  self.postMessage({ command: "initialized" });
}
function OnTimer() {
  Module._Turbo0(null, 0)
  Module._Turbo0(null, 0);
}
function requestWebsocket(url, msg, cb_message) {
  SocketObj = new WebSocket(url)
  SocketObj.binaryType = 'arraybuffer'
  SocketObj = new WebSocket(url);
  SocketObj.binaryType = "arraybuffer";
  SocketObj.onopen = function(evt) {
    SocketObj.send(msg)
  }
    SocketObj.send(msg);
  };
  SocketObj.onerror = function(evt) {
    console.log('Ws connect error ' + evt.data)
  }
  SocketObj.onmessage = cb_message
    console.log("Ws connect error " + evt.data);
  };
  SocketObj.onmessage = cb_message;
  SocketObj.onclose = function() {
    console.log('Ws closed.')
  }
    console.log("Ws closed.");
  };
}
function downloadFileByWebsocket(ws, payload) {
  this.requestWebsocket(ws, payload, function(evt) {
    if (evt.data.byteLength > CPointer_Cap) {
      if (CPointer_Buffer != null) Module._free(CPointer_Buffer)
      CPointer_Cap = evt.data.byteLength
      CPointer_Buffer = Module._malloc(CPointer_Cap)
      if (CPointer_Buffer != null) Module._free(CPointer_Buffer);
      CPointer_Cap = evt.data.byteLength;
      CPointer_Buffer = Module._malloc(CPointer_Cap);
    }
    var typedArray = new Uint8Array(evt.data)
    Module.HEAPU8.set(typedArray, CPointer_Buffer)
    var typedArray = new Uint8Array(evt.data);
    Module.HEAPU8.set(typedArray, CPointer_Buffer);
    //console.log("websocket data: "+typedArray.length);
    Module._Turbo0(CPointer_Buffer, typedArray.length)
  })
    Module._Turbo0(CPointer_Buffer, typedArray.length);
  });
}
self.onmessage = function(evt) {
  switch (evt.data.command) {
    case 'play': {
      MediaName = evt.data.media_name
      IsStream = evt.data.other
    case "play": {
      MediaName = evt.data.media_name;
      IsStream = evt.data.other;
      if (IsStream) {
        downloadFileByWebsocket(MediaName, evt.data.payload)
        downloadFileByWebsocket(MediaName, evt.data.payload);
      }
      Module._Play(null, !IsStream)
      TimerID = setInterval(OnTimer, 5) //此值越小,渲染精度越高,且可增强'双线程缓冲平滑机制'可靠性
      break
      Module._Play(null, !IsStream);
      TimerID = setInterval(OnTimer, 5); //此值越小,渲染精度越高,且可增强'双线程缓冲平滑机制'可靠性
      break;
    }
    case 'pause': {
      Module._Pause()
      clearInterval(TimerID)
      break
    case "pause": {
      Module._Pause();
      clearInterval(TimerID);
      break;
    }
    case 'resume': {
      Module._Resume()
      TimerID = setInterval(OnTimer, 5)
      break
    case "resume": {
      Module._Resume();
      TimerID = setInterval(OnTimer, 5);
      break;
    }
    case 'stop': {
      Module._Stop()
      clearInterval(TimerID)
    case "stop": {
      Module._Stop();
      clearInterval(TimerID);
      if (IsStream) {
        SocketObj.close()
        SocketObj.close();
        if (CPointer_Buffer != null) {
          Module._free(CPointer_Buffer)
          CPointer_Buffer = null
          CPointer_Cap = 0
          Module._free(CPointer_Buffer);
          CPointer_Buffer = null;
          CPointer_Cap = 0;
        }
      }
      close() //exit worker
      break
      close(); //exit worker
      break;
    }
    case 'seek': {
      Module._Seek(evt.data.pos)
      break
    case "seek": {
      Module._Seek(evt.data.pos);
      break;
    }
    default:
      return
      return;
  }
}
};