import * as native from "tc-native/connection"; //FIXME: Native audio initialize handle! export interface Device { device_id: string; name: string; } let _initialized_callbacks: (() => any)[] = []; export let _initialized = false; export let _initializing = false; export let _current_device: native.audio.AudioDevice; export function initialized() : boolean { return _initialized; } export function on_ready(cb: () => any) { if(_initialized) cb(); else _initialized_callbacks.push(cb); } export function initialize() { if(_initializing) return; _initializing = true; native.audio.initialize(() => { _initialized = true; for(const callback of _initialized_callbacks) callback(); _initialized_callbacks = []; }); return true; } export async function available_devices() : Promise { return native.audio.available_devices().filter(e => e.output_supported || e.output_default); } export async function set_device(device_id?: string) : Promise { const dev = native.audio.available_devices().filter(e => e.device_id == device_id); if(dev.length == 0) { console.warn("Missing audio device with is %s", device_id); throw "invalid device id"; } try { native.audio.playback.set_device(dev[0].device_id); } catch(error) { if(error instanceof Error) throw error.message; throw error; } _current_device = dev[0]; } export function current_device() : Device { if(_current_device) return _current_device; const dev = native.audio.available_devices().filter(e => e.output_default); if(dev.length > 0) return dev[0]; return {device_id: "default", name: "default"} as Device; } export function get_master_volume() : number { return native.audio.playback.get_master_volume(); } export function set_master_volume(volume: number) { native.audio.playback.set_master_volume(volume); }