+"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<string>): 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);
+ });
}
}
+
+
"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.
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<string>): 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);
- // });
}
reject(res);
} else {
auth = true;
- console.log(res);
resolve(res);
}
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 {
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);
}
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<BrowserWindow> => {
+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<void> => {
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,
win.loadURL("app://./index.html");
}
+ // Handle window close.
+ win.on("closed", windowDismount);
+
win.webContents.on('did-finish-load', () => {
windowMount();
- resolve(win);
+ if (win)resolve();
});
});