first cut

This commit is contained in:
freddyaboulton
2024-10-25 16:24:17 -07:00
parent 203b02e455
commit a5dbaaf49b
7 changed files with 439 additions and 5 deletions

View File

@@ -11,6 +11,7 @@ import traceback
from abc import ABC, abstractmethod
from collections.abc import Callable
from typing import TYPE_CHECKING, Any, Generator, Literal, Sequence, cast
from copy import deepcopy
import anyio.to_thread
import av
@@ -117,6 +118,12 @@ class StreamHandler(ABC):
self.output_frame_size = output_frame_size
self._resampler = None
def copy(self) -> "StreamHandler":
try:
return deepcopy(self)
except Exception:
raise ValueError("Current StreamHandler implementation cannot be deepcopied. Implement the copy method.")
def resample(self, frame: AudioFrame) -> Generator[AudioFrame, None, None]:
if self._resampler is None:
self._resampler = av.AudioResampler( # type: ignore
@@ -622,7 +629,7 @@ class WebRTC(Component):
elif self.modality == "audio":
cb = AudioCallback(
relay.subscribe(track),
event_handler=cast(StreamHandler, self.event_handler),
event_handler=cast(StreamHandler, self.event_handler).copy(),
)
self.connections[body["webrtc_id"]] = cb
logger.debug("Adding track to peer connection %s", cb)