From 7d23347ce509496130157b1dfec74b279644e76f Mon Sep 17 00:00:00 2001 From: riqo Date: Fri, 12 Feb 2021 11:58:12 -0600 Subject: [PATCH] audio restart fixed --- src/background/audio.ts | 55 +++++++++++++------------- src/background/run.ts | 82 ++++----------------------------------- src/background/session.ts | 1 - src/background/window.ts | 44 +++++++++++++++++++-- 4 files changed, 76 insertions(+), 106 deletions(-) diff --git a/src/background/audio.ts b/src/background/audio.ts index 7a30f32..c44def2 100644 --- a/src/background/audio.ts +++ b/src/background/audio.ts @@ -1,5 +1,9 @@ +"use strict"; +/* eslint @typescript-eslint/no-var-requires: "off" */ +import { sendMessage } from './session' const portAudio = require('naudiodon'); +let ia: typeof portAudio.AudioIO; let audioInput: string[] = []; function processAudio(audioInput: Array): Buffer { @@ -8,42 +12,39 @@ function processAudio(audioInput: Array): Buffer { return Buffer.from(audio, "base64"); } - -const updateRecorder = async (Event: any, record: boolean): void => { +export const updateRecorder = (_event, record: boolean): void => { if (record) { ia.resume(); } else { ia.pause(); const audio = processAudio(audioInput); - // emmit ws event with audio - // sendAudio(audio); + sendMessage(audio); audioInput = []; } } +export const initRecorder = () => { -const ia = new portAudio.AudioIO({ - inOptions: { - channelCount: 1, - sampleFormat: 16, - sampleRate: 16000, - deviceId: -1, - closeOnError: false, - } -}); -ia.setEncoding('base64'); -ia.start(); -ia.pause(); -ia.on('error', (e: Error) => { - console.log('Error recording audio', + e); -}); -ia.on('data', (chunk: string) => { - audioInput.push(chunk); -}); - -export function useIA() { - return { - ia, - processAudio + if (!ia) { + ia = new portAudio.AudioIO({ + inOptions: { + channelCount: 1, + sampleFormat: 16, + sampleRate: 16000, + deviceId: -1, + closeOnError: false, + } + }); + ia.setEncoding('base64'); + ia.start(); + ia.pause(); + ia.on('error', (e: Error) => { + console.log('Error recording audio', + e); + }); + ia.on('data', (chunk: string) => { + audioInput.push(chunk); + }); } } + + diff --git a/src/background/run.ts b/src/background/run.ts index fb237da..d3ab521 100644 --- a/src/background/run.ts +++ b/src/background/run.ts @@ -1,40 +1,10 @@ "use strict"; import { createWindow } from './window'; -import { ipcMain, BrowserWindow } from "electron"; import { initSession } from './session'; -import { backgroundMitt } from './emitter'; -// const portAudio = require('naudiodon'); +import { initRecorder } from './audio'; -interface RenderMessage { - content: string; - context: string; - subContext: string; - modifiers: string; - time: string; - id: string; -} - -interface IpcRendererPayload { - endpoint: string; - message: RenderMessage | null; -} - -let win: BrowserWindow | null; -let activeSession = false; - -backgroundMitt.on('ipc-renderer', (payload: IpcRendererPayload) => { - if (win) - win.webContents.send(payload.endpoint, { - message: payload.message - }); -}); - -const windowDismount = (): void => { - win = null; - backgroundMitt.emit('window-active', false); - ipcMain.removeAllListeners('send-message'); -} +let socket = false; /* * The main function will be run after electron app is ready. @@ -42,55 +12,17 @@ const windowDismount = (): void => { export async function main() { // create main window. - if (!win) win = await createWindow({ + await createWindow({ width: 350, height: 525, resizable: true }); // Instantiate socket session with crimata-platorm. - if (!activeSession) initSession(); - - activeSession = true; - - // Handle window close. - win.on("closed", windowDismount); - - // TODO: FIX recorder restart bug - // let audioInput: string[] = []; - // const updateRecorder = async (Event: any, record: boolean): void => { - // if (record) { - // ia.resume(); - // } else { - // ia.pause(); - // const audio = processAudio(audioInput); - // sendAudio(audio); - // audioInput = []; - // } - // } + if (!socket) initSession(); + socket = true; - // function processAudio(audioInput: Array): Buffer { - // let audio = ''; - // audioInput.forEach(chunk => audio += chunk); - // return Buffer.from(audio, "base64"); - // } + // Begin audio stream. + initRecorder(); - // const ia = new portAudio.AudioIO({ - // inOptions: { - // channelCount: 1, - // sampleFormat: 16, - // sampleRate: 16000, - // deviceId: -1, - // closeOnError: false, - // } - // }); - // ia.setEncoding('base64'); - // ia.start(); - // ia.pause(); - // ia.on('error', (e: Error) => { - // console.log('Error recording audio', + e); - // }); - // ia.on('data', (chunk: string) => { - // audioInput.push(chunk); - // }); } diff --git a/src/background/session.ts b/src/background/session.ts index f1e210a..fe0fbf1 100644 --- a/src/background/session.ts +++ b/src/background/session.ts @@ -41,7 +41,6 @@ const authSession = async (_event, payload: string | UserCreds | null): Promise< reject(res); } else { auth = true; - console.log(res); resolve(res); } diff --git a/src/background/window.ts b/src/background/window.ts index 70bc7dc..1fb69e9 100644 --- a/src/background/window.ts +++ b/src/background/window.ts @@ -4,6 +4,7 @@ import { BrowserWindow, ipcMain } from "electron"; import { createProtocol } from "vue-cli-plugin-electron-builder/lib"; import { backgroundMitt } from './emitter'; import { sendMessage } from './session'; +import { updateRecorder } from './audio'; import * as path from "path"; interface WindowSettings { @@ -17,6 +18,22 @@ interface TextMessage { content: string; } +interface RenderMessage { + content: string; + context: string; + subContext: string; + modifiers: string; + time: string; + id: string; +} + +interface IpcRendererPayload { + endpoint: string; + message: RenderMessage | null; +} + +let win: BrowserWindow | null; + const handleMessage = (_event, arg: TextMessage | Buffer ) => { sendMessage(arg); } @@ -24,11 +41,29 @@ const handleMessage = (_event, arg: TextMessage | Buffer ) => { const windowMount = (): void => { backgroundMitt.emit('window-active', true); ipcMain.on('send-message', handleMessage); + ipcMain.on('update-recorder', updateRecorder); } -export const createWindow = async (options: WindowSettings): Promise => { +const windowDismount = (): void => { + win = null; + backgroundMitt.emit('window-active', false); + ipcMain.removeAllListeners('send-message'); + ipcMain.removeAllListeners('update-recorder'); +} + +backgroundMitt.on('ipc-renderer', (payload: IpcRendererPayload) => { + if (win) + win.webContents.send(payload.endpoint, { + message: payload.message + }); +}); + +export const createWindow = async (options: WindowSettings): Promise => { return new Promise((resolve, _reject) => { - const win: BrowserWindow = new BrowserWindow({ + + if (win) resolve(); + + win= new BrowserWindow({ width: options.width, height: options.height, resizable: options.resizable, @@ -50,9 +85,12 @@ export const createWindow = async (options: WindowSettings): Promise { windowMount(); - resolve(win); + if (win)resolve(); }); }); -- 2.43.0