@pipecat-ai/client-react 0.3.5 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -1
- package/dist/index.d.ts +68 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +232 -66
- package/dist/index.js.map +1 -1
- package/dist/index.module.js +230 -68
- package/dist/index.module.js.map +1 -1
- package/package.json +6 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["client-react/src/index.ts","client-react/src/RTVIClientAudio.tsx","client-react/src/useRTVIClientEvent.ts","client-react/src/useRTVIClient.ts","client-react/src/RTVIClientProvider.tsx","client-react/src/useRTVIClientMediaTrack.ts","client-react/src/RTVIClientVideo.tsx","client-react/src/useMergedRef.ts","client-react/src/useRTVIClientMediaDevices.ts","client-react/src/useRTVIClientTransportState.ts","client-react/src/VoiceVisualizer.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIClientAudio } from \"./RTVIClientAudio\";\nimport { RTVIClientProvider } from \"./RTVIClientProvider\";\nimport { RTVIClientVideo } from \"./RTVIClientVideo\";\nimport { useRTVIClient } from \"./useRTVIClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\nimport { useRTVIClientMediaDevices } from \"./useRTVIClientMediaDevices\";\nimport { useRTVIClientMediaTrack } from \"./useRTVIClientMediaTrack\";\nimport { useRTVIClientTransportState } from \"./useRTVIClientTransportState\";\nimport { VoiceVisualizer } from \"./VoiceVisualizer\";\n\nexport {\n RTVIClientAudio,\n RTVIClientProvider,\n RTVIClientVideo,\n useRTVIClient,\n useRTVIClientEvent,\n useRTVIClientMediaDevices,\n useRTVIClientMediaTrack,\n useRTVIClientTransportState,\n VoiceVisualizer,\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\nimport { useRTVIClientMediaTrack } from \"./useRTVIClientMediaTrack\";\n\nexport const RTVIClientAudio = () => {\n const botAudioRef = useRef<HTMLAudioElement>(null);\n const botAudioTrack = useRTVIClientMediaTrack(\"audio\", \"bot\");\n\n useEffect(() => {\n if (!botAudioRef.current || !botAudioTrack) return;\n if (botAudioRef.current.srcObject) {\n const oldTrack = (\n botAudioRef.current.srcObject as MediaStream\n ).getAudioTracks()[0];\n if (oldTrack.id === botAudioTrack.id) return;\n }\n botAudioRef.current.srcObject = new MediaStream([botAudioTrack]);\n }, [botAudioTrack]);\n\n useRTVIClientEvent(\n RTVIEvent.SpeakerUpdated,\n useCallback((speaker: MediaDeviceInfo) => {\n if (!botAudioRef.current) return;\n if (typeof botAudioRef.current.setSinkId !== \"function\") return;\n botAudioRef.current.setSinkId(speaker.deviceId);\n }, [])\n );\n\n return (\n <>\n <audio ref={botAudioRef} autoPlay />\n </>\n );\n};\nRTVIClientAudio.displayName = \"RTVIClientAudio\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent, RTVIEventHandler } from \"@pipecat-ai/client-js\";\nimport { useEffect } from \"react\";\nimport { useRTVIClient } from \"./useRTVIClient\";\n\nexport const useRTVIClientEvent = <E extends RTVIEvent>(\n event: E,\n handler: RTVIEventHandler<E>\n) => {\n const client = useRTVIClient();\n\n useEffect(() => {\n if (!client) return;\n client.on(event, handler);\n return () => {\n client.off(event, handler);\n };\n }, [event, handler, client]);\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\nimport { RTVIClientContext } from \"./RTVIClientProvider\";\n\nexport const useRTVIClient = () => {\n const { client } = useContext(RTVIClientContext);\n return client;\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { createContext } from \"react\";\n\nimport { RTVIClient } from \"@pipecat-ai/client-js\";\nimport { createStore } from \"jotai\";\nimport { Provider as JotaiProvider } from \"jotai/react\";\n\nexport interface Props {\n client: RTVIClient;\n jotaiStore?: React.ComponentProps<typeof JotaiProvider>[\"store\"];\n}\n\nconst defaultStore = createStore();\n\nexport const RTVIClientContext = createContext<{ client?: RTVIClient }>({});\n\nexport const RTVIClientProvider: React.FC<React.PropsWithChildren<Props>> = ({\n children,\n client,\n jotaiStore = defaultStore,\n}) => {\n return (\n <JotaiProvider store={jotaiStore}>\n <RTVIClientContext.Provider value={{ client }}>\n {children}\n </RTVIClientContext.Provider>\n </JotaiProvider>\n );\n};\nRTVIClientProvider.displayName = \"RTVIClientProvider\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { Participant, RTVIEvent, Tracks } from \"@pipecat-ai/client-js\";\nimport { atom, useAtomValue } from \"jotai\";\nimport { atomFamily, useAtomCallback } from \"jotai/utils\";\nimport { PrimitiveAtom } from \"jotai/vanilla\";\nimport { useCallback, useEffect } from \"react\";\nimport { useRTVIClient } from \"./useRTVIClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\ntype ParticipantType = keyof Tracks;\ntype TrackType = keyof Tracks[\"local\"];\n\nconst localAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localVideoTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localScreenAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localScreenVideoTrackAtom = atom<MediaStreamTrack | null>(null);\nconst botAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst botVideoTrackAtom = atom<MediaStreamTrack | null>(null);\n\nconst trackAtom = atomFamily<\n { local: boolean; trackType: TrackType },\n PrimitiveAtom<MediaStreamTrack | null>\n>(({ local, trackType }) => {\n if (local) {\n switch (trackType) {\n case \"audio\":\n return localAudioTrackAtom;\n case \"screenAudio\":\n return localScreenAudioTrackAtom;\n case \"screenVideo\":\n return localScreenVideoTrackAtom;\n case \"video\":\n return localVideoTrackAtom;\n }\n }\n return trackType === \"audio\" ? botAudioTrackAtom : botVideoTrackAtom;\n});\n\nexport const useRTVIClientMediaTrack = (\n trackType: TrackType,\n participantType: ParticipantType\n) => {\n const client = useRTVIClient();\n const track = useAtomValue(\n trackAtom({ local: participantType === \"local\", trackType })\n );\n\n const updateTrack = useAtomCallback(\n useCallback(\n (\n get,\n set,\n track: MediaStreamTrack,\n trackType: TrackType,\n local: boolean\n ) => {\n const atom = trackAtom({\n local,\n trackType,\n });\n const oldTrack = get(atom);\n if (oldTrack?.id === track.id) return;\n set(atom, track);\n },\n [participantType, track, trackType]\n )\n );\n\n useRTVIClientEvent(\n RTVIEvent.TrackStarted,\n useCallback((track: MediaStreamTrack, participant?: Participant) => {\n updateTrack(track, track.kind as TrackType, Boolean(participant?.local));\n }, [])\n );\n\n useRTVIClientEvent(\n RTVIEvent.ScreenTrackStarted,\n useCallback((track: MediaStreamTrack, participant?: Participant) => {\n const trackType = track.kind === \"audio\" ? \"screenAudio\" : \"screenVideo\";\n updateTrack(track, trackType, Boolean(participant?.local));\n }, [])\n );\n\n useEffect(() => {\n if (!client) return;\n const tracks = client.tracks();\n const track = tracks?.[participantType]?.[trackType];\n if (!track) return;\n updateTrack(track, trackType, participantType === \"local\");\n }, [participantType, trackType, updateTrack, client]);\n\n return track;\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { forwardRef, useEffect, useRef } from \"react\";\nimport useMergedRef from \"./useMergedRef\";\nimport { useRTVIClientMediaTrack } from \"./useRTVIClientMediaTrack\";\n\ninterface RTVIClientVideoInterface {\n aspectRatio: number;\n height: number;\n width: number;\n}\n\nexport interface Props\n extends Omit<React.VideoHTMLAttributes<HTMLVideoElement>, \"onResize\"> {\n participant: \"local\" | \"bot\";\n\n /**\n * Defines the video track type to display. Default: 'video'.\n */\n trackType?: \"screenVideo\" | \"video\";\n\n /**\n * Defines whether the video should be fully contained or cover the box. Default: 'contain'.\n */\n fit?: \"contain\" | \"cover\";\n /**\n * Forces the video to be mirrored, if set.\n */\n mirror?: boolean;\n\n /**\n * Optional callback, which is triggered whenever the video's rendered width or height changes.\n * Returns the video's native width, height and aspectRatio.\n */\n onResize?(dimensions: RTVIClientVideoInterface): void;\n}\n\nexport const RTVIClientVideo = forwardRef<HTMLVideoElement, Props>(\n function VoiceClientVideo(\n {\n participant = \"local\",\n fit = \"contain\",\n mirror,\n onResize,\n style = {},\n trackType = \"video\",\n ...props\n },\n ref\n ) {\n const videoTrack: MediaStreamTrack | null = useRTVIClientMediaTrack(\n trackType,\n participant\n );\n\n const videoEl = useRef<HTMLVideoElement>(null);\n const videoRef = useMergedRef<HTMLVideoElement>(videoEl, ref);\n\n /**\n * Handle canplay & picture-in-picture events.\n */\n useEffect(function setupVideoEvents() {\n const video = videoEl.current;\n if (!video) return;\n\n const playVideo = () => {\n const promise = video.play();\n if (promise !== undefined) {\n promise\n .then(() => {\n // All good, playback started.\n video.controls = false;\n })\n .catch((error) => {\n // Auto-play was prevented. Show video controls, so user can play video manually.\n video.controls = true;\n console.warn(\"Failed to play video\", error);\n });\n }\n };\n\n const handleCanPlay = () => {\n if (!video.paused) return;\n playVideo();\n };\n const handleEnterPIP = () => {\n video.style.transform = \"scale(1)\";\n };\n const handleLeavePIP = () => {\n video.style.transform = \"\";\n setTimeout(() => {\n if (video.paused) playVideo();\n }, 100);\n };\n const handleVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") return;\n if (!video.paused) return;\n playVideo();\n };\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"enterpictureinpicture\", handleEnterPIP);\n video.addEventListener(\"leavepictureinpicture\", handleLeavePIP);\n\n // Videos can be paused if media was played in another app on iOS.\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n return () => {\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"enterpictureinpicture\", handleEnterPIP);\n video.removeEventListener(\"leavepictureinpicture\", handleLeavePIP);\n document.removeEventListener(\n \"visibilitychange\",\n handleVisibilityChange\n );\n };\n }, []);\n\n /**\n * Update srcObject.\n */\n useEffect(\n function updateSrcObject() {\n const video = videoEl.current;\n if (!video || !videoTrack) return;\n video.srcObject = new MediaStream([videoTrack]);\n video.load();\n return () => {\n // clean up when unmounted\n video.srcObject = null;\n video.load();\n };\n },\n [videoTrack, videoTrack?.id]\n );\n\n /**\n * Add optional event listener for resize event so the parent component\n * can know the video's native aspect ratio.\n */\n useEffect(\n function reportVideoDimensions() {\n const video = videoEl.current;\n if (!onResize || !video) return;\n\n let frame: ReturnType<typeof requestAnimationFrame>;\n function handleResize() {\n if (frame) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n const video = videoEl.current;\n if (!video || document.hidden) return;\n const videoWidth = video.videoWidth;\n const videoHeight = video.videoHeight;\n if (videoWidth && videoHeight) {\n onResize?.({\n aspectRatio: videoWidth / videoHeight,\n height: videoHeight,\n width: videoWidth,\n });\n }\n });\n }\n\n handleResize();\n video.addEventListener(\"loadedmetadata\", handleResize);\n video.addEventListener(\"resize\", handleResize);\n\n return () => {\n if (frame) cancelAnimationFrame(frame);\n video.removeEventListener(\"loadedmetadata\", handleResize);\n video.removeEventListener(\"resize\", handleResize);\n };\n },\n [onResize]\n );\n\n return (\n <video\n autoPlay\n muted\n playsInline\n ref={videoRef}\n style={{\n objectFit: fit,\n transform: mirror ? \"scale(-1, 1)\" : \"\",\n ...style,\n }}\n {...props}\n />\n );\n }\n);\nRTVIClientVideo.displayName = \"RTVIClientVideo\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n *\n * This file contains code derived from:\n * https://github.com/jaredLunde/react-hook/blob/master/packages/merged-ref/src/index.tsx\n * Original author: Jared Lunde (https://github.com/jaredLunde)\n * Original license: MIT (https://github.com/jaredLunde/react-hook/blob/master/LICENSE)\n */\n\nimport React, { useCallback } from \"react\";\n\nfunction useMergedRef<T>(...refs: React.Ref<T>[]): React.RefCallback<T> {\n return useCallback(\n (element: T) => {\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i];\n if (typeof ref === \"function\") ref(element);\n else if (ref && typeof ref === \"object\")\n (ref as React.MutableRefObject<T>).current = element;\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs\n );\n}\n\nexport default useMergedRef;\n","import { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { atom, useAtomValue } from \"jotai\";\nimport { useAtomCallback } from \"jotai/utils\";\nimport { useCallback } from \"react\";\nimport { useRTVIClient } from \"./useRTVIClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\ntype OptionalMediaDeviceInfo = MediaDeviceInfo | Record<string, never>;\n\nconst availableMicsAtom = atom<MediaDeviceInfo[]>([]);\nconst availableCamsAtom = atom<MediaDeviceInfo[]>([]);\nconst availableSpeakersAtom = atom<MediaDeviceInfo[]>([]);\nconst selectedMicAtom = atom<OptionalMediaDeviceInfo>({});\nconst selectedCamAtom = atom<OptionalMediaDeviceInfo>({});\nconst selectedSpeakerAtom = atom<OptionalMediaDeviceInfo>({});\n\nexport const useRTVIClientMediaDevices = () => {\n const client = useRTVIClient();\n\n const availableCams = useAtomValue(availableCamsAtom);\n const availableMics = useAtomValue(availableMicsAtom);\n const availableSpeakers = useAtomValue(availableSpeakersAtom);\n const selectedCam = useAtomValue(selectedCamAtom);\n const selectedMic = useAtomValue(selectedMicAtom);\n const selectedSpeaker = useAtomValue(selectedSpeakerAtom);\n\n useRTVIClientEvent(\n RTVIEvent.AvailableCamsUpdated,\n useAtomCallback(\n useCallback((_get, set, cams) => {\n set(availableCamsAtom, cams);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.AvailableMicsUpdated,\n useAtomCallback(\n useCallback((_get, set, mics) => {\n set(availableMicsAtom, mics);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.AvailableSpeakersUpdated,\n useAtomCallback(\n useCallback((_get, set, speakers) => {\n set(availableSpeakersAtom, speakers);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.CamUpdated,\n useAtomCallback(\n useCallback((_get, set, cam) => {\n set(selectedCamAtom, cam);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.MicUpdated,\n useAtomCallback(\n useCallback((_get, set, mic) => {\n set(selectedMicAtom, mic);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.SpeakerUpdated,\n useAtomCallback(\n useCallback((_get, set, speaker) => {\n set(selectedSpeakerAtom, speaker);\n }, [])\n )\n );\n\n const updateCam = useCallback(\n (id: string) => {\n client?.updateCam(id);\n },\n [client]\n );\n const updateMic = useCallback(\n (id: string) => {\n client?.updateMic(id);\n },\n [client]\n );\n const updateSpeaker = useCallback(\n (id: string) => {\n client?.updateSpeaker(id);\n },\n [client]\n );\n\n return {\n availableCams,\n availableMics,\n availableSpeakers,\n selectedCam,\n selectedMic,\n selectedSpeaker,\n updateCam,\n updateMic,\n updateSpeaker,\n };\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent, TransportState } from \"@pipecat-ai/client-js\";\nimport { atom, useAtom } from \"jotai\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\nconst transportStateAtom = atom<TransportState>(\"disconnected\");\n\nexport const useRTVIClientTransportState = () => {\n const [transportState, setTransportState] = useAtom(transportStateAtom);\n\n useRTVIClientEvent(RTVIEvent.TransportStateChanged, setTransportState);\n\n return transportState;\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { useEffect, useRef } from \"react\";\nimport { useRTVIClientMediaTrack } from \"./useRTVIClientMediaTrack\";\n\ntype ParticipantType = Parameters<typeof useRTVIClientMediaTrack>[1];\n\ninterface Props {\n backgroundColor?: string;\n barColor?: string;\n barGap?: number;\n barWidth?: number;\n barMaxHeight?: number;\n participantType: ParticipantType;\n}\n\nexport const VoiceVisualizer: React.FC<Props> = React.memo(\n ({\n backgroundColor = \"transparent\",\n barColor = \"black\",\n barWidth = 30,\n barGap = 12,\n barMaxHeight = 120,\n participantType,\n }) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const track: MediaStreamTrack | null = useRTVIClientMediaTrack(\n \"audio\",\n participantType\n );\n\n useEffect(() => {\n if (!canvasRef.current) return;\n\n const canvasWidth = 5 * barWidth + 4 * barGap;\n const canvasHeight = barMaxHeight;\n\n const canvas = canvasRef.current;\n\n const scaleFactor = 2;\n\n // Make canvas fill the width and height of its container\n const resizeCanvas = () => {\n canvas.width = canvasWidth * scaleFactor;\n canvas.height = canvasHeight * scaleFactor;\n\n canvas.style.width = `${canvasWidth}px`;\n canvas.style.height = `${canvasHeight}px`;\n\n canvasCtx.lineCap = \"round\";\n canvasCtx.scale(scaleFactor, scaleFactor);\n };\n\n const canvasCtx = canvas.getContext(\"2d\")!;\n resizeCanvas();\n\n if (!track) return;\n\n const audioContext = new AudioContext();\n const source = audioContext.createMediaStreamSource(\n new MediaStream([track])\n );\n const analyser = audioContext.createAnalyser();\n\n analyser.fftSize = 1024;\n\n source.connect(analyser);\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n\n canvasCtx.lineCap = \"round\";\n\n const bands = [\n { startFreq: 85, endFreq: 255, smoothValue: 0 }, // Covers fundamental frequencies for male and female voices\n { startFreq: 255, endFreq: 500, smoothValue: 0 }, // Lower formants and some harmonics\n { startFreq: 500, endFreq: 2000, smoothValue: 0 }, // Vowel formants and key consonant frequencies\n { startFreq: 2000, endFreq: 4000, smoothValue: 0 }, // Higher formants, \"clarity\" of speech\n { startFreq: 4000, endFreq: 8000, smoothValue: 0 }, // Sibilance and high-frequency consonants\n ];\n\n const getFrequencyBinIndex = (frequency: number) => {\n const nyquist = audioContext.sampleRate / 2;\n return Math.round(\n (frequency / nyquist) * (analyser.frequencyBinCount - 1)\n );\n };\n\n function drawSpectrum() {\n analyser.getByteFrequencyData(frequencyData);\n canvasCtx.clearRect(\n 0,\n 0,\n canvas.width / scaleFactor,\n canvas.height / scaleFactor\n );\n canvasCtx.fillStyle = backgroundColor;\n canvasCtx.fillRect(\n 0,\n 0,\n canvas.width / scaleFactor,\n canvas.height / scaleFactor\n );\n\n let isActive = false;\n\n const totalBarsWidth =\n bands.length * barWidth + (bands.length - 1) * barGap;\n const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2; // Center bars\n\n const adjustedCircleRadius = barWidth / 2; // Fixed radius for reset circles\n\n bands.forEach((band, i) => {\n const startIndex = getFrequencyBinIndex(band.startFreq);\n const endIndex = getFrequencyBinIndex(band.endFreq);\n const bandData = frequencyData.slice(startIndex, endIndex);\n const bandValue =\n bandData.reduce((acc, val) => acc + val, 0) / bandData.length;\n\n const smoothingFactor = 0.2;\n\n if (bandValue < 1) {\n band.smoothValue = Math.max(\n band.smoothValue - smoothingFactor * 5,\n 0\n );\n } else {\n band.smoothValue =\n band.smoothValue +\n (bandValue - band.smoothValue) * smoothingFactor;\n isActive = true;\n }\n\n const x = startX + i * (barWidth + barGap);\n // Calculate bar height with a maximum cap\n const barHeight = Math.min(\n (band.smoothValue / 255) * barMaxHeight,\n barMaxHeight\n );\n\n const yTop = Math.max(\n canvas.height / scaleFactor / 2 - barHeight / 2,\n adjustedCircleRadius\n );\n const yBottom = Math.min(\n canvas.height / scaleFactor / 2 + barHeight / 2,\n canvas.height / scaleFactor - adjustedCircleRadius\n );\n\n if (band.smoothValue > 0) {\n canvasCtx.beginPath();\n canvasCtx.moveTo(x + barWidth / 2, yTop);\n canvasCtx.lineTo(x + barWidth / 2, yBottom);\n canvasCtx.lineWidth = barWidth;\n canvasCtx.strokeStyle = barColor;\n canvasCtx.stroke();\n } else {\n canvasCtx.beginPath();\n canvasCtx.arc(\n x + barWidth / 2,\n canvas.height / scaleFactor / 2,\n adjustedCircleRadius,\n 0,\n 2 * Math.PI\n );\n canvasCtx.fillStyle = barColor;\n canvasCtx.fill();\n canvasCtx.closePath();\n }\n });\n\n if (!isActive) {\n drawInactiveCircles(adjustedCircleRadius, barColor);\n }\n\n requestAnimationFrame(drawSpectrum);\n }\n\n function drawInactiveCircles(circleRadius: number, color: string) {\n const totalBarsWidth =\n bands.length * barWidth + (bands.length - 1) * barGap;\n const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2;\n const y = canvas.height / scaleFactor / 2;\n\n bands.forEach((_, i) => {\n const x = startX + i * (barWidth + barGap);\n\n canvasCtx.beginPath();\n canvasCtx.arc(x + barWidth / 2, y, circleRadius, 0, 2 * Math.PI);\n canvasCtx.fillStyle = color;\n canvasCtx.fill();\n canvasCtx.closePath();\n });\n }\n\n drawSpectrum();\n\n // Handle resizing\n window.addEventListener(\"resize\", resizeCanvas);\n\n return () => {\n audioContext.close();\n window.removeEventListener(\"resize\", resizeCanvas);\n };\n }, [backgroundColor, barColor, barGap, barMaxHeight, barWidth, track]);\n\n return (\n <canvas\n ref={canvasRef}\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n }}\n />\n );\n }\n);\n\nVoiceVisualizer.displayName = \"VoiceVisualizer\";\n"],"names":[],"version":3,"file":"index.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["client-react/src/index.ts","client-react/src/RTVIClientAudio.tsx","client-react/src/useRTVIClientEvent.ts","client-react/src/useRTVIClient.ts","client-react/src/RTVIClientProvider.tsx","client-react/src/useRTVIClientMediaTrack.ts","client-react/src/RTVIClientCamToggle.tsx","client-react/src/useRTVIClientCamControl.ts","client-react/src/useRTVIClientTransportState.ts","client-react/src/RTVIClientMicToggle.tsx","client-react/src/useRTVIClientMicControl.ts","client-react/src/RTVIClientVideo.tsx","client-react/src/useMergedRef.ts","client-react/src/useRTVIClientMediaDevices.ts","client-react/src/VoiceVisualizer.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIClientAudio } from \"./RTVIClientAudio\";\nimport { RTVIClientCamToggle } from \"./RTVIClientCamToggle\";\nimport { RTVIClientMicToggle } from \"./RTVIClientMicToggle\";\nimport { RTVIClientProvider } from \"./RTVIClientProvider\";\nimport { RTVIClientVideo } from \"./RTVIClientVideo\";\nimport { useRTVIClient } from \"./useRTVIClient\";\nimport { useRTVIClientCamControl } from \"./useRTVIClientCamControl\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\nimport { useRTVIClientMediaDevices } from \"./useRTVIClientMediaDevices\";\nimport { useRTVIClientMediaTrack } from \"./useRTVIClientMediaTrack\";\nimport { useRTVIClientMicControl } from \"./useRTVIClientMicControl\";\nimport { useRTVIClientTransportState } from \"./useRTVIClientTransportState\";\nimport { VoiceVisualizer } from \"./VoiceVisualizer\";\n\nexport {\n RTVIClientAudio,\n RTVIClientCamToggle,\n RTVIClientMicToggle,\n RTVIClientProvider,\n RTVIClientVideo,\n useRTVIClient,\n useRTVIClientCamControl,\n useRTVIClientEvent,\n useRTVIClientMediaDevices,\n useRTVIClientMediaTrack,\n useRTVIClientMicControl,\n useRTVIClientTransportState,\n VoiceVisualizer,\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\nimport { useRTVIClientMediaTrack } from \"./useRTVIClientMediaTrack\";\n\nexport const RTVIClientAudio = () => {\n const botAudioRef = useRef<HTMLAudioElement>(null);\n const botAudioTrack = useRTVIClientMediaTrack(\"audio\", \"bot\");\n\n useEffect(() => {\n if (!botAudioRef.current || !botAudioTrack) return;\n if (botAudioRef.current.srcObject) {\n const oldTrack = (\n botAudioRef.current.srcObject as MediaStream\n ).getAudioTracks()[0];\n if (oldTrack.id === botAudioTrack.id) return;\n }\n botAudioRef.current.srcObject = new MediaStream([botAudioTrack]);\n }, [botAudioTrack]);\n\n useRTVIClientEvent(\n RTVIEvent.SpeakerUpdated,\n useCallback((speaker: MediaDeviceInfo) => {\n if (!botAudioRef.current) return;\n if (typeof botAudioRef.current.setSinkId !== \"function\") return;\n botAudioRef.current.setSinkId(speaker.deviceId);\n }, [])\n );\n\n return (\n <>\n <audio ref={botAudioRef} autoPlay />\n </>\n );\n};\nRTVIClientAudio.displayName = \"RTVIClientAudio\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent, RTVIEventHandler } from \"@pipecat-ai/client-js\";\nimport { useEffect } from \"react\";\n\nimport { useRTVIClient } from \"./useRTVIClient\";\n\nexport const useRTVIClientEvent = <E extends RTVIEvent>(\n event: E,\n handler: RTVIEventHandler<E>\n) => {\n const client = useRTVIClient();\n\n useEffect(() => {\n if (!client) return;\n client.on(event, handler);\n return () => {\n client.off(event, handler);\n };\n }, [event, handler, client]);\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { useContext } from \"react\";\n\nimport { RTVIClientContext } from \"./RTVIClientProvider\";\n\nexport const useRTVIClient = () => {\n const { client } = useContext(RTVIClientContext);\n return client;\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIClient } from \"@pipecat-ai/client-js\";\nimport { createStore } from \"jotai\";\nimport { Provider as JotaiProvider } from \"jotai/react\";\nimport React, { createContext } from \"react\";\n\nexport interface Props {\n client: RTVIClient;\n jotaiStore?: React.ComponentProps<typeof JotaiProvider>[\"store\"];\n}\n\nconst defaultStore = createStore();\n\nexport const RTVIClientContext = createContext<{ client?: RTVIClient }>({});\n\nexport const RTVIClientProvider: React.FC<React.PropsWithChildren<Props>> = ({\n children,\n client,\n jotaiStore = defaultStore,\n}) => {\n return (\n <JotaiProvider store={jotaiStore}>\n <RTVIClientContext.Provider value={{ client }}>\n {children}\n </RTVIClientContext.Provider>\n </JotaiProvider>\n );\n};\nRTVIClientProvider.displayName = \"RTVIClientProvider\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { Participant, RTVIEvent, Tracks } from \"@pipecat-ai/client-js\";\nimport { atom, useAtomValue } from \"jotai\";\nimport { atomFamily, useAtomCallback } from \"jotai/utils\";\nimport { PrimitiveAtom } from \"jotai/vanilla\";\nimport { useCallback, useEffect } from \"react\";\n\nimport { useRTVIClient } from \"./useRTVIClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\ntype ParticipantType = keyof Tracks;\ntype TrackType = keyof Tracks[\"local\"];\n\nconst localAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localVideoTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localScreenAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst localScreenVideoTrackAtom = atom<MediaStreamTrack | null>(null);\nconst botAudioTrackAtom = atom<MediaStreamTrack | null>(null);\nconst botVideoTrackAtom = atom<MediaStreamTrack | null>(null);\n\nconst trackAtom = atomFamily<\n { local: boolean; trackType: TrackType },\n PrimitiveAtom<MediaStreamTrack | null>\n>(({ local, trackType }) => {\n if (local) {\n switch (trackType) {\n case \"audio\":\n return localAudioTrackAtom;\n case \"screenAudio\":\n return localScreenAudioTrackAtom;\n case \"screenVideo\":\n return localScreenVideoTrackAtom;\n case \"video\":\n return localVideoTrackAtom;\n }\n }\n return trackType === \"audio\" ? botAudioTrackAtom : botVideoTrackAtom;\n});\n\nexport const useRTVIClientMediaTrack = (\n trackType: TrackType,\n participantType: ParticipantType\n) => {\n const client = useRTVIClient();\n const track = useAtomValue(\n trackAtom({ local: participantType === \"local\", trackType })\n );\n\n const updateTrack = useAtomCallback(\n useCallback(\n (\n get,\n set,\n track: MediaStreamTrack,\n trackType: TrackType,\n local: boolean\n ) => {\n const atom = trackAtom({\n local,\n trackType,\n });\n const oldTrack = get(atom);\n if (oldTrack?.id === track.id) return;\n set(atom, track);\n },\n []\n )\n );\n\n useRTVIClientEvent(\n RTVIEvent.TrackStarted,\n useCallback(\n (track: MediaStreamTrack, participant?: Participant) => {\n updateTrack(\n track,\n track.kind as TrackType,\n Boolean(participant?.local)\n );\n },\n [updateTrack]\n )\n );\n\n useRTVIClientEvent(\n RTVIEvent.ScreenTrackStarted,\n useCallback(\n (track: MediaStreamTrack, participant?: Participant) => {\n const trackType =\n track.kind === \"audio\" ? \"screenAudio\" : \"screenVideo\";\n updateTrack(track, trackType, Boolean(participant?.local));\n },\n [updateTrack]\n )\n );\n\n useEffect(() => {\n if (!client) return;\n const tracks = client.tracks();\n const track = tracks?.[participantType]?.[trackType];\n if (!track) return;\n updateTrack(track, trackType, participantType === \"local\");\n }, [participantType, trackType, updateTrack, client]);\n\n return track;\n};\n","import React, { useCallback } from \"react\";\n\nimport { useRTVIClientCamControl } from \"./useRTVIClientCamControl\";\n\nexport interface RTVIClientCamToggleProps {\n /**\n * Callback fired when camera state changes\n */\n onCamEnabledChanged?: (enabled: boolean) => void;\n\n /**\n * Optional prop to disable the cam toggle.\n * When disabled, changes are not applied to the client.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Render prop that provides state and handlers to the children\n */\n children: (props: {\n disabled?: boolean;\n isCamEnabled: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless component for controlling camera state\n */\nexport const RTVIClientCamToggle: React.FC<RTVIClientCamToggleProps> = ({\n onCamEnabledChanged,\n disabled = false,\n children,\n}) => {\n const { isCamEnabled, enableCam } = useRTVIClientCamControl();\n\n const handleToggleCam = useCallback(() => {\n if (disabled) return;\n\n const newEnabledState = !isCamEnabled;\n enableCam(newEnabledState);\n onCamEnabledChanged?.(newEnabledState);\n }, [disabled, enableCam, isCamEnabled, onCamEnabledChanged]);\n\n return (\n <>\n {children({\n isCamEnabled,\n onClick: handleToggleCam,\n disabled,\n })}\n </>\n );\n};\n\nexport default RTVIClientCamToggle;\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { useRTVIClient } from \"./useRTVIClient\";\nimport { useRTVIClientTransportState } from \"./useRTVIClientTransportState\";\n\n/**\n * Hook to control camera state\n */\nexport const useRTVIClientCamControl = () => {\n const client = useRTVIClient();\n\n const [isCamEnabled, setIsCamEnabled] = useState(\n client?.isCamEnabled ?? false\n );\n\n const transportState = useRTVIClientTransportState();\n\n // Sync component state with client state initially\n useEffect(() => {\n if (\n !client ||\n transportState !== \"initialized\" ||\n typeof client.isCamEnabled !== \"boolean\"\n )\n return;\n setIsCamEnabled(client.isCamEnabled);\n }, [client, transportState]);\n\n const enableCam = useCallback(\n (enabled: boolean) => {\n setIsCamEnabled(enabled);\n client?.enableCam?.(enabled);\n },\n [client]\n );\n\n return {\n enableCam,\n isCamEnabled,\n };\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport { RTVIEvent, TransportState } from \"@pipecat-ai/client-js\";\nimport { atom, useAtom } from \"jotai\";\n\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\nconst transportStateAtom = atom<TransportState>(\"disconnected\");\n\nexport const useRTVIClientTransportState = () => {\n const [transportState, setTransportState] = useAtom(transportStateAtom);\n\n useRTVIClientEvent(RTVIEvent.TransportStateChanged, setTransportState);\n\n return transportState;\n};\n","import React, { useCallback } from \"react\";\n\nimport { useRTVIClientMicControl } from \"./useRTVIClientMicControl\";\n\nexport interface RTVIClientMicToggleProps {\n /**\n * Callback fired when microphone state changes\n */\n onMicEnabledChanged?: (enabled: boolean) => void;\n\n /**\n * Optional prop to disable the mic toggle.\n * When disabled, changes are not applied to the client.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Render prop that provides state and handlers to the children\n */\n children: (props: {\n disabled?: boolean;\n isMicEnabled: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless component for controlling microphone state\n */\nexport const RTVIClientMicToggle: React.FC<RTVIClientMicToggleProps> = ({\n onMicEnabledChanged,\n disabled = false,\n children,\n}) => {\n const { enableMic, isMicEnabled } = useRTVIClientMicControl();\n\n const handleToggleMic = useCallback(() => {\n if (disabled) return;\n\n const newEnabledState = !isMicEnabled;\n enableMic(newEnabledState);\n onMicEnabledChanged?.(newEnabledState);\n }, [disabled, enableMic, isMicEnabled, onMicEnabledChanged]);\n\n return (\n <>\n {children({\n isMicEnabled,\n onClick: handleToggleMic,\n disabled,\n })}\n </>\n );\n};\n\nexport default RTVIClientMicToggle;\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { useRTVIClient } from \"./useRTVIClient\";\nimport { useRTVIClientTransportState } from \"./useRTVIClientTransportState\";\n\n/**\n * Hook to control microphone state\n */\nexport const useRTVIClientMicControl = () => {\n const client = useRTVIClient();\n\n const [isMicEnabled, setIsMicEnabled] = useState(\n client?.isMicEnabled ?? false\n );\n\n const transportState = useRTVIClientTransportState();\n\n // Sync component state with client state initially\n useEffect(() => {\n if (\n !client ||\n transportState !== \"initialized\" ||\n typeof client.isMicEnabled !== \"boolean\"\n )\n return;\n setIsMicEnabled(client.isMicEnabled);\n }, [client, transportState]);\n\n const enableMic = useCallback(\n (enabled: boolean) => {\n setIsMicEnabled(enabled);\n client?.enableMic?.(enabled);\n },\n [client]\n );\n\n return {\n enableMic,\n isMicEnabled,\n };\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { forwardRef, useEffect, useRef } from \"react\";\n\nimport useMergedRef from \"./useMergedRef\";\nimport { useRTVIClientMediaTrack } from \"./useRTVIClientMediaTrack\";\n\ninterface RTVIClientVideoInterface {\n aspectRatio: number;\n height: number;\n width: number;\n}\n\nexport interface Props\n extends Omit<React.VideoHTMLAttributes<HTMLVideoElement>, \"onResize\"> {\n participant: \"local\" | \"bot\";\n\n /**\n * Defines the video track type to display. Default: 'video'.\n */\n trackType?: \"screenVideo\" | \"video\";\n\n /**\n * Defines whether the video should be fully contained or cover the box. Default: 'contain'.\n */\n fit?: \"contain\" | \"cover\";\n /**\n * Forces the video to be mirrored, if set.\n */\n mirror?: boolean;\n\n /**\n * Optional callback, which is triggered whenever the video's rendered width or height changes.\n * Returns the video's native width, height and aspectRatio.\n */\n onResize?(dimensions: RTVIClientVideoInterface): void;\n}\n\nexport const RTVIClientVideo = forwardRef<HTMLVideoElement, Props>(\n function VoiceClientVideo(\n {\n participant = \"local\",\n fit = \"contain\",\n mirror,\n onResize,\n style = {},\n trackType = \"video\",\n ...props\n },\n ref\n ) {\n const videoTrack: MediaStreamTrack | null = useRTVIClientMediaTrack(\n trackType,\n participant\n );\n\n const videoEl = useRef<HTMLVideoElement>(null);\n const videoRef = useMergedRef<HTMLVideoElement>(videoEl, ref);\n\n /**\n * Handle canplay & picture-in-picture events.\n */\n useEffect(function setupVideoEvents() {\n const video = videoEl.current;\n if (!video) return;\n\n const playVideo = () => {\n const promise = video.play();\n if (promise !== undefined) {\n promise\n .then(() => {\n // All good, playback started.\n video.controls = false;\n })\n .catch((error) => {\n // Auto-play was prevented. Show video controls, so user can play video manually.\n video.controls = true;\n console.warn(\"Failed to play video\", error);\n });\n }\n };\n\n const handleCanPlay = () => {\n if (!video.paused) return;\n playVideo();\n };\n const handleEnterPIP = () => {\n video.style.transform = \"scale(1)\";\n };\n const handleLeavePIP = () => {\n video.style.transform = \"\";\n setTimeout(() => {\n if (video.paused) playVideo();\n }, 100);\n };\n const handleVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") return;\n if (!video.paused) return;\n playVideo();\n };\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"enterpictureinpicture\", handleEnterPIP);\n video.addEventListener(\"leavepictureinpicture\", handleLeavePIP);\n\n // Videos can be paused if media was played in another app on iOS.\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n return () => {\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"enterpictureinpicture\", handleEnterPIP);\n video.removeEventListener(\"leavepictureinpicture\", handleLeavePIP);\n document.removeEventListener(\n \"visibilitychange\",\n handleVisibilityChange\n );\n };\n }, []);\n\n /**\n * Update srcObject.\n */\n useEffect(\n function updateSrcObject() {\n const video = videoEl.current;\n if (!video || !videoTrack) return;\n video.srcObject = new MediaStream([videoTrack]);\n video.load();\n return () => {\n // clean up when unmounted\n video.srcObject = null;\n video.load();\n };\n },\n [videoTrack, videoTrack?.id]\n );\n\n /**\n * Add optional event listener for resize event so the parent component\n * can know the video's native aspect ratio.\n */\n useEffect(\n function reportVideoDimensions() {\n const video = videoEl.current;\n if (!onResize || !video) return;\n\n let frame: ReturnType<typeof requestAnimationFrame>;\n function handleResize() {\n if (frame) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n const video = videoEl.current;\n if (!video || document.hidden) return;\n const videoWidth = video.videoWidth;\n const videoHeight = video.videoHeight;\n if (videoWidth && videoHeight) {\n onResize?.({\n aspectRatio: videoWidth / videoHeight,\n height: videoHeight,\n width: videoWidth,\n });\n }\n });\n }\n\n handleResize();\n video.addEventListener(\"loadedmetadata\", handleResize);\n video.addEventListener(\"resize\", handleResize);\n\n return () => {\n if (frame) cancelAnimationFrame(frame);\n video.removeEventListener(\"loadedmetadata\", handleResize);\n video.removeEventListener(\"resize\", handleResize);\n };\n },\n [onResize]\n );\n\n return (\n <video\n autoPlay\n muted\n playsInline\n ref={videoRef}\n style={{\n objectFit: fit,\n transform: mirror ? \"scale(-1, 1)\" : \"\",\n ...style,\n }}\n {...props}\n />\n );\n }\n);\nRTVIClientVideo.displayName = \"RTVIClientVideo\";\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n *\n * This file contains code derived from:\n * https://github.com/jaredLunde/react-hook/blob/master/packages/merged-ref/src/index.tsx\n * Original author: Jared Lunde (https://github.com/jaredLunde)\n * Original license: MIT (https://github.com/jaredLunde/react-hook/blob/master/LICENSE)\n */\n\nimport React, { useCallback } from \"react\";\n\nfunction useMergedRef<T>(...refs: React.Ref<T>[]): React.RefCallback<T> {\n return useCallback(\n (element: T) => {\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i];\n if (typeof ref === \"function\") ref(element);\n else if (ref && typeof ref === \"object\")\n (ref as React.MutableRefObject<T>).current = element;\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs\n );\n}\n\nexport default useMergedRef;\n","import { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { atom, useAtomValue } from \"jotai\";\nimport { useAtomCallback } from \"jotai/utils\";\nimport { useCallback, useEffect } from \"react\";\n\nimport { useRTVIClient } from \"./useRTVIClient\";\nimport { useRTVIClientEvent } from \"./useRTVIClientEvent\";\n\ntype OptionalMediaDeviceInfo = MediaDeviceInfo | Record<string, never>;\n\nconst availableMicsAtom = atom<MediaDeviceInfo[]>([]);\nconst availableCamsAtom = atom<MediaDeviceInfo[]>([]);\nconst availableSpeakersAtom = atom<MediaDeviceInfo[]>([]);\nconst selectedMicAtom = atom<OptionalMediaDeviceInfo>({});\nconst selectedCamAtom = atom<OptionalMediaDeviceInfo>({});\nconst selectedSpeakerAtom = atom<OptionalMediaDeviceInfo>({});\n\nexport const useRTVIClientMediaDevices = () => {\n const client = useRTVIClient();\n\n const availableCams = useAtomValue(availableCamsAtom);\n const availableMics = useAtomValue(availableMicsAtom);\n const availableSpeakers = useAtomValue(availableSpeakersAtom);\n const selectedCam = useAtomValue(selectedCamAtom);\n const selectedMic = useAtomValue(selectedMicAtom);\n const selectedSpeaker = useAtomValue(selectedSpeakerAtom);\n\n const initDevices = useAtomCallback(\n useCallback(\n async (_get, set) => {\n if (!client) return;\n\n const availableCams = await client.getAllCams();\n const availableMics = await client.getAllMics();\n const availableSpeakers = await client.getAllSpeakers();\n\n set(availableCamsAtom, availableCams);\n set(availableMicsAtom, availableMics);\n set(availableSpeakersAtom, availableSpeakers);\n\n set(selectedCamAtom, client.selectedCam);\n set(selectedMicAtom, client.selectedMic);\n set(selectedSpeakerAtom, client.selectedSpeaker);\n },\n [client]\n )\n );\n\n useEffect(() => {\n initDevices();\n }, [initDevices]);\n\n useRTVIClientEvent(\n RTVIEvent.AvailableCamsUpdated,\n useAtomCallback(\n useCallback((_get, set, cams) => {\n set(availableCamsAtom, cams);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.AvailableMicsUpdated,\n useAtomCallback(\n useCallback((_get, set, mics) => {\n set(availableMicsAtom, mics);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.AvailableSpeakersUpdated,\n useAtomCallback(\n useCallback((_get, set, speakers) => {\n set(availableSpeakersAtom, speakers);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.CamUpdated,\n useAtomCallback(\n useCallback((_get, set, cam) => {\n set(selectedCamAtom, cam);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.MicUpdated,\n useAtomCallback(\n useCallback((_get, set, mic) => {\n set(selectedMicAtom, mic);\n }, [])\n )\n );\n useRTVIClientEvent(\n RTVIEvent.SpeakerUpdated,\n useAtomCallback(\n useCallback((_get, set, speaker) => {\n set(selectedSpeakerAtom, speaker);\n }, [])\n )\n );\n\n const updateCam = useCallback(\n (id: string) => {\n client?.updateCam(id);\n },\n [client]\n );\n const updateMic = useCallback(\n (id: string) => {\n client?.updateMic(id);\n },\n [client]\n );\n const updateSpeaker = useCallback(\n (id: string) => {\n client?.updateSpeaker(id);\n },\n [client]\n );\n\n return {\n availableCams,\n availableMics,\n availableSpeakers,\n selectedCam,\n selectedMic,\n selectedSpeaker,\n updateCam,\n updateMic,\n updateSpeaker,\n };\n};\n","/**\n * Copyright (c) 2024, Daily.\n *\n * SPDX-License-Identifier: BSD-2-Clause\n */\n\nimport React, { useEffect, useRef } from \"react\";\n\nimport { useRTVIClientMediaTrack } from \"./useRTVIClientMediaTrack\";\n\ntype ParticipantType = Parameters<typeof useRTVIClientMediaTrack>[1];\n\ninterface Props {\n backgroundColor?: string;\n barColor?: string;\n barCount?: number;\n barGap?: number;\n barLineCap?: \"round\" | \"square\";\n barMaxHeight?: number;\n barOrigin?: \"top\" | \"bottom\" | \"center\";\n barWidth?: number;\n participantType: ParticipantType;\n}\n\nexport const VoiceVisualizer: React.FC<Props> = React.memo(\n ({\n backgroundColor = \"transparent\",\n barColor = \"black\",\n barCount = 5,\n barGap = 12,\n barLineCap = \"round\",\n barMaxHeight = 120,\n barOrigin = \"center\",\n barWidth = 30,\n participantType,\n }) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const track: MediaStreamTrack | null = useRTVIClientMediaTrack(\n \"audio\",\n participantType\n );\n\n useEffect(() => {\n if (!canvasRef.current) return;\n\n const canvasWidth = barCount * barWidth + (barCount - 1) * barGap;\n const canvasHeight = barMaxHeight;\n\n const canvas = canvasRef.current;\n\n const scaleFactor = 2;\n\n // Make canvas fill the width and height of its container\n const resizeCanvas = () => {\n canvas.width = canvasWidth * scaleFactor;\n canvas.height = canvasHeight * scaleFactor;\n\n canvas.style.width = `${canvasWidth}px`;\n canvas.style.height = `${canvasHeight}px`;\n\n canvasCtx.lineCap = barLineCap;\n canvasCtx.scale(scaleFactor, scaleFactor);\n };\n\n const canvasCtx = canvas.getContext(\"2d\")!;\n resizeCanvas();\n\n if (!track) return;\n\n const audioContext = new AudioContext();\n const source = audioContext.createMediaStreamSource(\n new MediaStream([track])\n );\n const analyser = audioContext.createAnalyser();\n\n analyser.fftSize = 1024;\n\n source.connect(analyser);\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n\n canvasCtx.lineCap = barLineCap;\n\n // Create frequency bands based on barCount\n const bands = Array.from({ length: barCount }, (_, i) => {\n // Use improved logarithmic scale for better frequency distribution\n const minFreq = barCount > 20 ? 200 : 80; // Adjust min frequency based on bar count\n const maxFreq = 10000; // Cover most important audio frequencies\n\n // Use Mel scale inspired approach for more perceptually uniform distribution\n // This helps with a large number of bars by placing fewer in the very low range\n // https://en.wikipedia.org/wiki/Mel_scale\n const melMin = 2595 * Math.log10(1 + minFreq / 700);\n const melMax = 2595 * Math.log10(1 + maxFreq / 700);\n const melStep = (melMax - melMin) / barCount;\n\n const melValue = melMin + i * melStep;\n const startFreq = 700 * (Math.pow(10, melValue / 2595) - 1);\n const endFreq = 700 * (Math.pow(10, (melValue + melStep) / 2595) - 1);\n\n return {\n startFreq,\n endFreq,\n smoothValue: 0,\n };\n });\n\n const getFrequencyBinIndex = (frequency: number) => {\n const nyquist = audioContext.sampleRate / 2;\n return Math.round(\n (frequency / nyquist) * (analyser.frequencyBinCount - 1)\n );\n };\n\n function drawSpectrum() {\n analyser.getByteFrequencyData(frequencyData);\n canvasCtx.clearRect(\n 0,\n 0,\n canvas.width / scaleFactor,\n canvas.height / scaleFactor\n );\n canvasCtx.fillStyle = backgroundColor;\n canvasCtx.fillRect(\n 0,\n 0,\n canvas.width / scaleFactor,\n canvas.height / scaleFactor\n );\n\n let isActive = false;\n\n const totalBarsWidth =\n bands.length * barWidth + (bands.length - 1) * barGap;\n const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2; // Center bars\n\n const adjustedCircleRadius = barWidth / 2; // Fixed radius for reset circles\n\n bands.forEach((band, i) => {\n const startIndex = getFrequencyBinIndex(band.startFreq);\n const endIndex = getFrequencyBinIndex(band.endFreq);\n const bandData = frequencyData.slice(startIndex, endIndex);\n const bandValue =\n bandData.reduce((acc, val) => acc + val, 0) / bandData.length;\n\n const smoothingFactor = 0.2;\n\n if (bandValue < 1) {\n band.smoothValue = Math.max(\n band.smoothValue - smoothingFactor * 5,\n 0\n );\n } else {\n band.smoothValue =\n band.smoothValue +\n (bandValue - band.smoothValue) * smoothingFactor;\n isActive = true;\n }\n\n const x = startX + i * (barWidth + barGap);\n // Calculate bar height with a maximum cap\n const minHeight = 0;\n const barHeight = Math.max(\n minHeight,\n Math.min((band.smoothValue / 255) * barMaxHeight, barMaxHeight)\n );\n\n let yTop, yBottom;\n const canvasHeight = canvas.height / scaleFactor;\n\n switch (barOrigin) {\n case \"top\":\n yTop = adjustedCircleRadius;\n yBottom = Math.min(\n adjustedCircleRadius + barHeight,\n canvasHeight - adjustedCircleRadius\n );\n break;\n case \"bottom\":\n yBottom = canvasHeight - adjustedCircleRadius;\n yTop = Math.max(yBottom - barHeight, adjustedCircleRadius);\n break;\n case \"center\":\n default:\n yTop = Math.max(\n canvasHeight / 2 - barHeight / 2,\n adjustedCircleRadius\n );\n yBottom = Math.min(\n canvasHeight / 2 + barHeight / 2,\n canvasHeight - adjustedCircleRadius\n );\n break;\n }\n\n if (band.smoothValue > 0) {\n canvasCtx.beginPath();\n canvasCtx.moveTo(x + barWidth / 2, yTop);\n canvasCtx.lineTo(x + barWidth / 2, yBottom);\n canvasCtx.lineWidth = barWidth;\n canvasCtx.strokeStyle = barColor;\n canvasCtx.stroke();\n } else {\n drawInactiveCircle(adjustedCircleRadius, barColor, x, yTop);\n }\n });\n\n if (!isActive) {\n drawInactiveCircles(adjustedCircleRadius, barColor);\n }\n\n requestAnimationFrame(drawSpectrum);\n }\n\n function drawInactiveCircle(\n circleRadius: number,\n color: string,\n x: number,\n y: number\n ) {\n switch (barLineCap) {\n case \"square\":\n canvasCtx.fillStyle = color;\n canvasCtx.fillRect(\n x + barWidth / 2 - circleRadius,\n y - circleRadius,\n circleRadius * 2,\n circleRadius * 2\n );\n break;\n case \"round\":\n default:\n canvasCtx.beginPath();\n canvasCtx.arc(x + barWidth / 2, y, circleRadius, 0, 2 * Math.PI);\n canvasCtx.fillStyle = color;\n canvasCtx.fill();\n canvasCtx.closePath();\n break;\n }\n }\n\n function drawInactiveCircles(circleRadius: number, color: string) {\n const totalBarsWidth =\n bands.length * barWidth + (bands.length - 1) * barGap;\n const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2;\n const canvasHeight = canvas.height / scaleFactor;\n\n let y;\n switch (barOrigin) {\n case \"top\":\n y = circleRadius;\n break;\n case \"bottom\":\n y = canvasHeight - circleRadius;\n break;\n case \"center\":\n default:\n y = canvasHeight / 2;\n break;\n }\n\n bands.forEach((_, i) => {\n const x = startX + i * (barWidth + barGap);\n drawInactiveCircle(circleRadius, color, x, y);\n });\n }\n\n drawSpectrum();\n\n // Handle resizing\n window.addEventListener(\"resize\", resizeCanvas);\n\n return () => {\n audioContext.close();\n window.removeEventListener(\"resize\", resizeCanvas);\n };\n }, [\n backgroundColor,\n barColor,\n barCount,\n barGap,\n barLineCap,\n barMaxHeight,\n barOrigin,\n barWidth,\n track,\n ]);\n\n return (\n <canvas\n ref={canvasRef}\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n }}\n />\n );\n }\n);\n\nVoiceVisualizer.displayName = \"VoiceVisualizer\";\n"],"names":[],"version":3,"file":"index.js.map"}
|
package/dist/index.module.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {jsx as $h9lXz$jsx, Fragment as $h9lXz$Fragment} from "react/jsx-runtime";
|
|
2
2
|
import {RTVIEvent as $h9lXz$RTVIEvent} from "@pipecat-ai/client-js";
|
|
3
|
-
import $h9lXz$react, {useRef as $h9lXz$useRef, useEffect as $h9lXz$useEffect, useCallback as $h9lXz$useCallback, useContext as $h9lXz$useContext, createContext as $h9lXz$createContext, forwardRef as $h9lXz$forwardRef} from "react";
|
|
3
|
+
import $h9lXz$react, {useRef as $h9lXz$useRef, useEffect as $h9lXz$useEffect, useCallback as $h9lXz$useCallback, useContext as $h9lXz$useContext, createContext as $h9lXz$createContext, useState as $h9lXz$useState, forwardRef as $h9lXz$forwardRef} from "react";
|
|
4
4
|
import {createStore as $h9lXz$createStore, atom as $h9lXz$atom, useAtomValue as $h9lXz$useAtomValue, useAtom as $h9lXz$useAtom} from "jotai";
|
|
5
5
|
import {Provider as $h9lXz$Provider} from "jotai/react";
|
|
6
6
|
import {atomFamily as $h9lXz$atomFamily, useAtomCallback as $h9lXz$useAtomCallback} from "jotai/utils";
|
|
@@ -107,18 +107,18 @@ const $194c75143b7a1fa0$export$7c03381e0d26a6c3 = (trackType, participantType)=>
|
|
|
107
107
|
const oldTrack = get(atom);
|
|
108
108
|
if (oldTrack?.id === track.id) return;
|
|
109
109
|
set(atom, track);
|
|
110
|
-
}, [
|
|
111
|
-
participantType,
|
|
112
|
-
track,
|
|
113
|
-
trackType
|
|
114
|
-
]));
|
|
110
|
+
}, []));
|
|
115
111
|
(0, $824ea64b5f757259$export$33a6ac53b8f02625)((0, $h9lXz$RTVIEvent).TrackStarted, (0, $h9lXz$useCallback)((track, participant)=>{
|
|
116
112
|
updateTrack(track, track.kind, Boolean(participant?.local));
|
|
117
|
-
}, [
|
|
113
|
+
}, [
|
|
114
|
+
updateTrack
|
|
115
|
+
]));
|
|
118
116
|
(0, $824ea64b5f757259$export$33a6ac53b8f02625)((0, $h9lXz$RTVIEvent).ScreenTrackStarted, (0, $h9lXz$useCallback)((track, participant)=>{
|
|
119
117
|
const trackType = track.kind === "audio" ? "screenAudio" : "screenVideo";
|
|
120
118
|
updateTrack(track, trackType, Boolean(participant?.local));
|
|
121
|
-
}, [
|
|
119
|
+
}, [
|
|
120
|
+
updateTrack
|
|
121
|
+
]));
|
|
122
122
|
(0, $h9lXz$useEffect)(()=>{
|
|
123
123
|
if (!client) return;
|
|
124
124
|
const tracks = client.tracks();
|
|
@@ -168,6 +168,128 @@ $f8b885726fc652c0$export$ba1245f7cbf3ae02.displayName = "RTVIClientAudio";
|
|
|
168
168
|
|
|
169
169
|
|
|
170
170
|
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Copyright (c) 2024, Daily.
|
|
174
|
+
*
|
|
175
|
+
* SPDX-License-Identifier: BSD-2-Clause
|
|
176
|
+
*/
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
const $8376ffbc1b1f3c97$var$transportStateAtom = (0, $h9lXz$atom)("disconnected");
|
|
180
|
+
const $8376ffbc1b1f3c97$export$599fa01283bd4ece = ()=>{
|
|
181
|
+
const [transportState, setTransportState] = (0, $h9lXz$useAtom)($8376ffbc1b1f3c97$var$transportStateAtom);
|
|
182
|
+
(0, $824ea64b5f757259$export$33a6ac53b8f02625)((0, $h9lXz$RTVIEvent).TransportStateChanged, setTransportState);
|
|
183
|
+
return transportState;
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
const $7662c16ae3a8c331$export$46099a7ec2fe8ac5 = ()=>{
|
|
188
|
+
const client = (0, $54a3c9f5bdbf0854$export$31a5f6a22c9b8fba)();
|
|
189
|
+
const [isCamEnabled, setIsCamEnabled] = (0, $h9lXz$useState)(client?.isCamEnabled ?? false);
|
|
190
|
+
const transportState = (0, $8376ffbc1b1f3c97$export$599fa01283bd4ece)();
|
|
191
|
+
// Sync component state with client state initially
|
|
192
|
+
(0, $h9lXz$useEffect)(()=>{
|
|
193
|
+
if (!client || transportState !== "initialized" || typeof client.isCamEnabled !== "boolean") return;
|
|
194
|
+
setIsCamEnabled(client.isCamEnabled);
|
|
195
|
+
}, [
|
|
196
|
+
client,
|
|
197
|
+
transportState
|
|
198
|
+
]);
|
|
199
|
+
const enableCam = (0, $h9lXz$useCallback)((enabled)=>{
|
|
200
|
+
setIsCamEnabled(enabled);
|
|
201
|
+
client?.enableCam?.(enabled);
|
|
202
|
+
}, [
|
|
203
|
+
client
|
|
204
|
+
]);
|
|
205
|
+
return {
|
|
206
|
+
enableCam: enableCam,
|
|
207
|
+
isCamEnabled: isCamEnabled
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
const $379da083c72543d5$export$156c26e16246ae3e = ({ onCamEnabledChanged: onCamEnabledChanged, disabled: disabled = false, children: children })=>{
|
|
213
|
+
const { isCamEnabled: isCamEnabled, enableCam: enableCam } = (0, $7662c16ae3a8c331$export$46099a7ec2fe8ac5)();
|
|
214
|
+
const handleToggleCam = (0, $h9lXz$useCallback)(()=>{
|
|
215
|
+
if (disabled) return;
|
|
216
|
+
const newEnabledState = !isCamEnabled;
|
|
217
|
+
enableCam(newEnabledState);
|
|
218
|
+
onCamEnabledChanged?.(newEnabledState);
|
|
219
|
+
}, [
|
|
220
|
+
disabled,
|
|
221
|
+
enableCam,
|
|
222
|
+
isCamEnabled,
|
|
223
|
+
onCamEnabledChanged
|
|
224
|
+
]);
|
|
225
|
+
return (0, $h9lXz$jsx)((0, $h9lXz$Fragment), {
|
|
226
|
+
children: children({
|
|
227
|
+
isCamEnabled: isCamEnabled,
|
|
228
|
+
onClick: handleToggleCam,
|
|
229
|
+
disabled: disabled
|
|
230
|
+
})
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
var $379da083c72543d5$export$2e2bcd8739ae039 = $379da083c72543d5$export$156c26e16246ae3e;
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
const $e6f5302cf8392476$export$805915964ad7bc25 = ()=>{
|
|
242
|
+
const client = (0, $54a3c9f5bdbf0854$export$31a5f6a22c9b8fba)();
|
|
243
|
+
const [isMicEnabled, setIsMicEnabled] = (0, $h9lXz$useState)(client?.isMicEnabled ?? false);
|
|
244
|
+
const transportState = (0, $8376ffbc1b1f3c97$export$599fa01283bd4ece)();
|
|
245
|
+
// Sync component state with client state initially
|
|
246
|
+
(0, $h9lXz$useEffect)(()=>{
|
|
247
|
+
if (!client || transportState !== "initialized" || typeof client.isMicEnabled !== "boolean") return;
|
|
248
|
+
setIsMicEnabled(client.isMicEnabled);
|
|
249
|
+
}, [
|
|
250
|
+
client,
|
|
251
|
+
transportState
|
|
252
|
+
]);
|
|
253
|
+
const enableMic = (0, $h9lXz$useCallback)((enabled)=>{
|
|
254
|
+
setIsMicEnabled(enabled);
|
|
255
|
+
client?.enableMic?.(enabled);
|
|
256
|
+
}, [
|
|
257
|
+
client
|
|
258
|
+
]);
|
|
259
|
+
return {
|
|
260
|
+
enableMic: enableMic,
|
|
261
|
+
isMicEnabled: isMicEnabled
|
|
262
|
+
};
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
const $5bebec90a95fc7e5$export$bf1c2c9ca877628d = ({ onMicEnabledChanged: onMicEnabledChanged, disabled: disabled = false, children: children })=>{
|
|
267
|
+
const { enableMic: enableMic, isMicEnabled: isMicEnabled } = (0, $e6f5302cf8392476$export$805915964ad7bc25)();
|
|
268
|
+
const handleToggleMic = (0, $h9lXz$useCallback)(()=>{
|
|
269
|
+
if (disabled) return;
|
|
270
|
+
const newEnabledState = !isMicEnabled;
|
|
271
|
+
enableMic(newEnabledState);
|
|
272
|
+
onMicEnabledChanged?.(newEnabledState);
|
|
273
|
+
}, [
|
|
274
|
+
disabled,
|
|
275
|
+
enableMic,
|
|
276
|
+
isMicEnabled,
|
|
277
|
+
onMicEnabledChanged
|
|
278
|
+
]);
|
|
279
|
+
return (0, $h9lXz$jsx)((0, $h9lXz$Fragment), {
|
|
280
|
+
children: children({
|
|
281
|
+
isMicEnabled: isMicEnabled,
|
|
282
|
+
onClick: handleToggleMic,
|
|
283
|
+
disabled: disabled
|
|
284
|
+
})
|
|
285
|
+
});
|
|
286
|
+
};
|
|
287
|
+
var $5bebec90a95fc7e5$export$2e2bcd8739ae039 = $5bebec90a95fc7e5$export$bf1c2c9ca877628d;
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
|
|
171
293
|
/**
|
|
172
294
|
* Copyright (c) 2024, Daily.
|
|
173
295
|
*
|
|
@@ -316,6 +438,7 @@ $b76d887910983811$export$d090a384943608eb.displayName = "RTVIClientVideo";
|
|
|
316
438
|
|
|
317
439
|
|
|
318
440
|
|
|
441
|
+
|
|
319
442
|
const $c7d06534b21735c2$var$availableMicsAtom = (0, $h9lXz$atom)([]);
|
|
320
443
|
const $c7d06534b21735c2$var$availableCamsAtom = (0, $h9lXz$atom)([]);
|
|
321
444
|
const $c7d06534b21735c2$var$availableSpeakersAtom = (0, $h9lXz$atom)([]);
|
|
@@ -330,6 +453,25 @@ const $c7d06534b21735c2$export$652c54907b83a48d = ()=>{
|
|
|
330
453
|
const selectedCam = (0, $h9lXz$useAtomValue)($c7d06534b21735c2$var$selectedCamAtom);
|
|
331
454
|
const selectedMic = (0, $h9lXz$useAtomValue)($c7d06534b21735c2$var$selectedMicAtom);
|
|
332
455
|
const selectedSpeaker = (0, $h9lXz$useAtomValue)($c7d06534b21735c2$var$selectedSpeakerAtom);
|
|
456
|
+
const initDevices = (0, $h9lXz$useAtomCallback)((0, $h9lXz$useCallback)(async (_get, set)=>{
|
|
457
|
+
if (!client) return;
|
|
458
|
+
const availableCams = await client.getAllCams();
|
|
459
|
+
const availableMics = await client.getAllMics();
|
|
460
|
+
const availableSpeakers = await client.getAllSpeakers();
|
|
461
|
+
set($c7d06534b21735c2$var$availableCamsAtom, availableCams);
|
|
462
|
+
set($c7d06534b21735c2$var$availableMicsAtom, availableMics);
|
|
463
|
+
set($c7d06534b21735c2$var$availableSpeakersAtom, availableSpeakers);
|
|
464
|
+
set($c7d06534b21735c2$var$selectedCamAtom, client.selectedCam);
|
|
465
|
+
set($c7d06534b21735c2$var$selectedMicAtom, client.selectedMic);
|
|
466
|
+
set($c7d06534b21735c2$var$selectedSpeakerAtom, client.selectedSpeaker);
|
|
467
|
+
}, [
|
|
468
|
+
client
|
|
469
|
+
]));
|
|
470
|
+
(0, $h9lXz$useEffect)(()=>{
|
|
471
|
+
initDevices();
|
|
472
|
+
}, [
|
|
473
|
+
initDevices
|
|
474
|
+
]);
|
|
333
475
|
(0, $824ea64b5f757259$export$33a6ac53b8f02625)((0, $h9lXz$RTVIEvent).AvailableCamsUpdated, (0, $h9lXz$useAtomCallback)((0, $h9lXz$useCallback)((_get, set, cams)=>{
|
|
334
476
|
set($c7d06534b21735c2$var$availableCamsAtom, cams);
|
|
335
477
|
}, [])));
|
|
@@ -378,30 +520,17 @@ const $c7d06534b21735c2$export$652c54907b83a48d = ()=>{
|
|
|
378
520
|
|
|
379
521
|
|
|
380
522
|
|
|
381
|
-
/**
|
|
382
|
-
* Copyright (c) 2024, Daily.
|
|
383
|
-
*
|
|
384
|
-
* SPDX-License-Identifier: BSD-2-Clause
|
|
385
|
-
*/
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
const $8376ffbc1b1f3c97$var$transportStateAtom = (0, $h9lXz$atom)("disconnected");
|
|
389
|
-
const $8376ffbc1b1f3c97$export$599fa01283bd4ece = ()=>{
|
|
390
|
-
const [transportState, setTransportState] = (0, $h9lXz$useAtom)($8376ffbc1b1f3c97$var$transportStateAtom);
|
|
391
|
-
(0, $824ea64b5f757259$export$33a6ac53b8f02625)((0, $h9lXz$RTVIEvent).TransportStateChanged, setTransportState);
|
|
392
|
-
return transportState;
|
|
393
|
-
};
|
|
394
523
|
|
|
395
524
|
|
|
396
525
|
|
|
397
526
|
|
|
398
527
|
|
|
399
|
-
const $993a744193844a95$export$59bf27bd43679db6 = /*#__PURE__*/ (0, $h9lXz$react).memo(({ backgroundColor: backgroundColor = "transparent", barColor: barColor = "black",
|
|
528
|
+
const $993a744193844a95$export$59bf27bd43679db6 = /*#__PURE__*/ (0, $h9lXz$react).memo(({ backgroundColor: backgroundColor = "transparent", barColor: barColor = "black", barCount: barCount = 5, barGap: barGap = 12, barLineCap: barLineCap = "round", barMaxHeight: barMaxHeight = 120, barOrigin: barOrigin = "center", barWidth: barWidth = 30, participantType: participantType })=>{
|
|
400
529
|
const canvasRef = (0, $h9lXz$useRef)(null);
|
|
401
530
|
const track = (0, $194c75143b7a1fa0$export$7c03381e0d26a6c3)("audio", participantType);
|
|
402
531
|
(0, $h9lXz$useEffect)(()=>{
|
|
403
532
|
if (!canvasRef.current) return;
|
|
404
|
-
const canvasWidth =
|
|
533
|
+
const canvasWidth = barCount * barWidth + (barCount - 1) * barGap;
|
|
405
534
|
const canvasHeight = barMaxHeight;
|
|
406
535
|
const canvas = canvasRef.current;
|
|
407
536
|
const scaleFactor = 2;
|
|
@@ -411,7 +540,7 @@ const $993a744193844a95$export$59bf27bd43679db6 = /*#__PURE__*/ (0, $h9lXz$react
|
|
|
411
540
|
canvas.height = canvasHeight * scaleFactor;
|
|
412
541
|
canvas.style.width = `${canvasWidth}px`;
|
|
413
542
|
canvas.style.height = `${canvasHeight}px`;
|
|
414
|
-
canvasCtx.lineCap =
|
|
543
|
+
canvasCtx.lineCap = barLineCap;
|
|
415
544
|
canvasCtx.scale(scaleFactor, scaleFactor);
|
|
416
545
|
};
|
|
417
546
|
const canvasCtx = canvas.getContext("2d");
|
|
@@ -425,34 +554,29 @@ const $993a744193844a95$export$59bf27bd43679db6 = /*#__PURE__*/ (0, $h9lXz$react
|
|
|
425
554
|
analyser.fftSize = 1024;
|
|
426
555
|
source.connect(analyser);
|
|
427
556
|
const frequencyData = new Uint8Array(analyser.frequencyBinCount);
|
|
428
|
-
canvasCtx.lineCap =
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
557
|
+
canvasCtx.lineCap = barLineCap;
|
|
558
|
+
// Create frequency bands based on barCount
|
|
559
|
+
const bands = Array.from({
|
|
560
|
+
length: barCount
|
|
561
|
+
}, (_, i)=>{
|
|
562
|
+
// Use improved logarithmic scale for better frequency distribution
|
|
563
|
+
const minFreq = barCount > 20 ? 200 : 80; // Adjust min frequency based on bar count
|
|
564
|
+
const maxFreq = 10000; // Cover most important audio frequencies
|
|
565
|
+
// Use Mel scale inspired approach for more perceptually uniform distribution
|
|
566
|
+
// This helps with a large number of bars by placing fewer in the very low range
|
|
567
|
+
// https://en.wikipedia.org/wiki/Mel_scale
|
|
568
|
+
const melMin = 2595 * Math.log10(1 + minFreq / 700);
|
|
569
|
+
const melMax = 2595 * Math.log10(1 + maxFreq / 700);
|
|
570
|
+
const melStep = (melMax - melMin) / barCount;
|
|
571
|
+
const melValue = melMin + i * melStep;
|
|
572
|
+
const startFreq = 700 * (Math.pow(10, melValue / 2595) - 1);
|
|
573
|
+
const endFreq = 700 * (Math.pow(10, (melValue + melStep) / 2595) - 1);
|
|
574
|
+
return {
|
|
575
|
+
startFreq: startFreq,
|
|
576
|
+
endFreq: endFreq,
|
|
433
577
|
smoothValue: 0
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
startFreq: 255,
|
|
437
|
-
endFreq: 500,
|
|
438
|
-
smoothValue: 0
|
|
439
|
-
},
|
|
440
|
-
{
|
|
441
|
-
startFreq: 500,
|
|
442
|
-
endFreq: 2000,
|
|
443
|
-
smoothValue: 0
|
|
444
|
-
},
|
|
445
|
-
{
|
|
446
|
-
startFreq: 2000,
|
|
447
|
-
endFreq: 4000,
|
|
448
|
-
smoothValue: 0
|
|
449
|
-
},
|
|
450
|
-
{
|
|
451
|
-
startFreq: 4000,
|
|
452
|
-
endFreq: 8000,
|
|
453
|
-
smoothValue: 0
|
|
454
|
-
}
|
|
455
|
-
];
|
|
578
|
+
};
|
|
579
|
+
});
|
|
456
580
|
const getFrequencyBinIndex = (frequency)=>{
|
|
457
581
|
const nyquist = audioContext.sampleRate / 2;
|
|
458
582
|
return Math.round(frequency / nyquist * (analyser.frequencyBinCount - 1));
|
|
@@ -479,9 +603,25 @@ const $993a744193844a95$export$59bf27bd43679db6 = /*#__PURE__*/ (0, $h9lXz$react
|
|
|
479
603
|
}
|
|
480
604
|
const x = startX + i * (barWidth + barGap);
|
|
481
605
|
// Calculate bar height with a maximum cap
|
|
482
|
-
const
|
|
483
|
-
const
|
|
484
|
-
|
|
606
|
+
const minHeight = 0;
|
|
607
|
+
const barHeight = Math.max(minHeight, Math.min(band.smoothValue / 255 * barMaxHeight, barMaxHeight));
|
|
608
|
+
let yTop, yBottom;
|
|
609
|
+
const canvasHeight = canvas.height / scaleFactor;
|
|
610
|
+
switch(barOrigin){
|
|
611
|
+
case "top":
|
|
612
|
+
yTop = adjustedCircleRadius;
|
|
613
|
+
yBottom = Math.min(adjustedCircleRadius + barHeight, canvasHeight - adjustedCircleRadius);
|
|
614
|
+
break;
|
|
615
|
+
case "bottom":
|
|
616
|
+
yBottom = canvasHeight - adjustedCircleRadius;
|
|
617
|
+
yTop = Math.max(yBottom - barHeight, adjustedCircleRadius);
|
|
618
|
+
break;
|
|
619
|
+
case "center":
|
|
620
|
+
default:
|
|
621
|
+
yTop = Math.max(canvasHeight / 2 - barHeight / 2, adjustedCircleRadius);
|
|
622
|
+
yBottom = Math.min(canvasHeight / 2 + barHeight / 2, canvasHeight - adjustedCircleRadius);
|
|
623
|
+
break;
|
|
624
|
+
}
|
|
485
625
|
if (band.smoothValue > 0) {
|
|
486
626
|
canvasCtx.beginPath();
|
|
487
627
|
canvasCtx.moveTo(x + barWidth / 2, yTop);
|
|
@@ -489,28 +629,47 @@ const $993a744193844a95$export$59bf27bd43679db6 = /*#__PURE__*/ (0, $h9lXz$react
|
|
|
489
629
|
canvasCtx.lineWidth = barWidth;
|
|
490
630
|
canvasCtx.strokeStyle = barColor;
|
|
491
631
|
canvasCtx.stroke();
|
|
492
|
-
} else
|
|
493
|
-
canvasCtx.beginPath();
|
|
494
|
-
canvasCtx.arc(x + barWidth / 2, canvas.height / scaleFactor / 2, adjustedCircleRadius, 0, 2 * Math.PI);
|
|
495
|
-
canvasCtx.fillStyle = barColor;
|
|
496
|
-
canvasCtx.fill();
|
|
497
|
-
canvasCtx.closePath();
|
|
498
|
-
}
|
|
632
|
+
} else drawInactiveCircle(adjustedCircleRadius, barColor, x, yTop);
|
|
499
633
|
});
|
|
500
634
|
if (!isActive) drawInactiveCircles(adjustedCircleRadius, barColor);
|
|
501
635
|
requestAnimationFrame(drawSpectrum);
|
|
502
636
|
}
|
|
637
|
+
function drawInactiveCircle(circleRadius, color, x, y) {
|
|
638
|
+
switch(barLineCap){
|
|
639
|
+
case "square":
|
|
640
|
+
canvasCtx.fillStyle = color;
|
|
641
|
+
canvasCtx.fillRect(x + barWidth / 2 - circleRadius, y - circleRadius, circleRadius * 2, circleRadius * 2);
|
|
642
|
+
break;
|
|
643
|
+
case "round":
|
|
644
|
+
default:
|
|
645
|
+
canvasCtx.beginPath();
|
|
646
|
+
canvasCtx.arc(x + barWidth / 2, y, circleRadius, 0, 2 * Math.PI);
|
|
647
|
+
canvasCtx.fillStyle = color;
|
|
648
|
+
canvasCtx.fill();
|
|
649
|
+
canvasCtx.closePath();
|
|
650
|
+
break;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
503
653
|
function drawInactiveCircles(circleRadius, color) {
|
|
504
654
|
const totalBarsWidth = bands.length * barWidth + (bands.length - 1) * barGap;
|
|
505
655
|
const startX = (canvas.width / scaleFactor - totalBarsWidth) / 2;
|
|
506
|
-
const
|
|
656
|
+
const canvasHeight = canvas.height / scaleFactor;
|
|
657
|
+
let y;
|
|
658
|
+
switch(barOrigin){
|
|
659
|
+
case "top":
|
|
660
|
+
y = circleRadius;
|
|
661
|
+
break;
|
|
662
|
+
case "bottom":
|
|
663
|
+
y = canvasHeight - circleRadius;
|
|
664
|
+
break;
|
|
665
|
+
case "center":
|
|
666
|
+
default:
|
|
667
|
+
y = canvasHeight / 2;
|
|
668
|
+
break;
|
|
669
|
+
}
|
|
507
670
|
bands.forEach((_, i)=>{
|
|
508
671
|
const x = startX + i * (barWidth + barGap);
|
|
509
|
-
|
|
510
|
-
canvasCtx.arc(x + barWidth / 2, y, circleRadius, 0, 2 * Math.PI);
|
|
511
|
-
canvasCtx.fillStyle = color;
|
|
512
|
-
canvasCtx.fill();
|
|
513
|
-
canvasCtx.closePath();
|
|
672
|
+
drawInactiveCircle(circleRadius, color, x, y);
|
|
514
673
|
});
|
|
515
674
|
}
|
|
516
675
|
drawSpectrum();
|
|
@@ -523,8 +682,11 @@ const $993a744193844a95$export$59bf27bd43679db6 = /*#__PURE__*/ (0, $h9lXz$react
|
|
|
523
682
|
}, [
|
|
524
683
|
backgroundColor,
|
|
525
684
|
barColor,
|
|
685
|
+
barCount,
|
|
526
686
|
barGap,
|
|
687
|
+
barLineCap,
|
|
527
688
|
barMaxHeight,
|
|
689
|
+
barOrigin,
|
|
528
690
|
barWidth,
|
|
529
691
|
track
|
|
530
692
|
]);
|
|
@@ -542,5 +704,5 @@ $993a744193844a95$export$59bf27bd43679db6.displayName = "VoiceVisualizer";
|
|
|
542
704
|
|
|
543
705
|
|
|
544
706
|
|
|
545
|
-
export {$f8b885726fc652c0$export$ba1245f7cbf3ae02 as RTVIClientAudio, $f3f7d4263dc13c6a$export$4a4ae2d5dc96782 as RTVIClientProvider, $b76d887910983811$export$d090a384943608eb as RTVIClientVideo, $54a3c9f5bdbf0854$export$31a5f6a22c9b8fba as useRTVIClient, $824ea64b5f757259$export$33a6ac53b8f02625 as useRTVIClientEvent, $c7d06534b21735c2$export$652c54907b83a48d as useRTVIClientMediaDevices, $194c75143b7a1fa0$export$7c03381e0d26a6c3 as useRTVIClientMediaTrack, $8376ffbc1b1f3c97$export$599fa01283bd4ece as useRTVIClientTransportState, $993a744193844a95$export$59bf27bd43679db6 as VoiceVisualizer};
|
|
707
|
+
export {$f8b885726fc652c0$export$ba1245f7cbf3ae02 as RTVIClientAudio, $379da083c72543d5$export$156c26e16246ae3e as RTVIClientCamToggle, $5bebec90a95fc7e5$export$bf1c2c9ca877628d as RTVIClientMicToggle, $f3f7d4263dc13c6a$export$4a4ae2d5dc96782 as RTVIClientProvider, $b76d887910983811$export$d090a384943608eb as RTVIClientVideo, $54a3c9f5bdbf0854$export$31a5f6a22c9b8fba as useRTVIClient, $7662c16ae3a8c331$export$46099a7ec2fe8ac5 as useRTVIClientCamControl, $824ea64b5f757259$export$33a6ac53b8f02625 as useRTVIClientEvent, $c7d06534b21735c2$export$652c54907b83a48d as useRTVIClientMediaDevices, $194c75143b7a1fa0$export$7c03381e0d26a6c3 as useRTVIClientMediaTrack, $e6f5302cf8392476$export$805915964ad7bc25 as useRTVIClientMicControl, $8376ffbc1b1f3c97$export$599fa01283bd4ece as useRTVIClientTransportState, $993a744193844a95$export$59bf27bd43679db6 as VoiceVisualizer};
|
|
546
708
|
//# sourceMappingURL=index.module.js.map
|