diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6ecc29b..a772708 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - uses: actions/setup-node@master @@ -20,15 +20,38 @@ jobs: node-version: 16 - name: Install windows dependencies run: | + sudo apt-get update -y + sudo apt-get install -y --no-install-recommends software-properties-common + sudo dpkg --add-architecture i386 - sudo apt update - wget -qO- https://dl.winehq.org/wine-builds/winehq.key | sudo apt-key add - - sudo apt install software-properties-common - sudo apt-add-repository 'deb http://dl.winehq.org/wine-builds/ubuntu/ bionic main' - wget -qO- https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/Release.key | sudo apt-key add - - sudo sh -c 'echo "deb https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/ ./" > /etc/apt/sources.list.d/obs.list' - sudo apt update - sudo apt-get install -y --install-recommends winehq-devel + + curl -L https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_20.04/Release.key > winehq.key + sudo apt-key add winehq.key + + sudo apt-add-repository 'deb https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_20.04/ ./' + sudo apt-get update -y + + sudo apt-get -y purge software-properties-common libdbus-glib-1-2 python3-dbus python3-gi python3-pycurl python3-software-properties + + sudo apt-get install aptitude + sudo aptitude install -y libglib2.0-0:i386 + sudo aptitude install -y libgphoto2-6:i386 + sudo aptitude install -y libgstreamer-plugins-base1.0-0:i386 + sudo aptitude install -y libgstreamer1.0-0:i386 + sudo aptitude install -y libsane:i386 + sudo aptitude install -y libodbc1:i386 + + sudo rm -rvf /var/lib/apt/lists/* + sudo apt-get install -f + sudo apt-get update + sudo apt-get upgrade + sudo apt-get dist-upgrade + + sudo apt-get install -y wine-stable-i386 + + sudo apt-get install -y --no-install-recommends winehq-stable + + wine --version sudo apt-get install -y fakeroot - name: Install mono run: | @@ -39,4 +62,4 @@ jobs: - name: build run: yarn run dist env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/public/electron.js b/public/electron.js index 358fb63..f955533 100644 --- a/public/electron.js +++ b/public/electron.js @@ -18,6 +18,7 @@ console.log("notRelease", notRelease) let loadingScreen; let mainWindow; let tcpConn; +let boadcastConn; const createWindow = () => { // Create the browser window. @@ -150,7 +151,7 @@ ipcMain.on("getActReactCouples", (event, arg) => { } }); -ipcMain.on("setMicLevel", (event, arg) => { +ipcMain.on("setCompressorLevel", (event, arg) => { if (isDev) { let res = { message: "OK", @@ -203,22 +204,6 @@ ipcMain.on("setActionReaction", (event, arg) => { } }); -ipcMain.on("setAutoAudioLeveler", (event, arg) => { - if (isDev) { - let res = { - message: "OK", - statusCode: 200, - }; - event.returnValue = res; - return res; - } else { - return tcpConn.setAutoAudioLeveler(arg).then((res) => { - console.log("setAutoAudioLeveler : " + res); - event.returnValue = res; - }); - } -}); - ipcMain.on("removeActReact", (event, arg) => { if (isDev) { console.log("removeActReact") @@ -239,15 +224,22 @@ ipcMain.on("removeActReact", (event, arg) => { } }); +ipcMain.on("compressor-level-updated", (evt, arg) => { // Get from socket broadcast + mainWindow.webContents.send('compressor-level-updated'); // To renderer +}); + +ipcMain.on("scenes-updated", (evt, arg) => { // Get from socket broadcast + mainWindow.webContents.send('scenes-updated'); // To renderer +}); + ipcMain.on("connection-server-lost", (evt, arg) => { // Quit main app if (mainWindow) mainWindow.close(); tcpConn = null; + boadcastConn = null; // Load Loading page - if (loadingScreen) - loadingScreen.close() createLoadingScreen() }); @@ -258,19 +250,33 @@ ipcMain.on("close-me", (evt, arg) => { const createLoadingScreen = () => { tcpConn = new TCPConnection("localhost", 47920, ipcMain); + boadcastConn = new TCPConnection("localhost", 47920, ipcMain) // Try to connect every 5 seconds let refreshIntervalId = setInterval(() => { tcpConn .connect() .then((res) => { - console.log("TCPConnection is connected"); - launchingApplication(); - console.log("res", res); clearInterval(refreshIntervalId); - return res; - }) - .catch((err) => { + boadcastConn.connectBroadcast() + .then((broadcast_res) => { + console.log("TCPConnection and Broadcast is connected"); + launchingApplication(); + clearInterval(refreshIntervalId); + return res; + }).catch((err) => { + tcpConn.disconnectSocket() + if (isDev) { + console.log("DEV MODE"); + clearInterval(refreshIntervalId); + return null; + } else { + console.log("Can't locate the server", err); + setInterval(refreshIntervalId, 5000) + return null; + } + }) + }).catch((err) => { if (isDev) { console.log("DEV MODE"); clearInterval(refreshIntervalId); @@ -281,33 +287,35 @@ const createLoadingScreen = () => { } }); - }, 5000); - - /// create a browser window - loadingScreen = new BrowserWindow( - Object.assign({ - /// define width and height for the window - width: 440, - height: 260, - title: "EasyStream", - icon: __dirname + '/icon.png', - /// remove the window frame, so it will become a frameless window - frame: false, - /// and set the transparency, to remove any window background color - transparent: true, - webPreferences: { - nodeIntegration: true, - enableRemoteModule: isDev, - contextIsolation: false, - }, - }), - ); - loadingScreen.setResizable(false); - loadingScreen.loadURL(`file://${path.join(__dirname, "./loading.html")}`); - loadingScreen.on("closed", () => (loadingScreen = null)); - loadingScreen.webContents.on("did-finish-load", () => { - loadingScreen.show(); - }); + }, 3000); + + if (!loadingScreen) { + /// create a browser window + loadingScreen = new BrowserWindow( + Object.assign({ + /// define width and height for the window + width: 440, + height: 260, + title: "EasyStream", + icon: __dirname + '/icon.png', + /// remove the window frame, so it will become a frameless window + frame: false, + /// and set the transparency, to remove any window background color + transparent: true, + webPreferences: { + nodeIntegration: true, + enableRemoteModule: isDev, + contextIsolation: false, + }, + }), + ); + loadingScreen.setResizable(false); + loadingScreen.loadURL(`file://${path.join(__dirname, "./loading.html")}`); + loadingScreen.on("closed", () => (loadingScreen = null)); + loadingScreen.webContents.on("did-finish-load", () => { + loadingScreen.show(); + }); + } }; const launchingApplication = () => { @@ -375,6 +383,7 @@ app.on("window-all-closed", () => { app.on("before-quit", () => { tcpConn.disconnectSocket(); + boadcastConn.disconnectSocket(); }); // In this file you can include the rest of your app's specific main process diff --git a/src/Components/CompressorLevel/CompressorLevel.tsx b/src/Components/CompressorLevel/CompressorLevel.tsx index 8641234..8cbd38f 100644 --- a/src/Components/CompressorLevel/CompressorLevel.tsx +++ b/src/Components/CompressorLevel/CompressorLevel.tsx @@ -46,7 +46,7 @@ export const CompressorLevel = () => { const setVolumeToCompressor = (mic: Mic): Promise => { return new Promise(async (resolve, reject) => { const result: resultFormat = await ipcRenderer.sendSync( - "setMicLevel", + "setCompressorLevel", mic ); console.log("setVolumeToCompressor invoke", result); @@ -54,17 +54,13 @@ export const CompressorLevel = () => { }); }; - const getData = (index: number, value: number) => { + const setCompressorValue = (index: number, value: number) => { let copy = exampleCompressorArray.slice(); copy[index].level = value; console.log("Value", copy[index]); setExampleCompressorArray(copy); - // Update to server - clearTimeout(timeoutCommit); - timeoutCommit = setTimeout(() => { - setVolumeToCompressor(copy[index]); - }, 3000); + setVolumeToCompressor(copy[index]); }; const setActive = (index: number, value: boolean) => { @@ -72,14 +68,17 @@ export const CompressorLevel = () => { copy[index].isActive = value; setExampleCompressorArray(copy); - // Update to server - clearTimeout(timeoutCommit); - timeoutCommit = setTimeout(() => { - setVolumeToCompressor(copy[index]); - }, 3000); + setVolumeToCompressor(copy[index]); }; useEffect(() => { + ipcRenderer.on('compressor-level-updated', (evt: any, message: any) => { + getAllCompressors().then((res) => { + if (res.statusCode === 200) { + setExampleCompressorArray(res.data.mics); + } + }); + }) async function sleep(): Promise { return new Promise((resolve) => { getAllCompressors().then((res) => { @@ -145,7 +144,7 @@ export const CompressorLevel = () => { isActive={item.isActive} name={item.micName} value={item.level} - sendData={(val: number) => getData(index, val)} + sendData={(val: number) => setCompressorValue(index, val)} sendActive={(val: boolean) => setActive(index, val)} /> ); diff --git a/src/Socket/socket.js b/src/Socket/socket.js index f4df09f..c410469 100644 --- a/src/Socket/socket.js +++ b/src/Socket/socket.js @@ -12,11 +12,9 @@ class TCPConnection { return new Promise((resolve, reject) => { this.socket = net.createConnection({port: this.port, host: this.host}, () => { console.log('TCPConnection initialized'); - setTimeout(() => { - resolve(this.socket); - }, 3000); + resolve(this.socket); }); - this.socket.once('data', function (data) { + this.socket.once('data', (data) => { try { data = data.toString().replace('\t','').replace('\r','').replace('\n','').replace(/\0/g, ''); // Remove all useless characters const payload = JSON.parse(data); @@ -42,6 +40,49 @@ class TCPConnection { }); } + connectBroadcast() { + return new Promise((resolve, reject) => { + this.socket = net.createConnection({port: this.port, host: this.host}, () => { + console.log('TCPConnection broadcast initialized'); + this.setBrocast({ "enable": true }).then( + () => { + resolve(this.socket); + } + ) + }); + this.socket.on('data', (data) => { + try { + data = data.toString().replace('\t','').replace('\r','').replace('\n','').replace(/\0/g, ''); // Remove all useless characters + const payload = JSON.parse(data); + + if (payload.message === 'BROADCAST') { + let type = payload.data.type + + if (type === 'audioSourceCreated' || type === 'audioSourceRemoved' || type === 'audioSourceNameChanged' || type === 'micLevelChanged') { + this.ipcMain.emit('compressor-level-updated') + } else if (type === 'sceneCreated' || type === 'sceneRemoved' || type === 'sceneNameChanged') { + this.ipcMain.emit('scenes-updated') + } + } + } catch (error) { + console.error(error) + } + }); + this.socket.once('error', (error) => { + console.log("TCP server error"); + this.socket.end(); + reject(error); + }); + this.socket.once('close', (error) => { + console.log("C'est CLOSE", error) + if (!error) { + console.log('Server connection closed'); + this.socket.end(); + } + }); + }); + } + disconnectSocket() { console.log('enterring disconnectSocket'); if (this.socket && this.socket.connecting) { @@ -111,7 +152,7 @@ class TCPConnection { setVolumeToMic(args) { let obj = { - command: 'setMicLevel', + command: 'setCompressorLevel', params: args }; console.log('setVolumeToMic -> ', JSON.stringify(obj)); @@ -172,19 +213,19 @@ class TCPConnection { }); } - setAutoAudioLeveler(args) { + removeActReact(args) { let obj = { - command: 'setAutoAudioLeveler', + command: 'removeActReact', params: args }; - console.log('setAutoAudioLeveler -> ', JSON.stringify(obj)); + console.log('removeActReact -> ', JSON.stringify(obj)); return new Promise((resolve, reject) => { this.sendData(obj, (data, error) => { if (data) { - console.log('setAutoAudioLeveler resolve', data); + console.log('removeActReact resolve', data); resolve(data); } else { - console.log('setAutoAudioLeveler error', error); + console.log('removeActReact error', error); this.socket.end(); this.ipcMain.emit('connection-server-lost') reject(error); @@ -193,19 +234,19 @@ class TCPConnection { }); } - removeActReact(args) { + setBrocast(args) { let obj = { - command: 'removeActReact', + command: 'subscribeBroadcast', params: args }; - console.log('removeActReact -> ', JSON.stringify(obj)); + console.log('subscribeBroadcast -> ', JSON.stringify(obj)); return new Promise((resolve, reject) => { this.sendData(obj, (data, error) => { if (data) { - console.log('removeActReact resolve', data); + console.log('subscribeBroadcast resolve', data); resolve(data); } else { - console.log('removeActReact error', error); + console.log('subscribeBroadcast error', error); this.socket.end(); this.ipcMain.emit('connection-server-lost') reject(error); @@ -216,137 +257,6 @@ class TCPConnection { } -// function TCPConnection(host, port) { -// EventEmitter.call(this); - -// return new Promise((resolve, reject) => { -// try { -// this.socket = net.connect(port, host, (test, error) => { -// console.log('test ->', test); -// console.log('error ->', error); -// console.log('TCPConnection initialized'); -// setTimeout(() => { -// resolve(this.socket); -// }, 3000); -// }); -// this.socket.once('data', function (data) { -// data = data.toString().replace('\t','').replace('\r','').replace('\n','').replace(/\0/g, ''); // Remove all useless characters -// const payload = JSON.parse(data); -// console.log(payload); -// }); -// this.socket.once('error', (error) => { -// reject(error); -// this.socket.end(); -// }); -// } catch (error) { -// reject(error); -// } -// }); -// } - -// util.inherits(TCPConnection, EventEmitter); - -// function sendData(socket, obj, callback){ -// obj = JSON.stringify(obj); -// socket.write(obj); -// socket.once('data', (data) => { -// data = data.toString().replace('\t','').replace('\r','').replace('\n','').replace(/\0/g, ''); // Remove all useless characters -// callback(data, null) -// }); -// socket.on('error', (error) => { -// callback(null, error) -// }); -// }; - -// Get All Mics -// function getAllMics(socket) { -// let obj = { -// command: 'getAllMics', -// args: [] -// }; -// console.log('obj done'); -// return new Promise((resolve, reject) => { -// sendData(socket, obj, (data, error) => { -// if (data) { -// console.log('getAllMics resolve', data); -// resolve(data); -// } else { -// console.log('getAllMics error', error); -// socket.end(); -// reject(error); -// } -// }); -// }); -// } - -// Get Mic -// function getMic(socket, name) { -// let obj = { -// command: 'getMic', -// args: [name] -// }; -// return new Promise((resolve, reject) => { -// sendData(socket, obj, (data, error) => { -// if (data) { -// console.log('getMic resolve', data); -// resolve(data); -// } else { -// console.log('getMic error', error); -// socket.end(); -// reject(error); -// } -// }); -// }); -// } - -// Get All Events -// function getAllEvents(socket) { -// let obj = { -// command: 'getAllEvents', -// args: [] -// }; -// return new Promise((resolve, reject) => { -// sendData(socket, obj, (data, error) => { -// if (data) { -// console.log('getAllEvents resolve', data); -// resolve(data); -// } else { -// console.log('getAllEvents error', error); -// socket.end(); -// reject(error); -// } -// }); -// }); -// } - -// Get Event -// function getEvent(socket, id) { -// let obj = { -// command: 'getEvent', -// args: [id] -// }; -// return new Promise((resolve, reject) => { -// console.log('getEvent emit'); -// sendData(socket, obj, (data, error) => { -// if (data) { -// console.log('getEvent resolve', data); -// resolve(data); -// } else { -// console.log('getEvent error', error); -// socket.end(); -// reject(error); -// } -// }); -// }); -// } - -// function disconnectSocket(socket) { -// console.log('enterring disconnectSocket'); -// if (socket && socket.connecting) { -// socket.end(); -// } -// } - module.exports = { TCPConnection, }