2023-01-12 12:06:15 +03:00
|
|
|
import { useState, useMemo, useEffect } from "react"
|
2023-01-29 03:42:45 +03:00
|
|
|
import { WorkletSetting, DefaultWorkletSetting, INDEXEDDB_KEY_WORKLET } from "../const";
|
2023-01-12 17:01:45 +03:00
|
|
|
import { VoiceChangerClient } from "../VoiceChangerClient";
|
2023-01-29 03:42:45 +03:00
|
|
|
import { useIndexedDB } from "./useIndexedDB";
|
2023-01-11 22:52:01 +03:00
|
|
|
|
|
|
|
export type UseWorkletSettingProps = {
|
|
|
|
voiceChangerClient: VoiceChangerClient | null
|
|
|
|
}
|
|
|
|
|
|
|
|
export type WorkletSettingState = {
|
|
|
|
setting: WorkletSetting;
|
2023-01-29 03:42:45 +03:00
|
|
|
clearSetting: () => Promise<void>
|
2023-01-11 22:52:01 +03:00
|
|
|
setSetting: (setting: WorkletSetting) => void;
|
2023-02-12 11:07:28 +03:00
|
|
|
startOutputRecording: () => void
|
|
|
|
stopOutputRecording: () => Promise<void>
|
2023-01-11 22:52:01 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
export const useWorkletSetting = (props: UseWorkletSettingProps): WorkletSettingState => {
|
|
|
|
const [setting, _setSetting] = useState<WorkletSetting>(DefaultWorkletSetting)
|
2023-01-29 03:42:45 +03:00
|
|
|
const { setItem, getItem, removeItem } = useIndexedDB()
|
|
|
|
// 初期化 その1 DBから取得
|
|
|
|
useEffect(() => {
|
|
|
|
const loadCache = async () => {
|
|
|
|
const setting = await getItem(INDEXEDDB_KEY_WORKLET)
|
|
|
|
if (!setting) {
|
|
|
|
// デフォルト設定
|
|
|
|
const params = new URLSearchParams(location.search);
|
|
|
|
const colab = params.get("colab")
|
|
|
|
if (colab == "true") {
|
|
|
|
_setSetting({
|
|
|
|
numTrancateTreshold: 300,
|
|
|
|
volTrancateThreshold: 0.0005,
|
|
|
|
volTrancateLength: 32,
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
_setSetting({
|
|
|
|
numTrancateTreshold: 150,
|
|
|
|
volTrancateThreshold: 0.0005,
|
|
|
|
volTrancateLength: 32,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
_setSetting({
|
|
|
|
...(setting as WorkletSetting)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
loadCache()
|
|
|
|
}, [])
|
2023-01-11 22:52:01 +03:00
|
|
|
|
2023-01-29 03:42:45 +03:00
|
|
|
// 初期化 その2 クライアントに設定
|
|
|
|
useEffect(() => {
|
|
|
|
if (!props.voiceChangerClient) return
|
|
|
|
props.voiceChangerClient.configureWorklet(setting)
|
|
|
|
}, [props.voiceChangerClient, setting])
|
2023-01-11 22:52:01 +03:00
|
|
|
|
|
|
|
const setSetting = useMemo(() => {
|
|
|
|
return (setting: WorkletSetting) => {
|
|
|
|
if (!props.voiceChangerClient) return
|
|
|
|
props.voiceChangerClient.configureWorklet(setting)
|
|
|
|
_setSetting(setting)
|
2023-01-29 03:42:45 +03:00
|
|
|
setItem(INDEXEDDB_KEY_WORKLET, setting)
|
2023-01-11 22:52:01 +03:00
|
|
|
}
|
|
|
|
}, [props.voiceChangerClient])
|
|
|
|
|
2023-01-29 03:42:45 +03:00
|
|
|
const clearSetting = async () => {
|
|
|
|
await removeItem(INDEXEDDB_KEY_WORKLET)
|
|
|
|
}
|
2023-02-12 11:07:28 +03:00
|
|
|
|
|
|
|
const startOutputRecording = useMemo(() => {
|
|
|
|
return () => {
|
|
|
|
if (!props.voiceChangerClient) return
|
|
|
|
props.voiceChangerClient.startOutputRecordingWorklet()
|
|
|
|
}
|
|
|
|
}, [props.voiceChangerClient])
|
|
|
|
|
|
|
|
const stopOutputRecording = useMemo(() => {
|
|
|
|
return async () => {
|
|
|
|
if (!props.voiceChangerClient) return
|
|
|
|
props.voiceChangerClient.stopOutputRecordingWorklet()
|
|
|
|
}
|
|
|
|
}, [props.voiceChangerClient])
|
|
|
|
|
|
|
|
|
2023-01-11 22:52:01 +03:00
|
|
|
return {
|
|
|
|
setting,
|
2023-01-29 03:42:45 +03:00
|
|
|
clearSetting,
|
2023-02-12 11:07:28 +03:00
|
|
|
setSetting,
|
|
|
|
startOutputRecording,
|
|
|
|
stopOutputRecording
|
2023-01-11 22:52:01 +03:00
|
|
|
}
|
|
|
|
}
|