2023-01-12 10:38:45 +03:00
|
|
|
import { VoiceChangerClient } from "@dannadori/voice-changer-client-js"
|
2023-01-07 14:07:39 +03:00
|
|
|
import { useEffect, useMemo, useRef, useState } from "react"
|
2023-01-12 10:38:45 +03:00
|
|
|
import { ClientSettingState, useClientSetting } from "./useClientSetting"
|
|
|
|
import { ServerSettingState, useServerSetting } from "./useServerSetting"
|
2023-01-11 22:52:01 +03:00
|
|
|
import { useWorkletSetting, WorkletSettingState } from "./useWorkletSetting"
|
2023-01-07 14:07:39 +03:00
|
|
|
|
|
|
|
export type UseClientProps = {
|
|
|
|
audioContext: AudioContext | null
|
|
|
|
audioOutputElementId: string
|
|
|
|
}
|
|
|
|
|
|
|
|
export type ClientState = {
|
2023-01-12 10:38:45 +03:00
|
|
|
workletSetting: WorkletSettingState
|
|
|
|
clientSetting: ClientSettingState
|
|
|
|
serverSetting: ServerSettingState
|
|
|
|
|
2023-01-07 14:07:39 +03:00
|
|
|
bufferingTime: number;
|
|
|
|
responseTime: number;
|
|
|
|
volume: number;
|
2023-01-08 10:18:20 +03:00
|
|
|
|
|
|
|
getInfo: () => Promise<void>
|
2023-01-07 14:07:39 +03:00
|
|
|
}
|
2023-01-11 17:12:29 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
2023-01-07 14:07:39 +03:00
|
|
|
export const useClient = (props: UseClientProps): ClientState => {
|
|
|
|
|
2023-01-12 10:38:45 +03:00
|
|
|
// (1-1) クライアント
|
2023-01-11 22:52:01 +03:00
|
|
|
const voiceChangerClientRef = useRef<VoiceChangerClient | null>(null)
|
|
|
|
const [voiceChangerClient, setVoiceChangerClient] = useState<VoiceChangerClient | null>(voiceChangerClientRef.current)
|
2023-01-12 10:38:45 +03:00
|
|
|
//// クライアント初期化待ち用フラグ
|
2023-01-08 14:28:57 +03:00
|
|
|
const initializedResolveRef = useRef<(value: void | PromiseLike<void>) => void>()
|
|
|
|
const initializedPromise = useMemo(() => {
|
|
|
|
return new Promise<void>((resolve) => {
|
|
|
|
initializedResolveRef.current = resolve
|
|
|
|
})
|
|
|
|
}, [])
|
2023-01-12 10:38:45 +03:00
|
|
|
|
|
|
|
|
|
|
|
// (1-2) 各種設定
|
|
|
|
const clientSetting = useClientSetting({ voiceChangerClient, audioContext: props.audioContext })
|
|
|
|
const workletSetting = useWorkletSetting({ voiceChangerClient })
|
|
|
|
const serverSetting = useServerSetting({ voiceChangerClient })
|
|
|
|
|
|
|
|
// (1-3) ステータス
|
2023-01-10 16:49:16 +03:00
|
|
|
const [bufferingTime, setBufferingTime] = useState<number>(0)
|
|
|
|
const [responseTime, setResponseTime] = useState<number>(0)
|
|
|
|
const [volume, setVolume] = useState<number>(0)
|
2023-01-08 14:28:57 +03:00
|
|
|
|
2023-01-11 09:35:49 +03:00
|
|
|
|
2023-01-12 10:38:45 +03:00
|
|
|
// (2-1) 初期化処理
|
2023-01-07 14:07:39 +03:00
|
|
|
useEffect(() => {
|
|
|
|
const initialized = async () => {
|
|
|
|
if (!props.audioContext) {
|
|
|
|
return
|
|
|
|
}
|
2023-01-11 22:52:01 +03:00
|
|
|
const voiceChangerClient = new VoiceChangerClient(props.audioContext, true, {
|
2023-01-07 14:07:39 +03:00
|
|
|
notifySendBufferingTime: (val: number) => {
|
|
|
|
setBufferingTime(val)
|
|
|
|
},
|
|
|
|
notifyResponseTime: (val: number) => {
|
|
|
|
setResponseTime(val)
|
|
|
|
},
|
|
|
|
notifyException: (mes: string) => {
|
|
|
|
if (mes.length > 0) {
|
|
|
|
console.log(`error:${mes}`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
notifyVolume: (vol: number) => {
|
|
|
|
setVolume(vol)
|
|
|
|
}
|
|
|
|
})
|
2023-01-08 14:28:57 +03:00
|
|
|
|
2023-01-07 14:07:39 +03:00
|
|
|
await voiceChangerClient.isInitialized()
|
|
|
|
voiceChangerClientRef.current = voiceChangerClient
|
2023-01-11 22:52:01 +03:00
|
|
|
setVoiceChangerClient(voiceChangerClientRef.current)
|
2023-01-08 10:18:20 +03:00
|
|
|
console.log("[useClient] client initialized")
|
2023-01-07 14:07:39 +03:00
|
|
|
|
|
|
|
const audio = document.getElementById(props.audioOutputElementId) as HTMLAudioElement
|
|
|
|
audio.srcObject = voiceChangerClientRef.current.stream
|
|
|
|
audio.play()
|
2023-01-08 14:28:57 +03:00
|
|
|
initializedResolveRef.current!()
|
2023-01-07 14:07:39 +03:00
|
|
|
}
|
|
|
|
initialized()
|
|
|
|
}, [props.audioContext])
|
|
|
|
|
2023-01-08 10:18:20 +03:00
|
|
|
|
2023-01-12 10:38:45 +03:00
|
|
|
// (2-2) 情報リロード
|
2023-01-08 10:18:20 +03:00
|
|
|
const getInfo = useMemo(() => {
|
|
|
|
return async () => {
|
2023-01-08 14:28:57 +03:00
|
|
|
await initializedPromise
|
2023-01-12 10:38:45 +03:00
|
|
|
await clientSetting.reloadClientSetting()
|
|
|
|
await serverSetting.reloadServerInfo()
|
2023-01-10 20:19:54 +03:00
|
|
|
}
|
2023-01-12 10:38:45 +03:00
|
|
|
}, [clientSetting, serverSetting])
|
2023-01-11 17:12:29 +03:00
|
|
|
|
|
|
|
|
2023-01-11 22:52:01 +03:00
|
|
|
|
2023-01-07 14:07:39 +03:00
|
|
|
return {
|
|
|
|
bufferingTime,
|
|
|
|
responseTime,
|
|
|
|
volume,
|
|
|
|
|
2023-01-08 10:18:20 +03:00
|
|
|
getInfo,
|
2023-01-11 22:52:01 +03:00
|
|
|
|
2023-01-12 10:38:45 +03:00
|
|
|
clientSetting,
|
|
|
|
workletSetting,
|
|
|
|
serverSetting,
|
2023-01-07 14:07:39 +03:00
|
|
|
}
|
|
|
|
}
|