wokada-voice-changer/client/lib/src/hooks/useWorkletNodeSetting.ts

71 lines
2.4 KiB
TypeScript
Raw Normal View History

2023-06-24 11:52:37 +09:00
import { useState, useMemo } from "react"
2023-02-20 02:21:51 +09:00
2023-06-24 11:52:37 +09:00
import { WorkletNodeSetting } from "../const"
2023-02-20 02:21:51 +09:00
import { VoiceChangerClient } from "../VoiceChangerClient"
2023-06-24 11:52:37 +09:00
2023-02-20 02:21:51 +09:00
export type UseWorkletNodeSettingProps = {
voiceChangerClient: VoiceChangerClient | null
2023-06-24 11:52:37 +09:00
defaultWorkletNodeSetting: WorkletNodeSetting
2023-02-20 02:21:51 +09:00
}
export type WorkletNodeSettingState = {
workletNodeSetting: WorkletNodeSetting;
updateWorkletNodeSetting: (setting: WorkletNodeSetting) => void
2023-02-20 04:49:34 +09:00
startOutputRecording: () => void
stopOutputRecording: () => Promise<Float32Array>
2023-02-28 11:54:40 +09:00
trancateBuffer: () => Promise<void>
2023-02-20 02:21:51 +09:00
}
export const useWorkletNodeSetting = (props: UseWorkletNodeSettingProps): WorkletNodeSettingState => {
2023-06-24 11:52:37 +09:00
const [workletNodeSetting, _setWorkletNodeSetting] = useState<WorkletNodeSetting>(props.defaultWorkletNodeSetting)
2023-02-20 02:21:51 +09:00
//////////////
// 設定
/////////////
const updateWorkletNodeSetting = useMemo(() => {
return (_workletNodeSetting: WorkletNodeSetting) => {
if (!props.voiceChangerClient) return
for (let k in _workletNodeSetting) {
2023-02-20 04:49:34 +09:00
const cur_v = workletNodeSetting[k as keyof WorkletNodeSetting]
const new_v = _workletNodeSetting[k as keyof WorkletNodeSetting]
2023-02-20 02:21:51 +09:00
if (cur_v != new_v) {
_setWorkletNodeSetting(_workletNodeSetting)
props.voiceChangerClient.updateWorkletNodeSetting(_workletNodeSetting)
break
}
}
}
}, [props.voiceChangerClient, workletNodeSetting])
2023-02-20 04:49:34 +09:00
const startOutputRecording = useMemo(() => {
return () => {
if (!props.voiceChangerClient) return
props.voiceChangerClient.startOutputRecording()
}
}, [props.voiceChangerClient])
const stopOutputRecording = useMemo(() => {
return async () => {
if (!props.voiceChangerClient) return new Float32Array()
return props.voiceChangerClient.stopOutputRecording()
}
}, [props.voiceChangerClient])
2023-02-28 11:54:40 +09:00
const trancateBuffer = useMemo(() => {
return async () => {
if (!props.voiceChangerClient) return
props.voiceChangerClient.trancateBuffer()
}
}, [props.voiceChangerClient])
2023-02-20 02:21:51 +09:00
return {
workletNodeSetting,
updateWorkletNodeSetting,
2023-02-20 04:49:34 +09:00
startOutputRecording,
2023-02-28 11:54:40 +09:00
stopOutputRecording,
trancateBuffer
2023-02-20 02:21:51 +09:00
}
}