diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..08635659 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,268 @@ +# LiveKit Python SDK Examples + +This directory contains examples demonstrating various features of the LiveKit Python SDK. + +## Prerequisites + +Set the following environment variables: + +```bash +export LIVEKIT_URL=ws://localhost:7880 +export LIVEKIT_API_KEY=devkey +export LIVEKIT_API_SECRET=secret +``` + +## Examples Overview + +| Example | Description | +|---------|-------------| +| [basic_room.py](#basic_roompy) | Room connection with PlatformAudio and synthetic audio modes | +| [room_example.py](#room_examplepy) | Basic room connection and event handling | +| [api.py](#apipy) | Room management via LiveKit API | +| [e2ee.py](#e2eepy) | End-to-end encryption demo | +| [rpc.py](#rpcpy) | Remote Procedure Call between participants | +| [multiple_connections.py](#multiple_connectionspy) | Sequential connections for sync frameworks | +| [participant_attributes.py](#participant_attributespy) | Dynamic participant attributes | +| [publish_wave.py](#publish_wavepy) | Publish sine wave audio | +| [publish_hue.py](#publish_huepy) | Publish color-cycling video | +| [play_audio_stream.py](#play_audio_streampy) | Play received audio with sounddevice | +| [webhook.py](#webhookpy) | Webhook event handling | +| [agent_dispatch.py](#agent_dispatchpy) | Manual agent dispatch | + +### Subdirectories + +| Directory | Description | +|-----------|-------------| +| [face_landmark/](face_landmark/) | Facial landmark detection using MediaPipe | +| [video-stream/](video-stream/) | Video/audio sync with AVSynchronizer | +| [data_tracks/](data_tracks/) | Data channel examples | +| [data-streams/](data-streams/) | Data streaming examples | +| [local_audio/](local_audio/) | Local audio capture examples | + +--- + +## basic_room.py + +The most comprehensive example, demonstrating room connection with audio capabilities. It showcases two audio capture modes that can be used independently or combined. + +### Quick Start + +```bash +# List available audio devices +python basic_room.py --list-devices + +# Connect with PlatformAudio (recommended) +python basic_room.py --platform-audio --room my-room + +# Connect with specific devices +python basic_room.py --platform-audio --mic-id "device-guid" --speaker-id "device-guid" + +# Publish a WAV file +python basic_room.py --file audio.wav --room my-room + +# Mix microphone + WAV file (both modes together) +python basic_room.py --platform-audio --file background.wav --room my-room +``` + +### Audio Modes + +#### PlatformAudio Mode (`--platform-audio`) + +Uses WebRTC's Audio Device Module (ADM) for microphone capture. **Recommended for most applications.** + +**Features:** +- Built-in voice processing: + - **Echo Cancellation (AEC)** - removes echo from speaker playback + - **Noise Suppression (NS)** - reduces background noise + - **Auto Gain Control (AGC)** - normalizes audio levels +- Hardware-accelerated processing on supported platforms (e.g., iOS VPIO) +- Automatic speaker playout for received audio +- Device enumeration and selection +- No external audio libraries required + +**Limitations:** +- No direct access to raw audio frames (ADM sends directly to WebRTC) +- Cannot apply custom audio processing before publishing + +```python +platform_audio = rtc.PlatformAudio() +source = platform_audio.create_audio_source( + rtc.PlatformAudioOptions( + echo_cancellation=True, + noise_suppression=True, + auto_gain_control=True, + ) +) +track = rtc.LocalAudioTrack.create_audio_track("microphone", source) +``` + +#### Synthetic Mode (Default) + +Manual control over audio frames via `AudioSource.capture_frame()`. Use this for custom audio processing or programmatic audio generation. + +**Features:** +- Full control over audio data +- Access to raw audio frames for custom processing +- Generate synthetic audio (files, TTS, audio synthesis) +- Apply custom filters, effects, or ML models + +**Limitations:** +- No built-in AEC/NS/AGC - implement yourself or use `AudioProcessingModule` +- Must handle speaker playout manually via `AudioStream` +- Requires external audio libraries for mic capture (sounddevice, pyaudio) + +```python +source = rtc.AudioSource(sample_rate=48000, num_channels=1) +track = rtc.LocalAudioTrack.create_audio_track("audio", source) + +frame = rtc.AudioFrame(data=audio_bytes, sample_rate=48000, ...) +await source.capture_frame(frame) +``` + +#### Mixing Both Modes + +PlatformAudio and Synthetic modes can run simultaneously. The `--file` option demonstrates this by publishing a WAV file (synthetic) alongside microphone capture (PlatformAudio). + +```bash +python basic_room.py --platform-audio --file music.wav --room my-room +``` + +This creates two audio tracks: +1. **Microphone** - via PlatformAudio with voice processing +2. **File** - via synthetic mode from WAV + +Use cases: background music while speaking, sound effects, mixing pre-recorded audio with live input. + +### Command Line Options + +| Option | Description | +|--------|-------------| +| `--list-devices` | List available audio devices and exit | +| `--platform-audio` | Use PlatformAudio for microphone (recommended) | +| `--file WAV_PATH` | Publish audio from WAV file (synthetic mode) | +| `--room NAME` | Room name (default: my-room) | +| `--mic-id ID` | Select microphone by device ID | +| `--speaker-id ID` | Select speaker by device ID | + +### When to Use Each Mode + +| Use Case | Mode | +|----------|------| +| Voice/video calls | PlatformAudio | +| Conferencing apps | PlatformAudio | +| Playing audio files | Synthetic | +| Text-to-speech | Synthetic | +| Custom audio processing | Synthetic | +| ML audio effects | Synthetic | +| Background music + voice | Both | + +--- + +## room_example.py + +Basic room connection demonstrating event handling and participant tracking. + +```bash +python room_example.py +``` + +--- + +## api.py + +Room management using the LiveKit API (create rooms, list rooms). + +```bash +python api.py +``` + +--- + +## e2ee.py + +End-to-end encryption with a rotating 3D cube visualization. + +```bash +python e2ee.py +``` + +--- + +## rpc.py + +Remote Procedure Call (RPC) between participants - greetings, math operations, timeout handling. + +```bash +python rpc.py +``` + +--- + +## multiple_connections.py + +Sequential room connections in a single thread. Useful for Django/Flask integration. + +```bash +python multiple_connections.py +``` + +--- + +## participant_attributes.py + +Set, update, and delete participant attributes dynamically. + +```bash +python participant_attributes.py +``` + +--- + +## publish_wave.py + +Publish a sine wave audio track at a specified frequency. + +```bash +python publish_wave.py +``` + +--- + +## publish_hue.py + +Publish a color-cycling animated video track. + +```bash +python publish_hue.py +``` + +--- + +## play_audio_stream.py + +Play incoming audio from remote participants using sounddevice. + +```bash +pip install sounddevice +python play_audio_stream.py +``` + +--- + +## webhook.py + +Handle LiveKit webhook events using aiohttp. + +```bash +python webhook.py +``` + +--- + +## agent_dispatch.py + +Manually dispatch agents to rooms (instead of automatic dispatch). + +```bash +python agent_dispatch.py +``` diff --git a/examples/basic_room.py b/examples/basic_room.py index 5fa64f95..0d7f7265 100644 --- a/examples/basic_room.py +++ b/examples/basic_room.py @@ -1,126 +1,337 @@ +""" +LiveKit Basic Room Example + +This example demonstrates connecting to a LiveKit room with audio capabilities. +It supports two audio modes: + +1. PlatformAudio Mode (--platform-audio, RECOMMENDED): + - Uses WebRTC's Audio Device Module (ADM) for microphone capture + - Built-in echo cancellation (AEC), noise suppression (NS), auto gain control (AGC) + - Automatic speaker playout for received audio + - No external audio libraries needed + - Cannot access raw audio frames (ADM sends directly to WebRTC) + +2. Synthetic Mode (default, for advanced use): + - Manual audio frame capture via AudioSource.capture_frame() + - Requires external audio libraries (e.g., sounddevice, pyaudio) + - Full control over audio processing pipeline + - Access to raw audio frames for custom processing + - No built-in AEC/NS/AGC - must implement yourself or use AudioProcessingModule + - Must handle speaker playout manually + +Usage: + # List available audio devices + python basic_room.py --list-devices + + # Connect with PlatformAudio (recommended) + python basic_room.py --platform-audio --room my-room + + # Connect with PlatformAudio and specific devices + python basic_room.py --platform-audio --mic-id "device-guid" --speaker-id "device-guid" + + # Publish a WAV file instead of microphone + python basic_room.py --file audio.wav --room my-room + + # Publish both microphone and WAV file + python basic_room.py --platform-audio --file audio.wav --room my-room + +Environment variables: + LIVEKIT_URL - LiveKit server URL (e.g., ws://localhost:7880) + LIVEKIT_API_KEY - API key for token generation + LIVEKIT_API_SECRET - API secret for token generation +""" + +import argparse import asyncio import logging -from signal import SIGINT, SIGTERM -from typing import Union import os +import struct +import wave +from signal import SIGINT, SIGTERM +from typing import Optional, Union from livekit import api, rtc -# ensure LIVEKIT_URL, LIVEKIT_API_KEY, and LIVEKIT_API_SECRET are set +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="LiveKit Basic Room Example", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=__doc__, + ) + + parser.add_argument( + "--list-devices", + action="store_true", + help="List available audio devices and exit", + ) + + parser.add_argument( + "--platform-audio", + action="store_true", + help="Use PlatformAudio (WebRTC ADM) for microphone capture. " + "Provides built-in AEC, NS, AGC. Recommended for most use cases.", + ) + + parser.add_argument( + "--file", + type=str, + metavar="WAV_PATH", + help="Publish audio from a WAV file. Can be combined with --platform-audio " + "to publish both microphone and file audio.", + ) + + parser.add_argument( + "--room", + type=str, + default="my-room", + help="Room name to join (default: my-room)", + ) + + parser.add_argument( + "--mic-id", + type=str, + metavar="DEVICE_ID", + help="Select microphone by device ID (from --list-devices). " + "Only used with --platform-audio.", + ) + + parser.add_argument( + "--speaker-id", + type=str, + metavar="DEVICE_ID", + help="Select speaker by device ID (from --list-devices). " + "Only used with --platform-audio.", + ) + + return parser.parse_args() + + +def list_audio_devices() -> None: + """List available audio devices using PlatformAudio.""" + try: + platform_audio = rtc.PlatformAudio() + except rtc.PlatformAudioError as e: + print(f"Failed to initialize PlatformAudio: {e}") + return + + print("\nRecording devices (microphones):") + recording_devices = platform_audio.recording_devices() + if not recording_devices: + print(" (none)") + else: + for device in recording_devices: + print(f" [{device.index}] {device.name}") + print(f" ID: {device.id}") + + print("\nPlayout devices (speakers):") + playout_devices = platform_audio.playout_devices() + if not playout_devices: + print(" (none)") + else: + for device in playout_devices: + print(f" [{device.index}] {device.name}") + print(f" ID: {device.id}") + + print("\nUse --mic-id or --speaker-id with the device ID to select a specific device.") + + +def load_wav_file(path: str) -> tuple[bytes, int, int, int]: + """Load a WAV file and return (samples, sample_rate, channels, bits_per_sample).""" + with wave.open(path, "rb") as wav: + sample_rate = wav.getframerate() + channels = wav.getnchannels() + bits_per_sample = wav.getsampwidth() * 8 + frames = wav.readframes(wav.getnframes()) + + # Convert to 16-bit signed integers if needed + if bits_per_sample == 8: + # Convert unsigned 8-bit to signed 16-bit + samples = struct.unpack(f"{len(frames)}B", frames) + samples = [(s - 128) * 256 for s in samples] + frames = struct.pack(f"{len(samples)}h", *samples) + bits_per_sample = 16 + elif bits_per_sample == 24: + # Convert 24-bit to 16-bit (drop lower 8 bits) + samples = [] + for i in range(0, len(frames), 3): + # 24-bit little-endian, take upper 16 bits + sample = struct.unpack("> 8 + samples.append(sample) + frames = struct.pack(f"{len(samples)}h", *samples) + bits_per_sample = 16 + elif bits_per_sample == 32: + # Convert 32-bit to 16-bit + samples = struct.unpack(f"<{len(frames) // 4}i", frames) + samples = [s >> 16 for s in samples] + frames = struct.pack(f"{len(samples)}h", *samples) + bits_per_sample = 16 + + return frames, sample_rate, channels, bits_per_sample + + +async def publish_wav_file( + room: rtc.Room, wav_path: str, running: asyncio.Event +) -> None: + """Publish audio from a WAV file using synthetic mode (AudioSource). + + This demonstrates synthetic mode where you manually push audio frames. + Use this approach when you need to: + - Process audio before publishing + - Generate synthetic audio + - Play audio files + """ + logging.info(f"Loading WAV file: {wav_path}") + try: + audio_data, sample_rate, channels, _ = load_wav_file(wav_path) + except Exception as e: + logging.error(f"Failed to load WAV file: {e}") + return + + logging.info(f"WAV file: {sample_rate}Hz, {channels} channels, {len(audio_data)} bytes") + + # Create AudioSource for synthetic mode + # SYNTHETIC MODE LIMITATION: You must manually capture frames in a loop. + # There is no built-in AEC/NS/AGC - audio is sent exactly as provided. + source = rtc.AudioSource( + sample_rate=sample_rate, + num_channels=channels, + queue_size_ms=100, # Small queue for file playback + ) + + track = rtc.LocalAudioTrack.create_audio_track("audio-file", source) + + # Publish the track + publication = await room.local_participant.publish_track( + track, + rtc.TrackPublishOptions(source=rtc.TrackSource.SOURCE_UNKNOWN), + ) + logging.info(f"Published file audio track: {publication.sid}") + + # Convert audio data to samples + num_samples = len(audio_data) // 2 # 16-bit = 2 bytes per sample + samples = list(struct.unpack(f"<{num_samples}h", audio_data)) + + # Play audio in 10ms frames (standard WebRTC frame size) + samples_per_frame = (sample_rate * channels) // 100 # 10ms worth of samples + position = 0 + frame_count = 0 + + logging.info("Starting WAV playback loop...") + + while running.is_set(): + # Get next frame of samples + end = min(position + samples_per_frame, len(samples)) + frame_samples = samples[position:end] + + # Pad with silence if we don't have enough samples + if len(frame_samples) < samples_per_frame: + frame_samples = frame_samples + [0] * (samples_per_frame - len(frame_samples)) + + # Create AudioFrame + frame = rtc.AudioFrame( + data=bytes(struct.pack(f"<{len(frame_samples)}h", *frame_samples)), + sample_rate=sample_rate, + num_channels=channels, + samples_per_channel=samples_per_frame // channels, + ) + + # Capture frame (this queues it for sending) + await source.capture_frame(frame) -async def main(room: rtc.Room) -> None: + position += samples_per_frame + frame_count += 1 + + # Loop the file + if position >= len(samples): + position = 0 + logging.info("WAV file looping...") + + # Wait ~10ms before next frame + await asyncio.sleep(0.01) + + logging.info(f"WAV playback stopped after {frame_count} frames") + + +async def main(room: rtc.Room, args: argparse.Namespace) -> None: + running = asyncio.Event() + running.set() + + # Setup room event handlers @room.on("participant_connected") def on_participant_connected(participant: rtc.RemoteParticipant) -> None: - logging.info("participant connected: %s %s", participant.sid, participant.identity) + logging.info(f"Participant connected: {participant.identity} ({participant.sid})") @room.on("participant_disconnected") - def on_participant_disconnected(participant: rtc.RemoteParticipant): - logging.info("participant disconnected: %s %s", participant.sid, participant.identity) - - @room.on("local_track_published") - def on_local_track_published( - publication: rtc.LocalTrackPublication, - track: Union[rtc.LocalAudioTrack, rtc.LocalVideoTrack], - ): - logging.info("local track published: %s", publication.sid) - - @room.on("active_speakers_changed") - def on_active_speakers_changed(speakers: list[rtc.Participant]): - logging.info("active speakers changed: %s", speakers) - - @room.on("local_track_unpublished") - def on_local_track_unpublished(publication: rtc.LocalTrackPublication): - logging.info("local track unpublished: %s", publication.sid) - - @room.on("track_published") - def on_track_published( - publication: rtc.RemoteTrackPublication, participant: rtc.RemoteParticipant - ): - logging.info( - "track published: %s from participant %s (%s)", - publication.sid, - participant.sid, - participant.identity, - ) - - @room.on("track_unpublished") - def on_track_unpublished( - publication: rtc.RemoteTrackPublication, participant: rtc.RemoteParticipant - ): - logging.info("track unpublished: %s", publication.sid) + def on_participant_disconnected(participant: rtc.RemoteParticipant) -> None: + logging.info(f"Participant disconnected: {participant.identity}") @room.on("track_subscribed") def on_track_subscribed( track: rtc.Track, publication: rtc.RemoteTrackPublication, participant: rtc.RemoteParticipant, - ): - logging.info("track subscribed: %s", publication.sid) - if track.kind == rtc.TrackKind.KIND_VIDEO: - _video_stream = rtc.VideoStream(track) - # video_stream is an async iterator that yields VideoFrame - elif track.kind == rtc.TrackKind.KIND_AUDIO: - print("Subscribed to an Audio Track") - _audio_stream = rtc.AudioStream(track) - # audio_stream is an async iterator that yields AudioFrame + ) -> None: + logging.info( + f"Track subscribed: {track.kind} from {participant.identity}" + ) + if track.kind == rtc.TrackKind.KIND_AUDIO: + # When using PlatformAudio, received audio is automatically played + # through the selected speaker. No manual handling needed. + # + # For synthetic mode or custom processing, you would create an + # AudioStream and iterate over frames: + # audio_stream = rtc.AudioStream(track) + # async for frame_event in audio_stream: + # process(frame_event.frame) + logging.info("Audio track subscribed - audio will play through speaker") @room.on("track_unsubscribed") def on_track_unsubscribed( track: rtc.Track, publication: rtc.RemoteTrackPublication, participant: rtc.RemoteParticipant, - ): - logging.info("track unsubscribed: %s", publication.sid) - - @room.on("track_muted") - def on_track_muted(publication: rtc.RemoteTrackPublication, participant: rtc.RemoteParticipant): - logging.info("track muted: %s", publication.sid) - - @room.on("track_unmuted") - def on_track_unmuted( - publication: rtc.RemoteTrackPublication, participant: rtc.RemoteParticipant - ): - logging.info("track unmuted: %s", publication.sid) - - @room.on("data_received") - def on_data_received(data: rtc.DataPacket): - logging.info("received data from %s: %s", data.participant.identity, data.data) - - @room.on("connection_quality_changed") - def on_connection_quality_changed(participant: rtc.Participant, quality: rtc.ConnectionQuality): - logging.info("connection quality changed for %s", participant.identity) - - @room.on("track_subscription_failed") - def on_track_subscription_failed( - participant: rtc.RemoteParticipant, track_sid: str, error: str - ): - logging.info("track subscription failed: %s %s", participant.identity, error) + ) -> None: + logging.info(f"Track unsubscribed: {track.kind} from {participant.identity}") @room.on("connection_state_changed") - def on_connection_state_changed(state: rtc.ConnectionState): - logging.info("connection state changed: %s", state) - - @room.on("connected") - def on_connected() -> None: - logging.info("connected") + def on_connection_state_changed(state: rtc.ConnectionState) -> None: + logging.info(f"Connection state: {state}") @room.on("disconnected") def on_disconnected() -> None: - logging.info("disconnected") + logging.info("Disconnected from room") + running.clear() - @room.on("reconnecting") - def on_reconnecting() -> None: - logging.info("reconnecting") + # Initialize PlatformAudio if requested + platform_audio: Optional[rtc.PlatformAudio] = None + if args.platform_audio: + try: + platform_audio = rtc.PlatformAudio() + logging.info("PlatformAudio initialized") - @room.on("reconnected") - def on_reconnected() -> None: - logging.info("reconnected") + # Select microphone if specified + if args.mic_id: + try: + platform_audio.set_recording_device(args.mic_id) + logging.info(f"Selected microphone: {args.mic_id}") + except rtc.PlatformAudioError as e: + logging.warning(f"Failed to select microphone: {e}") - @room.on("room_updated") - def on_room_updated() -> None: - logging.info(f"room updated, participants: {room.num_participants}") + # Select speaker if specified + if args.speaker_id: + try: + platform_audio.set_playout_device(args.speaker_id) + logging.info(f"Selected speaker: {args.speaker_id}") + except rtc.PlatformAudioError as e: + logging.warning(f"Failed to select speaker: {e}") + except rtc.PlatformAudioError as e: + logging.error(f"Failed to initialize PlatformAudio: {e}") + logging.info("Falling back to no microphone capture") + platform_audio = None + + # Generate access token token = ( api.AccessToken() .with_identity("python-bot") @@ -128,25 +339,87 @@ def on_room_updated() -> None: .with_grants( api.VideoGrants( room_join=True, - room="my-room", + room=args.room, ) ) .to_jwt() ) - await room.connect(os.getenv("LIVEKIT_URL"), token) - logging.info(f"connected to room {room.name}, created {room.creation_time}") - logging.info(f"participants: {room.remote_participants}") + # Connect to room + url = os.getenv("LIVEKIT_URL") + if not url: + logging.error("LIVEKIT_URL environment variable not set") + return + + logging.info(f"Connecting to room '{args.room}'...") + await room.connect(url, token) + logging.info(f"Connected to room: {room.name}") + + # Publish microphone using PlatformAudio + if platform_audio: + # PLATFORMAUDIO MODE: The ADM captures audio from the microphone and sends + # it directly to WebRTC. You cannot access the raw audio frames. + # Benefits: Built-in AEC, NS, AGC. Automatic speaker playout. + source = platform_audio.create_audio_source( + rtc.PlatformAudioOptions( + echo_cancellation=True, + noise_suppression=True, + auto_gain_control=True, + ) + ) + mic_track = rtc.LocalAudioTrack.create_audio_track("microphone", source) + + publication = await room.local_participant.publish_track( + mic_track, + rtc.TrackPublishOptions(source=rtc.TrackSource.SOURCE_MICROPHONE), + ) + logging.info(f"Published microphone track: {publication.sid}") + + # Publish WAV file if specified + wav_task: Optional[asyncio.Task] = None + if args.file: + wav_task = asyncio.create_task(publish_wav_file(room, args.file, running)) + + # Keep running until disconnected + logging.info("Listening for events... Press Ctrl+C to exit") await asyncio.sleep(2) - await room.local_participant.publish_data("hello world") + await room.local_participant.publish_data("hello from python!") + + while running.is_set(): + await asyncio.sleep(1) + + # Cleanup + if wav_task: + wav_task.cancel() + try: + await wav_task + except asyncio.CancelledError: + pass if __name__ == "__main__": logging.basicConfig( level=logging.INFO, - handlers=[logging.FileHandler("basic_room.log"), logging.StreamHandler()], + format="%(asctime)s - %(levelname)s - %(message)s", + handlers=[ + logging.FileHandler("basic_room.log"), + logging.StreamHandler(), + ], ) + args = parse_args() + + # Handle --list-devices + if args.list_devices: + list_audio_devices() + exit(0) + + # Validate arguments + if args.mic_id and not args.platform_audio: + logging.warning("--mic-id requires --platform-audio, ignoring") + if args.speaker_id and not args.platform_audio: + logging.warning("--speaker-id requires --platform-audio, ignoring") + loop = asyncio.get_event_loop() room = rtc.Room(loop=loop) @@ -154,7 +427,8 @@ async def cleanup(): await room.disconnect() loop.stop() - asyncio.ensure_future(main(room)) + asyncio.ensure_future(main(room, args)) + for signal in [SIGINT, SIGTERM]: loop.add_signal_handler(signal, lambda: asyncio.ensure_future(cleanup())) diff --git a/livekit-rtc/livekit/rtc/__init__.py b/livekit-rtc/livekit/rtc/__init__.py index 23f9cbf1..75d68e54 100644 --- a/livekit-rtc/livekit/rtc/__init__.py +++ b/livekit-rtc/livekit/rtc/__init__.py @@ -96,6 +96,13 @@ from .audio_resampler import AudioResampler, AudioResamplerQuality from .audio_mixer import AudioMixer from .apm import AudioProcessingModule +from .platform_audio import ( + PlatformAudio, + PlatformAudioSource, + PlatformAudioOptions, + PlatformAudioError, + AudioDeviceInfo, +) try: from .media_devices import MediaDevices as MediaDevices @@ -204,6 +211,11 @@ "ByteStreamReader", "ByteStreamWriter", "AudioProcessingModule", + "PlatformAudio", + "PlatformAudioSource", + "PlatformAudioOptions", + "PlatformAudioError", + "AudioDeviceInfo", "FrameProcessor", "LocalDataTrack", "RemoteDataTrack", diff --git a/livekit-rtc/livekit/rtc/_proto/audio_frame_pb2.py b/livekit-rtc/livekit/rtc/_proto/audio_frame_pb2.py index c634580d..9ddbcb4e 100644 --- a/livekit-rtc/livekit/rtc/_proto/audio_frame_pb2.py +++ b/livekit-rtc/livekit/rtc/_proto/audio_frame_pb2.py @@ -16,7 +16,7 @@ from . import track_pb2 as track__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11\x61udio_frame.proto\x12\rlivekit.proto\x1a\x0chandle.proto\x1a\x0btrack.proto\"\xf6\x01\n\x15NewAudioStreamRequest\x12\x14\n\x0ctrack_handle\x18\x01 \x02(\x04\x12,\n\x04type\x18\x02 \x02(\x0e\x32\x1e.livekit.proto.AudioStreamType\x12\x13\n\x0bsample_rate\x18\x03 \x01(\r\x12\x14\n\x0cnum_channels\x18\x04 \x01(\r\x12\x1e\n\x16\x61udio_filter_module_id\x18\x05 \x01(\t\x12\x1c\n\x14\x61udio_filter_options\x18\x06 \x01(\t\x12\x15\n\rframe_size_ms\x18\x07 \x01(\r\x12\x19\n\x11queue_size_frames\x18\x08 \x01(\r\"I\n\x16NewAudioStreamResponse\x12/\n\x06stream\x18\x01 \x02(\x0b\x32\x1f.livekit.proto.OwnedAudioStream\"\xba\x02\n!AudioStreamFromParticipantRequest\x12\x1a\n\x12participant_handle\x18\x01 \x02(\x04\x12,\n\x04type\x18\x02 \x02(\x0e\x32\x1e.livekit.proto.AudioStreamType\x12\x30\n\x0ctrack_source\x18\x03 \x01(\x0e\x32\x1a.livekit.proto.TrackSource\x12\x13\n\x0bsample_rate\x18\x05 \x01(\r\x12\x14\n\x0cnum_channels\x18\x06 \x01(\r\x12\x1e\n\x16\x61udio_filter_module_id\x18\x07 \x01(\t\x12\x1c\n\x14\x61udio_filter_options\x18\x08 \x01(\t\x12\x15\n\rframe_size_ms\x18\t \x01(\r\x12\x19\n\x11queue_size_frames\x18\n \x01(\r\"U\n\"AudioStreamFromParticipantResponse\x12/\n\x06stream\x18\x01 \x02(\x0b\x32\x1f.livekit.proto.OwnedAudioStream\"\xbb\x01\n\x15NewAudioSourceRequest\x12,\n\x04type\x18\x01 \x02(\x0e\x32\x1e.livekit.proto.AudioSourceType\x12\x32\n\x07options\x18\x02 \x01(\x0b\x32!.livekit.proto.AudioSourceOptions\x12\x13\n\x0bsample_rate\x18\x03 \x02(\r\x12\x14\n\x0cnum_channels\x18\x04 \x02(\r\x12\x15\n\rqueue_size_ms\x18\x05 \x01(\r\"I\n\x16NewAudioSourceResponse\x12/\n\x06source\x18\x01 \x02(\x0b\x32\x1f.livekit.proto.OwnedAudioSource\"\x80\x01\n\x18\x43\x61ptureAudioFrameRequest\x12\x15\n\rsource_handle\x18\x01 \x02(\x04\x12\x33\n\x06\x62uffer\x18\x02 \x02(\x0b\x32#.livekit.proto.AudioFrameBufferInfo\x12\x18\n\x10request_async_id\x18\x03 \x01(\x04\"-\n\x19\x43\x61ptureAudioFrameResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"<\n\x19\x43\x61ptureAudioFrameCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"0\n\x17\x43learAudioBufferRequest\x12\x15\n\rsource_handle\x18\x01 \x02(\x04\"\x1a\n\x18\x43learAudioBufferResponse\"\x1a\n\x18NewAudioResamplerRequest\"R\n\x19NewAudioResamplerResponse\x12\x35\n\tresampler\x18\x01 \x02(\x0b\x32\".livekit.proto.OwnedAudioResampler\"\x93\x01\n\x17RemixAndResampleRequest\x12\x18\n\x10resampler_handle\x18\x01 \x02(\x04\x12\x33\n\x06\x62uffer\x18\x02 \x02(\x0b\x32#.livekit.proto.AudioFrameBufferInfo\x12\x14\n\x0cnum_channels\x18\x03 \x02(\r\x12\x13\n\x0bsample_rate\x18\x04 \x02(\r\"P\n\x18RemixAndResampleResponse\x12\x34\n\x06\x62uffer\x18\x01 \x02(\x0b\x32$.livekit.proto.OwnedAudioFrameBuffer\"\x95\x01\n\rNewApmRequest\x12\x1e\n\x16\x65\x63ho_canceller_enabled\x18\x01 \x02(\x08\x12\x1f\n\x17gain_controller_enabled\x18\x02 \x02(\x08\x12 \n\x18high_pass_filter_enabled\x18\x03 \x02(\x08\x12!\n\x19noise_suppression_enabled\x18\x04 \x02(\x08\"6\n\x0eNewApmResponse\x12$\n\x03\x61pm\x18\x01 \x02(\x0b\x32\x17.livekit.proto.OwnedApm\"x\n\x17\x41pmProcessStreamRequest\x12\x12\n\napm_handle\x18\x01 \x02(\x04\x12\x10\n\x08\x64\x61ta_ptr\x18\x02 \x02(\x04\x12\x0c\n\x04size\x18\x03 \x02(\r\x12\x13\n\x0bsample_rate\x18\x04 \x02(\r\x12\x14\n\x0cnum_channels\x18\x05 \x02(\r\")\n\x18\x41pmProcessStreamResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"\x7f\n\x1e\x41pmProcessReverseStreamRequest\x12\x12\n\napm_handle\x18\x01 \x02(\x04\x12\x10\n\x08\x64\x61ta_ptr\x18\x02 \x02(\x04\x12\x0c\n\x04size\x18\x03 \x02(\r\x12\x13\n\x0bsample_rate\x18\x04 \x02(\r\x12\x14\n\x0cnum_channels\x18\x05 \x02(\r\"0\n\x1f\x41pmProcessReverseStreamResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"@\n\x18\x41pmSetStreamDelayRequest\x12\x12\n\napm_handle\x18\x01 \x02(\x04\x12\x10\n\x08\x64\x65lay_ms\x18\x02 \x02(\x05\"*\n\x19\x41pmSetStreamDelayResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"\x9c\x02\n\x16NewSoxResamplerRequest\x12\x12\n\ninput_rate\x18\x01 \x02(\x01\x12\x13\n\x0boutput_rate\x18\x02 \x02(\x01\x12\x14\n\x0cnum_channels\x18\x03 \x02(\r\x12<\n\x0finput_data_type\x18\x04 \x02(\x0e\x32#.livekit.proto.SoxResamplerDataType\x12=\n\x10output_data_type\x18\x05 \x02(\x0e\x32#.livekit.proto.SoxResamplerDataType\x12\x37\n\x0equality_recipe\x18\x06 \x02(\x0e\x32\x1f.livekit.proto.SoxQualityRecipe\x12\r\n\x05\x66lags\x18\x07 \x01(\r\"l\n\x17NewSoxResamplerResponse\x12\x35\n\tresampler\x18\x01 \x01(\x0b\x32 .livekit.proto.OwnedSoxResamplerH\x00\x12\x0f\n\x05\x65rror\x18\x02 \x01(\tH\x00\x42\t\n\x07message\"S\n\x17PushSoxResamplerRequest\x12\x18\n\x10resampler_handle\x18\x01 \x02(\x04\x12\x10\n\x08\x64\x61ta_ptr\x18\x02 \x02(\x04\x12\x0c\n\x04size\x18\x03 \x02(\r\"K\n\x18PushSoxResamplerResponse\x12\x12\n\noutput_ptr\x18\x01 \x02(\x04\x12\x0c\n\x04size\x18\x02 \x02(\r\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"4\n\x18\x46lushSoxResamplerRequest\x12\x18\n\x10resampler_handle\x18\x01 \x02(\x04\"L\n\x19\x46lushSoxResamplerResponse\x12\x12\n\noutput_ptr\x18\x01 \x02(\x04\x12\x0c\n\x04size\x18\x02 \x02(\r\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"p\n\x14\x41udioFrameBufferInfo\x12\x10\n\x08\x64\x61ta_ptr\x18\x01 \x02(\x04\x12\x14\n\x0cnum_channels\x18\x02 \x02(\r\x12\x13\n\x0bsample_rate\x18\x03 \x02(\r\x12\x1b\n\x13samples_per_channel\x18\x04 \x02(\r\"y\n\x15OwnedAudioFrameBuffer\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12\x31\n\x04info\x18\x02 \x02(\x0b\x32#.livekit.proto.AudioFrameBufferInfo\"?\n\x0f\x41udioStreamInfo\x12,\n\x04type\x18\x01 \x02(\x0e\x32\x1e.livekit.proto.AudioStreamType\"o\n\x10OwnedAudioStream\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12,\n\x04info\x18\x02 \x02(\x0b\x32\x1e.livekit.proto.AudioStreamInfo\"\x9f\x01\n\x10\x41udioStreamEvent\x12\x15\n\rstream_handle\x18\x01 \x02(\x04\x12;\n\x0e\x66rame_received\x18\x02 \x01(\x0b\x32!.livekit.proto.AudioFrameReceivedH\x00\x12,\n\x03\x65os\x18\x03 \x01(\x0b\x32\x1d.livekit.proto.AudioStreamEOSH\x00\x42\t\n\x07message\"I\n\x12\x41udioFrameReceived\x12\x33\n\x05\x66rame\x18\x01 \x02(\x0b\x32$.livekit.proto.OwnedAudioFrameBuffer\"\x10\n\x0e\x41udioStreamEOS\"e\n\x12\x41udioSourceOptions\x12\x19\n\x11\x65\x63ho_cancellation\x18\x01 \x02(\x08\x12\x19\n\x11noise_suppression\x18\x02 \x02(\x08\x12\x19\n\x11\x61uto_gain_control\x18\x03 \x02(\x08\"?\n\x0f\x41udioSourceInfo\x12,\n\x04type\x18\x02 \x02(\x0e\x32\x1e.livekit.proto.AudioSourceType\"o\n\x10OwnedAudioSource\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12,\n\x04info\x18\x02 \x02(\x0b\x32\x1e.livekit.proto.AudioSourceInfo\"\x14\n\x12\x41udioResamplerInfo\"u\n\x13OwnedAudioResampler\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12/\n\x04info\x18\x02 \x02(\x0b\x32!.livekit.proto.AudioResamplerInfo\"9\n\x08OwnedApm\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\"\x12\n\x10SoxResamplerInfo\"q\n\x11OwnedSoxResampler\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12-\n\x04info\x18\x02 \x02(\x0b\x32\x1f.livekit.proto.SoxResamplerInfo\"\\\n\x1cLoadAudioFilterPluginRequest\x12\x13\n\x0bplugin_path\x18\x01 \x02(\t\x12\x14\n\x0c\x64\x65pendencies\x18\x02 \x03(\t\x12\x11\n\tmodule_id\x18\x03 \x02(\t\".\n\x1dLoadAudioFilterPluginResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t*J\n\x14SoxResamplerDataType\x12\x18\n\x14SOXR_DATATYPE_INT16I\x10\x00\x12\x18\n\x14SOXR_DATATYPE_INT16S\x10\x01*\x8b\x01\n\x10SoxQualityRecipe\x12\x16\n\x12SOXR_QUALITY_QUICK\x10\x00\x12\x14\n\x10SOXR_QUALITY_LOW\x10\x01\x12\x17\n\x13SOXR_QUALITY_MEDIUM\x10\x02\x12\x15\n\x11SOXR_QUALITY_HIGH\x10\x03\x12\x19\n\x15SOXR_QUALITY_VERYHIGH\x10\x04*\x97\x01\n\x0bSoxFlagBits\x12\x16\n\x12SOXR_ROLLOFF_SMALL\x10\x00\x12\x17\n\x13SOXR_ROLLOFF_MEDIUM\x10\x01\x12\x15\n\x11SOXR_ROLLOFF_NONE\x10\x02\x12\x18\n\x14SOXR_HIGH_PREC_CLOCK\x10\x03\x12\x19\n\x15SOXR_DOUBLE_PRECISION\x10\x04\x12\x0b\n\x07SOXR_VR\x10\x05*A\n\x0f\x41udioStreamType\x12\x17\n\x13\x41UDIO_STREAM_NATIVE\x10\x00\x12\x15\n\x11\x41UDIO_STREAM_HTML\x10\x01**\n\x0f\x41udioSourceType\x12\x17\n\x13\x41UDIO_SOURCE_NATIVE\x10\x00\x42\x10\xaa\x02\rLiveKit.Proto') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11\x61udio_frame.proto\x12\rlivekit.proto\x1a\x0chandle.proto\x1a\x0btrack.proto\"\xf6\x01\n\x15NewAudioStreamRequest\x12\x14\n\x0ctrack_handle\x18\x01 \x02(\x04\x12,\n\x04type\x18\x02 \x02(\x0e\x32\x1e.livekit.proto.AudioStreamType\x12\x13\n\x0bsample_rate\x18\x03 \x01(\r\x12\x14\n\x0cnum_channels\x18\x04 \x01(\r\x12\x1e\n\x16\x61udio_filter_module_id\x18\x05 \x01(\t\x12\x1c\n\x14\x61udio_filter_options\x18\x06 \x01(\t\x12\x15\n\rframe_size_ms\x18\x07 \x01(\r\x12\x19\n\x11queue_size_frames\x18\x08 \x01(\r\"I\n\x16NewAudioStreamResponse\x12/\n\x06stream\x18\x01 \x02(\x0b\x32\x1f.livekit.proto.OwnedAudioStream\"\xba\x02\n!AudioStreamFromParticipantRequest\x12\x1a\n\x12participant_handle\x18\x01 \x02(\x04\x12,\n\x04type\x18\x02 \x02(\x0e\x32\x1e.livekit.proto.AudioStreamType\x12\x30\n\x0ctrack_source\x18\x03 \x01(\x0e\x32\x1a.livekit.proto.TrackSource\x12\x13\n\x0bsample_rate\x18\x05 \x01(\r\x12\x14\n\x0cnum_channels\x18\x06 \x01(\r\x12\x1e\n\x16\x61udio_filter_module_id\x18\x07 \x01(\t\x12\x1c\n\x14\x61udio_filter_options\x18\x08 \x01(\t\x12\x15\n\rframe_size_ms\x18\t \x01(\r\x12\x19\n\x11queue_size_frames\x18\n \x01(\r\"U\n\"AudioStreamFromParticipantResponse\x12/\n\x06stream\x18\x01 \x02(\x0b\x32\x1f.livekit.proto.OwnedAudioStream\"\xda\x01\n\x15NewAudioSourceRequest\x12,\n\x04type\x18\x01 \x02(\x0e\x32\x1e.livekit.proto.AudioSourceType\x12\x32\n\x07options\x18\x02 \x01(\x0b\x32!.livekit.proto.AudioSourceOptions\x12\x13\n\x0bsample_rate\x18\x03 \x02(\r\x12\x14\n\x0cnum_channels\x18\x04 \x02(\r\x12\x15\n\rqueue_size_ms\x18\x05 \x01(\r\x12\x1d\n\x15platform_audio_handle\x18\x06 \x01(\x04\"I\n\x16NewAudioSourceResponse\x12/\n\x06source\x18\x01 \x02(\x0b\x32\x1f.livekit.proto.OwnedAudioSource\"\x80\x01\n\x18\x43\x61ptureAudioFrameRequest\x12\x15\n\rsource_handle\x18\x01 \x02(\x04\x12\x33\n\x06\x62uffer\x18\x02 \x02(\x0b\x32#.livekit.proto.AudioFrameBufferInfo\x12\x18\n\x10request_async_id\x18\x03 \x01(\x04\"-\n\x19\x43\x61ptureAudioFrameResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"<\n\x19\x43\x61ptureAudioFrameCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"0\n\x17\x43learAudioBufferRequest\x12\x15\n\rsource_handle\x18\x01 \x02(\x04\"\x1a\n\x18\x43learAudioBufferResponse\"\x1a\n\x18NewAudioResamplerRequest\"R\n\x19NewAudioResamplerResponse\x12\x35\n\tresampler\x18\x01 \x02(\x0b\x32\".livekit.proto.OwnedAudioResampler\"\x93\x01\n\x17RemixAndResampleRequest\x12\x18\n\x10resampler_handle\x18\x01 \x02(\x04\x12\x33\n\x06\x62uffer\x18\x02 \x02(\x0b\x32#.livekit.proto.AudioFrameBufferInfo\x12\x14\n\x0cnum_channels\x18\x03 \x02(\r\x12\x13\n\x0bsample_rate\x18\x04 \x02(\r\"P\n\x18RemixAndResampleResponse\x12\x34\n\x06\x62uffer\x18\x01 \x02(\x0b\x32$.livekit.proto.OwnedAudioFrameBuffer\"\x95\x01\n\rNewApmRequest\x12\x1e\n\x16\x65\x63ho_canceller_enabled\x18\x01 \x02(\x08\x12\x1f\n\x17gain_controller_enabled\x18\x02 \x02(\x08\x12 \n\x18high_pass_filter_enabled\x18\x03 \x02(\x08\x12!\n\x19noise_suppression_enabled\x18\x04 \x02(\x08\"6\n\x0eNewApmResponse\x12$\n\x03\x61pm\x18\x01 \x02(\x0b\x32\x17.livekit.proto.OwnedApm\"x\n\x17\x41pmProcessStreamRequest\x12\x12\n\napm_handle\x18\x01 \x02(\x04\x12\x10\n\x08\x64\x61ta_ptr\x18\x02 \x02(\x04\x12\x0c\n\x04size\x18\x03 \x02(\r\x12\x13\n\x0bsample_rate\x18\x04 \x02(\r\x12\x14\n\x0cnum_channels\x18\x05 \x02(\r\")\n\x18\x41pmProcessStreamResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"\x7f\n\x1e\x41pmProcessReverseStreamRequest\x12\x12\n\napm_handle\x18\x01 \x02(\x04\x12\x10\n\x08\x64\x61ta_ptr\x18\x02 \x02(\x04\x12\x0c\n\x04size\x18\x03 \x02(\r\x12\x13\n\x0bsample_rate\x18\x04 \x02(\r\x12\x14\n\x0cnum_channels\x18\x05 \x02(\r\"0\n\x1f\x41pmProcessReverseStreamResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"@\n\x18\x41pmSetStreamDelayRequest\x12\x12\n\napm_handle\x18\x01 \x02(\x04\x12\x10\n\x08\x64\x65lay_ms\x18\x02 \x02(\x05\"*\n\x19\x41pmSetStreamDelayResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"\x9c\x02\n\x16NewSoxResamplerRequest\x12\x12\n\ninput_rate\x18\x01 \x02(\x01\x12\x13\n\x0boutput_rate\x18\x02 \x02(\x01\x12\x14\n\x0cnum_channels\x18\x03 \x02(\r\x12<\n\x0finput_data_type\x18\x04 \x02(\x0e\x32#.livekit.proto.SoxResamplerDataType\x12=\n\x10output_data_type\x18\x05 \x02(\x0e\x32#.livekit.proto.SoxResamplerDataType\x12\x37\n\x0equality_recipe\x18\x06 \x02(\x0e\x32\x1f.livekit.proto.SoxQualityRecipe\x12\r\n\x05\x66lags\x18\x07 \x01(\r\"l\n\x17NewSoxResamplerResponse\x12\x35\n\tresampler\x18\x01 \x01(\x0b\x32 .livekit.proto.OwnedSoxResamplerH\x00\x12\x0f\n\x05\x65rror\x18\x02 \x01(\tH\x00\x42\t\n\x07message\"S\n\x17PushSoxResamplerRequest\x12\x18\n\x10resampler_handle\x18\x01 \x02(\x04\x12\x10\n\x08\x64\x61ta_ptr\x18\x02 \x02(\x04\x12\x0c\n\x04size\x18\x03 \x02(\r\"K\n\x18PushSoxResamplerResponse\x12\x12\n\noutput_ptr\x18\x01 \x02(\x04\x12\x0c\n\x04size\x18\x02 \x02(\r\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"4\n\x18\x46lushSoxResamplerRequest\x12\x18\n\x10resampler_handle\x18\x01 \x02(\x04\"L\n\x19\x46lushSoxResamplerResponse\x12\x12\n\noutput_ptr\x18\x01 \x02(\x04\x12\x0c\n\x04size\x18\x02 \x02(\r\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"p\n\x14\x41udioFrameBufferInfo\x12\x10\n\x08\x64\x61ta_ptr\x18\x01 \x02(\x04\x12\x14\n\x0cnum_channels\x18\x02 \x02(\r\x12\x13\n\x0bsample_rate\x18\x03 \x02(\r\x12\x1b\n\x13samples_per_channel\x18\x04 \x02(\r\"y\n\x15OwnedAudioFrameBuffer\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12\x31\n\x04info\x18\x02 \x02(\x0b\x32#.livekit.proto.AudioFrameBufferInfo\"?\n\x0f\x41udioStreamInfo\x12,\n\x04type\x18\x01 \x02(\x0e\x32\x1e.livekit.proto.AudioStreamType\"o\n\x10OwnedAudioStream\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12,\n\x04info\x18\x02 \x02(\x0b\x32\x1e.livekit.proto.AudioStreamInfo\"\x9f\x01\n\x10\x41udioStreamEvent\x12\x15\n\rstream_handle\x18\x01 \x02(\x04\x12;\n\x0e\x66rame_received\x18\x02 \x01(\x0b\x32!.livekit.proto.AudioFrameReceivedH\x00\x12,\n\x03\x65os\x18\x03 \x01(\x0b\x32\x1d.livekit.proto.AudioStreamEOSH\x00\x42\t\n\x07message\"I\n\x12\x41udioFrameReceived\x12\x33\n\x05\x66rame\x18\x01 \x02(\x0b\x32$.livekit.proto.OwnedAudioFrameBuffer\"\x10\n\x0e\x41udioStreamEOS\"~\n\x12\x41udioSourceOptions\x12\x19\n\x11\x65\x63ho_cancellation\x18\x01 \x02(\x08\x12\x19\n\x11noise_suppression\x18\x02 \x02(\x08\x12\x19\n\x11\x61uto_gain_control\x18\x03 \x02(\x08\x12\x17\n\x0fprefer_hardware\x18\x04 \x01(\x08\"?\n\x0f\x41udioSourceInfo\x12,\n\x04type\x18\x02 \x02(\x0e\x32\x1e.livekit.proto.AudioSourceType\"o\n\x10OwnedAudioSource\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12,\n\x04info\x18\x02 \x02(\x0b\x32\x1e.livekit.proto.AudioSourceInfo\"\x14\n\x12\x41udioResamplerInfo\"u\n\x13OwnedAudioResampler\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12/\n\x04info\x18\x02 \x02(\x0b\x32!.livekit.proto.AudioResamplerInfo\"9\n\x08OwnedApm\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\"\x12\n\x10SoxResamplerInfo\"q\n\x11OwnedSoxResampler\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12-\n\x04info\x18\x02 \x02(\x0b\x32\x1f.livekit.proto.SoxResamplerInfo\"\\\n\x1cLoadAudioFilterPluginRequest\x12\x13\n\x0bplugin_path\x18\x01 \x02(\t\x12\x14\n\x0c\x64\x65pendencies\x18\x02 \x03(\t\x12\x11\n\tmodule_id\x18\x03 \x02(\t\".\n\x1dLoadAudioFilterPluginResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"<\n\x0f\x41udioDeviceInfo\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0c\n\x04name\x18\x02 \x02(\t\x12\x0c\n\x04guid\x18\x03 \x01(\t\"Q\n\x11PlatformAudioInfo\x12\x1e\n\x16recording_device_count\x18\x01 \x02(\x05\x12\x1c\n\x14playout_device_count\x18\x02 \x02(\x05\"s\n\x12OwnedPlatformAudio\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12.\n\x04info\x18\x02 \x02(\x0b\x32 .livekit.proto.PlatformAudioInfo\"\x19\n\x17NewPlatformAudioRequest\"s\n\x18NewPlatformAudioResponse\x12;\n\x0eplatform_audio\x18\x01 \x01(\x0b\x32!.livekit.proto.OwnedPlatformAudioH\x00\x12\x0f\n\x05\x65rror\x18\x02 \x01(\tH\x00\x42\t\n\x07message\"7\n\x16GetAudioDevicesRequest\x12\x1d\n\x15platform_audio_handle\x18\x01 \x02(\x04\"\x9c\x01\n\x17GetAudioDevicesResponse\x12\x37\n\x0fplayout_devices\x18\x01 \x03(\x0b\x32\x1e.livekit.proto.AudioDeviceInfo\x12\x39\n\x11recording_devices\x18\x02 \x03(\x0b\x32\x1e.livekit.proto.AudioDeviceInfo\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"M\n\x19SetRecordingDeviceRequest\x12\x1d\n\x15platform_audio_handle\x18\x01 \x02(\x04\x12\x11\n\tdevice_id\x18\x02 \x02(\t\"+\n\x1aSetRecordingDeviceResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"K\n\x17SetPlayoutDeviceRequest\x12\x1d\n\x15platform_audio_handle\x18\x01 \x02(\x04\x12\x11\n\tdevice_id\x18\x02 \x02(\t\")\n\x18SetPlayoutDeviceResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"6\n\x15StartRecordingRequest\x12\x1d\n\x15platform_audio_handle\x18\x01 \x02(\x04\"\'\n\x16StartRecordingResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"5\n\x14StopRecordingRequest\x12\x1d\n\x15platform_audio_handle\x18\x01 \x02(\x04\"&\n\x15StopRecordingResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t*J\n\x14SoxResamplerDataType\x12\x18\n\x14SOXR_DATATYPE_INT16I\x10\x00\x12\x18\n\x14SOXR_DATATYPE_INT16S\x10\x01*\x8b\x01\n\x10SoxQualityRecipe\x12\x16\n\x12SOXR_QUALITY_QUICK\x10\x00\x12\x14\n\x10SOXR_QUALITY_LOW\x10\x01\x12\x17\n\x13SOXR_QUALITY_MEDIUM\x10\x02\x12\x15\n\x11SOXR_QUALITY_HIGH\x10\x03\x12\x19\n\x15SOXR_QUALITY_VERYHIGH\x10\x04*\x97\x01\n\x0bSoxFlagBits\x12\x16\n\x12SOXR_ROLLOFF_SMALL\x10\x00\x12\x17\n\x13SOXR_ROLLOFF_MEDIUM\x10\x01\x12\x15\n\x11SOXR_ROLLOFF_NONE\x10\x02\x12\x18\n\x14SOXR_HIGH_PREC_CLOCK\x10\x03\x12\x19\n\x15SOXR_DOUBLE_PRECISION\x10\x04\x12\x0b\n\x07SOXR_VR\x10\x05*A\n\x0f\x41udioStreamType\x12\x17\n\x13\x41UDIO_STREAM_NATIVE\x10\x00\x12\x15\n\x11\x41UDIO_STREAM_HTML\x10\x01*E\n\x0f\x41udioSourceType\x12\x17\n\x13\x41UDIO_SOURCE_NATIVE\x10\x00\x12\x19\n\x15\x41UDIO_SOURCE_PLATFORM\x10\x01\x42\x10\xaa\x02\rLiveKit.Proto') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -24,16 +24,16 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['DESCRIPTOR']._options = None _globals['DESCRIPTOR']._serialized_options = b'\252\002\rLiveKit.Proto' - _globals['_SOXRESAMPLERDATATYPE']._serialized_start=4499 - _globals['_SOXRESAMPLERDATATYPE']._serialized_end=4573 - _globals['_SOXQUALITYRECIPE']._serialized_start=4576 - _globals['_SOXQUALITYRECIPE']._serialized_end=4715 - _globals['_SOXFLAGBITS']._serialized_start=4718 - _globals['_SOXFLAGBITS']._serialized_end=4869 - _globals['_AUDIOSTREAMTYPE']._serialized_start=4871 - _globals['_AUDIOSTREAMTYPE']._serialized_end=4936 - _globals['_AUDIOSOURCETYPE']._serialized_start=4938 - _globals['_AUDIOSOURCETYPE']._serialized_end=4980 + _globals['_SOXRESAMPLERDATATYPE']._serialized_start=5613 + _globals['_SOXRESAMPLERDATATYPE']._serialized_end=5687 + _globals['_SOXQUALITYRECIPE']._serialized_start=5690 + _globals['_SOXQUALITYRECIPE']._serialized_end=5829 + _globals['_SOXFLAGBITS']._serialized_start=5832 + _globals['_SOXFLAGBITS']._serialized_end=5983 + _globals['_AUDIOSTREAMTYPE']._serialized_start=5985 + _globals['_AUDIOSTREAMTYPE']._serialized_end=6050 + _globals['_AUDIOSOURCETYPE']._serialized_start=6052 + _globals['_AUDIOSOURCETYPE']._serialized_end=6121 _globals['_NEWAUDIOSTREAMREQUEST']._serialized_start=64 _globals['_NEWAUDIOSTREAMREQUEST']._serialized_end=310 _globals['_NEWAUDIOSTREAMRESPONSE']._serialized_start=312 @@ -43,87 +43,117 @@ _globals['_AUDIOSTREAMFROMPARTICIPANTRESPONSE']._serialized_start=704 _globals['_AUDIOSTREAMFROMPARTICIPANTRESPONSE']._serialized_end=789 _globals['_NEWAUDIOSOURCEREQUEST']._serialized_start=792 - _globals['_NEWAUDIOSOURCEREQUEST']._serialized_end=979 - _globals['_NEWAUDIOSOURCERESPONSE']._serialized_start=981 - _globals['_NEWAUDIOSOURCERESPONSE']._serialized_end=1054 - _globals['_CAPTUREAUDIOFRAMEREQUEST']._serialized_start=1057 - _globals['_CAPTUREAUDIOFRAMEREQUEST']._serialized_end=1185 - _globals['_CAPTUREAUDIOFRAMERESPONSE']._serialized_start=1187 - _globals['_CAPTUREAUDIOFRAMERESPONSE']._serialized_end=1232 - _globals['_CAPTUREAUDIOFRAMECALLBACK']._serialized_start=1234 - _globals['_CAPTUREAUDIOFRAMECALLBACK']._serialized_end=1294 - _globals['_CLEARAUDIOBUFFERREQUEST']._serialized_start=1296 - _globals['_CLEARAUDIOBUFFERREQUEST']._serialized_end=1344 - _globals['_CLEARAUDIOBUFFERRESPONSE']._serialized_start=1346 - _globals['_CLEARAUDIOBUFFERRESPONSE']._serialized_end=1372 - _globals['_NEWAUDIORESAMPLERREQUEST']._serialized_start=1374 - _globals['_NEWAUDIORESAMPLERREQUEST']._serialized_end=1400 - _globals['_NEWAUDIORESAMPLERRESPONSE']._serialized_start=1402 - _globals['_NEWAUDIORESAMPLERRESPONSE']._serialized_end=1484 - _globals['_REMIXANDRESAMPLEREQUEST']._serialized_start=1487 - _globals['_REMIXANDRESAMPLEREQUEST']._serialized_end=1634 - _globals['_REMIXANDRESAMPLERESPONSE']._serialized_start=1636 - _globals['_REMIXANDRESAMPLERESPONSE']._serialized_end=1716 - _globals['_NEWAPMREQUEST']._serialized_start=1719 - _globals['_NEWAPMREQUEST']._serialized_end=1868 - _globals['_NEWAPMRESPONSE']._serialized_start=1870 - _globals['_NEWAPMRESPONSE']._serialized_end=1924 - _globals['_APMPROCESSSTREAMREQUEST']._serialized_start=1926 - _globals['_APMPROCESSSTREAMREQUEST']._serialized_end=2046 - _globals['_APMPROCESSSTREAMRESPONSE']._serialized_start=2048 - _globals['_APMPROCESSSTREAMRESPONSE']._serialized_end=2089 - _globals['_APMPROCESSREVERSESTREAMREQUEST']._serialized_start=2091 - _globals['_APMPROCESSREVERSESTREAMREQUEST']._serialized_end=2218 - _globals['_APMPROCESSREVERSESTREAMRESPONSE']._serialized_start=2220 - _globals['_APMPROCESSREVERSESTREAMRESPONSE']._serialized_end=2268 - _globals['_APMSETSTREAMDELAYREQUEST']._serialized_start=2270 - _globals['_APMSETSTREAMDELAYREQUEST']._serialized_end=2334 - _globals['_APMSETSTREAMDELAYRESPONSE']._serialized_start=2336 - _globals['_APMSETSTREAMDELAYRESPONSE']._serialized_end=2378 - _globals['_NEWSOXRESAMPLERREQUEST']._serialized_start=2381 - _globals['_NEWSOXRESAMPLERREQUEST']._serialized_end=2665 - _globals['_NEWSOXRESAMPLERRESPONSE']._serialized_start=2667 - _globals['_NEWSOXRESAMPLERRESPONSE']._serialized_end=2775 - _globals['_PUSHSOXRESAMPLERREQUEST']._serialized_start=2777 - _globals['_PUSHSOXRESAMPLERREQUEST']._serialized_end=2860 - _globals['_PUSHSOXRESAMPLERRESPONSE']._serialized_start=2862 - _globals['_PUSHSOXRESAMPLERRESPONSE']._serialized_end=2937 - _globals['_FLUSHSOXRESAMPLERREQUEST']._serialized_start=2939 - _globals['_FLUSHSOXRESAMPLERREQUEST']._serialized_end=2991 - _globals['_FLUSHSOXRESAMPLERRESPONSE']._serialized_start=2993 - _globals['_FLUSHSOXRESAMPLERRESPONSE']._serialized_end=3069 - _globals['_AUDIOFRAMEBUFFERINFO']._serialized_start=3071 - _globals['_AUDIOFRAMEBUFFERINFO']._serialized_end=3183 - _globals['_OWNEDAUDIOFRAMEBUFFER']._serialized_start=3185 - _globals['_OWNEDAUDIOFRAMEBUFFER']._serialized_end=3306 - _globals['_AUDIOSTREAMINFO']._serialized_start=3308 - _globals['_AUDIOSTREAMINFO']._serialized_end=3371 - _globals['_OWNEDAUDIOSTREAM']._serialized_start=3373 - _globals['_OWNEDAUDIOSTREAM']._serialized_end=3484 - _globals['_AUDIOSTREAMEVENT']._serialized_start=3487 - _globals['_AUDIOSTREAMEVENT']._serialized_end=3646 - _globals['_AUDIOFRAMERECEIVED']._serialized_start=3648 - _globals['_AUDIOFRAMERECEIVED']._serialized_end=3721 - _globals['_AUDIOSTREAMEOS']._serialized_start=3723 - _globals['_AUDIOSTREAMEOS']._serialized_end=3739 - _globals['_AUDIOSOURCEOPTIONS']._serialized_start=3741 - _globals['_AUDIOSOURCEOPTIONS']._serialized_end=3842 - _globals['_AUDIOSOURCEINFO']._serialized_start=3844 - _globals['_AUDIOSOURCEINFO']._serialized_end=3907 - _globals['_OWNEDAUDIOSOURCE']._serialized_start=3909 - _globals['_OWNEDAUDIOSOURCE']._serialized_end=4020 - _globals['_AUDIORESAMPLERINFO']._serialized_start=4022 - _globals['_AUDIORESAMPLERINFO']._serialized_end=4042 - _globals['_OWNEDAUDIORESAMPLER']._serialized_start=4044 - _globals['_OWNEDAUDIORESAMPLER']._serialized_end=4161 - _globals['_OWNEDAPM']._serialized_start=4163 - _globals['_OWNEDAPM']._serialized_end=4220 - _globals['_SOXRESAMPLERINFO']._serialized_start=4222 - _globals['_SOXRESAMPLERINFO']._serialized_end=4240 - _globals['_OWNEDSOXRESAMPLER']._serialized_start=4242 - _globals['_OWNEDSOXRESAMPLER']._serialized_end=4355 - _globals['_LOADAUDIOFILTERPLUGINREQUEST']._serialized_start=4357 - _globals['_LOADAUDIOFILTERPLUGINREQUEST']._serialized_end=4449 - _globals['_LOADAUDIOFILTERPLUGINRESPONSE']._serialized_start=4451 - _globals['_LOADAUDIOFILTERPLUGINRESPONSE']._serialized_end=4497 + _globals['_NEWAUDIOSOURCEREQUEST']._serialized_end=1010 + _globals['_NEWAUDIOSOURCERESPONSE']._serialized_start=1012 + _globals['_NEWAUDIOSOURCERESPONSE']._serialized_end=1085 + _globals['_CAPTUREAUDIOFRAMEREQUEST']._serialized_start=1088 + _globals['_CAPTUREAUDIOFRAMEREQUEST']._serialized_end=1216 + _globals['_CAPTUREAUDIOFRAMERESPONSE']._serialized_start=1218 + _globals['_CAPTUREAUDIOFRAMERESPONSE']._serialized_end=1263 + _globals['_CAPTUREAUDIOFRAMECALLBACK']._serialized_start=1265 + _globals['_CAPTUREAUDIOFRAMECALLBACK']._serialized_end=1325 + _globals['_CLEARAUDIOBUFFERREQUEST']._serialized_start=1327 + _globals['_CLEARAUDIOBUFFERREQUEST']._serialized_end=1375 + _globals['_CLEARAUDIOBUFFERRESPONSE']._serialized_start=1377 + _globals['_CLEARAUDIOBUFFERRESPONSE']._serialized_end=1403 + _globals['_NEWAUDIORESAMPLERREQUEST']._serialized_start=1405 + _globals['_NEWAUDIORESAMPLERREQUEST']._serialized_end=1431 + _globals['_NEWAUDIORESAMPLERRESPONSE']._serialized_start=1433 + _globals['_NEWAUDIORESAMPLERRESPONSE']._serialized_end=1515 + _globals['_REMIXANDRESAMPLEREQUEST']._serialized_start=1518 + _globals['_REMIXANDRESAMPLEREQUEST']._serialized_end=1665 + _globals['_REMIXANDRESAMPLERESPONSE']._serialized_start=1667 + _globals['_REMIXANDRESAMPLERESPONSE']._serialized_end=1747 + _globals['_NEWAPMREQUEST']._serialized_start=1750 + _globals['_NEWAPMREQUEST']._serialized_end=1899 + _globals['_NEWAPMRESPONSE']._serialized_start=1901 + _globals['_NEWAPMRESPONSE']._serialized_end=1955 + _globals['_APMPROCESSSTREAMREQUEST']._serialized_start=1957 + _globals['_APMPROCESSSTREAMREQUEST']._serialized_end=2077 + _globals['_APMPROCESSSTREAMRESPONSE']._serialized_start=2079 + _globals['_APMPROCESSSTREAMRESPONSE']._serialized_end=2120 + _globals['_APMPROCESSREVERSESTREAMREQUEST']._serialized_start=2122 + _globals['_APMPROCESSREVERSESTREAMREQUEST']._serialized_end=2249 + _globals['_APMPROCESSREVERSESTREAMRESPONSE']._serialized_start=2251 + _globals['_APMPROCESSREVERSESTREAMRESPONSE']._serialized_end=2299 + _globals['_APMSETSTREAMDELAYREQUEST']._serialized_start=2301 + _globals['_APMSETSTREAMDELAYREQUEST']._serialized_end=2365 + _globals['_APMSETSTREAMDELAYRESPONSE']._serialized_start=2367 + _globals['_APMSETSTREAMDELAYRESPONSE']._serialized_end=2409 + _globals['_NEWSOXRESAMPLERREQUEST']._serialized_start=2412 + _globals['_NEWSOXRESAMPLERREQUEST']._serialized_end=2696 + _globals['_NEWSOXRESAMPLERRESPONSE']._serialized_start=2698 + _globals['_NEWSOXRESAMPLERRESPONSE']._serialized_end=2806 + _globals['_PUSHSOXRESAMPLERREQUEST']._serialized_start=2808 + _globals['_PUSHSOXRESAMPLERREQUEST']._serialized_end=2891 + _globals['_PUSHSOXRESAMPLERRESPONSE']._serialized_start=2893 + _globals['_PUSHSOXRESAMPLERRESPONSE']._serialized_end=2968 + _globals['_FLUSHSOXRESAMPLERREQUEST']._serialized_start=2970 + _globals['_FLUSHSOXRESAMPLERREQUEST']._serialized_end=3022 + _globals['_FLUSHSOXRESAMPLERRESPONSE']._serialized_start=3024 + _globals['_FLUSHSOXRESAMPLERRESPONSE']._serialized_end=3100 + _globals['_AUDIOFRAMEBUFFERINFO']._serialized_start=3102 + _globals['_AUDIOFRAMEBUFFERINFO']._serialized_end=3214 + _globals['_OWNEDAUDIOFRAMEBUFFER']._serialized_start=3216 + _globals['_OWNEDAUDIOFRAMEBUFFER']._serialized_end=3337 + _globals['_AUDIOSTREAMINFO']._serialized_start=3339 + _globals['_AUDIOSTREAMINFO']._serialized_end=3402 + _globals['_OWNEDAUDIOSTREAM']._serialized_start=3404 + _globals['_OWNEDAUDIOSTREAM']._serialized_end=3515 + _globals['_AUDIOSTREAMEVENT']._serialized_start=3518 + _globals['_AUDIOSTREAMEVENT']._serialized_end=3677 + _globals['_AUDIOFRAMERECEIVED']._serialized_start=3679 + _globals['_AUDIOFRAMERECEIVED']._serialized_end=3752 + _globals['_AUDIOSTREAMEOS']._serialized_start=3754 + _globals['_AUDIOSTREAMEOS']._serialized_end=3770 + _globals['_AUDIOSOURCEOPTIONS']._serialized_start=3772 + _globals['_AUDIOSOURCEOPTIONS']._serialized_end=3898 + _globals['_AUDIOSOURCEINFO']._serialized_start=3900 + _globals['_AUDIOSOURCEINFO']._serialized_end=3963 + _globals['_OWNEDAUDIOSOURCE']._serialized_start=3965 + _globals['_OWNEDAUDIOSOURCE']._serialized_end=4076 + _globals['_AUDIORESAMPLERINFO']._serialized_start=4078 + _globals['_AUDIORESAMPLERINFO']._serialized_end=4098 + _globals['_OWNEDAUDIORESAMPLER']._serialized_start=4100 + _globals['_OWNEDAUDIORESAMPLER']._serialized_end=4217 + _globals['_OWNEDAPM']._serialized_start=4219 + _globals['_OWNEDAPM']._serialized_end=4276 + _globals['_SOXRESAMPLERINFO']._serialized_start=4278 + _globals['_SOXRESAMPLERINFO']._serialized_end=4296 + _globals['_OWNEDSOXRESAMPLER']._serialized_start=4298 + _globals['_OWNEDSOXRESAMPLER']._serialized_end=4411 + _globals['_LOADAUDIOFILTERPLUGINREQUEST']._serialized_start=4413 + _globals['_LOADAUDIOFILTERPLUGINREQUEST']._serialized_end=4505 + _globals['_LOADAUDIOFILTERPLUGINRESPONSE']._serialized_start=4507 + _globals['_LOADAUDIOFILTERPLUGINRESPONSE']._serialized_end=4553 + _globals['_AUDIODEVICEINFO']._serialized_start=4555 + _globals['_AUDIODEVICEINFO']._serialized_end=4615 + _globals['_PLATFORMAUDIOINFO']._serialized_start=4617 + _globals['_PLATFORMAUDIOINFO']._serialized_end=4698 + _globals['_OWNEDPLATFORMAUDIO']._serialized_start=4700 + _globals['_OWNEDPLATFORMAUDIO']._serialized_end=4815 + _globals['_NEWPLATFORMAUDIOREQUEST']._serialized_start=4817 + _globals['_NEWPLATFORMAUDIOREQUEST']._serialized_end=4842 + _globals['_NEWPLATFORMAUDIORESPONSE']._serialized_start=4844 + _globals['_NEWPLATFORMAUDIORESPONSE']._serialized_end=4959 + _globals['_GETAUDIODEVICESREQUEST']._serialized_start=4961 + _globals['_GETAUDIODEVICESREQUEST']._serialized_end=5016 + _globals['_GETAUDIODEVICESRESPONSE']._serialized_start=5019 + _globals['_GETAUDIODEVICESRESPONSE']._serialized_end=5175 + _globals['_SETRECORDINGDEVICEREQUEST']._serialized_start=5177 + _globals['_SETRECORDINGDEVICEREQUEST']._serialized_end=5254 + _globals['_SETRECORDINGDEVICERESPONSE']._serialized_start=5256 + _globals['_SETRECORDINGDEVICERESPONSE']._serialized_end=5299 + _globals['_SETPLAYOUTDEVICEREQUEST']._serialized_start=5301 + _globals['_SETPLAYOUTDEVICEREQUEST']._serialized_end=5376 + _globals['_SETPLAYOUTDEVICERESPONSE']._serialized_start=5378 + _globals['_SETPLAYOUTDEVICERESPONSE']._serialized_end=5419 + _globals['_STARTRECORDINGREQUEST']._serialized_start=5421 + _globals['_STARTRECORDINGREQUEST']._serialized_end=5475 + _globals['_STARTRECORDINGRESPONSE']._serialized_start=5477 + _globals['_STARTRECORDINGRESPONSE']._serialized_end=5516 + _globals['_STOPRECORDINGREQUEST']._serialized_start=5518 + _globals['_STOPRECORDINGREQUEST']._serialized_end=5571 + _globals['_STOPRECORDINGRESPONSE']._serialized_start=5573 + _globals['_STOPRECORDINGRESPONSE']._serialized_end=5611 # @@protoc_insertion_point(module_scope) diff --git a/livekit-rtc/livekit/rtc/_proto/audio_frame_pb2.pyi b/livekit-rtc/livekit/rtc/_proto/audio_frame_pb2.pyi index cb73e1ea..88978aa4 100644 --- a/livekit-rtc/livekit/rtc/_proto/audio_frame_pb2.pyi +++ b/livekit-rtc/livekit/rtc/_proto/audio_frame_pb2.pyi @@ -132,10 +132,20 @@ class _AudioSourceType: class _AudioSourceTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_AudioSourceType.ValueType], builtins.type): DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor AUDIO_SOURCE_NATIVE: _AudioSourceType.ValueType # 0 + """Push-based audio source - manually capture frames via CaptureAudioFrameRequest""" + AUDIO_SOURCE_PLATFORM: _AudioSourceType.ValueType # 1 + """Platform ADM-based audio source - captures from microphone automatically + Requires PlatformAudio to be created first to enable ADM recording + """ class AudioSourceType(_AudioSourceType, metaclass=_AudioSourceTypeEnumTypeWrapper): ... AUDIO_SOURCE_NATIVE: AudioSourceType.ValueType # 0 +"""Push-based audio source - manually capture frames via CaptureAudioFrameRequest""" +AUDIO_SOURCE_PLATFORM: AudioSourceType.ValueType # 1 +"""Platform ADM-based audio source - captures from microphone automatically +Requires PlatformAudio to be created first to enable ADM recording +""" global___AudioSourceType = AudioSourceType @typing.final @@ -285,10 +295,15 @@ class NewAudioSourceRequest(google.protobuf.message.Message): SAMPLE_RATE_FIELD_NUMBER: builtins.int NUM_CHANNELS_FIELD_NUMBER: builtins.int QUEUE_SIZE_MS_FIELD_NUMBER: builtins.int + PLATFORM_AUDIO_HANDLE_FIELD_NUMBER: builtins.int type: global___AudioSourceType.ValueType sample_rate: builtins.int num_channels: builtins.int queue_size_ms: builtins.int + platform_audio_handle: builtins.int + """For AudioSourcePlatform: the PlatformAudio handle to configure audio processing on. + If provided with options, audio processing will be configured on the PlatformAudio. + """ @property def options(self) -> global___AudioSourceOptions: ... def __init__( @@ -299,9 +314,10 @@ class NewAudioSourceRequest(google.protobuf.message.Message): sample_rate: builtins.int | None = ..., num_channels: builtins.int | None = ..., queue_size_ms: builtins.int | None = ..., + platform_audio_handle: builtins.int | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["num_channels", b"num_channels", "options", b"options", "queue_size_ms", b"queue_size_ms", "sample_rate", b"sample_rate", "type", b"type"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["num_channels", b"num_channels", "options", b"options", "queue_size_ms", b"queue_size_ms", "sample_rate", b"sample_rate", "type", b"type"]) -> None: ... + def HasField(self, field_name: typing.Literal["num_channels", b"num_channels", "options", b"options", "platform_audio_handle", b"platform_audio_handle", "queue_size_ms", b"queue_size_ms", "sample_rate", b"sample_rate", "type", b"type"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["num_channels", b"num_channels", "options", b"options", "platform_audio_handle", b"platform_audio_handle", "queue_size_ms", b"queue_size_ms", "sample_rate", b"sample_rate", "type", b"type"]) -> None: ... global___NewAudioSourceRequest = NewAudioSourceRequest @@ -951,18 +967,24 @@ class AudioSourceOptions(google.protobuf.message.Message): ECHO_CANCELLATION_FIELD_NUMBER: builtins.int NOISE_SUPPRESSION_FIELD_NUMBER: builtins.int AUTO_GAIN_CONTROL_FIELD_NUMBER: builtins.int + PREFER_HARDWARE_FIELD_NUMBER: builtins.int echo_cancellation: builtins.bool noise_suppression: builtins.bool auto_gain_control: builtins.bool + prefer_hardware: builtins.bool + """Prefer hardware audio processing (e.g., iOS VPIO). Lower latency. + Only applies to AudioSourcePlatform. Default: true. + """ def __init__( self, *, echo_cancellation: builtins.bool | None = ..., noise_suppression: builtins.bool | None = ..., auto_gain_control: builtins.bool | None = ..., + prefer_hardware: builtins.bool | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["auto_gain_control", b"auto_gain_control", "echo_cancellation", b"echo_cancellation", "noise_suppression", b"noise_suppression"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["auto_gain_control", b"auto_gain_control", "echo_cancellation", b"echo_cancellation", "noise_suppression", b"noise_suppression"]) -> None: ... + def HasField(self, field_name: typing.Literal["auto_gain_control", b"auto_gain_control", "echo_cancellation", b"echo_cancellation", "noise_suppression", b"noise_suppression", "prefer_hardware", b"prefer_hardware"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["auto_gain_control", b"auto_gain_control", "echo_cancellation", b"echo_cancellation", "noise_suppression", b"noise_suppression", "prefer_hardware", b"prefer_hardware"]) -> None: ... global___AudioSourceOptions = AudioSourceOptions @@ -1138,3 +1160,377 @@ class LoadAudioFilterPluginResponse(google.protobuf.message.Message): def ClearField(self, field_name: typing.Literal["error", b"error"]) -> None: ... global___LoadAudioFilterPluginResponse = LoadAudioFilterPluginResponse + +@typing.final +class AudioDeviceInfo(google.protobuf.message.Message): + """ + PlatformAudio - Platform audio device management via WebRTC's ADM + + PlatformAudio provides access to the platform's audio devices (microphones and + speakers) via WebRTC's Audio Device Module (ADM). Use it to: + + - Capture audio from the microphone for publishing + - Play received audio through the speakers + - Enumerate and select audio devices + + # Usage + + 1. Create a PlatformAudio handle with NewPlatformAudioRequest + 2. Enumerate devices with GetAudioDevicesRequest (optional) + 3. Select devices with SetRecordingDeviceRequest/SetPlayoutDeviceRequest (optional) + 4. Create an audio track using AudioSourcePlatform type + 5. When done, drop the handle (the ADM is disabled when all handles are released) + + Information about an audio device. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + INDEX_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + GUID_FIELD_NUMBER: builtins.int + index: builtins.int + """Device index (0-based). Note: indices can change when devices are added/removed.""" + name: builtins.str + """Device name as reported by the operating system.""" + guid: builtins.str + """Platform-specific unique device identifier (GUID). + This is stable across device additions/removals and should be preferred + over index for device selection. Format varies by platform: + - Windows: Device interface path + - macOS: AudioObjectID as string + - Linux: ALSA/PulseAudio device identifier + """ + def __init__( + self, + *, + index: builtins.int | None = ..., + name: builtins.str | None = ..., + guid: builtins.str | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["guid", b"guid", "index", b"index", "name", b"name"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["guid", b"guid", "index", b"index", "name", b"name"]) -> None: ... + +global___AudioDeviceInfo = AudioDeviceInfo + +@typing.final +class PlatformAudioInfo(google.protobuf.message.Message): + """Information about a PlatformAudio instance.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RECORDING_DEVICE_COUNT_FIELD_NUMBER: builtins.int + PLAYOUT_DEVICE_COUNT_FIELD_NUMBER: builtins.int + recording_device_count: builtins.int + """Number of available recording (microphone) devices.""" + playout_device_count: builtins.int + """Number of available playout (speaker) devices.""" + def __init__( + self, + *, + recording_device_count: builtins.int | None = ..., + playout_device_count: builtins.int | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["playout_device_count", b"playout_device_count", "recording_device_count", b"recording_device_count"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["playout_device_count", b"playout_device_count", "recording_device_count", b"recording_device_count"]) -> None: ... + +global___PlatformAudioInfo = PlatformAudioInfo + +@typing.final +class OwnedPlatformAudio(google.protobuf.message.Message): + """Owned PlatformAudio handle with info.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + HANDLE_FIELD_NUMBER: builtins.int + INFO_FIELD_NUMBER: builtins.int + @property + def handle(self) -> handle_pb2.FfiOwnedHandle: ... + @property + def info(self) -> global___PlatformAudioInfo: ... + def __init__( + self, + *, + handle: handle_pb2.FfiOwnedHandle | None = ..., + info: global___PlatformAudioInfo | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["handle", b"handle", "info", b"info"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["handle", b"handle", "info", b"info"]) -> None: ... + +global___OwnedPlatformAudio = OwnedPlatformAudio + +@typing.final +class NewPlatformAudioRequest(google.protobuf.message.Message): + """Create a new PlatformAudio instance. + + This enables the platform ADM for microphone capture and speaker playout. + If another PlatformAudio instance exists, this reuses the same underlying ADM. + + The returned handle must be kept alive while platform audio is needed. + When all handles are released, the ADM is automatically disabled. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___NewPlatformAudioRequest = NewPlatformAudioRequest + +@typing.final +class NewPlatformAudioResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PLATFORM_AUDIO_FIELD_NUMBER: builtins.int + ERROR_FIELD_NUMBER: builtins.int + error: builtins.str + """Error message if creation failed.""" + @property + def platform_audio(self) -> global___OwnedPlatformAudio: + """The PlatformAudio handle on success.""" + + def __init__( + self, + *, + platform_audio: global___OwnedPlatformAudio | None = ..., + error: builtins.str | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["error", b"error", "message", b"message", "platform_audio", b"platform_audio"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["error", b"error", "message", b"message", "platform_audio", b"platform_audio"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["message", b"message"]) -> typing.Literal["platform_audio", "error"] | None: ... + +global___NewPlatformAudioResponse = NewPlatformAudioResponse + +@typing.final +class GetAudioDevicesRequest(google.protobuf.message.Message): + """Get available audio devices. + + Returns lists of available recording (microphone) and playout (speaker) devices. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PLATFORM_AUDIO_HANDLE_FIELD_NUMBER: builtins.int + platform_audio_handle: builtins.int + """The PlatformAudio handle.""" + def __init__( + self, + *, + platform_audio_handle: builtins.int | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["platform_audio_handle", b"platform_audio_handle"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["platform_audio_handle", b"platform_audio_handle"]) -> None: ... + +global___GetAudioDevicesRequest = GetAudioDevicesRequest + +@typing.final +class GetAudioDevicesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PLAYOUT_DEVICES_FIELD_NUMBER: builtins.int + RECORDING_DEVICES_FIELD_NUMBER: builtins.int + ERROR_FIELD_NUMBER: builtins.int + error: builtins.str + """Error message if enumeration failed, empty/absent on success.""" + @property + def playout_devices(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___AudioDeviceInfo]: + """Available playout devices (speakers/headphones).""" + + @property + def recording_devices(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___AudioDeviceInfo]: + """Available recording devices (microphones).""" + + def __init__( + self, + *, + playout_devices: collections.abc.Iterable[global___AudioDeviceInfo] | None = ..., + recording_devices: collections.abc.Iterable[global___AudioDeviceInfo] | None = ..., + error: builtins.str | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["error", b"error"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["error", b"error", "playout_devices", b"playout_devices", "recording_devices", b"recording_devices"]) -> None: ... + +global___GetAudioDevicesResponse = GetAudioDevicesResponse + +@typing.final +class SetRecordingDeviceRequest(google.protobuf.message.Message): + """Set the recording device (microphone). + + Call this before creating audio tracks to select which microphone to use. + Use the GUID from AudioDeviceInfo for stable device selection across hot-plug events. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PLATFORM_AUDIO_HANDLE_FIELD_NUMBER: builtins.int + DEVICE_ID_FIELD_NUMBER: builtins.int + platform_audio_handle: builtins.int + """The PlatformAudio handle.""" + device_id: builtins.str + """Device GUID from AudioDeviceInfo.guid - stable across device additions/removals.""" + def __init__( + self, + *, + platform_audio_handle: builtins.int | None = ..., + device_id: builtins.str | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["device_id", b"device_id", "platform_audio_handle", b"platform_audio_handle"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["device_id", b"device_id", "platform_audio_handle", b"platform_audio_handle"]) -> None: ... + +global___SetRecordingDeviceRequest = SetRecordingDeviceRequest + +@typing.final +class SetRecordingDeviceResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ERROR_FIELD_NUMBER: builtins.int + error: builtins.str + """Error message if the operation failed: + - "Device not found" if GUID doesn't match any device + - Other platform-specific errors + Empty/absent on success. + """ + def __init__( + self, + *, + error: builtins.str | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["error", b"error"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["error", b"error"]) -> None: ... + +global___SetRecordingDeviceResponse = SetRecordingDeviceResponse + +@typing.final +class SetPlayoutDeviceRequest(google.protobuf.message.Message): + """Set the playout device (speaker/headphones). + + Call this before connecting to select which speaker to use for audio output. + Use the GUID from AudioDeviceInfo for stable device selection across hot-plug events. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PLATFORM_AUDIO_HANDLE_FIELD_NUMBER: builtins.int + DEVICE_ID_FIELD_NUMBER: builtins.int + platform_audio_handle: builtins.int + """The PlatformAudio handle.""" + device_id: builtins.str + """Device GUID from AudioDeviceInfo.guid - stable across device additions/removals.""" + def __init__( + self, + *, + platform_audio_handle: builtins.int | None = ..., + device_id: builtins.str | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["device_id", b"device_id", "platform_audio_handle", b"platform_audio_handle"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["device_id", b"device_id", "platform_audio_handle", b"platform_audio_handle"]) -> None: ... + +global___SetPlayoutDeviceRequest = SetPlayoutDeviceRequest + +@typing.final +class SetPlayoutDeviceResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ERROR_FIELD_NUMBER: builtins.int + error: builtins.str + """Error message if the operation failed: + - "Device not found" if GUID doesn't match any device + - Other platform-specific errors + Empty/absent on success. + """ + def __init__( + self, + *, + error: builtins.str | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["error", b"error"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["error", b"error"]) -> None: ... + +global___SetPlayoutDeviceResponse = SetPlayoutDeviceResponse + +@typing.final +class StartRecordingRequest(google.protobuf.message.Message): + """Start recording from the microphone. + + Recording is started automatically when PlatformAudio is created. + Use this to resume recording after calling StopRecording. + This also turns on the system's recording privacy indicator. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PLATFORM_AUDIO_HANDLE_FIELD_NUMBER: builtins.int + platform_audio_handle: builtins.int + """The PlatformAudio handle.""" + def __init__( + self, + *, + platform_audio_handle: builtins.int | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["platform_audio_handle", b"platform_audio_handle"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["platform_audio_handle", b"platform_audio_handle"]) -> None: ... + +global___StartRecordingRequest = StartRecordingRequest + +@typing.final +class StartRecordingResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ERROR_FIELD_NUMBER: builtins.int + error: builtins.str + """Error message if the operation failed. + Empty/absent on success. + """ + def __init__( + self, + *, + error: builtins.str | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["error", b"error"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["error", b"error"]) -> None: ... + +global___StartRecordingResponse = StartRecordingResponse + +@typing.final +class StopRecordingRequest(google.protobuf.message.Message): + """Stop recording from the microphone. + + Use this to temporarily stop recording without disposing PlatformAudio. + This will turn off the system's recording privacy indicator (e.g., on macOS/iOS). + Call StartRecording to resume recording. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PLATFORM_AUDIO_HANDLE_FIELD_NUMBER: builtins.int + platform_audio_handle: builtins.int + """The PlatformAudio handle.""" + def __init__( + self, + *, + platform_audio_handle: builtins.int | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["platform_audio_handle", b"platform_audio_handle"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["platform_audio_handle", b"platform_audio_handle"]) -> None: ... + +global___StopRecordingRequest = StopRecordingRequest + +@typing.final +class StopRecordingResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ERROR_FIELD_NUMBER: builtins.int + error: builtins.str + """Error message if the operation failed. + Empty/absent on success. + """ + def __init__( + self, + *, + error: builtins.str | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["error", b"error"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["error", b"error"]) -> None: ... + +global___StopRecordingResponse = StopRecordingResponse diff --git a/livekit-rtc/livekit/rtc/_proto/ffi_pb2.py b/livekit-rtc/livekit/rtc/_proto/ffi_pb2.py index 0e023da0..1e589579 100644 --- a/livekit-rtc/livekit/rtc/_proto/ffi_pb2.py +++ b/livekit-rtc/livekit/rtc/_proto/ffi_pb2.py @@ -23,7 +23,7 @@ from . import data_track_pb2 as data__track__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\tffi.proto\x12\rlivekit.proto\x1a\ne2ee.proto\x1a\x0btrack.proto\x1a\x17track_publication.proto\x1a\nroom.proto\x1a\x11video_frame.proto\x1a\x11\x61udio_frame.proto\x1a\trpc.proto\x1a\x11\x64\x61ta_stream.proto\x1a\x10\x64\x61ta_track.proto\"\xae+\n\nFfiRequest\x12\x30\n\x07\x64ispose\x18\x02 \x01(\x0b\x32\x1d.livekit.proto.DisposeRequestH\x00\x12\x30\n\x07\x63onnect\x18\x03 \x01(\x0b\x32\x1d.livekit.proto.ConnectRequestH\x00\x12\x36\n\ndisconnect\x18\x04 \x01(\x0b\x32 .livekit.proto.DisconnectRequestH\x00\x12;\n\rpublish_track\x18\x05 \x01(\x0b\x32\".livekit.proto.PublishTrackRequestH\x00\x12?\n\x0funpublish_track\x18\x06 \x01(\x0b\x32$.livekit.proto.UnpublishTrackRequestH\x00\x12\x39\n\x0cpublish_data\x18\x07 \x01(\x0b\x32!.livekit.proto.PublishDataRequestH\x00\x12=\n\x0eset_subscribed\x18\x08 \x01(\x0b\x32#.livekit.proto.SetSubscribedRequestH\x00\x12\x44\n\x12set_local_metadata\x18\t \x01(\x0b\x32&.livekit.proto.SetLocalMetadataRequestH\x00\x12<\n\x0eset_local_name\x18\n \x01(\x0b\x32\".livekit.proto.SetLocalNameRequestH\x00\x12H\n\x14set_local_attributes\x18\x0b \x01(\x0b\x32(.livekit.proto.SetLocalAttributesRequestH\x00\x12\x42\n\x11get_session_stats\x18\x0c \x01(\x0b\x32%.livekit.proto.GetSessionStatsRequestH\x00\x12K\n\x15publish_transcription\x18\r \x01(\x0b\x32*.livekit.proto.PublishTranscriptionRequestH\x00\x12@\n\x10publish_sip_dtmf\x18\x0e \x01(\x0b\x32$.livekit.proto.PublishSipDtmfRequestH\x00\x12\x44\n\x12\x63reate_video_track\x18\x0f \x01(\x0b\x32&.livekit.proto.CreateVideoTrackRequestH\x00\x12\x44\n\x12\x63reate_audio_track\x18\x10 \x01(\x0b\x32&.livekit.proto.CreateAudioTrackRequestH\x00\x12@\n\x10local_track_mute\x18\x11 \x01(\x0b\x32$.livekit.proto.LocalTrackMuteRequestH\x00\x12\x46\n\x13\x65nable_remote_track\x18\x12 \x01(\x0b\x32\'.livekit.proto.EnableRemoteTrackRequestH\x00\x12\x33\n\tget_stats\x18\x13 \x01(\x0b\x32\x1e.livekit.proto.GetStatsRequestH\x00\x12\x63\n\"set_track_subscription_permissions\x18\x30 \x01(\x0b\x32\x35.livekit.proto.SetTrackSubscriptionPermissionsRequestH\x00\x12@\n\x10new_video_stream\x18\x14 \x01(\x0b\x32$.livekit.proto.NewVideoStreamRequestH\x00\x12@\n\x10new_video_source\x18\x15 \x01(\x0b\x32$.livekit.proto.NewVideoSourceRequestH\x00\x12\x46\n\x13\x63\x61pture_video_frame\x18\x16 \x01(\x0b\x32\'.livekit.proto.CaptureVideoFrameRequestH\x00\x12;\n\rvideo_convert\x18\x17 \x01(\x0b\x32\".livekit.proto.VideoConvertRequestH\x00\x12Y\n\x1dvideo_stream_from_participant\x18\x18 \x01(\x0b\x32\x30.livekit.proto.VideoStreamFromParticipantRequestH\x00\x12@\n\x10new_audio_stream\x18\x19 \x01(\x0b\x32$.livekit.proto.NewAudioStreamRequestH\x00\x12@\n\x10new_audio_source\x18\x1a \x01(\x0b\x32$.livekit.proto.NewAudioSourceRequestH\x00\x12\x46\n\x13\x63\x61pture_audio_frame\x18\x1b \x01(\x0b\x32\'.livekit.proto.CaptureAudioFrameRequestH\x00\x12\x44\n\x12\x63lear_audio_buffer\x18\x1c \x01(\x0b\x32&.livekit.proto.ClearAudioBufferRequestH\x00\x12\x46\n\x13new_audio_resampler\x18\x1d \x01(\x0b\x32\'.livekit.proto.NewAudioResamplerRequestH\x00\x12\x44\n\x12remix_and_resample\x18\x1e \x01(\x0b\x32&.livekit.proto.RemixAndResampleRequestH\x00\x12*\n\x04\x65\x32\x65\x65\x18\x1f \x01(\x0b\x32\x1a.livekit.proto.E2eeRequestH\x00\x12Y\n\x1d\x61udio_stream_from_participant\x18 \x01(\x0b\x32\x30.livekit.proto.AudioStreamFromParticipantRequestH\x00\x12\x42\n\x11new_sox_resampler\x18! \x01(\x0b\x32%.livekit.proto.NewSoxResamplerRequestH\x00\x12\x44\n\x12push_sox_resampler\x18\" \x01(\x0b\x32&.livekit.proto.PushSoxResamplerRequestH\x00\x12\x46\n\x13\x66lush_sox_resampler\x18# \x01(\x0b\x32\'.livekit.proto.FlushSoxResamplerRequestH\x00\x12\x42\n\x11send_chat_message\x18$ \x01(\x0b\x32%.livekit.proto.SendChatMessageRequestH\x00\x12\x42\n\x11\x65\x64it_chat_message\x18% \x01(\x0b\x32%.livekit.proto.EditChatMessageRequestH\x00\x12\x37\n\x0bperform_rpc\x18& \x01(\x0b\x32 .livekit.proto.PerformRpcRequestH\x00\x12\x46\n\x13register_rpc_method\x18\' \x01(\x0b\x32\'.livekit.proto.RegisterRpcMethodRequestH\x00\x12J\n\x15unregister_rpc_method\x18( \x01(\x0b\x32).livekit.proto.UnregisterRpcMethodRequestH\x00\x12[\n\x1erpc_method_invocation_response\x18) \x01(\x0b\x32\x31.livekit.proto.RpcMethodInvocationResponseRequestH\x00\x12]\n\x1f\x65nable_remote_track_publication\x18* \x01(\x0b\x32\x32.livekit.proto.EnableRemoteTrackPublicationRequestH\x00\x12p\n)update_remote_track_publication_dimension\x18+ \x01(\x0b\x32;.livekit.proto.UpdateRemoteTrackPublicationDimensionRequestH\x00\x12\x44\n\x12send_stream_header\x18, \x01(\x0b\x32&.livekit.proto.SendStreamHeaderRequestH\x00\x12\x42\n\x11send_stream_chunk\x18- \x01(\x0b\x32%.livekit.proto.SendStreamChunkRequestH\x00\x12\x46\n\x13send_stream_trailer\x18. \x01(\x0b\x32\'.livekit.proto.SendStreamTrailerRequestH\x00\x12x\n.set_data_channel_buffered_amount_low_threshold\x18/ \x01(\x0b\x32>.livekit.proto.SetDataChannelBufferedAmountLowThresholdRequestH\x00\x12O\n\x18load_audio_filter_plugin\x18\x31 \x01(\x0b\x32+.livekit.proto.LoadAudioFilterPluginRequestH\x00\x12/\n\x07new_apm\x18\x32 \x01(\x0b\x32\x1c.livekit.proto.NewApmRequestH\x00\x12\x44\n\x12\x61pm_process_stream\x18\x33 \x01(\x0b\x32&.livekit.proto.ApmProcessStreamRequestH\x00\x12S\n\x1a\x61pm_process_reverse_stream\x18\x34 \x01(\x0b\x32-.livekit.proto.ApmProcessReverseStreamRequestH\x00\x12G\n\x14\x61pm_set_stream_delay\x18\x35 \x01(\x0b\x32\'.livekit.proto.ApmSetStreamDelayRequestH\x00\x12V\n\x15\x62yte_read_incremental\x18\x36 \x01(\x0b\x32\x35.livekit.proto.ByteStreamReaderReadIncrementalRequestH\x00\x12\x46\n\rbyte_read_all\x18\x37 \x01(\x0b\x32-.livekit.proto.ByteStreamReaderReadAllRequestH\x00\x12O\n\x12\x62yte_write_to_file\x18\x38 \x01(\x0b\x32\x31.livekit.proto.ByteStreamReaderWriteToFileRequestH\x00\x12V\n\x15text_read_incremental\x18\x39 \x01(\x0b\x32\x35.livekit.proto.TextStreamReaderReadIncrementalRequestH\x00\x12\x46\n\rtext_read_all\x18: \x01(\x0b\x32-.livekit.proto.TextStreamReaderReadAllRequestH\x00\x12\x39\n\tsend_file\x18; \x01(\x0b\x32$.livekit.proto.StreamSendFileRequestH\x00\x12\x39\n\tsend_text\x18< \x01(\x0b\x32$.livekit.proto.StreamSendTextRequestH\x00\x12@\n\x10\x62yte_stream_open\x18= \x01(\x0b\x32$.livekit.proto.ByteStreamOpenRequestH\x00\x12H\n\x11\x62yte_stream_write\x18> \x01(\x0b\x32+.livekit.proto.ByteStreamWriterWriteRequestH\x00\x12H\n\x11\x62yte_stream_close\x18? \x01(\x0b\x32+.livekit.proto.ByteStreamWriterCloseRequestH\x00\x12@\n\x10text_stream_open\x18@ \x01(\x0b\x32$.livekit.proto.TextStreamOpenRequestH\x00\x12H\n\x11text_stream_write\x18\x41 \x01(\x0b\x32+.livekit.proto.TextStreamWriterWriteRequestH\x00\x12H\n\x11text_stream_close\x18\x42 \x01(\x0b\x32+.livekit.proto.TextStreamWriterCloseRequestH\x00\x12;\n\nsend_bytes\x18\x43 \x01(\x0b\x32%.livekit.proto.StreamSendBytesRequestH\x00\x12\x66\n$set_remote_track_publication_quality\x18\x44 \x01(\x0b\x32\x36.livekit.proto.SetRemoteTrackPublicationQualityRequestH\x00\x12\x44\n\x12publish_data_track\x18\x45 \x01(\x0b\x32&.livekit.proto.PublishDataTrackRequestH\x00\x12P\n\x19local_data_track_try_push\x18\x46 \x01(\x0b\x32+.livekit.proto.LocalDataTrackTryPushRequestH\x00\x12S\n\x1alocal_data_track_unpublish\x18G \x01(\x0b\x32-.livekit.proto.LocalDataTrackUnpublishRequestH\x00\x12X\n\x1dlocal_data_track_is_published\x18H \x01(\x0b\x32/.livekit.proto.LocalDataTrackIsPublishedRequestH\x00\x12H\n\x14subscribe_data_track\x18I \x01(\x0b\x32(.livekit.proto.SubscribeDataTrackRequestH\x00\x12Z\n\x1eremote_data_track_is_published\x18J \x01(\x0b\x32\x30.livekit.proto.RemoteDataTrackIsPublishedRequestH\x00\x12K\n\x16\x64\x61ta_track_stream_read\x18K \x01(\x0b\x32).livekit.proto.DataTrackStreamReadRequestH\x00\x12\x43\n\x11simulate_scenario\x18L \x01(\x0b\x32&.livekit.proto.SimulateScenarioRequestH\x00\x12G\n\x14ready_for_room_event\x18M \x01(\x0b\x32\'.livekit.proto.ReadyForRoomEventRequestH\x00\x42\t\n\x07message\"\xb6+\n\x0b\x46\x66iResponse\x12\x31\n\x07\x64ispose\x18\x02 \x01(\x0b\x32\x1e.livekit.proto.DisposeResponseH\x00\x12\x31\n\x07\x63onnect\x18\x03 \x01(\x0b\x32\x1e.livekit.proto.ConnectResponseH\x00\x12\x37\n\ndisconnect\x18\x04 \x01(\x0b\x32!.livekit.proto.DisconnectResponseH\x00\x12<\n\rpublish_track\x18\x05 \x01(\x0b\x32#.livekit.proto.PublishTrackResponseH\x00\x12@\n\x0funpublish_track\x18\x06 \x01(\x0b\x32%.livekit.proto.UnpublishTrackResponseH\x00\x12:\n\x0cpublish_data\x18\x07 \x01(\x0b\x32\".livekit.proto.PublishDataResponseH\x00\x12>\n\x0eset_subscribed\x18\x08 \x01(\x0b\x32$.livekit.proto.SetSubscribedResponseH\x00\x12\x45\n\x12set_local_metadata\x18\t \x01(\x0b\x32\'.livekit.proto.SetLocalMetadataResponseH\x00\x12=\n\x0eset_local_name\x18\n \x01(\x0b\x32#.livekit.proto.SetLocalNameResponseH\x00\x12I\n\x14set_local_attributes\x18\x0b \x01(\x0b\x32).livekit.proto.SetLocalAttributesResponseH\x00\x12\x43\n\x11get_session_stats\x18\x0c \x01(\x0b\x32&.livekit.proto.GetSessionStatsResponseH\x00\x12L\n\x15publish_transcription\x18\r \x01(\x0b\x32+.livekit.proto.PublishTranscriptionResponseH\x00\x12\x41\n\x10publish_sip_dtmf\x18\x0e \x01(\x0b\x32%.livekit.proto.PublishSipDtmfResponseH\x00\x12\x45\n\x12\x63reate_video_track\x18\x0f \x01(\x0b\x32\'.livekit.proto.CreateVideoTrackResponseH\x00\x12\x45\n\x12\x63reate_audio_track\x18\x10 \x01(\x0b\x32\'.livekit.proto.CreateAudioTrackResponseH\x00\x12\x41\n\x10local_track_mute\x18\x11 \x01(\x0b\x32%.livekit.proto.LocalTrackMuteResponseH\x00\x12G\n\x13\x65nable_remote_track\x18\x12 \x01(\x0b\x32(.livekit.proto.EnableRemoteTrackResponseH\x00\x12\x34\n\tget_stats\x18\x13 \x01(\x0b\x32\x1f.livekit.proto.GetStatsResponseH\x00\x12\x64\n\"set_track_subscription_permissions\x18/ \x01(\x0b\x32\x36.livekit.proto.SetTrackSubscriptionPermissionsResponseH\x00\x12\x41\n\x10new_video_stream\x18\x14 \x01(\x0b\x32%.livekit.proto.NewVideoStreamResponseH\x00\x12\x41\n\x10new_video_source\x18\x15 \x01(\x0b\x32%.livekit.proto.NewVideoSourceResponseH\x00\x12G\n\x13\x63\x61pture_video_frame\x18\x16 \x01(\x0b\x32(.livekit.proto.CaptureVideoFrameResponseH\x00\x12<\n\rvideo_convert\x18\x17 \x01(\x0b\x32#.livekit.proto.VideoConvertResponseH\x00\x12Z\n\x1dvideo_stream_from_participant\x18\x18 \x01(\x0b\x32\x31.livekit.proto.VideoStreamFromParticipantResponseH\x00\x12\x41\n\x10new_audio_stream\x18\x19 \x01(\x0b\x32%.livekit.proto.NewAudioStreamResponseH\x00\x12\x41\n\x10new_audio_source\x18\x1a \x01(\x0b\x32%.livekit.proto.NewAudioSourceResponseH\x00\x12G\n\x13\x63\x61pture_audio_frame\x18\x1b \x01(\x0b\x32(.livekit.proto.CaptureAudioFrameResponseH\x00\x12\x45\n\x12\x63lear_audio_buffer\x18\x1c \x01(\x0b\x32\'.livekit.proto.ClearAudioBufferResponseH\x00\x12G\n\x13new_audio_resampler\x18\x1d \x01(\x0b\x32(.livekit.proto.NewAudioResamplerResponseH\x00\x12\x45\n\x12remix_and_resample\x18\x1e \x01(\x0b\x32\'.livekit.proto.RemixAndResampleResponseH\x00\x12Z\n\x1d\x61udio_stream_from_participant\x18\x1f \x01(\x0b\x32\x31.livekit.proto.AudioStreamFromParticipantResponseH\x00\x12+\n\x04\x65\x32\x65\x65\x18 \x01(\x0b\x32\x1b.livekit.proto.E2eeResponseH\x00\x12\x43\n\x11new_sox_resampler\x18! \x01(\x0b\x32&.livekit.proto.NewSoxResamplerResponseH\x00\x12\x45\n\x12push_sox_resampler\x18\" \x01(\x0b\x32\'.livekit.proto.PushSoxResamplerResponseH\x00\x12G\n\x13\x66lush_sox_resampler\x18# \x01(\x0b\x32(.livekit.proto.FlushSoxResamplerResponseH\x00\x12\x43\n\x11send_chat_message\x18$ \x01(\x0b\x32&.livekit.proto.SendChatMessageResponseH\x00\x12\x38\n\x0bperform_rpc\x18% \x01(\x0b\x32!.livekit.proto.PerformRpcResponseH\x00\x12G\n\x13register_rpc_method\x18& \x01(\x0b\x32(.livekit.proto.RegisterRpcMethodResponseH\x00\x12K\n\x15unregister_rpc_method\x18\' \x01(\x0b\x32*.livekit.proto.UnregisterRpcMethodResponseH\x00\x12\\\n\x1erpc_method_invocation_response\x18( \x01(\x0b\x32\x32.livekit.proto.RpcMethodInvocationResponseResponseH\x00\x12^\n\x1f\x65nable_remote_track_publication\x18) \x01(\x0b\x32\x33.livekit.proto.EnableRemoteTrackPublicationResponseH\x00\x12q\n)update_remote_track_publication_dimension\x18* \x01(\x0b\x32<.livekit.proto.UpdateRemoteTrackPublicationDimensionResponseH\x00\x12\x45\n\x12send_stream_header\x18+ \x01(\x0b\x32\'.livekit.proto.SendStreamHeaderResponseH\x00\x12\x43\n\x11send_stream_chunk\x18, \x01(\x0b\x32&.livekit.proto.SendStreamChunkResponseH\x00\x12G\n\x13send_stream_trailer\x18- \x01(\x0b\x32(.livekit.proto.SendStreamTrailerResponseH\x00\x12y\n.set_data_channel_buffered_amount_low_threshold\x18. \x01(\x0b\x32?.livekit.proto.SetDataChannelBufferedAmountLowThresholdResponseH\x00\x12P\n\x18load_audio_filter_plugin\x18\x30 \x01(\x0b\x32,.livekit.proto.LoadAudioFilterPluginResponseH\x00\x12\x30\n\x07new_apm\x18\x31 \x01(\x0b\x32\x1d.livekit.proto.NewApmResponseH\x00\x12\x45\n\x12\x61pm_process_stream\x18\x32 \x01(\x0b\x32\'.livekit.proto.ApmProcessStreamResponseH\x00\x12T\n\x1a\x61pm_process_reverse_stream\x18\x33 \x01(\x0b\x32..livekit.proto.ApmProcessReverseStreamResponseH\x00\x12H\n\x14\x61pm_set_stream_delay\x18\x34 \x01(\x0b\x32(.livekit.proto.ApmSetStreamDelayResponseH\x00\x12W\n\x15\x62yte_read_incremental\x18\x35 \x01(\x0b\x32\x36.livekit.proto.ByteStreamReaderReadIncrementalResponseH\x00\x12G\n\rbyte_read_all\x18\x36 \x01(\x0b\x32..livekit.proto.ByteStreamReaderReadAllResponseH\x00\x12P\n\x12\x62yte_write_to_file\x18\x37 \x01(\x0b\x32\x32.livekit.proto.ByteStreamReaderWriteToFileResponseH\x00\x12W\n\x15text_read_incremental\x18\x38 \x01(\x0b\x32\x36.livekit.proto.TextStreamReaderReadIncrementalResponseH\x00\x12G\n\rtext_read_all\x18\x39 \x01(\x0b\x32..livekit.proto.TextStreamReaderReadAllResponseH\x00\x12:\n\tsend_file\x18: \x01(\x0b\x32%.livekit.proto.StreamSendFileResponseH\x00\x12:\n\tsend_text\x18; \x01(\x0b\x32%.livekit.proto.StreamSendTextResponseH\x00\x12\x41\n\x10\x62yte_stream_open\x18< \x01(\x0b\x32%.livekit.proto.ByteStreamOpenResponseH\x00\x12I\n\x11\x62yte_stream_write\x18= \x01(\x0b\x32,.livekit.proto.ByteStreamWriterWriteResponseH\x00\x12I\n\x11\x62yte_stream_close\x18> \x01(\x0b\x32,.livekit.proto.ByteStreamWriterCloseResponseH\x00\x12\x41\n\x10text_stream_open\x18? \x01(\x0b\x32%.livekit.proto.TextStreamOpenResponseH\x00\x12I\n\x11text_stream_write\x18@ \x01(\x0b\x32,.livekit.proto.TextStreamWriterWriteResponseH\x00\x12I\n\x11text_stream_close\x18\x41 \x01(\x0b\x32,.livekit.proto.TextStreamWriterCloseResponseH\x00\x12<\n\nsend_bytes\x18\x42 \x01(\x0b\x32&.livekit.proto.StreamSendBytesResponseH\x00\x12g\n$set_remote_track_publication_quality\x18\x43 \x01(\x0b\x32\x37.livekit.proto.SetRemoteTrackPublicationQualityResponseH\x00\x12\x45\n\x12publish_data_track\x18\x44 \x01(\x0b\x32\'.livekit.proto.PublishDataTrackResponseH\x00\x12Q\n\x19local_data_track_try_push\x18\x45 \x01(\x0b\x32,.livekit.proto.LocalDataTrackTryPushResponseH\x00\x12T\n\x1alocal_data_track_unpublish\x18\x46 \x01(\x0b\x32..livekit.proto.LocalDataTrackUnpublishResponseH\x00\x12Y\n\x1dlocal_data_track_is_published\x18G \x01(\x0b\x32\x30.livekit.proto.LocalDataTrackIsPublishedResponseH\x00\x12I\n\x14subscribe_data_track\x18H \x01(\x0b\x32).livekit.proto.SubscribeDataTrackResponseH\x00\x12[\n\x1eremote_data_track_is_published\x18I \x01(\x0b\x32\x31.livekit.proto.RemoteDataTrackIsPublishedResponseH\x00\x12L\n\x16\x64\x61ta_track_stream_read\x18J \x01(\x0b\x32*.livekit.proto.DataTrackStreamReadResponseH\x00\x12\x44\n\x11simulate_scenario\x18K \x01(\x0b\x32\'.livekit.proto.SimulateScenarioResponseH\x00\x12H\n\x14ready_for_room_event\x18L \x01(\x0b\x32(.livekit.proto.ReadyForRoomEventResponseH\x00\x42\t\n\x07message\"\xda\x16\n\x08\x46\x66iEvent\x12.\n\nroom_event\x18\x01 \x01(\x0b\x32\x18.livekit.proto.RoomEventH\x00\x12\x30\n\x0btrack_event\x18\x02 \x01(\x0b\x32\x19.livekit.proto.TrackEventH\x00\x12=\n\x12video_stream_event\x18\x03 \x01(\x0b\x32\x1f.livekit.proto.VideoStreamEventH\x00\x12=\n\x12\x61udio_stream_event\x18\x04 \x01(\x0b\x32\x1f.livekit.proto.AudioStreamEventH\x00\x12\x31\n\x07\x63onnect\x18\x05 \x01(\x0b\x32\x1e.livekit.proto.ConnectCallbackH\x00\x12\x37\n\ndisconnect\x18\x07 \x01(\x0b\x32!.livekit.proto.DisconnectCallbackH\x00\x12\x31\n\x07\x64ispose\x18\x08 \x01(\x0b\x32\x1e.livekit.proto.DisposeCallbackH\x00\x12<\n\rpublish_track\x18\t \x01(\x0b\x32#.livekit.proto.PublishTrackCallbackH\x00\x12@\n\x0funpublish_track\x18\n \x01(\x0b\x32%.livekit.proto.UnpublishTrackCallbackH\x00\x12:\n\x0cpublish_data\x18\x0b \x01(\x0b\x32\".livekit.proto.PublishDataCallbackH\x00\x12L\n\x15publish_transcription\x18\x0c \x01(\x0b\x32+.livekit.proto.PublishTranscriptionCallbackH\x00\x12G\n\x13\x63\x61pture_audio_frame\x18\r \x01(\x0b\x32(.livekit.proto.CaptureAudioFrameCallbackH\x00\x12\x45\n\x12set_local_metadata\x18\x0e \x01(\x0b\x32\'.livekit.proto.SetLocalMetadataCallbackH\x00\x12=\n\x0eset_local_name\x18\x0f \x01(\x0b\x32#.livekit.proto.SetLocalNameCallbackH\x00\x12I\n\x14set_local_attributes\x18\x10 \x01(\x0b\x32).livekit.proto.SetLocalAttributesCallbackH\x00\x12\x34\n\tget_stats\x18\x11 \x01(\x0b\x32\x1f.livekit.proto.GetStatsCallbackH\x00\x12\'\n\x04logs\x18\x12 \x01(\x0b\x32\x17.livekit.proto.LogBatchH\x00\x12\x43\n\x11get_session_stats\x18\x13 \x01(\x0b\x32&.livekit.proto.GetSessionStatsCallbackH\x00\x12%\n\x05panic\x18\x14 \x01(\x0b\x32\x14.livekit.proto.PanicH\x00\x12\x41\n\x10publish_sip_dtmf\x18\x15 \x01(\x0b\x32%.livekit.proto.PublishSipDtmfCallbackH\x00\x12>\n\x0c\x63hat_message\x18\x16 \x01(\x0b\x32&.livekit.proto.SendChatMessageCallbackH\x00\x12\x38\n\x0bperform_rpc\x18\x17 \x01(\x0b\x32!.livekit.proto.PerformRpcCallbackH\x00\x12H\n\x15rpc_method_invocation\x18\x18 \x01(\x0b\x32\'.livekit.proto.RpcMethodInvocationEventH\x00\x12\x45\n\x12send_stream_header\x18\x19 \x01(\x0b\x32\'.livekit.proto.SendStreamHeaderCallbackH\x00\x12\x43\n\x11send_stream_chunk\x18\x1a \x01(\x0b\x32&.livekit.proto.SendStreamChunkCallbackH\x00\x12G\n\x13send_stream_trailer\x18\x1b \x01(\x0b\x32(.livekit.proto.SendStreamTrailerCallbackH\x00\x12H\n\x18\x62yte_stream_reader_event\x18\x1c \x01(\x0b\x32$.livekit.proto.ByteStreamReaderEventH\x00\x12U\n\x1b\x62yte_stream_reader_read_all\x18\x1d \x01(\x0b\x32..livekit.proto.ByteStreamReaderReadAllCallbackH\x00\x12^\n byte_stream_reader_write_to_file\x18\x1e \x01(\x0b\x32\x32.livekit.proto.ByteStreamReaderWriteToFileCallbackH\x00\x12\x41\n\x10\x62yte_stream_open\x18\x1f \x01(\x0b\x32%.livekit.proto.ByteStreamOpenCallbackH\x00\x12P\n\x18\x62yte_stream_writer_write\x18 \x01(\x0b\x32,.livekit.proto.ByteStreamWriterWriteCallbackH\x00\x12P\n\x18\x62yte_stream_writer_close\x18! \x01(\x0b\x32,.livekit.proto.ByteStreamWriterCloseCallbackH\x00\x12:\n\tsend_file\x18\" \x01(\x0b\x32%.livekit.proto.StreamSendFileCallbackH\x00\x12H\n\x18text_stream_reader_event\x18# \x01(\x0b\x32$.livekit.proto.TextStreamReaderEventH\x00\x12U\n\x1btext_stream_reader_read_all\x18$ \x01(\x0b\x32..livekit.proto.TextStreamReaderReadAllCallbackH\x00\x12\x41\n\x10text_stream_open\x18% \x01(\x0b\x32%.livekit.proto.TextStreamOpenCallbackH\x00\x12P\n\x18text_stream_writer_write\x18& \x01(\x0b\x32,.livekit.proto.TextStreamWriterWriteCallbackH\x00\x12P\n\x18text_stream_writer_close\x18\' \x01(\x0b\x32,.livekit.proto.TextStreamWriterCloseCallbackH\x00\x12:\n\tsend_text\x18( \x01(\x0b\x32%.livekit.proto.StreamSendTextCallbackH\x00\x12<\n\nsend_bytes\x18) \x01(\x0b\x32&.livekit.proto.StreamSendBytesCallbackH\x00\x12\x45\n\x12publish_data_track\x18* \x01(\x0b\x32\'.livekit.proto.PublishDataTrackCallbackH\x00\x12\x46\n\x17\x64\x61ta_track_stream_event\x18+ \x01(\x0b\x32#.livekit.proto.DataTrackStreamEventH\x00\x12\x44\n\x11simulate_scenario\x18, \x01(\x0b\x32\'.livekit.proto.SimulateScenarioCallbackH\x00\x42\t\n\x07message\"\x1f\n\x0e\x44isposeRequest\x12\r\n\x05\x61sync\x18\x01 \x02(\x08\"#\n\x0f\x44isposeResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x01(\x04\"#\n\x0f\x44isposeCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"\x85\x01\n\tLogRecord\x12&\n\x05level\x18\x01 \x02(\x0e\x32\x17.livekit.proto.LogLevel\x12\x0e\n\x06target\x18\x02 \x02(\t\x12\x13\n\x0bmodule_path\x18\x03 \x01(\t\x12\x0c\n\x04\x66ile\x18\x04 \x01(\t\x12\x0c\n\x04line\x18\x05 \x01(\r\x12\x0f\n\x07message\x18\x06 \x02(\t\"5\n\x08LogBatch\x12)\n\x07records\x18\x01 \x03(\x0b\x32\x18.livekit.proto.LogRecord\"\x18\n\x05Panic\x12\x0f\n\x07message\x18\x01 \x02(\t*S\n\x08LogLevel\x12\r\n\tLOG_ERROR\x10\x00\x12\x0c\n\x08LOG_WARN\x10\x01\x12\x0c\n\x08LOG_INFO\x10\x02\x12\r\n\tLOG_DEBUG\x10\x03\x12\r\n\tLOG_TRACE\x10\x04\x42\x10\xaa\x02\rLiveKit.Proto') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\tffi.proto\x12\rlivekit.proto\x1a\ne2ee.proto\x1a\x0btrack.proto\x1a\x17track_publication.proto\x1a\nroom.proto\x1a\x11video_frame.proto\x1a\x11\x61udio_frame.proto\x1a\trpc.proto\x1a\x11\x64\x61ta_stream.proto\x1a\x10\x64\x61ta_track.proto\"\xff-\n\nFfiRequest\x12\x30\n\x07\x64ispose\x18\x02 \x01(\x0b\x32\x1d.livekit.proto.DisposeRequestH\x00\x12\x30\n\x07\x63onnect\x18\x03 \x01(\x0b\x32\x1d.livekit.proto.ConnectRequestH\x00\x12\x36\n\ndisconnect\x18\x04 \x01(\x0b\x32 .livekit.proto.DisconnectRequestH\x00\x12;\n\rpublish_track\x18\x05 \x01(\x0b\x32\".livekit.proto.PublishTrackRequestH\x00\x12?\n\x0funpublish_track\x18\x06 \x01(\x0b\x32$.livekit.proto.UnpublishTrackRequestH\x00\x12\x39\n\x0cpublish_data\x18\x07 \x01(\x0b\x32!.livekit.proto.PublishDataRequestH\x00\x12=\n\x0eset_subscribed\x18\x08 \x01(\x0b\x32#.livekit.proto.SetSubscribedRequestH\x00\x12\x44\n\x12set_local_metadata\x18\t \x01(\x0b\x32&.livekit.proto.SetLocalMetadataRequestH\x00\x12<\n\x0eset_local_name\x18\n \x01(\x0b\x32\".livekit.proto.SetLocalNameRequestH\x00\x12H\n\x14set_local_attributes\x18\x0b \x01(\x0b\x32(.livekit.proto.SetLocalAttributesRequestH\x00\x12\x42\n\x11get_session_stats\x18\x0c \x01(\x0b\x32%.livekit.proto.GetSessionStatsRequestH\x00\x12K\n\x15publish_transcription\x18\r \x01(\x0b\x32*.livekit.proto.PublishTranscriptionRequestH\x00\x12@\n\x10publish_sip_dtmf\x18\x0e \x01(\x0b\x32$.livekit.proto.PublishSipDtmfRequestH\x00\x12\x44\n\x12\x63reate_video_track\x18\x0f \x01(\x0b\x32&.livekit.proto.CreateVideoTrackRequestH\x00\x12\x44\n\x12\x63reate_audio_track\x18\x10 \x01(\x0b\x32&.livekit.proto.CreateAudioTrackRequestH\x00\x12@\n\x10local_track_mute\x18\x11 \x01(\x0b\x32$.livekit.proto.LocalTrackMuteRequestH\x00\x12\x46\n\x13\x65nable_remote_track\x18\x12 \x01(\x0b\x32\'.livekit.proto.EnableRemoteTrackRequestH\x00\x12\x33\n\tget_stats\x18\x13 \x01(\x0b\x32\x1e.livekit.proto.GetStatsRequestH\x00\x12\x63\n\"set_track_subscription_permissions\x18\x30 \x01(\x0b\x32\x35.livekit.proto.SetTrackSubscriptionPermissionsRequestH\x00\x12@\n\x10new_video_stream\x18\x14 \x01(\x0b\x32$.livekit.proto.NewVideoStreamRequestH\x00\x12@\n\x10new_video_source\x18\x15 \x01(\x0b\x32$.livekit.proto.NewVideoSourceRequestH\x00\x12\x46\n\x13\x63\x61pture_video_frame\x18\x16 \x01(\x0b\x32\'.livekit.proto.CaptureVideoFrameRequestH\x00\x12;\n\rvideo_convert\x18\x17 \x01(\x0b\x32\".livekit.proto.VideoConvertRequestH\x00\x12Y\n\x1dvideo_stream_from_participant\x18\x18 \x01(\x0b\x32\x30.livekit.proto.VideoStreamFromParticipantRequestH\x00\x12@\n\x10new_audio_stream\x18\x19 \x01(\x0b\x32$.livekit.proto.NewAudioStreamRequestH\x00\x12@\n\x10new_audio_source\x18\x1a \x01(\x0b\x32$.livekit.proto.NewAudioSourceRequestH\x00\x12\x46\n\x13\x63\x61pture_audio_frame\x18\x1b \x01(\x0b\x32\'.livekit.proto.CaptureAudioFrameRequestH\x00\x12\x44\n\x12\x63lear_audio_buffer\x18\x1c \x01(\x0b\x32&.livekit.proto.ClearAudioBufferRequestH\x00\x12\x46\n\x13new_audio_resampler\x18\x1d \x01(\x0b\x32\'.livekit.proto.NewAudioResamplerRequestH\x00\x12\x44\n\x12remix_and_resample\x18\x1e \x01(\x0b\x32&.livekit.proto.RemixAndResampleRequestH\x00\x12*\n\x04\x65\x32\x65\x65\x18\x1f \x01(\x0b\x32\x1a.livekit.proto.E2eeRequestH\x00\x12Y\n\x1d\x61udio_stream_from_participant\x18 \x01(\x0b\x32\x30.livekit.proto.AudioStreamFromParticipantRequestH\x00\x12\x42\n\x11new_sox_resampler\x18! \x01(\x0b\x32%.livekit.proto.NewSoxResamplerRequestH\x00\x12\x44\n\x12push_sox_resampler\x18\" \x01(\x0b\x32&.livekit.proto.PushSoxResamplerRequestH\x00\x12\x46\n\x13\x66lush_sox_resampler\x18# \x01(\x0b\x32\'.livekit.proto.FlushSoxResamplerRequestH\x00\x12\x42\n\x11send_chat_message\x18$ \x01(\x0b\x32%.livekit.proto.SendChatMessageRequestH\x00\x12\x42\n\x11\x65\x64it_chat_message\x18% \x01(\x0b\x32%.livekit.proto.EditChatMessageRequestH\x00\x12\x37\n\x0bperform_rpc\x18& \x01(\x0b\x32 .livekit.proto.PerformRpcRequestH\x00\x12\x46\n\x13register_rpc_method\x18\' \x01(\x0b\x32\'.livekit.proto.RegisterRpcMethodRequestH\x00\x12J\n\x15unregister_rpc_method\x18( \x01(\x0b\x32).livekit.proto.UnregisterRpcMethodRequestH\x00\x12[\n\x1erpc_method_invocation_response\x18) \x01(\x0b\x32\x31.livekit.proto.RpcMethodInvocationResponseRequestH\x00\x12]\n\x1f\x65nable_remote_track_publication\x18* \x01(\x0b\x32\x32.livekit.proto.EnableRemoteTrackPublicationRequestH\x00\x12p\n)update_remote_track_publication_dimension\x18+ \x01(\x0b\x32;.livekit.proto.UpdateRemoteTrackPublicationDimensionRequestH\x00\x12\x44\n\x12send_stream_header\x18, \x01(\x0b\x32&.livekit.proto.SendStreamHeaderRequestH\x00\x12\x42\n\x11send_stream_chunk\x18- \x01(\x0b\x32%.livekit.proto.SendStreamChunkRequestH\x00\x12\x46\n\x13send_stream_trailer\x18. \x01(\x0b\x32\'.livekit.proto.SendStreamTrailerRequestH\x00\x12x\n.set_data_channel_buffered_amount_low_threshold\x18/ \x01(\x0b\x32>.livekit.proto.SetDataChannelBufferedAmountLowThresholdRequestH\x00\x12O\n\x18load_audio_filter_plugin\x18\x31 \x01(\x0b\x32+.livekit.proto.LoadAudioFilterPluginRequestH\x00\x12/\n\x07new_apm\x18\x32 \x01(\x0b\x32\x1c.livekit.proto.NewApmRequestH\x00\x12\x44\n\x12\x61pm_process_stream\x18\x33 \x01(\x0b\x32&.livekit.proto.ApmProcessStreamRequestH\x00\x12S\n\x1a\x61pm_process_reverse_stream\x18\x34 \x01(\x0b\x32-.livekit.proto.ApmProcessReverseStreamRequestH\x00\x12G\n\x14\x61pm_set_stream_delay\x18\x35 \x01(\x0b\x32\'.livekit.proto.ApmSetStreamDelayRequestH\x00\x12V\n\x15\x62yte_read_incremental\x18\x36 \x01(\x0b\x32\x35.livekit.proto.ByteStreamReaderReadIncrementalRequestH\x00\x12\x46\n\rbyte_read_all\x18\x37 \x01(\x0b\x32-.livekit.proto.ByteStreamReaderReadAllRequestH\x00\x12O\n\x12\x62yte_write_to_file\x18\x38 \x01(\x0b\x32\x31.livekit.proto.ByteStreamReaderWriteToFileRequestH\x00\x12V\n\x15text_read_incremental\x18\x39 \x01(\x0b\x32\x35.livekit.proto.TextStreamReaderReadIncrementalRequestH\x00\x12\x46\n\rtext_read_all\x18: \x01(\x0b\x32-.livekit.proto.TextStreamReaderReadAllRequestH\x00\x12\x39\n\tsend_file\x18; \x01(\x0b\x32$.livekit.proto.StreamSendFileRequestH\x00\x12\x39\n\tsend_text\x18< \x01(\x0b\x32$.livekit.proto.StreamSendTextRequestH\x00\x12@\n\x10\x62yte_stream_open\x18= \x01(\x0b\x32$.livekit.proto.ByteStreamOpenRequestH\x00\x12H\n\x11\x62yte_stream_write\x18> \x01(\x0b\x32+.livekit.proto.ByteStreamWriterWriteRequestH\x00\x12H\n\x11\x62yte_stream_close\x18? \x01(\x0b\x32+.livekit.proto.ByteStreamWriterCloseRequestH\x00\x12@\n\x10text_stream_open\x18@ \x01(\x0b\x32$.livekit.proto.TextStreamOpenRequestH\x00\x12H\n\x11text_stream_write\x18\x41 \x01(\x0b\x32+.livekit.proto.TextStreamWriterWriteRequestH\x00\x12H\n\x11text_stream_close\x18\x42 \x01(\x0b\x32+.livekit.proto.TextStreamWriterCloseRequestH\x00\x12;\n\nsend_bytes\x18\x43 \x01(\x0b\x32%.livekit.proto.StreamSendBytesRequestH\x00\x12\x66\n$set_remote_track_publication_quality\x18\x44 \x01(\x0b\x32\x36.livekit.proto.SetRemoteTrackPublicationQualityRequestH\x00\x12\x44\n\x12publish_data_track\x18\x45 \x01(\x0b\x32&.livekit.proto.PublishDataTrackRequestH\x00\x12P\n\x19local_data_track_try_push\x18\x46 \x01(\x0b\x32+.livekit.proto.LocalDataTrackTryPushRequestH\x00\x12S\n\x1alocal_data_track_unpublish\x18G \x01(\x0b\x32-.livekit.proto.LocalDataTrackUnpublishRequestH\x00\x12X\n\x1dlocal_data_track_is_published\x18H \x01(\x0b\x32/.livekit.proto.LocalDataTrackIsPublishedRequestH\x00\x12H\n\x14subscribe_data_track\x18I \x01(\x0b\x32(.livekit.proto.SubscribeDataTrackRequestH\x00\x12Z\n\x1eremote_data_track_is_published\x18J \x01(\x0b\x32\x30.livekit.proto.RemoteDataTrackIsPublishedRequestH\x00\x12K\n\x16\x64\x61ta_track_stream_read\x18K \x01(\x0b\x32).livekit.proto.DataTrackStreamReadRequestH\x00\x12\x43\n\x11simulate_scenario\x18L \x01(\x0b\x32&.livekit.proto.SimulateScenarioRequestH\x00\x12\x44\n\x12new_platform_audio\x18M \x01(\x0b\x32&.livekit.proto.NewPlatformAudioRequestH\x00\x12\x42\n\x11get_audio_devices\x18N \x01(\x0b\x32%.livekit.proto.GetAudioDevicesRequestH\x00\x12H\n\x14set_recording_device\x18O \x01(\x0b\x32(.livekit.proto.SetRecordingDeviceRequestH\x00\x12\x44\n\x12set_playout_device\x18P \x01(\x0b\x32&.livekit.proto.SetPlayoutDeviceRequestH\x00\x12?\n\x0fstart_recording\x18Q \x01(\x0b\x32$.livekit.proto.StartRecordingRequestH\x00\x12=\n\x0estop_recording\x18R \x01(\x0b\x32#.livekit.proto.StopRecordingRequestH\x00\x42\t\n\x07message\"\x8c.\n\x0b\x46\x66iResponse\x12\x31\n\x07\x64ispose\x18\x02 \x01(\x0b\x32\x1e.livekit.proto.DisposeResponseH\x00\x12\x31\n\x07\x63onnect\x18\x03 \x01(\x0b\x32\x1e.livekit.proto.ConnectResponseH\x00\x12\x37\n\ndisconnect\x18\x04 \x01(\x0b\x32!.livekit.proto.DisconnectResponseH\x00\x12<\n\rpublish_track\x18\x05 \x01(\x0b\x32#.livekit.proto.PublishTrackResponseH\x00\x12@\n\x0funpublish_track\x18\x06 \x01(\x0b\x32%.livekit.proto.UnpublishTrackResponseH\x00\x12:\n\x0cpublish_data\x18\x07 \x01(\x0b\x32\".livekit.proto.PublishDataResponseH\x00\x12>\n\x0eset_subscribed\x18\x08 \x01(\x0b\x32$.livekit.proto.SetSubscribedResponseH\x00\x12\x45\n\x12set_local_metadata\x18\t \x01(\x0b\x32\'.livekit.proto.SetLocalMetadataResponseH\x00\x12=\n\x0eset_local_name\x18\n \x01(\x0b\x32#.livekit.proto.SetLocalNameResponseH\x00\x12I\n\x14set_local_attributes\x18\x0b \x01(\x0b\x32).livekit.proto.SetLocalAttributesResponseH\x00\x12\x43\n\x11get_session_stats\x18\x0c \x01(\x0b\x32&.livekit.proto.GetSessionStatsResponseH\x00\x12L\n\x15publish_transcription\x18\r \x01(\x0b\x32+.livekit.proto.PublishTranscriptionResponseH\x00\x12\x41\n\x10publish_sip_dtmf\x18\x0e \x01(\x0b\x32%.livekit.proto.PublishSipDtmfResponseH\x00\x12\x45\n\x12\x63reate_video_track\x18\x0f \x01(\x0b\x32\'.livekit.proto.CreateVideoTrackResponseH\x00\x12\x45\n\x12\x63reate_audio_track\x18\x10 \x01(\x0b\x32\'.livekit.proto.CreateAudioTrackResponseH\x00\x12\x41\n\x10local_track_mute\x18\x11 \x01(\x0b\x32%.livekit.proto.LocalTrackMuteResponseH\x00\x12G\n\x13\x65nable_remote_track\x18\x12 \x01(\x0b\x32(.livekit.proto.EnableRemoteTrackResponseH\x00\x12\x34\n\tget_stats\x18\x13 \x01(\x0b\x32\x1f.livekit.proto.GetStatsResponseH\x00\x12\x64\n\"set_track_subscription_permissions\x18/ \x01(\x0b\x32\x36.livekit.proto.SetTrackSubscriptionPermissionsResponseH\x00\x12\x41\n\x10new_video_stream\x18\x14 \x01(\x0b\x32%.livekit.proto.NewVideoStreamResponseH\x00\x12\x41\n\x10new_video_source\x18\x15 \x01(\x0b\x32%.livekit.proto.NewVideoSourceResponseH\x00\x12G\n\x13\x63\x61pture_video_frame\x18\x16 \x01(\x0b\x32(.livekit.proto.CaptureVideoFrameResponseH\x00\x12<\n\rvideo_convert\x18\x17 \x01(\x0b\x32#.livekit.proto.VideoConvertResponseH\x00\x12Z\n\x1dvideo_stream_from_participant\x18\x18 \x01(\x0b\x32\x31.livekit.proto.VideoStreamFromParticipantResponseH\x00\x12\x41\n\x10new_audio_stream\x18\x19 \x01(\x0b\x32%.livekit.proto.NewAudioStreamResponseH\x00\x12\x41\n\x10new_audio_source\x18\x1a \x01(\x0b\x32%.livekit.proto.NewAudioSourceResponseH\x00\x12G\n\x13\x63\x61pture_audio_frame\x18\x1b \x01(\x0b\x32(.livekit.proto.CaptureAudioFrameResponseH\x00\x12\x45\n\x12\x63lear_audio_buffer\x18\x1c \x01(\x0b\x32\'.livekit.proto.ClearAudioBufferResponseH\x00\x12G\n\x13new_audio_resampler\x18\x1d \x01(\x0b\x32(.livekit.proto.NewAudioResamplerResponseH\x00\x12\x45\n\x12remix_and_resample\x18\x1e \x01(\x0b\x32\'.livekit.proto.RemixAndResampleResponseH\x00\x12Z\n\x1d\x61udio_stream_from_participant\x18\x1f \x01(\x0b\x32\x31.livekit.proto.AudioStreamFromParticipantResponseH\x00\x12+\n\x04\x65\x32\x65\x65\x18 \x01(\x0b\x32\x1b.livekit.proto.E2eeResponseH\x00\x12\x43\n\x11new_sox_resampler\x18! \x01(\x0b\x32&.livekit.proto.NewSoxResamplerResponseH\x00\x12\x45\n\x12push_sox_resampler\x18\" \x01(\x0b\x32\'.livekit.proto.PushSoxResamplerResponseH\x00\x12G\n\x13\x66lush_sox_resampler\x18# \x01(\x0b\x32(.livekit.proto.FlushSoxResamplerResponseH\x00\x12\x43\n\x11send_chat_message\x18$ \x01(\x0b\x32&.livekit.proto.SendChatMessageResponseH\x00\x12\x38\n\x0bperform_rpc\x18% \x01(\x0b\x32!.livekit.proto.PerformRpcResponseH\x00\x12G\n\x13register_rpc_method\x18& \x01(\x0b\x32(.livekit.proto.RegisterRpcMethodResponseH\x00\x12K\n\x15unregister_rpc_method\x18\' \x01(\x0b\x32*.livekit.proto.UnregisterRpcMethodResponseH\x00\x12\\\n\x1erpc_method_invocation_response\x18( \x01(\x0b\x32\x32.livekit.proto.RpcMethodInvocationResponseResponseH\x00\x12^\n\x1f\x65nable_remote_track_publication\x18) \x01(\x0b\x32\x33.livekit.proto.EnableRemoteTrackPublicationResponseH\x00\x12q\n)update_remote_track_publication_dimension\x18* \x01(\x0b\x32<.livekit.proto.UpdateRemoteTrackPublicationDimensionResponseH\x00\x12\x45\n\x12send_stream_header\x18+ \x01(\x0b\x32\'.livekit.proto.SendStreamHeaderResponseH\x00\x12\x43\n\x11send_stream_chunk\x18, \x01(\x0b\x32&.livekit.proto.SendStreamChunkResponseH\x00\x12G\n\x13send_stream_trailer\x18- \x01(\x0b\x32(.livekit.proto.SendStreamTrailerResponseH\x00\x12y\n.set_data_channel_buffered_amount_low_threshold\x18. \x01(\x0b\x32?.livekit.proto.SetDataChannelBufferedAmountLowThresholdResponseH\x00\x12P\n\x18load_audio_filter_plugin\x18\x30 \x01(\x0b\x32,.livekit.proto.LoadAudioFilterPluginResponseH\x00\x12\x30\n\x07new_apm\x18\x31 \x01(\x0b\x32\x1d.livekit.proto.NewApmResponseH\x00\x12\x45\n\x12\x61pm_process_stream\x18\x32 \x01(\x0b\x32\'.livekit.proto.ApmProcessStreamResponseH\x00\x12T\n\x1a\x61pm_process_reverse_stream\x18\x33 \x01(\x0b\x32..livekit.proto.ApmProcessReverseStreamResponseH\x00\x12H\n\x14\x61pm_set_stream_delay\x18\x34 \x01(\x0b\x32(.livekit.proto.ApmSetStreamDelayResponseH\x00\x12W\n\x15\x62yte_read_incremental\x18\x35 \x01(\x0b\x32\x36.livekit.proto.ByteStreamReaderReadIncrementalResponseH\x00\x12G\n\rbyte_read_all\x18\x36 \x01(\x0b\x32..livekit.proto.ByteStreamReaderReadAllResponseH\x00\x12P\n\x12\x62yte_write_to_file\x18\x37 \x01(\x0b\x32\x32.livekit.proto.ByteStreamReaderWriteToFileResponseH\x00\x12W\n\x15text_read_incremental\x18\x38 \x01(\x0b\x32\x36.livekit.proto.TextStreamReaderReadIncrementalResponseH\x00\x12G\n\rtext_read_all\x18\x39 \x01(\x0b\x32..livekit.proto.TextStreamReaderReadAllResponseH\x00\x12:\n\tsend_file\x18: \x01(\x0b\x32%.livekit.proto.StreamSendFileResponseH\x00\x12:\n\tsend_text\x18; \x01(\x0b\x32%.livekit.proto.StreamSendTextResponseH\x00\x12\x41\n\x10\x62yte_stream_open\x18< \x01(\x0b\x32%.livekit.proto.ByteStreamOpenResponseH\x00\x12I\n\x11\x62yte_stream_write\x18= \x01(\x0b\x32,.livekit.proto.ByteStreamWriterWriteResponseH\x00\x12I\n\x11\x62yte_stream_close\x18> \x01(\x0b\x32,.livekit.proto.ByteStreamWriterCloseResponseH\x00\x12\x41\n\x10text_stream_open\x18? \x01(\x0b\x32%.livekit.proto.TextStreamOpenResponseH\x00\x12I\n\x11text_stream_write\x18@ \x01(\x0b\x32,.livekit.proto.TextStreamWriterWriteResponseH\x00\x12I\n\x11text_stream_close\x18\x41 \x01(\x0b\x32,.livekit.proto.TextStreamWriterCloseResponseH\x00\x12<\n\nsend_bytes\x18\x42 \x01(\x0b\x32&.livekit.proto.StreamSendBytesResponseH\x00\x12g\n$set_remote_track_publication_quality\x18\x43 \x01(\x0b\x32\x37.livekit.proto.SetRemoteTrackPublicationQualityResponseH\x00\x12\x45\n\x12publish_data_track\x18\x44 \x01(\x0b\x32\'.livekit.proto.PublishDataTrackResponseH\x00\x12Q\n\x19local_data_track_try_push\x18\x45 \x01(\x0b\x32,.livekit.proto.LocalDataTrackTryPushResponseH\x00\x12T\n\x1alocal_data_track_unpublish\x18\x46 \x01(\x0b\x32..livekit.proto.LocalDataTrackUnpublishResponseH\x00\x12Y\n\x1dlocal_data_track_is_published\x18G \x01(\x0b\x32\x30.livekit.proto.LocalDataTrackIsPublishedResponseH\x00\x12I\n\x14subscribe_data_track\x18H \x01(\x0b\x32).livekit.proto.SubscribeDataTrackResponseH\x00\x12[\n\x1eremote_data_track_is_published\x18I \x01(\x0b\x32\x31.livekit.proto.RemoteDataTrackIsPublishedResponseH\x00\x12L\n\x16\x64\x61ta_track_stream_read\x18J \x01(\x0b\x32*.livekit.proto.DataTrackStreamReadResponseH\x00\x12\x44\n\x11simulate_scenario\x18K \x01(\x0b\x32\'.livekit.proto.SimulateScenarioResponseH\x00\x12\x45\n\x12new_platform_audio\x18L \x01(\x0b\x32\'.livekit.proto.NewPlatformAudioResponseH\x00\x12\x43\n\x11get_audio_devices\x18M \x01(\x0b\x32&.livekit.proto.GetAudioDevicesResponseH\x00\x12I\n\x14set_recording_device\x18N \x01(\x0b\x32).livekit.proto.SetRecordingDeviceResponseH\x00\x12\x45\n\x12set_playout_device\x18O \x01(\x0b\x32\'.livekit.proto.SetPlayoutDeviceResponseH\x00\x12@\n\x0fstart_recording\x18P \x01(\x0b\x32%.livekit.proto.StartRecordingResponseH\x00\x12>\n\x0estop_recording\x18Q \x01(\x0b\x32$.livekit.proto.StopRecordingResponseH\x00\x42\t\n\x07message\"\xda\x16\n\x08\x46\x66iEvent\x12.\n\nroom_event\x18\x01 \x01(\x0b\x32\x18.livekit.proto.RoomEventH\x00\x12\x30\n\x0btrack_event\x18\x02 \x01(\x0b\x32\x19.livekit.proto.TrackEventH\x00\x12=\n\x12video_stream_event\x18\x03 \x01(\x0b\x32\x1f.livekit.proto.VideoStreamEventH\x00\x12=\n\x12\x61udio_stream_event\x18\x04 \x01(\x0b\x32\x1f.livekit.proto.AudioStreamEventH\x00\x12\x31\n\x07\x63onnect\x18\x05 \x01(\x0b\x32\x1e.livekit.proto.ConnectCallbackH\x00\x12\x37\n\ndisconnect\x18\x07 \x01(\x0b\x32!.livekit.proto.DisconnectCallbackH\x00\x12\x31\n\x07\x64ispose\x18\x08 \x01(\x0b\x32\x1e.livekit.proto.DisposeCallbackH\x00\x12<\n\rpublish_track\x18\t \x01(\x0b\x32#.livekit.proto.PublishTrackCallbackH\x00\x12@\n\x0funpublish_track\x18\n \x01(\x0b\x32%.livekit.proto.UnpublishTrackCallbackH\x00\x12:\n\x0cpublish_data\x18\x0b \x01(\x0b\x32\".livekit.proto.PublishDataCallbackH\x00\x12L\n\x15publish_transcription\x18\x0c \x01(\x0b\x32+.livekit.proto.PublishTranscriptionCallbackH\x00\x12G\n\x13\x63\x61pture_audio_frame\x18\r \x01(\x0b\x32(.livekit.proto.CaptureAudioFrameCallbackH\x00\x12\x45\n\x12set_local_metadata\x18\x0e \x01(\x0b\x32\'.livekit.proto.SetLocalMetadataCallbackH\x00\x12=\n\x0eset_local_name\x18\x0f \x01(\x0b\x32#.livekit.proto.SetLocalNameCallbackH\x00\x12I\n\x14set_local_attributes\x18\x10 \x01(\x0b\x32).livekit.proto.SetLocalAttributesCallbackH\x00\x12\x34\n\tget_stats\x18\x11 \x01(\x0b\x32\x1f.livekit.proto.GetStatsCallbackH\x00\x12\'\n\x04logs\x18\x12 \x01(\x0b\x32\x17.livekit.proto.LogBatchH\x00\x12\x43\n\x11get_session_stats\x18\x13 \x01(\x0b\x32&.livekit.proto.GetSessionStatsCallbackH\x00\x12%\n\x05panic\x18\x14 \x01(\x0b\x32\x14.livekit.proto.PanicH\x00\x12\x41\n\x10publish_sip_dtmf\x18\x15 \x01(\x0b\x32%.livekit.proto.PublishSipDtmfCallbackH\x00\x12>\n\x0c\x63hat_message\x18\x16 \x01(\x0b\x32&.livekit.proto.SendChatMessageCallbackH\x00\x12\x38\n\x0bperform_rpc\x18\x17 \x01(\x0b\x32!.livekit.proto.PerformRpcCallbackH\x00\x12H\n\x15rpc_method_invocation\x18\x18 \x01(\x0b\x32\'.livekit.proto.RpcMethodInvocationEventH\x00\x12\x45\n\x12send_stream_header\x18\x19 \x01(\x0b\x32\'.livekit.proto.SendStreamHeaderCallbackH\x00\x12\x43\n\x11send_stream_chunk\x18\x1a \x01(\x0b\x32&.livekit.proto.SendStreamChunkCallbackH\x00\x12G\n\x13send_stream_trailer\x18\x1b \x01(\x0b\x32(.livekit.proto.SendStreamTrailerCallbackH\x00\x12H\n\x18\x62yte_stream_reader_event\x18\x1c \x01(\x0b\x32$.livekit.proto.ByteStreamReaderEventH\x00\x12U\n\x1b\x62yte_stream_reader_read_all\x18\x1d \x01(\x0b\x32..livekit.proto.ByteStreamReaderReadAllCallbackH\x00\x12^\n byte_stream_reader_write_to_file\x18\x1e \x01(\x0b\x32\x32.livekit.proto.ByteStreamReaderWriteToFileCallbackH\x00\x12\x41\n\x10\x62yte_stream_open\x18\x1f \x01(\x0b\x32%.livekit.proto.ByteStreamOpenCallbackH\x00\x12P\n\x18\x62yte_stream_writer_write\x18 \x01(\x0b\x32,.livekit.proto.ByteStreamWriterWriteCallbackH\x00\x12P\n\x18\x62yte_stream_writer_close\x18! \x01(\x0b\x32,.livekit.proto.ByteStreamWriterCloseCallbackH\x00\x12:\n\tsend_file\x18\" \x01(\x0b\x32%.livekit.proto.StreamSendFileCallbackH\x00\x12H\n\x18text_stream_reader_event\x18# \x01(\x0b\x32$.livekit.proto.TextStreamReaderEventH\x00\x12U\n\x1btext_stream_reader_read_all\x18$ \x01(\x0b\x32..livekit.proto.TextStreamReaderReadAllCallbackH\x00\x12\x41\n\x10text_stream_open\x18% \x01(\x0b\x32%.livekit.proto.TextStreamOpenCallbackH\x00\x12P\n\x18text_stream_writer_write\x18& \x01(\x0b\x32,.livekit.proto.TextStreamWriterWriteCallbackH\x00\x12P\n\x18text_stream_writer_close\x18\' \x01(\x0b\x32,.livekit.proto.TextStreamWriterCloseCallbackH\x00\x12:\n\tsend_text\x18( \x01(\x0b\x32%.livekit.proto.StreamSendTextCallbackH\x00\x12<\n\nsend_bytes\x18) \x01(\x0b\x32&.livekit.proto.StreamSendBytesCallbackH\x00\x12\x45\n\x12publish_data_track\x18* \x01(\x0b\x32\'.livekit.proto.PublishDataTrackCallbackH\x00\x12\x46\n\x17\x64\x61ta_track_stream_event\x18+ \x01(\x0b\x32#.livekit.proto.DataTrackStreamEventH\x00\x12\x44\n\x11simulate_scenario\x18, \x01(\x0b\x32\'.livekit.proto.SimulateScenarioCallbackH\x00\x42\t\n\x07message\"\x1f\n\x0e\x44isposeRequest\x12\r\n\x05\x61sync\x18\x01 \x02(\x08\"#\n\x0f\x44isposeResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x01(\x04\"#\n\x0f\x44isposeCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"\x85\x01\n\tLogRecord\x12&\n\x05level\x18\x01 \x02(\x0e\x32\x17.livekit.proto.LogLevel\x12\x0e\n\x06target\x18\x02 \x02(\t\x12\x13\n\x0bmodule_path\x18\x03 \x01(\t\x12\x0c\n\x04\x66ile\x18\x04 \x01(\t\x12\x0c\n\x04line\x18\x05 \x01(\r\x12\x0f\n\x07message\x18\x06 \x02(\t\"5\n\x08LogBatch\x12)\n\x07records\x18\x01 \x03(\x0b\x32\x18.livekit.proto.LogRecord\"\x18\n\x05Panic\x12\x0f\n\x07message\x18\x01 \x02(\t*S\n\x08LogLevel\x12\r\n\tLOG_ERROR\x10\x00\x12\x0c\n\x08LOG_WARN\x10\x01\x12\x0c\n\x08LOG_INFO\x10\x02\x12\r\n\tLOG_DEBUG\x10\x03\x12\r\n\tLOG_TRACE\x10\x04\x42\x10\xaa\x02\rLiveKit.Proto') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -31,24 +31,24 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['DESCRIPTOR']._options = None _globals['DESCRIPTOR']._serialized_options = b'\252\002\rLiveKit.Proto' - _globals['_LOGLEVEL']._serialized_start=14523 - _globals['_LOGLEVEL']._serialized_end=14606 + _globals['_LOGLEVEL']._serialized_start=15202 + _globals['_LOGLEVEL']._serialized_end=15285 _globals['_FFIREQUEST']._serialized_start=177 - _globals['_FFIREQUEST']._serialized_end=5727 - _globals['_FFIRESPONSE']._serialized_start=5730 - _globals['_FFIRESPONSE']._serialized_end=11288 - _globals['_FFIEVENT']._serialized_start=11291 - _globals['_FFIEVENT']._serialized_end=14197 - _globals['_DISPOSEREQUEST']._serialized_start=14199 - _globals['_DISPOSEREQUEST']._serialized_end=14230 - _globals['_DISPOSERESPONSE']._serialized_start=14232 - _globals['_DISPOSERESPONSE']._serialized_end=14267 - _globals['_DISPOSECALLBACK']._serialized_start=14269 - _globals['_DISPOSECALLBACK']._serialized_end=14304 - _globals['_LOGRECORD']._serialized_start=14307 - _globals['_LOGRECORD']._serialized_end=14440 - _globals['_LOGBATCH']._serialized_start=14442 - _globals['_LOGBATCH']._serialized_end=14495 - _globals['_PANIC']._serialized_start=14497 - _globals['_PANIC']._serialized_end=14521 + _globals['_FFIREQUEST']._serialized_end=6064 + _globals['_FFIRESPONSE']._serialized_start=6067 + _globals['_FFIRESPONSE']._serialized_end=11967 + _globals['_FFIEVENT']._serialized_start=11970 + _globals['_FFIEVENT']._serialized_end=14876 + _globals['_DISPOSEREQUEST']._serialized_start=14878 + _globals['_DISPOSEREQUEST']._serialized_end=14909 + _globals['_DISPOSERESPONSE']._serialized_start=14911 + _globals['_DISPOSERESPONSE']._serialized_end=14946 + _globals['_DISPOSECALLBACK']._serialized_start=14948 + _globals['_DISPOSECALLBACK']._serialized_end=14983 + _globals['_LOGRECORD']._serialized_start=14986 + _globals['_LOGRECORD']._serialized_end=15119 + _globals['_LOGBATCH']._serialized_start=15121 + _globals['_LOGBATCH']._serialized_end=15174 + _globals['_PANIC']._serialized_start=15176 + _globals['_PANIC']._serialized_end=15200 # @@protoc_insertion_point(module_scope) diff --git a/livekit-rtc/livekit/rtc/_proto/ffi_pb2.pyi b/livekit-rtc/livekit/rtc/_proto/ffi_pb2.pyi index d6ebf8ee..ebb3ff14 100644 --- a/livekit-rtc/livekit/rtc/_proto/ffi_pb2.pyi +++ b/livekit-rtc/livekit/rtc/_proto/ffi_pb2.pyi @@ -171,7 +171,12 @@ class FfiRequest(google.protobuf.message.Message): REMOTE_DATA_TRACK_IS_PUBLISHED_FIELD_NUMBER: builtins.int DATA_TRACK_STREAM_READ_FIELD_NUMBER: builtins.int SIMULATE_SCENARIO_FIELD_NUMBER: builtins.int - READY_FOR_ROOM_EVENT_FIELD_NUMBER: builtins.int + NEW_PLATFORM_AUDIO_FIELD_NUMBER: builtins.int + GET_AUDIO_DEVICES_FIELD_NUMBER: builtins.int + SET_RECORDING_DEVICE_FIELD_NUMBER: builtins.int + SET_PLAYOUT_DEVICE_FIELD_NUMBER: builtins.int + START_RECORDING_FIELD_NUMBER: builtins.int + STOP_RECORDING_FIELD_NUMBER: builtins.int @property def dispose(self) -> global___DisposeRequest: ... @property @@ -349,9 +354,19 @@ class FfiRequest(google.protobuf.message.Message): """Reconnection / chaos testing""" @property - def ready_for_room_event(self) -> room_pb2.ReadyForRoomEventRequest: - """Room event ready handshake""" + def new_platform_audio(self) -> audio_frame_pb2.NewPlatformAudioRequest: + """Platform Audio (ADM)""" + @property + def get_audio_devices(self) -> audio_frame_pb2.GetAudioDevicesRequest: ... + @property + def set_recording_device(self) -> audio_frame_pb2.SetRecordingDeviceRequest: ... + @property + def set_playout_device(self) -> audio_frame_pb2.SetPlayoutDeviceRequest: ... + @property + def start_recording(self) -> audio_frame_pb2.StartRecordingRequest: ... + @property + def stop_recording(self) -> audio_frame_pb2.StopRecordingRequest: ... def __init__( self, *, @@ -430,11 +445,16 @@ class FfiRequest(google.protobuf.message.Message): remote_data_track_is_published: data_track_pb2.RemoteDataTrackIsPublishedRequest | None = ..., data_track_stream_read: data_track_pb2.DataTrackStreamReadRequest | None = ..., simulate_scenario: room_pb2.SimulateScenarioRequest | None = ..., - ready_for_room_event: room_pb2.ReadyForRoomEventRequest | None = ..., + new_platform_audio: audio_frame_pb2.NewPlatformAudioRequest | None = ..., + get_audio_devices: audio_frame_pb2.GetAudioDevicesRequest | None = ..., + set_recording_device: audio_frame_pb2.SetRecordingDeviceRequest | None = ..., + set_playout_device: audio_frame_pb2.SetPlayoutDeviceRequest | None = ..., + start_recording: audio_frame_pb2.StartRecordingRequest | None = ..., + stop_recording: audio_frame_pb2.StopRecordingRequest | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["apm_process_reverse_stream", b"apm_process_reverse_stream", "apm_process_stream", b"apm_process_stream", "apm_set_stream_delay", b"apm_set_stream_delay", "audio_stream_from_participant", b"audio_stream_from_participant", "byte_read_all", b"byte_read_all", "byte_read_incremental", b"byte_read_incremental", "byte_stream_close", b"byte_stream_close", "byte_stream_open", b"byte_stream_open", "byte_stream_write", b"byte_stream_write", "byte_write_to_file", b"byte_write_to_file", "capture_audio_frame", b"capture_audio_frame", "capture_video_frame", b"capture_video_frame", "clear_audio_buffer", b"clear_audio_buffer", "connect", b"connect", "create_audio_track", b"create_audio_track", "create_video_track", b"create_video_track", "data_track_stream_read", b"data_track_stream_read", "disconnect", b"disconnect", "dispose", b"dispose", "e2ee", b"e2ee", "edit_chat_message", b"edit_chat_message", "enable_remote_track", b"enable_remote_track", "enable_remote_track_publication", b"enable_remote_track_publication", "flush_sox_resampler", b"flush_sox_resampler", "get_session_stats", b"get_session_stats", "get_stats", b"get_stats", "load_audio_filter_plugin", b"load_audio_filter_plugin", "local_data_track_is_published", b"local_data_track_is_published", "local_data_track_try_push", b"local_data_track_try_push", "local_data_track_unpublish", b"local_data_track_unpublish", "local_track_mute", b"local_track_mute", "message", b"message", "new_apm", b"new_apm", "new_audio_resampler", b"new_audio_resampler", "new_audio_source", b"new_audio_source", "new_audio_stream", b"new_audio_stream", "new_sox_resampler", b"new_sox_resampler", "new_video_source", b"new_video_source", "new_video_stream", b"new_video_stream", "perform_rpc", b"perform_rpc", "publish_data", b"publish_data", "publish_data_track", b"publish_data_track", "publish_sip_dtmf", b"publish_sip_dtmf", "publish_track", b"publish_track", "publish_transcription", b"publish_transcription", "push_sox_resampler", b"push_sox_resampler", "ready_for_room_event", b"ready_for_room_event", "register_rpc_method", b"register_rpc_method", "remix_and_resample", b"remix_and_resample", "remote_data_track_is_published", b"remote_data_track_is_published", "rpc_method_invocation_response", b"rpc_method_invocation_response", "send_bytes", b"send_bytes", "send_chat_message", b"send_chat_message", "send_file", b"send_file", "send_stream_chunk", b"send_stream_chunk", "send_stream_header", b"send_stream_header", "send_stream_trailer", b"send_stream_trailer", "send_text", b"send_text", "set_data_channel_buffered_amount_low_threshold", b"set_data_channel_buffered_amount_low_threshold", "set_local_attributes", b"set_local_attributes", "set_local_metadata", b"set_local_metadata", "set_local_name", b"set_local_name", "set_remote_track_publication_quality", b"set_remote_track_publication_quality", "set_subscribed", b"set_subscribed", "set_track_subscription_permissions", b"set_track_subscription_permissions", "simulate_scenario", b"simulate_scenario", "subscribe_data_track", b"subscribe_data_track", "text_read_all", b"text_read_all", "text_read_incremental", b"text_read_incremental", "text_stream_close", b"text_stream_close", "text_stream_open", b"text_stream_open", "text_stream_write", b"text_stream_write", "unpublish_track", b"unpublish_track", "unregister_rpc_method", b"unregister_rpc_method", "update_remote_track_publication_dimension", b"update_remote_track_publication_dimension", "video_convert", b"video_convert", "video_stream_from_participant", b"video_stream_from_participant"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["apm_process_reverse_stream", b"apm_process_reverse_stream", "apm_process_stream", b"apm_process_stream", "apm_set_stream_delay", b"apm_set_stream_delay", "audio_stream_from_participant", b"audio_stream_from_participant", "byte_read_all", b"byte_read_all", "byte_read_incremental", b"byte_read_incremental", "byte_stream_close", b"byte_stream_close", "byte_stream_open", b"byte_stream_open", "byte_stream_write", b"byte_stream_write", "byte_write_to_file", b"byte_write_to_file", "capture_audio_frame", b"capture_audio_frame", "capture_video_frame", b"capture_video_frame", "clear_audio_buffer", b"clear_audio_buffer", "connect", b"connect", "create_audio_track", b"create_audio_track", "create_video_track", b"create_video_track", "data_track_stream_read", b"data_track_stream_read", "disconnect", b"disconnect", "dispose", b"dispose", "e2ee", b"e2ee", "edit_chat_message", b"edit_chat_message", "enable_remote_track", b"enable_remote_track", "enable_remote_track_publication", b"enable_remote_track_publication", "flush_sox_resampler", b"flush_sox_resampler", "get_session_stats", b"get_session_stats", "get_stats", b"get_stats", "load_audio_filter_plugin", b"load_audio_filter_plugin", "local_data_track_is_published", b"local_data_track_is_published", "local_data_track_try_push", b"local_data_track_try_push", "local_data_track_unpublish", b"local_data_track_unpublish", "local_track_mute", b"local_track_mute", "message", b"message", "new_apm", b"new_apm", "new_audio_resampler", b"new_audio_resampler", "new_audio_source", b"new_audio_source", "new_audio_stream", b"new_audio_stream", "new_sox_resampler", b"new_sox_resampler", "new_video_source", b"new_video_source", "new_video_stream", b"new_video_stream", "perform_rpc", b"perform_rpc", "publish_data", b"publish_data", "publish_data_track", b"publish_data_track", "publish_sip_dtmf", b"publish_sip_dtmf", "publish_track", b"publish_track", "publish_transcription", b"publish_transcription", "push_sox_resampler", b"push_sox_resampler", "ready_for_room_event", b"ready_for_room_event", "register_rpc_method", b"register_rpc_method", "remix_and_resample", b"remix_and_resample", "remote_data_track_is_published", b"remote_data_track_is_published", "rpc_method_invocation_response", b"rpc_method_invocation_response", "send_bytes", b"send_bytes", "send_chat_message", b"send_chat_message", "send_file", b"send_file", "send_stream_chunk", b"send_stream_chunk", "send_stream_header", b"send_stream_header", "send_stream_trailer", b"send_stream_trailer", "send_text", b"send_text", "set_data_channel_buffered_amount_low_threshold", b"set_data_channel_buffered_amount_low_threshold", "set_local_attributes", b"set_local_attributes", "set_local_metadata", b"set_local_metadata", "set_local_name", b"set_local_name", "set_remote_track_publication_quality", b"set_remote_track_publication_quality", "set_subscribed", b"set_subscribed", "set_track_subscription_permissions", b"set_track_subscription_permissions", "simulate_scenario", b"simulate_scenario", "subscribe_data_track", b"subscribe_data_track", "text_read_all", b"text_read_all", "text_read_incremental", b"text_read_incremental", "text_stream_close", b"text_stream_close", "text_stream_open", b"text_stream_open", "text_stream_write", b"text_stream_write", "unpublish_track", b"unpublish_track", "unregister_rpc_method", b"unregister_rpc_method", "update_remote_track_publication_dimension", b"update_remote_track_publication_dimension", "video_convert", b"video_convert", "video_stream_from_participant", b"video_stream_from_participant"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["message", b"message"]) -> typing.Literal["dispose", "connect", "disconnect", "publish_track", "unpublish_track", "publish_data", "set_subscribed", "set_local_metadata", "set_local_name", "set_local_attributes", "get_session_stats", "publish_transcription", "publish_sip_dtmf", "create_video_track", "create_audio_track", "local_track_mute", "enable_remote_track", "get_stats", "set_track_subscription_permissions", "new_video_stream", "new_video_source", "capture_video_frame", "video_convert", "video_stream_from_participant", "new_audio_stream", "new_audio_source", "capture_audio_frame", "clear_audio_buffer", "new_audio_resampler", "remix_and_resample", "e2ee", "audio_stream_from_participant", "new_sox_resampler", "push_sox_resampler", "flush_sox_resampler", "send_chat_message", "edit_chat_message", "perform_rpc", "register_rpc_method", "unregister_rpc_method", "rpc_method_invocation_response", "enable_remote_track_publication", "update_remote_track_publication_dimension", "send_stream_header", "send_stream_chunk", "send_stream_trailer", "set_data_channel_buffered_amount_low_threshold", "load_audio_filter_plugin", "new_apm", "apm_process_stream", "apm_process_reverse_stream", "apm_set_stream_delay", "byte_read_incremental", "byte_read_all", "byte_write_to_file", "text_read_incremental", "text_read_all", "send_file", "send_text", "byte_stream_open", "byte_stream_write", "byte_stream_close", "text_stream_open", "text_stream_write", "text_stream_close", "send_bytes", "set_remote_track_publication_quality", "publish_data_track", "local_data_track_try_push", "local_data_track_unpublish", "local_data_track_is_published", "subscribe_data_track", "remote_data_track_is_published", "data_track_stream_read", "simulate_scenario", "ready_for_room_event"] | None: ... + def HasField(self, field_name: typing.Literal["apm_process_reverse_stream", b"apm_process_reverse_stream", "apm_process_stream", b"apm_process_stream", "apm_set_stream_delay", b"apm_set_stream_delay", "audio_stream_from_participant", b"audio_stream_from_participant", "byte_read_all", b"byte_read_all", "byte_read_incremental", b"byte_read_incremental", "byte_stream_close", b"byte_stream_close", "byte_stream_open", b"byte_stream_open", "byte_stream_write", b"byte_stream_write", "byte_write_to_file", b"byte_write_to_file", "capture_audio_frame", b"capture_audio_frame", "capture_video_frame", b"capture_video_frame", "clear_audio_buffer", b"clear_audio_buffer", "connect", b"connect", "create_audio_track", b"create_audio_track", "create_video_track", b"create_video_track", "data_track_stream_read", b"data_track_stream_read", "disconnect", b"disconnect", "dispose", b"dispose", "e2ee", b"e2ee", "edit_chat_message", b"edit_chat_message", "enable_remote_track", b"enable_remote_track", "enable_remote_track_publication", b"enable_remote_track_publication", "flush_sox_resampler", b"flush_sox_resampler", "get_audio_devices", b"get_audio_devices", "get_session_stats", b"get_session_stats", "get_stats", b"get_stats", "load_audio_filter_plugin", b"load_audio_filter_plugin", "local_data_track_is_published", b"local_data_track_is_published", "local_data_track_try_push", b"local_data_track_try_push", "local_data_track_unpublish", b"local_data_track_unpublish", "local_track_mute", b"local_track_mute", "message", b"message", "new_apm", b"new_apm", "new_audio_resampler", b"new_audio_resampler", "new_audio_source", b"new_audio_source", "new_audio_stream", b"new_audio_stream", "new_platform_audio", b"new_platform_audio", "new_sox_resampler", b"new_sox_resampler", "new_video_source", b"new_video_source", "new_video_stream", b"new_video_stream", "perform_rpc", b"perform_rpc", "publish_data", b"publish_data", "publish_data_track", b"publish_data_track", "publish_sip_dtmf", b"publish_sip_dtmf", "publish_track", b"publish_track", "publish_transcription", b"publish_transcription", "push_sox_resampler", b"push_sox_resampler", "register_rpc_method", b"register_rpc_method", "remix_and_resample", b"remix_and_resample", "remote_data_track_is_published", b"remote_data_track_is_published", "rpc_method_invocation_response", b"rpc_method_invocation_response", "send_bytes", b"send_bytes", "send_chat_message", b"send_chat_message", "send_file", b"send_file", "send_stream_chunk", b"send_stream_chunk", "send_stream_header", b"send_stream_header", "send_stream_trailer", b"send_stream_trailer", "send_text", b"send_text", "set_data_channel_buffered_amount_low_threshold", b"set_data_channel_buffered_amount_low_threshold", "set_local_attributes", b"set_local_attributes", "set_local_metadata", b"set_local_metadata", "set_local_name", b"set_local_name", "set_playout_device", b"set_playout_device", "set_recording_device", b"set_recording_device", "set_remote_track_publication_quality", b"set_remote_track_publication_quality", "set_subscribed", b"set_subscribed", "set_track_subscription_permissions", b"set_track_subscription_permissions", "simulate_scenario", b"simulate_scenario", "start_recording", b"start_recording", "stop_recording", b"stop_recording", "subscribe_data_track", b"subscribe_data_track", "text_read_all", b"text_read_all", "text_read_incremental", b"text_read_incremental", "text_stream_close", b"text_stream_close", "text_stream_open", b"text_stream_open", "text_stream_write", b"text_stream_write", "unpublish_track", b"unpublish_track", "unregister_rpc_method", b"unregister_rpc_method", "update_remote_track_publication_dimension", b"update_remote_track_publication_dimension", "video_convert", b"video_convert", "video_stream_from_participant", b"video_stream_from_participant"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["apm_process_reverse_stream", b"apm_process_reverse_stream", "apm_process_stream", b"apm_process_stream", "apm_set_stream_delay", b"apm_set_stream_delay", "audio_stream_from_participant", b"audio_stream_from_participant", "byte_read_all", b"byte_read_all", "byte_read_incremental", b"byte_read_incremental", "byte_stream_close", b"byte_stream_close", "byte_stream_open", b"byte_stream_open", "byte_stream_write", b"byte_stream_write", "byte_write_to_file", b"byte_write_to_file", "capture_audio_frame", b"capture_audio_frame", "capture_video_frame", b"capture_video_frame", "clear_audio_buffer", b"clear_audio_buffer", "connect", b"connect", "create_audio_track", b"create_audio_track", "create_video_track", b"create_video_track", "data_track_stream_read", b"data_track_stream_read", "disconnect", b"disconnect", "dispose", b"dispose", "e2ee", b"e2ee", "edit_chat_message", b"edit_chat_message", "enable_remote_track", b"enable_remote_track", "enable_remote_track_publication", b"enable_remote_track_publication", "flush_sox_resampler", b"flush_sox_resampler", "get_audio_devices", b"get_audio_devices", "get_session_stats", b"get_session_stats", "get_stats", b"get_stats", "load_audio_filter_plugin", b"load_audio_filter_plugin", "local_data_track_is_published", b"local_data_track_is_published", "local_data_track_try_push", b"local_data_track_try_push", "local_data_track_unpublish", b"local_data_track_unpublish", "local_track_mute", b"local_track_mute", "message", b"message", "new_apm", b"new_apm", "new_audio_resampler", b"new_audio_resampler", "new_audio_source", b"new_audio_source", "new_audio_stream", b"new_audio_stream", "new_platform_audio", b"new_platform_audio", "new_sox_resampler", b"new_sox_resampler", "new_video_source", b"new_video_source", "new_video_stream", b"new_video_stream", "perform_rpc", b"perform_rpc", "publish_data", b"publish_data", "publish_data_track", b"publish_data_track", "publish_sip_dtmf", b"publish_sip_dtmf", "publish_track", b"publish_track", "publish_transcription", b"publish_transcription", "push_sox_resampler", b"push_sox_resampler", "register_rpc_method", b"register_rpc_method", "remix_and_resample", b"remix_and_resample", "remote_data_track_is_published", b"remote_data_track_is_published", "rpc_method_invocation_response", b"rpc_method_invocation_response", "send_bytes", b"send_bytes", "send_chat_message", b"send_chat_message", "send_file", b"send_file", "send_stream_chunk", b"send_stream_chunk", "send_stream_header", b"send_stream_header", "send_stream_trailer", b"send_stream_trailer", "send_text", b"send_text", "set_data_channel_buffered_amount_low_threshold", b"set_data_channel_buffered_amount_low_threshold", "set_local_attributes", b"set_local_attributes", "set_local_metadata", b"set_local_metadata", "set_local_name", b"set_local_name", "set_playout_device", b"set_playout_device", "set_recording_device", b"set_recording_device", "set_remote_track_publication_quality", b"set_remote_track_publication_quality", "set_subscribed", b"set_subscribed", "set_track_subscription_permissions", b"set_track_subscription_permissions", "simulate_scenario", b"simulate_scenario", "start_recording", b"start_recording", "stop_recording", b"stop_recording", "subscribe_data_track", b"subscribe_data_track", "text_read_all", b"text_read_all", "text_read_incremental", b"text_read_incremental", "text_stream_close", b"text_stream_close", "text_stream_open", b"text_stream_open", "text_stream_write", b"text_stream_write", "unpublish_track", b"unpublish_track", "unregister_rpc_method", b"unregister_rpc_method", "update_remote_track_publication_dimension", b"update_remote_track_publication_dimension", "video_convert", b"video_convert", "video_stream_from_participant", b"video_stream_from_participant"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["message", b"message"]) -> typing.Literal["dispose", "connect", "disconnect", "publish_track", "unpublish_track", "publish_data", "set_subscribed", "set_local_metadata", "set_local_name", "set_local_attributes", "get_session_stats", "publish_transcription", "publish_sip_dtmf", "create_video_track", "create_audio_track", "local_track_mute", "enable_remote_track", "get_stats", "set_track_subscription_permissions", "new_video_stream", "new_video_source", "capture_video_frame", "video_convert", "video_stream_from_participant", "new_audio_stream", "new_audio_source", "capture_audio_frame", "clear_audio_buffer", "new_audio_resampler", "remix_and_resample", "e2ee", "audio_stream_from_participant", "new_sox_resampler", "push_sox_resampler", "flush_sox_resampler", "send_chat_message", "edit_chat_message", "perform_rpc", "register_rpc_method", "unregister_rpc_method", "rpc_method_invocation_response", "enable_remote_track_publication", "update_remote_track_publication_dimension", "send_stream_header", "send_stream_chunk", "send_stream_trailer", "set_data_channel_buffered_amount_low_threshold", "load_audio_filter_plugin", "new_apm", "apm_process_stream", "apm_process_reverse_stream", "apm_set_stream_delay", "byte_read_incremental", "byte_read_all", "byte_write_to_file", "text_read_incremental", "text_read_all", "send_file", "send_text", "byte_stream_open", "byte_stream_write", "byte_stream_close", "text_stream_open", "text_stream_write", "text_stream_close", "send_bytes", "set_remote_track_publication_quality", "publish_data_track", "local_data_track_try_push", "local_data_track_unpublish", "local_data_track_is_published", "subscribe_data_track", "remote_data_track_is_published", "data_track_stream_read", "simulate_scenario", "new_platform_audio", "get_audio_devices", "set_recording_device", "set_playout_device", "start_recording", "stop_recording"] | None: ... global___FfiRequest = FfiRequest @@ -518,7 +538,12 @@ class FfiResponse(google.protobuf.message.Message): REMOTE_DATA_TRACK_IS_PUBLISHED_FIELD_NUMBER: builtins.int DATA_TRACK_STREAM_READ_FIELD_NUMBER: builtins.int SIMULATE_SCENARIO_FIELD_NUMBER: builtins.int - READY_FOR_ROOM_EVENT_FIELD_NUMBER: builtins.int + NEW_PLATFORM_AUDIO_FIELD_NUMBER: builtins.int + GET_AUDIO_DEVICES_FIELD_NUMBER: builtins.int + SET_RECORDING_DEVICE_FIELD_NUMBER: builtins.int + SET_PLAYOUT_DEVICE_FIELD_NUMBER: builtins.int + START_RECORDING_FIELD_NUMBER: builtins.int + STOP_RECORDING_FIELD_NUMBER: builtins.int @property def dispose(self) -> global___DisposeResponse: ... @property @@ -694,9 +719,19 @@ class FfiResponse(google.protobuf.message.Message): """Reconnection / chaos testing""" @property - def ready_for_room_event(self) -> room_pb2.ReadyForRoomEventResponse: - """Room event ready handshake""" + def new_platform_audio(self) -> audio_frame_pb2.NewPlatformAudioResponse: + """Platform Audio (ADM)""" + @property + def get_audio_devices(self) -> audio_frame_pb2.GetAudioDevicesResponse: ... + @property + def set_recording_device(self) -> audio_frame_pb2.SetRecordingDeviceResponse: ... + @property + def set_playout_device(self) -> audio_frame_pb2.SetPlayoutDeviceResponse: ... + @property + def start_recording(self) -> audio_frame_pb2.StartRecordingResponse: ... + @property + def stop_recording(self) -> audio_frame_pb2.StopRecordingResponse: ... def __init__( self, *, @@ -774,11 +809,16 @@ class FfiResponse(google.protobuf.message.Message): remote_data_track_is_published: data_track_pb2.RemoteDataTrackIsPublishedResponse | None = ..., data_track_stream_read: data_track_pb2.DataTrackStreamReadResponse | None = ..., simulate_scenario: room_pb2.SimulateScenarioResponse | None = ..., - ready_for_room_event: room_pb2.ReadyForRoomEventResponse | None = ..., + new_platform_audio: audio_frame_pb2.NewPlatformAudioResponse | None = ..., + get_audio_devices: audio_frame_pb2.GetAudioDevicesResponse | None = ..., + set_recording_device: audio_frame_pb2.SetRecordingDeviceResponse | None = ..., + set_playout_device: audio_frame_pb2.SetPlayoutDeviceResponse | None = ..., + start_recording: audio_frame_pb2.StartRecordingResponse | None = ..., + stop_recording: audio_frame_pb2.StopRecordingResponse | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["apm_process_reverse_stream", b"apm_process_reverse_stream", "apm_process_stream", b"apm_process_stream", "apm_set_stream_delay", b"apm_set_stream_delay", "audio_stream_from_participant", b"audio_stream_from_participant", "byte_read_all", b"byte_read_all", "byte_read_incremental", b"byte_read_incremental", "byte_stream_close", b"byte_stream_close", "byte_stream_open", b"byte_stream_open", "byte_stream_write", b"byte_stream_write", "byte_write_to_file", b"byte_write_to_file", "capture_audio_frame", b"capture_audio_frame", "capture_video_frame", b"capture_video_frame", "clear_audio_buffer", b"clear_audio_buffer", "connect", b"connect", "create_audio_track", b"create_audio_track", "create_video_track", b"create_video_track", "data_track_stream_read", b"data_track_stream_read", "disconnect", b"disconnect", "dispose", b"dispose", "e2ee", b"e2ee", "enable_remote_track", b"enable_remote_track", "enable_remote_track_publication", b"enable_remote_track_publication", "flush_sox_resampler", b"flush_sox_resampler", "get_session_stats", b"get_session_stats", "get_stats", b"get_stats", "load_audio_filter_plugin", b"load_audio_filter_plugin", "local_data_track_is_published", b"local_data_track_is_published", "local_data_track_try_push", b"local_data_track_try_push", "local_data_track_unpublish", b"local_data_track_unpublish", "local_track_mute", b"local_track_mute", "message", b"message", "new_apm", b"new_apm", "new_audio_resampler", b"new_audio_resampler", "new_audio_source", b"new_audio_source", "new_audio_stream", b"new_audio_stream", "new_sox_resampler", b"new_sox_resampler", "new_video_source", b"new_video_source", "new_video_stream", b"new_video_stream", "perform_rpc", b"perform_rpc", "publish_data", b"publish_data", "publish_data_track", b"publish_data_track", "publish_sip_dtmf", b"publish_sip_dtmf", "publish_track", b"publish_track", "publish_transcription", b"publish_transcription", "push_sox_resampler", b"push_sox_resampler", "ready_for_room_event", b"ready_for_room_event", "register_rpc_method", b"register_rpc_method", "remix_and_resample", b"remix_and_resample", "remote_data_track_is_published", b"remote_data_track_is_published", "rpc_method_invocation_response", b"rpc_method_invocation_response", "send_bytes", b"send_bytes", "send_chat_message", b"send_chat_message", "send_file", b"send_file", "send_stream_chunk", b"send_stream_chunk", "send_stream_header", b"send_stream_header", "send_stream_trailer", b"send_stream_trailer", "send_text", b"send_text", "set_data_channel_buffered_amount_low_threshold", b"set_data_channel_buffered_amount_low_threshold", "set_local_attributes", b"set_local_attributes", "set_local_metadata", b"set_local_metadata", "set_local_name", b"set_local_name", "set_remote_track_publication_quality", b"set_remote_track_publication_quality", "set_subscribed", b"set_subscribed", "set_track_subscription_permissions", b"set_track_subscription_permissions", "simulate_scenario", b"simulate_scenario", "subscribe_data_track", b"subscribe_data_track", "text_read_all", b"text_read_all", "text_read_incremental", b"text_read_incremental", "text_stream_close", b"text_stream_close", "text_stream_open", b"text_stream_open", "text_stream_write", b"text_stream_write", "unpublish_track", b"unpublish_track", "unregister_rpc_method", b"unregister_rpc_method", "update_remote_track_publication_dimension", b"update_remote_track_publication_dimension", "video_convert", b"video_convert", "video_stream_from_participant", b"video_stream_from_participant"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["apm_process_reverse_stream", b"apm_process_reverse_stream", "apm_process_stream", b"apm_process_stream", "apm_set_stream_delay", b"apm_set_stream_delay", "audio_stream_from_participant", b"audio_stream_from_participant", "byte_read_all", b"byte_read_all", "byte_read_incremental", b"byte_read_incremental", "byte_stream_close", b"byte_stream_close", "byte_stream_open", b"byte_stream_open", "byte_stream_write", b"byte_stream_write", "byte_write_to_file", b"byte_write_to_file", "capture_audio_frame", b"capture_audio_frame", "capture_video_frame", b"capture_video_frame", "clear_audio_buffer", b"clear_audio_buffer", "connect", b"connect", "create_audio_track", b"create_audio_track", "create_video_track", b"create_video_track", "data_track_stream_read", b"data_track_stream_read", "disconnect", b"disconnect", "dispose", b"dispose", "e2ee", b"e2ee", "enable_remote_track", b"enable_remote_track", "enable_remote_track_publication", b"enable_remote_track_publication", "flush_sox_resampler", b"flush_sox_resampler", "get_session_stats", b"get_session_stats", "get_stats", b"get_stats", "load_audio_filter_plugin", b"load_audio_filter_plugin", "local_data_track_is_published", b"local_data_track_is_published", "local_data_track_try_push", b"local_data_track_try_push", "local_data_track_unpublish", b"local_data_track_unpublish", "local_track_mute", b"local_track_mute", "message", b"message", "new_apm", b"new_apm", "new_audio_resampler", b"new_audio_resampler", "new_audio_source", b"new_audio_source", "new_audio_stream", b"new_audio_stream", "new_sox_resampler", b"new_sox_resampler", "new_video_source", b"new_video_source", "new_video_stream", b"new_video_stream", "perform_rpc", b"perform_rpc", "publish_data", b"publish_data", "publish_data_track", b"publish_data_track", "publish_sip_dtmf", b"publish_sip_dtmf", "publish_track", b"publish_track", "publish_transcription", b"publish_transcription", "push_sox_resampler", b"push_sox_resampler", "ready_for_room_event", b"ready_for_room_event", "register_rpc_method", b"register_rpc_method", "remix_and_resample", b"remix_and_resample", "remote_data_track_is_published", b"remote_data_track_is_published", "rpc_method_invocation_response", b"rpc_method_invocation_response", "send_bytes", b"send_bytes", "send_chat_message", b"send_chat_message", "send_file", b"send_file", "send_stream_chunk", b"send_stream_chunk", "send_stream_header", b"send_stream_header", "send_stream_trailer", b"send_stream_trailer", "send_text", b"send_text", "set_data_channel_buffered_amount_low_threshold", b"set_data_channel_buffered_amount_low_threshold", "set_local_attributes", b"set_local_attributes", "set_local_metadata", b"set_local_metadata", "set_local_name", b"set_local_name", "set_remote_track_publication_quality", b"set_remote_track_publication_quality", "set_subscribed", b"set_subscribed", "set_track_subscription_permissions", b"set_track_subscription_permissions", "simulate_scenario", b"simulate_scenario", "subscribe_data_track", b"subscribe_data_track", "text_read_all", b"text_read_all", "text_read_incremental", b"text_read_incremental", "text_stream_close", b"text_stream_close", "text_stream_open", b"text_stream_open", "text_stream_write", b"text_stream_write", "unpublish_track", b"unpublish_track", "unregister_rpc_method", b"unregister_rpc_method", "update_remote_track_publication_dimension", b"update_remote_track_publication_dimension", "video_convert", b"video_convert", "video_stream_from_participant", b"video_stream_from_participant"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["message", b"message"]) -> typing.Literal["dispose", "connect", "disconnect", "publish_track", "unpublish_track", "publish_data", "set_subscribed", "set_local_metadata", "set_local_name", "set_local_attributes", "get_session_stats", "publish_transcription", "publish_sip_dtmf", "create_video_track", "create_audio_track", "local_track_mute", "enable_remote_track", "get_stats", "set_track_subscription_permissions", "new_video_stream", "new_video_source", "capture_video_frame", "video_convert", "video_stream_from_participant", "new_audio_stream", "new_audio_source", "capture_audio_frame", "clear_audio_buffer", "new_audio_resampler", "remix_and_resample", "audio_stream_from_participant", "e2ee", "new_sox_resampler", "push_sox_resampler", "flush_sox_resampler", "send_chat_message", "perform_rpc", "register_rpc_method", "unregister_rpc_method", "rpc_method_invocation_response", "enable_remote_track_publication", "update_remote_track_publication_dimension", "send_stream_header", "send_stream_chunk", "send_stream_trailer", "set_data_channel_buffered_amount_low_threshold", "load_audio_filter_plugin", "new_apm", "apm_process_stream", "apm_process_reverse_stream", "apm_set_stream_delay", "byte_read_incremental", "byte_read_all", "byte_write_to_file", "text_read_incremental", "text_read_all", "send_file", "send_text", "byte_stream_open", "byte_stream_write", "byte_stream_close", "text_stream_open", "text_stream_write", "text_stream_close", "send_bytes", "set_remote_track_publication_quality", "publish_data_track", "local_data_track_try_push", "local_data_track_unpublish", "local_data_track_is_published", "subscribe_data_track", "remote_data_track_is_published", "data_track_stream_read", "simulate_scenario", "ready_for_room_event"] | None: ... + def HasField(self, field_name: typing.Literal["apm_process_reverse_stream", b"apm_process_reverse_stream", "apm_process_stream", b"apm_process_stream", "apm_set_stream_delay", b"apm_set_stream_delay", "audio_stream_from_participant", b"audio_stream_from_participant", "byte_read_all", b"byte_read_all", "byte_read_incremental", b"byte_read_incremental", "byte_stream_close", b"byte_stream_close", "byte_stream_open", b"byte_stream_open", "byte_stream_write", b"byte_stream_write", "byte_write_to_file", b"byte_write_to_file", "capture_audio_frame", b"capture_audio_frame", "capture_video_frame", b"capture_video_frame", "clear_audio_buffer", b"clear_audio_buffer", "connect", b"connect", "create_audio_track", b"create_audio_track", "create_video_track", b"create_video_track", "data_track_stream_read", b"data_track_stream_read", "disconnect", b"disconnect", "dispose", b"dispose", "e2ee", b"e2ee", "enable_remote_track", b"enable_remote_track", "enable_remote_track_publication", b"enable_remote_track_publication", "flush_sox_resampler", b"flush_sox_resampler", "get_audio_devices", b"get_audio_devices", "get_session_stats", b"get_session_stats", "get_stats", b"get_stats", "load_audio_filter_plugin", b"load_audio_filter_plugin", "local_data_track_is_published", b"local_data_track_is_published", "local_data_track_try_push", b"local_data_track_try_push", "local_data_track_unpublish", b"local_data_track_unpublish", "local_track_mute", b"local_track_mute", "message", b"message", "new_apm", b"new_apm", "new_audio_resampler", b"new_audio_resampler", "new_audio_source", b"new_audio_source", "new_audio_stream", b"new_audio_stream", "new_platform_audio", b"new_platform_audio", "new_sox_resampler", b"new_sox_resampler", "new_video_source", b"new_video_source", "new_video_stream", b"new_video_stream", "perform_rpc", b"perform_rpc", "publish_data", b"publish_data", "publish_data_track", b"publish_data_track", "publish_sip_dtmf", b"publish_sip_dtmf", "publish_track", b"publish_track", "publish_transcription", b"publish_transcription", "push_sox_resampler", b"push_sox_resampler", "register_rpc_method", b"register_rpc_method", "remix_and_resample", b"remix_and_resample", "remote_data_track_is_published", b"remote_data_track_is_published", "rpc_method_invocation_response", b"rpc_method_invocation_response", "send_bytes", b"send_bytes", "send_chat_message", b"send_chat_message", "send_file", b"send_file", "send_stream_chunk", b"send_stream_chunk", "send_stream_header", b"send_stream_header", "send_stream_trailer", b"send_stream_trailer", "send_text", b"send_text", "set_data_channel_buffered_amount_low_threshold", b"set_data_channel_buffered_amount_low_threshold", "set_local_attributes", b"set_local_attributes", "set_local_metadata", b"set_local_metadata", "set_local_name", b"set_local_name", "set_playout_device", b"set_playout_device", "set_recording_device", b"set_recording_device", "set_remote_track_publication_quality", b"set_remote_track_publication_quality", "set_subscribed", b"set_subscribed", "set_track_subscription_permissions", b"set_track_subscription_permissions", "simulate_scenario", b"simulate_scenario", "start_recording", b"start_recording", "stop_recording", b"stop_recording", "subscribe_data_track", b"subscribe_data_track", "text_read_all", b"text_read_all", "text_read_incremental", b"text_read_incremental", "text_stream_close", b"text_stream_close", "text_stream_open", b"text_stream_open", "text_stream_write", b"text_stream_write", "unpublish_track", b"unpublish_track", "unregister_rpc_method", b"unregister_rpc_method", "update_remote_track_publication_dimension", b"update_remote_track_publication_dimension", "video_convert", b"video_convert", "video_stream_from_participant", b"video_stream_from_participant"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["apm_process_reverse_stream", b"apm_process_reverse_stream", "apm_process_stream", b"apm_process_stream", "apm_set_stream_delay", b"apm_set_stream_delay", "audio_stream_from_participant", b"audio_stream_from_participant", "byte_read_all", b"byte_read_all", "byte_read_incremental", b"byte_read_incremental", "byte_stream_close", b"byte_stream_close", "byte_stream_open", b"byte_stream_open", "byte_stream_write", b"byte_stream_write", "byte_write_to_file", b"byte_write_to_file", "capture_audio_frame", b"capture_audio_frame", "capture_video_frame", b"capture_video_frame", "clear_audio_buffer", b"clear_audio_buffer", "connect", b"connect", "create_audio_track", b"create_audio_track", "create_video_track", b"create_video_track", "data_track_stream_read", b"data_track_stream_read", "disconnect", b"disconnect", "dispose", b"dispose", "e2ee", b"e2ee", "enable_remote_track", b"enable_remote_track", "enable_remote_track_publication", b"enable_remote_track_publication", "flush_sox_resampler", b"flush_sox_resampler", "get_audio_devices", b"get_audio_devices", "get_session_stats", b"get_session_stats", "get_stats", b"get_stats", "load_audio_filter_plugin", b"load_audio_filter_plugin", "local_data_track_is_published", b"local_data_track_is_published", "local_data_track_try_push", b"local_data_track_try_push", "local_data_track_unpublish", b"local_data_track_unpublish", "local_track_mute", b"local_track_mute", "message", b"message", "new_apm", b"new_apm", "new_audio_resampler", b"new_audio_resampler", "new_audio_source", b"new_audio_source", "new_audio_stream", b"new_audio_stream", "new_platform_audio", b"new_platform_audio", "new_sox_resampler", b"new_sox_resampler", "new_video_source", b"new_video_source", "new_video_stream", b"new_video_stream", "perform_rpc", b"perform_rpc", "publish_data", b"publish_data", "publish_data_track", b"publish_data_track", "publish_sip_dtmf", b"publish_sip_dtmf", "publish_track", b"publish_track", "publish_transcription", b"publish_transcription", "push_sox_resampler", b"push_sox_resampler", "register_rpc_method", b"register_rpc_method", "remix_and_resample", b"remix_and_resample", "remote_data_track_is_published", b"remote_data_track_is_published", "rpc_method_invocation_response", b"rpc_method_invocation_response", "send_bytes", b"send_bytes", "send_chat_message", b"send_chat_message", "send_file", b"send_file", "send_stream_chunk", b"send_stream_chunk", "send_stream_header", b"send_stream_header", "send_stream_trailer", b"send_stream_trailer", "send_text", b"send_text", "set_data_channel_buffered_amount_low_threshold", b"set_data_channel_buffered_amount_low_threshold", "set_local_attributes", b"set_local_attributes", "set_local_metadata", b"set_local_metadata", "set_local_name", b"set_local_name", "set_playout_device", b"set_playout_device", "set_recording_device", b"set_recording_device", "set_remote_track_publication_quality", b"set_remote_track_publication_quality", "set_subscribed", b"set_subscribed", "set_track_subscription_permissions", b"set_track_subscription_permissions", "simulate_scenario", b"simulate_scenario", "start_recording", b"start_recording", "stop_recording", b"stop_recording", "subscribe_data_track", b"subscribe_data_track", "text_read_all", b"text_read_all", "text_read_incremental", b"text_read_incremental", "text_stream_close", b"text_stream_close", "text_stream_open", b"text_stream_open", "text_stream_write", b"text_stream_write", "unpublish_track", b"unpublish_track", "unregister_rpc_method", b"unregister_rpc_method", "update_remote_track_publication_dimension", b"update_remote_track_publication_dimension", "video_convert", b"video_convert", "video_stream_from_participant", b"video_stream_from_participant"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["message", b"message"]) -> typing.Literal["dispose", "connect", "disconnect", "publish_track", "unpublish_track", "publish_data", "set_subscribed", "set_local_metadata", "set_local_name", "set_local_attributes", "get_session_stats", "publish_transcription", "publish_sip_dtmf", "create_video_track", "create_audio_track", "local_track_mute", "enable_remote_track", "get_stats", "set_track_subscription_permissions", "new_video_stream", "new_video_source", "capture_video_frame", "video_convert", "video_stream_from_participant", "new_audio_stream", "new_audio_source", "capture_audio_frame", "clear_audio_buffer", "new_audio_resampler", "remix_and_resample", "audio_stream_from_participant", "e2ee", "new_sox_resampler", "push_sox_resampler", "flush_sox_resampler", "send_chat_message", "perform_rpc", "register_rpc_method", "unregister_rpc_method", "rpc_method_invocation_response", "enable_remote_track_publication", "update_remote_track_publication_dimension", "send_stream_header", "send_stream_chunk", "send_stream_trailer", "set_data_channel_buffered_amount_low_threshold", "load_audio_filter_plugin", "new_apm", "apm_process_stream", "apm_process_reverse_stream", "apm_set_stream_delay", "byte_read_incremental", "byte_read_all", "byte_write_to_file", "text_read_incremental", "text_read_all", "send_file", "send_text", "byte_stream_open", "byte_stream_write", "byte_stream_close", "text_stream_open", "text_stream_write", "text_stream_close", "send_bytes", "set_remote_track_publication_quality", "publish_data_track", "local_data_track_try_push", "local_data_track_unpublish", "local_data_track_is_published", "subscribe_data_track", "remote_data_track_is_published", "data_track_stream_read", "simulate_scenario", "new_platform_audio", "get_audio_devices", "set_recording_device", "set_playout_device", "start_recording", "stop_recording"] | None: ... global___FfiResponse = FfiResponse diff --git a/livekit-rtc/livekit/rtc/_proto/room_pb2.py b/livekit-rtc/livekit/rtc/_proto/room_pb2.py index c49407e1..6b6b3840 100644 --- a/livekit-rtc/livekit/rtc/_proto/room_pb2.py +++ b/livekit-rtc/livekit/rtc/_proto/room_pb2.py @@ -22,7 +22,7 @@ from . import data_track_pb2 as data__track__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nroom.proto\x12\rlivekit.proto\x1a\ne2ee.proto\x1a\x0chandle.proto\x1a\x11participant.proto\x1a\x0btrack.proto\x1a\x11video_frame.proto\x1a\x0bstats.proto\x1a\x11\x64\x61ta_stream.proto\x1a\x10\x64\x61ta_track.proto\"s\n\x0e\x43onnectRequest\x12\x0b\n\x03url\x18\x01 \x02(\t\x12\r\n\x05token\x18\x02 \x02(\t\x12+\n\x07options\x18\x03 \x02(\x0b\x32\x1a.livekit.proto.RoomOptions\x12\x18\n\x10request_async_id\x18\x04 \x01(\x04\"#\n\x0f\x43onnectResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"\xbf\x03\n\x0f\x43onnectCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\x0f\n\x05\x65rror\x18\x02 \x01(\tH\x00\x12\x37\n\x06result\x18\x03 \x01(\x0b\x32%.livekit.proto.ConnectCallback.ResultH\x00\x1a\x89\x01\n\x15ParticipantWithTracks\x12\x34\n\x0bparticipant\x18\x01 \x02(\x0b\x32\x1f.livekit.proto.OwnedParticipant\x12:\n\x0cpublications\x18\x02 \x03(\x0b\x32$.livekit.proto.OwnedTrackPublication\x1a\xb8\x01\n\x06Result\x12&\n\x04room\x18\x01 \x02(\x0b\x32\x18.livekit.proto.OwnedRoom\x12:\n\x11local_participant\x18\x02 \x02(\x0b\x32\x1f.livekit.proto.OwnedParticipant\x12J\n\x0cparticipants\x18\x03 \x03(\x0b\x32\x34.livekit.proto.ConnectCallback.ParticipantWithTracksB\t\n\x07message\"s\n\x11\x44isconnectRequest\x12\x13\n\x0broom_handle\x18\x01 \x02(\x04\x12\x18\n\x10request_async_id\x18\x02 \x01(\x04\x12/\n\x06reason\x18\x03 \x01(\x0e\x32\x1f.livekit.proto.DisconnectReason\"&\n\x12\x44isconnectResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"&\n\x12\x44isconnectCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"\x7f\n\x17SimulateScenarioRequest\x12\x13\n\x0broom_handle\x18\x01 \x02(\x04\x12\x35\n\x08scenario\x18\x02 \x02(\x0e\x32#.livekit.proto.SimulateScenarioKind\x12\x18\n\x10request_async_id\x18\x03 \x01(\x04\",\n\x18SimulateScenarioResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\";\n\x18SimulateScenarioCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x9c\x01\n\x13PublishTrackRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x14\n\x0ctrack_handle\x18\x02 \x02(\x04\x12\x33\n\x07options\x18\x03 \x02(\x0b\x32\".livekit.proto.TrackPublishOptions\x12\x18\n\x10request_async_id\x18\x04 \x01(\x04\"(\n\x14PublishTrackResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"\x81\x01\n\x14PublishTrackCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\x0f\n\x05\x65rror\x18\x02 \x01(\tH\x00\x12;\n\x0bpublication\x18\x03 \x01(\x0b\x32$.livekit.proto.OwnedTrackPublicationH\x00\x42\t\n\x07message\"/\n\x18ReadyForRoomEventRequest\x12\x13\n\x0broom_handle\x18\x01 \x02(\x04\"\x1b\n\x19ReadyForRoomEventResponse\"\x81\x01\n\x15UnpublishTrackRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x11\n\ttrack_sid\x18\x02 \x02(\t\x12\x19\n\x11stop_on_unpublish\x18\x03 \x02(\x08\x12\x18\n\x10request_async_id\x18\x04 \x01(\x04\"*\n\x16UnpublishTrackResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"9\n\x16UnpublishTrackCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\xd3\x01\n\x12PublishDataRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x10\n\x08\x64\x61ta_ptr\x18\x02 \x02(\x04\x12\x10\n\x08\x64\x61ta_len\x18\x03 \x02(\x04\x12\x10\n\x08reliable\x18\x04 \x02(\x08\x12\x1c\n\x10\x64\x65stination_sids\x18\x05 \x03(\tB\x02\x18\x01\x12\r\n\x05topic\x18\x06 \x01(\t\x12\x1e\n\x16\x64\x65stination_identities\x18\x07 \x03(\t\x12\x18\n\x10request_async_id\x18\x08 \x01(\x04\"\'\n\x13PublishDataResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"6\n\x13PublishDataCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\xc0\x01\n\x1bPublishTranscriptionRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x1c\n\x14participant_identity\x18\x02 \x02(\t\x12\x10\n\x08track_id\x18\x03 \x02(\t\x12\x35\n\x08segments\x18\x04 \x03(\x0b\x32#.livekit.proto.TranscriptionSegment\x12\x18\n\x10request_async_id\x18\x05 \x01(\x04\"0\n\x1cPublishTranscriptionResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"?\n\x1cPublishTranscriptionCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x90\x01\n\x15PublishSipDtmfRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x0c\n\x04\x63ode\x18\x02 \x02(\r\x12\r\n\x05\x64igit\x18\x03 \x02(\t\x12\x1e\n\x16\x64\x65stination_identities\x18\x04 \x03(\t\x12\x18\n\x10request_async_id\x18\x05 \x01(\x04\"*\n\x16PublishSipDtmfResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"9\n\x16PublishSipDtmfCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"g\n\x17SetLocalMetadataRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x10\n\x08metadata\x18\x02 \x02(\t\x12\x18\n\x10request_async_id\x18\x03 \x01(\x04\",\n\x18SetLocalMetadataResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\";\n\x18SetLocalMetadataCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x9e\x01\n\x16SendChatMessageRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x0f\n\x07message\x18\x02 \x02(\t\x12\x1e\n\x16\x64\x65stination_identities\x18\x03 \x03(\t\x12\x17\n\x0fsender_identity\x18\x04 \x01(\t\x12\x18\n\x10request_async_id\x18\x05 \x01(\x04\"\xd6\x01\n\x16\x45\x64itChatMessageRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x11\n\tedit_text\x18\x02 \x02(\t\x12\x34\n\x10original_message\x18\x03 \x02(\x0b\x32\x1a.livekit.proto.ChatMessage\x12\x1e\n\x16\x64\x65stination_identities\x18\x04 \x03(\t\x12\x17\n\x0fsender_identity\x18\x05 \x01(\t\x12\x18\n\x10request_async_id\x18\x06 \x01(\x04\"+\n\x17SendChatMessageResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"{\n\x17SendChatMessageCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\x0f\n\x05\x65rror\x18\x02 \x01(\tH\x00\x12\x32\n\x0c\x63hat_message\x18\x03 \x01(\x0b\x32\x1a.livekit.proto.ChatMessageH\x00\x42\t\n\x07message\"\x8b\x01\n\x19SetLocalAttributesRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x32\n\nattributes\x18\x02 \x03(\x0b\x32\x1e.livekit.proto.AttributesEntry\x12\x18\n\x10request_async_id\x18\x03 \x01(\x04\"-\n\x0f\x41ttributesEntry\x12\x0b\n\x03key\x18\x01 \x02(\t\x12\r\n\x05value\x18\x02 \x02(\t\".\n\x1aSetLocalAttributesResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"=\n\x1aSetLocalAttributesCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"_\n\x13SetLocalNameRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x0c\n\x04name\x18\x02 \x02(\t\x12\x18\n\x10request_async_id\x18\x03 \x01(\x04\"(\n\x14SetLocalNameResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"7\n\x14SetLocalNameCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"E\n\x14SetSubscribedRequest\x12\x11\n\tsubscribe\x18\x01 \x02(\x08\x12\x1a\n\x12publication_handle\x18\x02 \x02(\x04\"\x17\n\x15SetSubscribedResponse\"G\n\x16GetSessionStatsRequest\x12\x13\n\x0broom_handle\x18\x01 \x02(\x04\x12\x18\n\x10request_async_id\x18\x02 \x01(\x04\"+\n\x17GetSessionStatsResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"\xf7\x01\n\x17GetSessionStatsCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\x0f\n\x05\x65rror\x18\x02 \x01(\tH\x00\x12?\n\x06result\x18\x03 \x01(\x0b\x32-.livekit.proto.GetSessionStatsCallback.ResultH\x00\x1am\n\x06Result\x12\x30\n\x0fpublisher_stats\x18\x01 \x03(\x0b\x32\x17.livekit.proto.RtcStats\x12\x31\n\x10subscriber_stats\x18\x02 \x03(\x0b\x32\x17.livekit.proto.RtcStatsB\t\n\x07message\";\n\rVideoEncoding\x12\x13\n\x0bmax_bitrate\x18\x01 \x02(\x04\x12\x15\n\rmax_framerate\x18\x02 \x02(\x01\"$\n\rAudioEncoding\x12\x13\n\x0bmax_bitrate\x18\x01 \x02(\x04\"\x95\x03\n\x13TrackPublishOptions\x12\x34\n\x0evideo_encoding\x18\x01 \x01(\x0b\x32\x1c.livekit.proto.VideoEncoding\x12\x34\n\x0e\x61udio_encoding\x18\x02 \x01(\x0b\x32\x1c.livekit.proto.AudioEncoding\x12.\n\x0bvideo_codec\x18\x03 \x01(\x0e\x32\x19.livekit.proto.VideoCodec\x12\x0b\n\x03\x64tx\x18\x04 \x01(\x08\x12\x0b\n\x03red\x18\x05 \x01(\x08\x12\x11\n\tsimulcast\x18\x06 \x01(\x08\x12*\n\x06source\x18\x07 \x01(\x0e\x32\x1a.livekit.proto.TrackSource\x12\x0e\n\x06stream\x18\x08 \x01(\t\x12\x19\n\x11preconnect_buffer\x18\t \x01(\x08\x12\x44\n\x17packet_trailer_features\x18\n \x03(\x0e\x32#.livekit.proto.PacketTrailerFeature\x12\x18\n\x10scalability_mode\x18\x0b \x01(\t\"=\n\tIceServer\x12\x0c\n\x04urls\x18\x01 \x03(\t\x12\x10\n\x08username\x18\x02 \x01(\t\x12\x10\n\x08password\x18\x03 \x01(\t\"\xc4\x01\n\tRtcConfig\x12;\n\x12ice_transport_type\x18\x01 \x01(\x0e\x32\x1f.livekit.proto.IceTransportType\x12K\n\x1a\x63ontinual_gathering_policy\x18\x02 \x01(\x0e\x32\'.livekit.proto.ContinualGatheringPolicy\x12-\n\x0bice_servers\x18\x03 \x03(\x0b\x32\x18.livekit.proto.IceServer\"\xae\x02\n\x0bRoomOptions\x12\x16\n\x0e\x61uto_subscribe\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x64\x61ptive_stream\x18\x02 \x01(\x08\x12\x10\n\x08\x64ynacast\x18\x03 \x01(\x08\x12,\n\x04\x65\x32\x65\x65\x18\x04 \x01(\x0b\x32\x1a.livekit.proto.E2eeOptionsB\x02\x18\x01\x12,\n\nrtc_config\x18\x05 \x01(\x0b\x32\x18.livekit.proto.RtcConfig\x12\x14\n\x0cjoin_retries\x18\x06 \x01(\r\x12.\n\nencryption\x18\x07 \x01(\x0b\x32\x1a.livekit.proto.E2eeOptions\x12\x1e\n\x16single_peer_connection\x18\x08 \x01(\x08\x12\x1a\n\x12\x63onnect_timeout_ms\x18\t \x01(\x04\"w\n\x14TranscriptionSegment\x12\n\n\x02id\x18\x01 \x02(\t\x12\x0c\n\x04text\x18\x02 \x02(\t\x12\x12\n\nstart_time\x18\x03 \x02(\x04\x12\x10\n\x08\x65nd_time\x18\x04 \x02(\x04\x12\r\n\x05\x66inal\x18\x05 \x02(\x08\x12\x10\n\x08language\x18\x06 \x02(\t\"0\n\nBufferInfo\x12\x10\n\x08\x64\x61ta_ptr\x18\x01 \x02(\x04\x12\x10\n\x08\x64\x61ta_len\x18\x02 \x02(\x04\"e\n\x0bOwnedBuffer\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12\'\n\x04\x64\x61ta\x18\x02 \x02(\x0b\x32\x19.livekit.proto.BufferInfo\"\xce\x17\n\tRoomEvent\x12\x13\n\x0broom_handle\x18\x01 \x02(\x04\x12\x44\n\x15participant_connected\x18\x02 \x01(\x0b\x32#.livekit.proto.ParticipantConnectedH\x00\x12J\n\x18participant_disconnected\x18\x03 \x01(\x0b\x32&.livekit.proto.ParticipantDisconnectedH\x00\x12\x43\n\x15local_track_published\x18\x04 \x01(\x0b\x32\".livekit.proto.LocalTrackPublishedH\x00\x12G\n\x17local_track_unpublished\x18\x05 \x01(\x0b\x32$.livekit.proto.LocalTrackUnpublishedH\x00\x12\x45\n\x16local_track_subscribed\x18\x06 \x01(\x0b\x32#.livekit.proto.LocalTrackSubscribedH\x00\x12\x38\n\x0ftrack_published\x18\x07 \x01(\x0b\x32\x1d.livekit.proto.TrackPublishedH\x00\x12<\n\x11track_unpublished\x18\x08 \x01(\x0b\x32\x1f.livekit.proto.TrackUnpublishedH\x00\x12:\n\x10track_subscribed\x18\t \x01(\x0b\x32\x1e.livekit.proto.TrackSubscribedH\x00\x12>\n\x12track_unsubscribed\x18\n \x01(\x0b\x32 .livekit.proto.TrackUnsubscribedH\x00\x12K\n\x19track_subscription_failed\x18\x0b \x01(\x0b\x32&.livekit.proto.TrackSubscriptionFailedH\x00\x12\x30\n\x0btrack_muted\x18\x0c \x01(\x0b\x32\x19.livekit.proto.TrackMutedH\x00\x12\x34\n\rtrack_unmuted\x18\r \x01(\x0b\x32\x1b.livekit.proto.TrackUnmutedH\x00\x12G\n\x17\x61\x63tive_speakers_changed\x18\x0e \x01(\x0b\x32$.livekit.proto.ActiveSpeakersChangedH\x00\x12\x43\n\x15room_metadata_changed\x18\x0f \x01(\x0b\x32\".livekit.proto.RoomMetadataChangedH\x00\x12\x39\n\x10room_sid_changed\x18\x10 \x01(\x0b\x32\x1d.livekit.proto.RoomSidChangedH\x00\x12Q\n\x1cparticipant_metadata_changed\x18\x11 \x01(\x0b\x32).livekit.proto.ParticipantMetadataChangedH\x00\x12I\n\x18participant_name_changed\x18\x12 \x01(\x0b\x32%.livekit.proto.ParticipantNameChangedH\x00\x12U\n\x1eparticipant_attributes_changed\x18\x13 \x01(\x0b\x32+.livekit.proto.ParticipantAttributesChangedH\x00\x12M\n\x1a\x63onnection_quality_changed\x18\x14 \x01(\x0b\x32\'.livekit.proto.ConnectionQualityChangedH\x00\x12I\n\x18\x63onnection_state_changed\x18\x15 \x01(\x0b\x32%.livekit.proto.ConnectionStateChangedH\x00\x12\x33\n\x0c\x64isconnected\x18\x16 \x01(\x0b\x32\x1b.livekit.proto.DisconnectedH\x00\x12\x33\n\x0creconnecting\x18\x17 \x01(\x0b\x32\x1b.livekit.proto.ReconnectingH\x00\x12\x31\n\x0breconnected\x18\x18 \x01(\x0b\x32\x1a.livekit.proto.ReconnectedH\x00\x12=\n\x12\x65\x32\x65\x65_state_changed\x18\x19 \x01(\x0b\x32\x1f.livekit.proto.E2eeStateChangedH\x00\x12%\n\x03\x65os\x18\x1a \x01(\x0b\x32\x16.livekit.proto.RoomEOSH\x00\x12\x41\n\x14\x64\x61ta_packet_received\x18\x1b \x01(\x0b\x32!.livekit.proto.DataPacketReceivedH\x00\x12\x46\n\x16transcription_received\x18\x1c \x01(\x0b\x32$.livekit.proto.TranscriptionReceivedH\x00\x12:\n\x0c\x63hat_message\x18\x1d \x01(\x0b\x32\".livekit.proto.ChatMessageReceivedH\x00\x12I\n\x16stream_header_received\x18\x1e \x01(\x0b\x32\'.livekit.proto.DataStreamHeaderReceivedH\x00\x12G\n\x15stream_chunk_received\x18\x1f \x01(\x0b\x32&.livekit.proto.DataStreamChunkReceivedH\x00\x12K\n\x17stream_trailer_received\x18 \x01(\x0b\x32(.livekit.proto.DataStreamTrailerReceivedH\x00\x12i\n\"data_channel_low_threshold_changed\x18! \x01(\x0b\x32;.livekit.proto.DataChannelBufferedAmountLowThresholdChangedH\x00\x12=\n\x12\x62yte_stream_opened\x18\" \x01(\x0b\x32\x1f.livekit.proto.ByteStreamOpenedH\x00\x12=\n\x12text_stream_opened\x18# \x01(\x0b\x32\x1f.livekit.proto.TextStreamOpenedH\x00\x12/\n\x0croom_updated\x18$ \x01(\x0b\x32\x17.livekit.proto.RoomInfoH\x00\x12(\n\x05moved\x18% \x01(\x0b\x32\x17.livekit.proto.RoomInfoH\x00\x12\x42\n\x14participants_updated\x18& \x01(\x0b\x32\".livekit.proto.ParticipantsUpdatedH\x00\x12\x62\n%participant_encryption_status_changed\x18\' \x01(\x0b\x32\x31.livekit.proto.ParticipantEncryptionStatusChangedH\x00\x12U\n\x1eparticipant_permission_changed\x18) \x01(\x0b\x32+.livekit.proto.ParticipantPermissionChangedH\x00\x12\x38\n\x0ftoken_refreshed\x18( \x01(\x0b\x32\x1d.livekit.proto.TokenRefreshedH\x00\x12>\n\x12participant_active\x18* \x01(\x0b\x32 .livekit.proto.ParticipantActiveH\x00\x12\x41\n\x14\x64\x61ta_track_published\x18+ \x01(\x0b\x32!.livekit.proto.DataTrackPublishedH\x00\x12\x45\n\x16\x64\x61ta_track_unpublished\x18, \x01(\x0b\x32#.livekit.proto.DataTrackUnpublishedH\x00\x12G\n\x17local_track_republished\x18- \x01(\x0b\x32$.livekit.proto.LocalTrackRepublishedH\x00\x42\t\n\x07message\"\xc9\x02\n\x08RoomInfo\x12\x0b\n\x03sid\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x02(\t\x12\x10\n\x08metadata\x18\x03 \x02(\t\x12.\n&lossy_dc_buffered_amount_low_threshold\x18\x04 \x02(\x04\x12\x31\n)reliable_dc_buffered_amount_low_threshold\x18\x05 \x02(\x04\x12\x15\n\rempty_timeout\x18\x06 \x02(\r\x12\x19\n\x11\x64\x65parture_timeout\x18\x07 \x02(\r\x12\x18\n\x10max_participants\x18\x08 \x02(\r\x12\x15\n\rcreation_time\x18\t \x02(\x03\x12\x18\n\x10num_participants\x18\n \x02(\r\x12\x16\n\x0enum_publishers\x18\x0b \x02(\r\x12\x18\n\x10\x61\x63tive_recording\x18\x0c \x02(\x08\"a\n\tOwnedRoom\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12%\n\x04info\x18\x02 \x02(\x0b\x32\x17.livekit.proto.RoomInfo\"K\n\x13ParticipantsUpdated\x12\x34\n\x0cparticipants\x18\x01 \x03(\x0b\x32\x1e.livekit.proto.ParticipantInfo\"E\n\x14ParticipantConnected\x12-\n\x04info\x18\x01 \x02(\x0b\x32\x1f.livekit.proto.OwnedParticipant\"1\n\x11ParticipantActive\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\"s\n\x17ParticipantDisconnected\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12:\n\x11\x64isconnect_reason\x18\x02 \x02(\x0e\x32\x1f.livekit.proto.DisconnectReason\"(\n\x13LocalTrackPublished\x12\x11\n\ttrack_sid\x18\x01 \x02(\t\"0\n\x15LocalTrackUnpublished\x12\x17\n\x0fpublication_sid\x18\x01 \x02(\t\"|\n\x15LocalTrackRepublished\x12\x1a\n\x12publication_handle\x18\x01 \x02(\x04\x12\x14\n\x0cprevious_sid\x18\x02 \x02(\t\x12\x31\n\x04info\x18\x03 \x02(\x0b\x32#.livekit.proto.TrackPublicationInfo\")\n\x14LocalTrackSubscribed\x12\x11\n\ttrack_sid\x18\x02 \x02(\t\"i\n\x0eTrackPublished\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x39\n\x0bpublication\x18\x02 \x02(\x0b\x32$.livekit.proto.OwnedTrackPublication\"I\n\x10TrackUnpublished\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x17\n\x0fpublication_sid\x18\x02 \x02(\t\"Y\n\x0fTrackSubscribed\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12(\n\x05track\x18\x02 \x02(\x0b\x32\x19.livekit.proto.OwnedTrack\"D\n\x11TrackUnsubscribed\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x11\n\ttrack_sid\x18\x02 \x02(\t\"Y\n\x17TrackSubscriptionFailed\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x11\n\ttrack_sid\x18\x02 \x02(\t\x12\r\n\x05\x65rror\x18\x03 \x02(\t\"=\n\nTrackMuted\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x11\n\ttrack_sid\x18\x02 \x02(\t\"?\n\x0cTrackUnmuted\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x11\n\ttrack_sid\x18\x02 \x02(\t\"_\n\x10\x45\x32\x65\x65StateChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12-\n\x05state\x18\x02 \x02(\x0e\x32\x1e.livekit.proto.EncryptionState\"7\n\x15\x41\x63tiveSpeakersChanged\x12\x1e\n\x16participant_identities\x18\x01 \x03(\t\"\'\n\x13RoomMetadataChanged\x12\x10\n\x08metadata\x18\x01 \x02(\t\"\x1d\n\x0eRoomSidChanged\x12\x0b\n\x03sid\x18\x01 \x02(\t\"L\n\x1aParticipantMetadataChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x10\n\x08metadata\x18\x02 \x02(\t\"\xac\x01\n\x1cParticipantAttributesChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x32\n\nattributes\x18\x02 \x03(\x0b\x32\x1e.livekit.proto.AttributesEntry\x12:\n\x12\x63hanged_attributes\x18\x03 \x03(\x0b\x32\x1e.livekit.proto.AttributesEntry\"X\n\"ParticipantEncryptionStatusChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x14\n\x0cis_encrypted\x18\x02 \x02(\x08\"D\n\x16ParticipantNameChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x0c\n\x04name\x18\x02 \x02(\t\"v\n\x1cParticipantPermissionChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x38\n\npermission\x18\x02 \x01(\x0b\x32$.livekit.proto.ParticipantPermission\"k\n\x18\x43onnectionQualityChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x31\n\x07quality\x18\x02 \x02(\x0e\x32 .livekit.proto.ConnectionQuality\"E\n\nUserPacket\x12(\n\x04\x64\x61ta\x18\x01 \x02(\x0b\x32\x1a.livekit.proto.OwnedBuffer\x12\r\n\x05topic\x18\x02 \x01(\t\"y\n\x0b\x43hatMessage\x12\n\n\x02id\x18\x01 \x02(\t\x12\x11\n\ttimestamp\x18\x02 \x02(\x03\x12\x0f\n\x07message\x18\x03 \x02(\t\x12\x16\n\x0e\x65\x64it_timestamp\x18\x04 \x01(\x03\x12\x0f\n\x07\x64\x65leted\x18\x05 \x01(\x08\x12\x11\n\tgenerated\x18\x06 \x01(\x08\"`\n\x13\x43hatMessageReceived\x12+\n\x07message\x18\x01 \x02(\x0b\x32\x1a.livekit.proto.ChatMessage\x12\x1c\n\x14participant_identity\x18\x02 \x02(\t\"&\n\x07SipDTMF\x12\x0c\n\x04\x63ode\x18\x01 \x02(\r\x12\r\n\x05\x64igit\x18\x02 \x01(\t\"\xbf\x01\n\x12\x44\x61taPacketReceived\x12+\n\x04kind\x18\x01 \x02(\x0e\x32\x1d.livekit.proto.DataPacketKind\x12\x1c\n\x14participant_identity\x18\x02 \x02(\t\x12)\n\x04user\x18\x04 \x01(\x0b\x32\x19.livekit.proto.UserPacketH\x00\x12*\n\x08sip_dtmf\x18\x05 \x01(\x0b\x32\x16.livekit.proto.SipDTMFH\x00\x42\x07\n\x05value\"\x7f\n\x15TranscriptionReceived\x12\x1c\n\x14participant_identity\x18\x01 \x01(\t\x12\x11\n\ttrack_sid\x18\x02 \x01(\t\x12\x35\n\x08segments\x18\x03 \x03(\x0b\x32#.livekit.proto.TranscriptionSegment\"G\n\x16\x43onnectionStateChanged\x12-\n\x05state\x18\x01 \x02(\x0e\x32\x1e.livekit.proto.ConnectionState\"\x0b\n\tConnected\"?\n\x0c\x44isconnected\x12/\n\x06reason\x18\x01 \x02(\x0e\x32\x1f.livekit.proto.DisconnectReason\"\x0e\n\x0cReconnecting\"\r\n\x0bReconnected\"\x1f\n\x0eTokenRefreshed\x12\r\n\x05token\x18\x01 \x02(\t\"\t\n\x07RoomEOS\"\x8e\x07\n\nDataStream\x1a\xaa\x01\n\nTextHeader\x12?\n\x0eoperation_type\x18\x01 \x02(\x0e\x32\'.livekit.proto.DataStream.OperationType\x12\x0f\n\x07version\x18\x02 \x01(\x05\x12\x1a\n\x12reply_to_stream_id\x18\x03 \x01(\t\x12\x1b\n\x13\x61ttached_stream_ids\x18\x04 \x03(\t\x12\x11\n\tgenerated\x18\x05 \x01(\x08\x1a\x1a\n\nByteHeader\x12\x0c\n\x04name\x18\x01 \x02(\t\x1a\xeb\x02\n\x06Header\x12\x11\n\tstream_id\x18\x01 \x02(\t\x12\x11\n\ttimestamp\x18\x02 \x02(\x03\x12\x11\n\tmime_type\x18\x03 \x02(\t\x12\r\n\x05topic\x18\x04 \x02(\t\x12\x14\n\x0ctotal_length\x18\x05 \x01(\x04\x12\x44\n\nattributes\x18\x06 \x03(\x0b\x32\x30.livekit.proto.DataStream.Header.AttributesEntry\x12;\n\x0btext_header\x18\x07 \x01(\x0b\x32$.livekit.proto.DataStream.TextHeaderH\x00\x12;\n\x0b\x62yte_header\x18\x08 \x01(\x0b\x32$.livekit.proto.DataStream.ByteHeaderH\x00\x1a\x31\n\x0f\x41ttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x10\n\x0e\x63ontent_header\x1a]\n\x05\x43hunk\x12\x11\n\tstream_id\x18\x01 \x02(\t\x12\x13\n\x0b\x63hunk_index\x18\x02 \x02(\x04\x12\x0f\n\x07\x63ontent\x18\x03 \x02(\x0c\x12\x0f\n\x07version\x18\x04 \x01(\x05\x12\n\n\x02iv\x18\x05 \x01(\x0c\x1a\xa6\x01\n\x07Trailer\x12\x11\n\tstream_id\x18\x01 \x02(\t\x12\x0e\n\x06reason\x18\x02 \x02(\t\x12\x45\n\nattributes\x18\x03 \x03(\x0b\x32\x31.livekit.proto.DataStream.Trailer.AttributesEntry\x1a\x31\n\x0f\x41ttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"A\n\rOperationType\x12\n\n\x06\x43REATE\x10\x00\x12\n\n\x06UPDATE\x10\x01\x12\n\n\x06\x44\x45LETE\x10\x02\x12\x0c\n\x08REACTION\x10\x03\"j\n\x18\x44\x61taStreamHeaderReceived\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x30\n\x06header\x18\x02 \x02(\x0b\x32 .livekit.proto.DataStream.Header\"g\n\x17\x44\x61taStreamChunkReceived\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12.\n\x05\x63hunk\x18\x02 \x02(\x0b\x32\x1f.livekit.proto.DataStream.Chunk\"m\n\x19\x44\x61taStreamTrailerReceived\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x32\n\x07trailer\x18\x02 \x02(\x0b\x32!.livekit.proto.DataStream.Trailer\"\xc0\x01\n\x17SendStreamHeaderRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x30\n\x06header\x18\x02 \x02(\x0b\x32 .livekit.proto.DataStream.Header\x12\x1e\n\x16\x64\x65stination_identities\x18\x03 \x03(\t\x12\x17\n\x0fsender_identity\x18\x04 \x02(\t\x12\x18\n\x10request_async_id\x18\x05 \x01(\x04\"\xbd\x01\n\x16SendStreamChunkRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12.\n\x05\x63hunk\x18\x02 \x02(\x0b\x32\x1f.livekit.proto.DataStream.Chunk\x12\x1e\n\x16\x64\x65stination_identities\x18\x03 \x03(\t\x12\x17\n\x0fsender_identity\x18\x04 \x02(\t\x12\x18\n\x10request_async_id\x18\x05 \x01(\x04\"\xc3\x01\n\x18SendStreamTrailerRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x32\n\x07trailer\x18\x02 \x02(\x0b\x32!.livekit.proto.DataStream.Trailer\x12\x1e\n\x16\x64\x65stination_identities\x18\x03 \x03(\t\x12\x17\n\x0fsender_identity\x18\x04 \x02(\t\x12\x18\n\x10request_async_id\x18\x05 \x01(\x04\",\n\x18SendStreamHeaderResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"+\n\x17SendStreamChunkResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"-\n\x19SendStreamTrailerResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\";\n\x18SendStreamHeaderCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\":\n\x17SendStreamChunkCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"<\n\x19SendStreamTrailerCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x93\x01\n/SetDataChannelBufferedAmountLowThresholdRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x11\n\tthreshold\x18\x02 \x02(\x04\x12+\n\x04kind\x18\x03 \x02(\x0e\x32\x1d.livekit.proto.DataPacketKind\"2\n0SetDataChannelBufferedAmountLowThresholdResponse\"n\n,DataChannelBufferedAmountLowThresholdChanged\x12+\n\x04kind\x18\x01 \x02(\x0e\x32\x1d.livekit.proto.DataPacketKind\x12\x11\n\tthreshold\x18\x02 \x02(\x04\"f\n\x10\x42yteStreamOpened\x12\x34\n\x06reader\x18\x01 \x02(\x0b\x32$.livekit.proto.OwnedByteStreamReader\x12\x1c\n\x14participant_identity\x18\x02 \x02(\t\"f\n\x10TextStreamOpened\x12\x34\n\x06reader\x18\x01 \x02(\x0b\x32$.livekit.proto.OwnedTextStreamReader\x12\x1c\n\x14participant_identity\x18\x02 \x02(\t\"H\n\x12\x44\x61taTrackPublished\x12\x32\n\x05track\x18\x01 \x02(\x0b\x32#.livekit.proto.OwnedRemoteDataTrack\"#\n\x14\x44\x61taTrackUnpublished\x12\x0b\n\x03sid\x18\x01 \x02(\t*\xe6\x01\n\x14SimulateScenarioKind\x12\x1d\n\x19SIMULATE_SIGNAL_RECONNECT\x10\x00\x12\x14\n\x10SIMULATE_SPEAKER\x10\x01\x12\x19\n\x15SIMULATE_NODE_FAILURE\x10\x02\x12\x19\n\x15SIMULATE_SERVER_LEAVE\x10\x03\x12\x16\n\x12SIMULATE_MIGRATION\x10\x04\x12\x16\n\x12SIMULATE_FORCE_TCP\x10\x05\x12\x16\n\x12SIMULATE_FORCE_TLS\x10\x06\x12\x1b\n\x17SIMULATE_FULL_RECONNECT\x10\x07*P\n\x10IceTransportType\x12\x13\n\x0fTRANSPORT_RELAY\x10\x00\x12\x14\n\x10TRANSPORT_NOHOST\x10\x01\x12\x11\n\rTRANSPORT_ALL\x10\x02*C\n\x18\x43ontinualGatheringPolicy\x12\x0f\n\x0bGATHER_ONCE\x10\x00\x12\x16\n\x12GATHER_CONTINUALLY\x10\x01*`\n\x11\x43onnectionQuality\x12\x10\n\x0cQUALITY_POOR\x10\x00\x12\x10\n\x0cQUALITY_GOOD\x10\x01\x12\x15\n\x11QUALITY_EXCELLENT\x10\x02\x12\x10\n\x0cQUALITY_LOST\x10\x03*S\n\x0f\x43onnectionState\x12\x15\n\x11\x43ONN_DISCONNECTED\x10\x00\x12\x12\n\x0e\x43ONN_CONNECTED\x10\x01\x12\x15\n\x11\x43ONN_RECONNECTING\x10\x02*3\n\x0e\x44\x61taPacketKind\x12\x0e\n\nKIND_LOSSY\x10\x00\x12\x11\n\rKIND_RELIABLE\x10\x01\x42\x10\xaa\x02\rLiveKit.Proto') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nroom.proto\x12\rlivekit.proto\x1a\ne2ee.proto\x1a\x0chandle.proto\x1a\x11participant.proto\x1a\x0btrack.proto\x1a\x11video_frame.proto\x1a\x0bstats.proto\x1a\x11\x64\x61ta_stream.proto\x1a\x10\x64\x61ta_track.proto\"s\n\x0e\x43onnectRequest\x12\x0b\n\x03url\x18\x01 \x02(\t\x12\r\n\x05token\x18\x02 \x02(\t\x12+\n\x07options\x18\x03 \x02(\x0b\x32\x1a.livekit.proto.RoomOptions\x12\x18\n\x10request_async_id\x18\x04 \x01(\x04\"#\n\x0f\x43onnectResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"\xbf\x03\n\x0f\x43onnectCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\x0f\n\x05\x65rror\x18\x02 \x01(\tH\x00\x12\x37\n\x06result\x18\x03 \x01(\x0b\x32%.livekit.proto.ConnectCallback.ResultH\x00\x1a\x89\x01\n\x15ParticipantWithTracks\x12\x34\n\x0bparticipant\x18\x01 \x02(\x0b\x32\x1f.livekit.proto.OwnedParticipant\x12:\n\x0cpublications\x18\x02 \x03(\x0b\x32$.livekit.proto.OwnedTrackPublication\x1a\xb8\x01\n\x06Result\x12&\n\x04room\x18\x01 \x02(\x0b\x32\x18.livekit.proto.OwnedRoom\x12:\n\x11local_participant\x18\x02 \x02(\x0b\x32\x1f.livekit.proto.OwnedParticipant\x12J\n\x0cparticipants\x18\x03 \x03(\x0b\x32\x34.livekit.proto.ConnectCallback.ParticipantWithTracksB\t\n\x07message\"s\n\x11\x44isconnectRequest\x12\x13\n\x0broom_handle\x18\x01 \x02(\x04\x12\x18\n\x10request_async_id\x18\x02 \x01(\x04\x12/\n\x06reason\x18\x03 \x01(\x0e\x32\x1f.livekit.proto.DisconnectReason\"&\n\x12\x44isconnectResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"&\n\x12\x44isconnectCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"\x7f\n\x17SimulateScenarioRequest\x12\x13\n\x0broom_handle\x18\x01 \x02(\x04\x12\x35\n\x08scenario\x18\x02 \x02(\x0e\x32#.livekit.proto.SimulateScenarioKind\x12\x18\n\x10request_async_id\x18\x03 \x01(\x04\",\n\x18SimulateScenarioResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\";\n\x18SimulateScenarioCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x9c\x01\n\x13PublishTrackRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x14\n\x0ctrack_handle\x18\x02 \x02(\x04\x12\x33\n\x07options\x18\x03 \x02(\x0b\x32\".livekit.proto.TrackPublishOptions\x12\x18\n\x10request_async_id\x18\x04 \x01(\x04\"(\n\x14PublishTrackResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"\x81\x01\n\x14PublishTrackCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\x0f\n\x05\x65rror\x18\x02 \x01(\tH\x00\x12;\n\x0bpublication\x18\x03 \x01(\x0b\x32$.livekit.proto.OwnedTrackPublicationH\x00\x42\t\n\x07message\"\x81\x01\n\x15UnpublishTrackRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x11\n\ttrack_sid\x18\x02 \x02(\t\x12\x19\n\x11stop_on_unpublish\x18\x03 \x02(\x08\x12\x18\n\x10request_async_id\x18\x04 \x01(\x04\"*\n\x16UnpublishTrackResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"9\n\x16UnpublishTrackCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\xd3\x01\n\x12PublishDataRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x10\n\x08\x64\x61ta_ptr\x18\x02 \x02(\x04\x12\x10\n\x08\x64\x61ta_len\x18\x03 \x02(\x04\x12\x10\n\x08reliable\x18\x04 \x02(\x08\x12\x1c\n\x10\x64\x65stination_sids\x18\x05 \x03(\tB\x02\x18\x01\x12\r\n\x05topic\x18\x06 \x01(\t\x12\x1e\n\x16\x64\x65stination_identities\x18\x07 \x03(\t\x12\x18\n\x10request_async_id\x18\x08 \x01(\x04\"\'\n\x13PublishDataResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"6\n\x13PublishDataCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\xc0\x01\n\x1bPublishTranscriptionRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x1c\n\x14participant_identity\x18\x02 \x02(\t\x12\x10\n\x08track_id\x18\x03 \x02(\t\x12\x35\n\x08segments\x18\x04 \x03(\x0b\x32#.livekit.proto.TranscriptionSegment\x12\x18\n\x10request_async_id\x18\x05 \x01(\x04\"0\n\x1cPublishTranscriptionResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"?\n\x1cPublishTranscriptionCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x90\x01\n\x15PublishSipDtmfRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x0c\n\x04\x63ode\x18\x02 \x02(\r\x12\r\n\x05\x64igit\x18\x03 \x02(\t\x12\x1e\n\x16\x64\x65stination_identities\x18\x04 \x03(\t\x12\x18\n\x10request_async_id\x18\x05 \x01(\x04\"*\n\x16PublishSipDtmfResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"9\n\x16PublishSipDtmfCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"g\n\x17SetLocalMetadataRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x10\n\x08metadata\x18\x02 \x02(\t\x12\x18\n\x10request_async_id\x18\x03 \x01(\x04\",\n\x18SetLocalMetadataResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\";\n\x18SetLocalMetadataCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x9e\x01\n\x16SendChatMessageRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x0f\n\x07message\x18\x02 \x02(\t\x12\x1e\n\x16\x64\x65stination_identities\x18\x03 \x03(\t\x12\x17\n\x0fsender_identity\x18\x04 \x01(\t\x12\x18\n\x10request_async_id\x18\x05 \x01(\x04\"\xd6\x01\n\x16\x45\x64itChatMessageRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x11\n\tedit_text\x18\x02 \x02(\t\x12\x34\n\x10original_message\x18\x03 \x02(\x0b\x32\x1a.livekit.proto.ChatMessage\x12\x1e\n\x16\x64\x65stination_identities\x18\x04 \x03(\t\x12\x17\n\x0fsender_identity\x18\x05 \x01(\t\x12\x18\n\x10request_async_id\x18\x06 \x01(\x04\"+\n\x17SendChatMessageResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"{\n\x17SendChatMessageCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\x0f\n\x05\x65rror\x18\x02 \x01(\tH\x00\x12\x32\n\x0c\x63hat_message\x18\x03 \x01(\x0b\x32\x1a.livekit.proto.ChatMessageH\x00\x42\t\n\x07message\"\x8b\x01\n\x19SetLocalAttributesRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x32\n\nattributes\x18\x02 \x03(\x0b\x32\x1e.livekit.proto.AttributesEntry\x12\x18\n\x10request_async_id\x18\x03 \x01(\x04\"-\n\x0f\x41ttributesEntry\x12\x0b\n\x03key\x18\x01 \x02(\t\x12\r\n\x05value\x18\x02 \x02(\t\".\n\x1aSetLocalAttributesResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"=\n\x1aSetLocalAttributesCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"_\n\x13SetLocalNameRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x0c\n\x04name\x18\x02 \x02(\t\x12\x18\n\x10request_async_id\x18\x03 \x01(\x04\"(\n\x14SetLocalNameResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"7\n\x14SetLocalNameCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"E\n\x14SetSubscribedRequest\x12\x11\n\tsubscribe\x18\x01 \x02(\x08\x12\x1a\n\x12publication_handle\x18\x02 \x02(\x04\"\x17\n\x15SetSubscribedResponse\"G\n\x16GetSessionStatsRequest\x12\x13\n\x0broom_handle\x18\x01 \x02(\x04\x12\x18\n\x10request_async_id\x18\x02 \x01(\x04\"+\n\x17GetSessionStatsResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"\xf7\x01\n\x17GetSessionStatsCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\x0f\n\x05\x65rror\x18\x02 \x01(\tH\x00\x12?\n\x06result\x18\x03 \x01(\x0b\x32-.livekit.proto.GetSessionStatsCallback.ResultH\x00\x1am\n\x06Result\x12\x30\n\x0fpublisher_stats\x18\x01 \x03(\x0b\x32\x17.livekit.proto.RtcStats\x12\x31\n\x10subscriber_stats\x18\x02 \x03(\x0b\x32\x17.livekit.proto.RtcStatsB\t\n\x07message\";\n\rVideoEncoding\x12\x13\n\x0bmax_bitrate\x18\x01 \x02(\x04\x12\x15\n\rmax_framerate\x18\x02 \x02(\x01\"$\n\rAudioEncoding\x12\x13\n\x0bmax_bitrate\x18\x01 \x02(\x04\"\x95\x03\n\x13TrackPublishOptions\x12\x34\n\x0evideo_encoding\x18\x01 \x01(\x0b\x32\x1c.livekit.proto.VideoEncoding\x12\x34\n\x0e\x61udio_encoding\x18\x02 \x01(\x0b\x32\x1c.livekit.proto.AudioEncoding\x12.\n\x0bvideo_codec\x18\x03 \x01(\x0e\x32\x19.livekit.proto.VideoCodec\x12\x0b\n\x03\x64tx\x18\x04 \x01(\x08\x12\x0b\n\x03red\x18\x05 \x01(\x08\x12\x11\n\tsimulcast\x18\x06 \x01(\x08\x12*\n\x06source\x18\x07 \x01(\x0e\x32\x1a.livekit.proto.TrackSource\x12\x0e\n\x06stream\x18\x08 \x01(\t\x12\x19\n\x11preconnect_buffer\x18\t \x01(\x08\x12\x44\n\x17packet_trailer_features\x18\n \x03(\x0e\x32#.livekit.proto.PacketTrailerFeature\x12\x18\n\x10scalability_mode\x18\x0b \x01(\t\"=\n\tIceServer\x12\x0c\n\x04urls\x18\x01 \x03(\t\x12\x10\n\x08username\x18\x02 \x01(\t\x12\x10\n\x08password\x18\x03 \x01(\t\"\xc4\x01\n\tRtcConfig\x12;\n\x12ice_transport_type\x18\x01 \x01(\x0e\x32\x1f.livekit.proto.IceTransportType\x12K\n\x1a\x63ontinual_gathering_policy\x18\x02 \x01(\x0e\x32\'.livekit.proto.ContinualGatheringPolicy\x12-\n\x0bice_servers\x18\x03 \x03(\x0b\x32\x18.livekit.proto.IceServer\"\xae\x02\n\x0bRoomOptions\x12\x16\n\x0e\x61uto_subscribe\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x64\x61ptive_stream\x18\x02 \x01(\x08\x12\x10\n\x08\x64ynacast\x18\x03 \x01(\x08\x12,\n\x04\x65\x32\x65\x65\x18\x04 \x01(\x0b\x32\x1a.livekit.proto.E2eeOptionsB\x02\x18\x01\x12,\n\nrtc_config\x18\x05 \x01(\x0b\x32\x18.livekit.proto.RtcConfig\x12\x14\n\x0cjoin_retries\x18\x06 \x01(\r\x12.\n\nencryption\x18\x07 \x01(\x0b\x32\x1a.livekit.proto.E2eeOptions\x12\x1e\n\x16single_peer_connection\x18\x08 \x01(\x08\x12\x1a\n\x12\x63onnect_timeout_ms\x18\t \x01(\x04\"w\n\x14TranscriptionSegment\x12\n\n\x02id\x18\x01 \x02(\t\x12\x0c\n\x04text\x18\x02 \x02(\t\x12\x12\n\nstart_time\x18\x03 \x02(\x04\x12\x10\n\x08\x65nd_time\x18\x04 \x02(\x04\x12\r\n\x05\x66inal\x18\x05 \x02(\x08\x12\x10\n\x08language\x18\x06 \x02(\t\"0\n\nBufferInfo\x12\x10\n\x08\x64\x61ta_ptr\x18\x01 \x02(\x04\x12\x10\n\x08\x64\x61ta_len\x18\x02 \x02(\x04\"e\n\x0bOwnedBuffer\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12\'\n\x04\x64\x61ta\x18\x02 \x02(\x0b\x32\x19.livekit.proto.BufferInfo\"\xce\x17\n\tRoomEvent\x12\x13\n\x0broom_handle\x18\x01 \x02(\x04\x12\x44\n\x15participant_connected\x18\x02 \x01(\x0b\x32#.livekit.proto.ParticipantConnectedH\x00\x12J\n\x18participant_disconnected\x18\x03 \x01(\x0b\x32&.livekit.proto.ParticipantDisconnectedH\x00\x12\x43\n\x15local_track_published\x18\x04 \x01(\x0b\x32\".livekit.proto.LocalTrackPublishedH\x00\x12G\n\x17local_track_unpublished\x18\x05 \x01(\x0b\x32$.livekit.proto.LocalTrackUnpublishedH\x00\x12\x45\n\x16local_track_subscribed\x18\x06 \x01(\x0b\x32#.livekit.proto.LocalTrackSubscribedH\x00\x12\x38\n\x0ftrack_published\x18\x07 \x01(\x0b\x32\x1d.livekit.proto.TrackPublishedH\x00\x12<\n\x11track_unpublished\x18\x08 \x01(\x0b\x32\x1f.livekit.proto.TrackUnpublishedH\x00\x12:\n\x10track_subscribed\x18\t \x01(\x0b\x32\x1e.livekit.proto.TrackSubscribedH\x00\x12>\n\x12track_unsubscribed\x18\n \x01(\x0b\x32 .livekit.proto.TrackUnsubscribedH\x00\x12K\n\x19track_subscription_failed\x18\x0b \x01(\x0b\x32&.livekit.proto.TrackSubscriptionFailedH\x00\x12\x30\n\x0btrack_muted\x18\x0c \x01(\x0b\x32\x19.livekit.proto.TrackMutedH\x00\x12\x34\n\rtrack_unmuted\x18\r \x01(\x0b\x32\x1b.livekit.proto.TrackUnmutedH\x00\x12G\n\x17\x61\x63tive_speakers_changed\x18\x0e \x01(\x0b\x32$.livekit.proto.ActiveSpeakersChangedH\x00\x12\x43\n\x15room_metadata_changed\x18\x0f \x01(\x0b\x32\".livekit.proto.RoomMetadataChangedH\x00\x12\x39\n\x10room_sid_changed\x18\x10 \x01(\x0b\x32\x1d.livekit.proto.RoomSidChangedH\x00\x12Q\n\x1cparticipant_metadata_changed\x18\x11 \x01(\x0b\x32).livekit.proto.ParticipantMetadataChangedH\x00\x12I\n\x18participant_name_changed\x18\x12 \x01(\x0b\x32%.livekit.proto.ParticipantNameChangedH\x00\x12U\n\x1eparticipant_attributes_changed\x18\x13 \x01(\x0b\x32+.livekit.proto.ParticipantAttributesChangedH\x00\x12M\n\x1a\x63onnection_quality_changed\x18\x14 \x01(\x0b\x32\'.livekit.proto.ConnectionQualityChangedH\x00\x12I\n\x18\x63onnection_state_changed\x18\x15 \x01(\x0b\x32%.livekit.proto.ConnectionStateChangedH\x00\x12\x33\n\x0c\x64isconnected\x18\x16 \x01(\x0b\x32\x1b.livekit.proto.DisconnectedH\x00\x12\x33\n\x0creconnecting\x18\x17 \x01(\x0b\x32\x1b.livekit.proto.ReconnectingH\x00\x12\x31\n\x0breconnected\x18\x18 \x01(\x0b\x32\x1a.livekit.proto.ReconnectedH\x00\x12=\n\x12\x65\x32\x65\x65_state_changed\x18\x19 \x01(\x0b\x32\x1f.livekit.proto.E2eeStateChangedH\x00\x12%\n\x03\x65os\x18\x1a \x01(\x0b\x32\x16.livekit.proto.RoomEOSH\x00\x12\x41\n\x14\x64\x61ta_packet_received\x18\x1b \x01(\x0b\x32!.livekit.proto.DataPacketReceivedH\x00\x12\x46\n\x16transcription_received\x18\x1c \x01(\x0b\x32$.livekit.proto.TranscriptionReceivedH\x00\x12:\n\x0c\x63hat_message\x18\x1d \x01(\x0b\x32\".livekit.proto.ChatMessageReceivedH\x00\x12I\n\x16stream_header_received\x18\x1e \x01(\x0b\x32\'.livekit.proto.DataStreamHeaderReceivedH\x00\x12G\n\x15stream_chunk_received\x18\x1f \x01(\x0b\x32&.livekit.proto.DataStreamChunkReceivedH\x00\x12K\n\x17stream_trailer_received\x18 \x01(\x0b\x32(.livekit.proto.DataStreamTrailerReceivedH\x00\x12i\n\"data_channel_low_threshold_changed\x18! \x01(\x0b\x32;.livekit.proto.DataChannelBufferedAmountLowThresholdChangedH\x00\x12=\n\x12\x62yte_stream_opened\x18\" \x01(\x0b\x32\x1f.livekit.proto.ByteStreamOpenedH\x00\x12=\n\x12text_stream_opened\x18# \x01(\x0b\x32\x1f.livekit.proto.TextStreamOpenedH\x00\x12/\n\x0croom_updated\x18$ \x01(\x0b\x32\x17.livekit.proto.RoomInfoH\x00\x12(\n\x05moved\x18% \x01(\x0b\x32\x17.livekit.proto.RoomInfoH\x00\x12\x42\n\x14participants_updated\x18& \x01(\x0b\x32\".livekit.proto.ParticipantsUpdatedH\x00\x12\x62\n%participant_encryption_status_changed\x18\' \x01(\x0b\x32\x31.livekit.proto.ParticipantEncryptionStatusChangedH\x00\x12U\n\x1eparticipant_permission_changed\x18) \x01(\x0b\x32+.livekit.proto.ParticipantPermissionChangedH\x00\x12\x38\n\x0ftoken_refreshed\x18( \x01(\x0b\x32\x1d.livekit.proto.TokenRefreshedH\x00\x12>\n\x12participant_active\x18* \x01(\x0b\x32 .livekit.proto.ParticipantActiveH\x00\x12\x41\n\x14\x64\x61ta_track_published\x18+ \x01(\x0b\x32!.livekit.proto.DataTrackPublishedH\x00\x12\x45\n\x16\x64\x61ta_track_unpublished\x18, \x01(\x0b\x32#.livekit.proto.DataTrackUnpublishedH\x00\x12G\n\x17local_track_republished\x18- \x01(\x0b\x32$.livekit.proto.LocalTrackRepublishedH\x00\x42\t\n\x07message\"\xc9\x02\n\x08RoomInfo\x12\x0b\n\x03sid\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x02(\t\x12\x10\n\x08metadata\x18\x03 \x02(\t\x12.\n&lossy_dc_buffered_amount_low_threshold\x18\x04 \x02(\x04\x12\x31\n)reliable_dc_buffered_amount_low_threshold\x18\x05 \x02(\x04\x12\x15\n\rempty_timeout\x18\x06 \x02(\r\x12\x19\n\x11\x64\x65parture_timeout\x18\x07 \x02(\r\x12\x18\n\x10max_participants\x18\x08 \x02(\r\x12\x15\n\rcreation_time\x18\t \x02(\x03\x12\x18\n\x10num_participants\x18\n \x02(\r\x12\x16\n\x0enum_publishers\x18\x0b \x02(\r\x12\x18\n\x10\x61\x63tive_recording\x18\x0c \x02(\x08\"a\n\tOwnedRoom\x12-\n\x06handle\x18\x01 \x02(\x0b\x32\x1d.livekit.proto.FfiOwnedHandle\x12%\n\x04info\x18\x02 \x02(\x0b\x32\x17.livekit.proto.RoomInfo\"K\n\x13ParticipantsUpdated\x12\x34\n\x0cparticipants\x18\x01 \x03(\x0b\x32\x1e.livekit.proto.ParticipantInfo\"E\n\x14ParticipantConnected\x12-\n\x04info\x18\x01 \x02(\x0b\x32\x1f.livekit.proto.OwnedParticipant\"1\n\x11ParticipantActive\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\"s\n\x17ParticipantDisconnected\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12:\n\x11\x64isconnect_reason\x18\x02 \x02(\x0e\x32\x1f.livekit.proto.DisconnectReason\"(\n\x13LocalTrackPublished\x12\x11\n\ttrack_sid\x18\x01 \x02(\t\"0\n\x15LocalTrackUnpublished\x12\x17\n\x0fpublication_sid\x18\x01 \x02(\t\"|\n\x15LocalTrackRepublished\x12\x1a\n\x12publication_handle\x18\x01 \x02(\x04\x12\x14\n\x0cprevious_sid\x18\x02 \x02(\t\x12\x31\n\x04info\x18\x03 \x02(\x0b\x32#.livekit.proto.TrackPublicationInfo\")\n\x14LocalTrackSubscribed\x12\x11\n\ttrack_sid\x18\x02 \x02(\t\"i\n\x0eTrackPublished\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x39\n\x0bpublication\x18\x02 \x02(\x0b\x32$.livekit.proto.OwnedTrackPublication\"I\n\x10TrackUnpublished\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x17\n\x0fpublication_sid\x18\x02 \x02(\t\"Y\n\x0fTrackSubscribed\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12(\n\x05track\x18\x02 \x02(\x0b\x32\x19.livekit.proto.OwnedTrack\"D\n\x11TrackUnsubscribed\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x11\n\ttrack_sid\x18\x02 \x02(\t\"Y\n\x17TrackSubscriptionFailed\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x11\n\ttrack_sid\x18\x02 \x02(\t\x12\r\n\x05\x65rror\x18\x03 \x02(\t\"=\n\nTrackMuted\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x11\n\ttrack_sid\x18\x02 \x02(\t\"?\n\x0cTrackUnmuted\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x11\n\ttrack_sid\x18\x02 \x02(\t\"_\n\x10\x45\x32\x65\x65StateChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12-\n\x05state\x18\x02 \x02(\x0e\x32\x1e.livekit.proto.EncryptionState\"7\n\x15\x41\x63tiveSpeakersChanged\x12\x1e\n\x16participant_identities\x18\x01 \x03(\t\"\'\n\x13RoomMetadataChanged\x12\x10\n\x08metadata\x18\x01 \x02(\t\"\x1d\n\x0eRoomSidChanged\x12\x0b\n\x03sid\x18\x01 \x02(\t\"L\n\x1aParticipantMetadataChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x10\n\x08metadata\x18\x02 \x02(\t\"\xac\x01\n\x1cParticipantAttributesChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x32\n\nattributes\x18\x02 \x03(\x0b\x32\x1e.livekit.proto.AttributesEntry\x12:\n\x12\x63hanged_attributes\x18\x03 \x03(\x0b\x32\x1e.livekit.proto.AttributesEntry\"X\n\"ParticipantEncryptionStatusChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x14\n\x0cis_encrypted\x18\x02 \x02(\x08\"D\n\x16ParticipantNameChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x0c\n\x04name\x18\x02 \x02(\t\"v\n\x1cParticipantPermissionChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x38\n\npermission\x18\x02 \x01(\x0b\x32$.livekit.proto.ParticipantPermission\"k\n\x18\x43onnectionQualityChanged\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x31\n\x07quality\x18\x02 \x02(\x0e\x32 .livekit.proto.ConnectionQuality\"E\n\nUserPacket\x12(\n\x04\x64\x61ta\x18\x01 \x02(\x0b\x32\x1a.livekit.proto.OwnedBuffer\x12\r\n\x05topic\x18\x02 \x01(\t\"y\n\x0b\x43hatMessage\x12\n\n\x02id\x18\x01 \x02(\t\x12\x11\n\ttimestamp\x18\x02 \x02(\x03\x12\x0f\n\x07message\x18\x03 \x02(\t\x12\x16\n\x0e\x65\x64it_timestamp\x18\x04 \x01(\x03\x12\x0f\n\x07\x64\x65leted\x18\x05 \x01(\x08\x12\x11\n\tgenerated\x18\x06 \x01(\x08\"`\n\x13\x43hatMessageReceived\x12+\n\x07message\x18\x01 \x02(\x0b\x32\x1a.livekit.proto.ChatMessage\x12\x1c\n\x14participant_identity\x18\x02 \x02(\t\"&\n\x07SipDTMF\x12\x0c\n\x04\x63ode\x18\x01 \x02(\r\x12\r\n\x05\x64igit\x18\x02 \x01(\t\"\xbf\x01\n\x12\x44\x61taPacketReceived\x12+\n\x04kind\x18\x01 \x02(\x0e\x32\x1d.livekit.proto.DataPacketKind\x12\x1c\n\x14participant_identity\x18\x02 \x02(\t\x12)\n\x04user\x18\x04 \x01(\x0b\x32\x19.livekit.proto.UserPacketH\x00\x12*\n\x08sip_dtmf\x18\x05 \x01(\x0b\x32\x16.livekit.proto.SipDTMFH\x00\x42\x07\n\x05value\"\x7f\n\x15TranscriptionReceived\x12\x1c\n\x14participant_identity\x18\x01 \x01(\t\x12\x11\n\ttrack_sid\x18\x02 \x01(\t\x12\x35\n\x08segments\x18\x03 \x03(\x0b\x32#.livekit.proto.TranscriptionSegment\"G\n\x16\x43onnectionStateChanged\x12-\n\x05state\x18\x01 \x02(\x0e\x32\x1e.livekit.proto.ConnectionState\"\x0b\n\tConnected\"?\n\x0c\x44isconnected\x12/\n\x06reason\x18\x01 \x02(\x0e\x32\x1f.livekit.proto.DisconnectReason\"\x0e\n\x0cReconnecting\"\r\n\x0bReconnected\"\x1f\n\x0eTokenRefreshed\x12\r\n\x05token\x18\x01 \x02(\t\"\t\n\x07RoomEOS\"\x8e\x07\n\nDataStream\x1a\xaa\x01\n\nTextHeader\x12?\n\x0eoperation_type\x18\x01 \x02(\x0e\x32\'.livekit.proto.DataStream.OperationType\x12\x0f\n\x07version\x18\x02 \x01(\x05\x12\x1a\n\x12reply_to_stream_id\x18\x03 \x01(\t\x12\x1b\n\x13\x61ttached_stream_ids\x18\x04 \x03(\t\x12\x11\n\tgenerated\x18\x05 \x01(\x08\x1a\x1a\n\nByteHeader\x12\x0c\n\x04name\x18\x01 \x02(\t\x1a\xeb\x02\n\x06Header\x12\x11\n\tstream_id\x18\x01 \x02(\t\x12\x11\n\ttimestamp\x18\x02 \x02(\x03\x12\x11\n\tmime_type\x18\x03 \x02(\t\x12\r\n\x05topic\x18\x04 \x02(\t\x12\x14\n\x0ctotal_length\x18\x05 \x01(\x04\x12\x44\n\nattributes\x18\x06 \x03(\x0b\x32\x30.livekit.proto.DataStream.Header.AttributesEntry\x12;\n\x0btext_header\x18\x07 \x01(\x0b\x32$.livekit.proto.DataStream.TextHeaderH\x00\x12;\n\x0b\x62yte_header\x18\x08 \x01(\x0b\x32$.livekit.proto.DataStream.ByteHeaderH\x00\x1a\x31\n\x0f\x41ttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x10\n\x0e\x63ontent_header\x1a]\n\x05\x43hunk\x12\x11\n\tstream_id\x18\x01 \x02(\t\x12\x13\n\x0b\x63hunk_index\x18\x02 \x02(\x04\x12\x0f\n\x07\x63ontent\x18\x03 \x02(\x0c\x12\x0f\n\x07version\x18\x04 \x01(\x05\x12\n\n\x02iv\x18\x05 \x01(\x0c\x1a\xa6\x01\n\x07Trailer\x12\x11\n\tstream_id\x18\x01 \x02(\t\x12\x0e\n\x06reason\x18\x02 \x02(\t\x12\x45\n\nattributes\x18\x03 \x03(\x0b\x32\x31.livekit.proto.DataStream.Trailer.AttributesEntry\x1a\x31\n\x0f\x41ttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"A\n\rOperationType\x12\n\n\x06\x43REATE\x10\x00\x12\n\n\x06UPDATE\x10\x01\x12\n\n\x06\x44\x45LETE\x10\x02\x12\x0c\n\x08REACTION\x10\x03\"j\n\x18\x44\x61taStreamHeaderReceived\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x30\n\x06header\x18\x02 \x02(\x0b\x32 .livekit.proto.DataStream.Header\"g\n\x17\x44\x61taStreamChunkReceived\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12.\n\x05\x63hunk\x18\x02 \x02(\x0b\x32\x1f.livekit.proto.DataStream.Chunk\"m\n\x19\x44\x61taStreamTrailerReceived\x12\x1c\n\x14participant_identity\x18\x01 \x02(\t\x12\x32\n\x07trailer\x18\x02 \x02(\x0b\x32!.livekit.proto.DataStream.Trailer\"\xc0\x01\n\x17SendStreamHeaderRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x30\n\x06header\x18\x02 \x02(\x0b\x32 .livekit.proto.DataStream.Header\x12\x1e\n\x16\x64\x65stination_identities\x18\x03 \x03(\t\x12\x17\n\x0fsender_identity\x18\x04 \x02(\t\x12\x18\n\x10request_async_id\x18\x05 \x01(\x04\"\xbd\x01\n\x16SendStreamChunkRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12.\n\x05\x63hunk\x18\x02 \x02(\x0b\x32\x1f.livekit.proto.DataStream.Chunk\x12\x1e\n\x16\x64\x65stination_identities\x18\x03 \x03(\t\x12\x17\n\x0fsender_identity\x18\x04 \x02(\t\x12\x18\n\x10request_async_id\x18\x05 \x01(\x04\"\xc3\x01\n\x18SendStreamTrailerRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x32\n\x07trailer\x18\x02 \x02(\x0b\x32!.livekit.proto.DataStream.Trailer\x12\x1e\n\x16\x64\x65stination_identities\x18\x03 \x03(\t\x12\x17\n\x0fsender_identity\x18\x04 \x02(\t\x12\x18\n\x10request_async_id\x18\x05 \x01(\x04\",\n\x18SendStreamHeaderResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"+\n\x17SendStreamChunkResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\"-\n\x19SendStreamTrailerResponse\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\";\n\x18SendStreamHeaderCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\":\n\x17SendStreamChunkCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"<\n\x19SendStreamTrailerCallback\x12\x10\n\x08\x61sync_id\x18\x01 \x02(\x04\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x93\x01\n/SetDataChannelBufferedAmountLowThresholdRequest\x12 \n\x18local_participant_handle\x18\x01 \x02(\x04\x12\x11\n\tthreshold\x18\x02 \x02(\x04\x12+\n\x04kind\x18\x03 \x02(\x0e\x32\x1d.livekit.proto.DataPacketKind\"2\n0SetDataChannelBufferedAmountLowThresholdResponse\"n\n,DataChannelBufferedAmountLowThresholdChanged\x12+\n\x04kind\x18\x01 \x02(\x0e\x32\x1d.livekit.proto.DataPacketKind\x12\x11\n\tthreshold\x18\x02 \x02(\x04\"f\n\x10\x42yteStreamOpened\x12\x34\n\x06reader\x18\x01 \x02(\x0b\x32$.livekit.proto.OwnedByteStreamReader\x12\x1c\n\x14participant_identity\x18\x02 \x02(\t\"f\n\x10TextStreamOpened\x12\x34\n\x06reader\x18\x01 \x02(\x0b\x32$.livekit.proto.OwnedTextStreamReader\x12\x1c\n\x14participant_identity\x18\x02 \x02(\t\"H\n\x12\x44\x61taTrackPublished\x12\x32\n\x05track\x18\x01 \x02(\x0b\x32#.livekit.proto.OwnedRemoteDataTrack\"#\n\x14\x44\x61taTrackUnpublished\x12\x0b\n\x03sid\x18\x01 \x02(\t*\xe6\x01\n\x14SimulateScenarioKind\x12\x1d\n\x19SIMULATE_SIGNAL_RECONNECT\x10\x00\x12\x14\n\x10SIMULATE_SPEAKER\x10\x01\x12\x19\n\x15SIMULATE_NODE_FAILURE\x10\x02\x12\x19\n\x15SIMULATE_SERVER_LEAVE\x10\x03\x12\x16\n\x12SIMULATE_MIGRATION\x10\x04\x12\x16\n\x12SIMULATE_FORCE_TCP\x10\x05\x12\x16\n\x12SIMULATE_FORCE_TLS\x10\x06\x12\x1b\n\x17SIMULATE_FULL_RECONNECT\x10\x07*P\n\x10IceTransportType\x12\x13\n\x0fTRANSPORT_RELAY\x10\x00\x12\x14\n\x10TRANSPORT_NOHOST\x10\x01\x12\x11\n\rTRANSPORT_ALL\x10\x02*C\n\x18\x43ontinualGatheringPolicy\x12\x0f\n\x0bGATHER_ONCE\x10\x00\x12\x16\n\x12GATHER_CONTINUALLY\x10\x01*`\n\x11\x43onnectionQuality\x12\x10\n\x0cQUALITY_POOR\x10\x00\x12\x10\n\x0cQUALITY_GOOD\x10\x01\x12\x15\n\x11QUALITY_EXCELLENT\x10\x02\x12\x10\n\x0cQUALITY_LOST\x10\x03*S\n\x0f\x43onnectionState\x12\x15\n\x11\x43ONN_DISCONNECTED\x10\x00\x12\x12\n\x0e\x43ONN_CONNECTED\x10\x01\x12\x15\n\x11\x43ONN_RECONNECTING\x10\x02*3\n\x0e\x44\x61taPacketKind\x12\x0e\n\nKIND_LOSSY\x10\x00\x12\x11\n\rKIND_RELIABLE\x10\x01\x42\x10\xaa\x02\rLiveKit.Proto') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -38,18 +38,18 @@ _globals['_DATASTREAM_HEADER_ATTRIBUTESENTRY']._serialized_options = b'8\001' _globals['_DATASTREAM_TRAILER_ATTRIBUTESENTRY']._options = None _globals['_DATASTREAM_TRAILER_ATTRIBUTESENTRY']._serialized_options = b'8\001' - _globals['_SIMULATESCENARIOKIND']._serialized_start=14899 - _globals['_SIMULATESCENARIOKIND']._serialized_end=15129 - _globals['_ICETRANSPORTTYPE']._serialized_start=15131 - _globals['_ICETRANSPORTTYPE']._serialized_end=15211 - _globals['_CONTINUALGATHERINGPOLICY']._serialized_start=15213 - _globals['_CONTINUALGATHERINGPOLICY']._serialized_end=15280 - _globals['_CONNECTIONQUALITY']._serialized_start=15282 - _globals['_CONNECTIONQUALITY']._serialized_end=15378 - _globals['_CONNECTIONSTATE']._serialized_start=15380 - _globals['_CONNECTIONSTATE']._serialized_end=15463 - _globals['_DATAPACKETKIND']._serialized_start=15465 - _globals['_DATAPACKETKIND']._serialized_end=15516 + _globals['_SIMULATESCENARIOKIND']._serialized_start=14821 + _globals['_SIMULATESCENARIOKIND']._serialized_end=15051 + _globals['_ICETRANSPORTTYPE']._serialized_start=15053 + _globals['_ICETRANSPORTTYPE']._serialized_end=15133 + _globals['_CONTINUALGATHERINGPOLICY']._serialized_start=15135 + _globals['_CONTINUALGATHERINGPOLICY']._serialized_end=15202 + _globals['_CONNECTIONQUALITY']._serialized_start=15204 + _globals['_CONNECTIONQUALITY']._serialized_end=15300 + _globals['_CONNECTIONSTATE']._serialized_start=15302 + _globals['_CONNECTIONSTATE']._serialized_end=15385 + _globals['_DATAPACKETKIND']._serialized_start=15387 + _globals['_DATAPACKETKIND']._serialized_end=15438 _globals['_CONNECTREQUEST']._serialized_start=156 _globals['_CONNECTREQUEST']._serialized_end=271 _globals['_CONNECTRESPONSE']._serialized_start=273 @@ -78,228 +78,224 @@ _globals['_PUBLISHTRACKRESPONSE']._serialized_end=1392 _globals['_PUBLISHTRACKCALLBACK']._serialized_start=1395 _globals['_PUBLISHTRACKCALLBACK']._serialized_end=1524 - _globals['_READYFORROOMEVENTREQUEST']._serialized_start=1526 - _globals['_READYFORROOMEVENTREQUEST']._serialized_end=1573 - _globals['_READYFORROOMEVENTRESPONSE']._serialized_start=1575 - _globals['_READYFORROOMEVENTRESPONSE']._serialized_end=1602 - _globals['_UNPUBLISHTRACKREQUEST']._serialized_start=1605 - _globals['_UNPUBLISHTRACKREQUEST']._serialized_end=1734 - _globals['_UNPUBLISHTRACKRESPONSE']._serialized_start=1736 - _globals['_UNPUBLISHTRACKRESPONSE']._serialized_end=1778 - _globals['_UNPUBLISHTRACKCALLBACK']._serialized_start=1780 - _globals['_UNPUBLISHTRACKCALLBACK']._serialized_end=1837 - _globals['_PUBLISHDATAREQUEST']._serialized_start=1840 - _globals['_PUBLISHDATAREQUEST']._serialized_end=2051 - _globals['_PUBLISHDATARESPONSE']._serialized_start=2053 - _globals['_PUBLISHDATARESPONSE']._serialized_end=2092 - _globals['_PUBLISHDATACALLBACK']._serialized_start=2094 - _globals['_PUBLISHDATACALLBACK']._serialized_end=2148 - _globals['_PUBLISHTRANSCRIPTIONREQUEST']._serialized_start=2151 - _globals['_PUBLISHTRANSCRIPTIONREQUEST']._serialized_end=2343 - _globals['_PUBLISHTRANSCRIPTIONRESPONSE']._serialized_start=2345 - _globals['_PUBLISHTRANSCRIPTIONRESPONSE']._serialized_end=2393 - _globals['_PUBLISHTRANSCRIPTIONCALLBACK']._serialized_start=2395 - _globals['_PUBLISHTRANSCRIPTIONCALLBACK']._serialized_end=2458 - _globals['_PUBLISHSIPDTMFREQUEST']._serialized_start=2461 - _globals['_PUBLISHSIPDTMFREQUEST']._serialized_end=2605 - _globals['_PUBLISHSIPDTMFRESPONSE']._serialized_start=2607 - _globals['_PUBLISHSIPDTMFRESPONSE']._serialized_end=2649 - _globals['_PUBLISHSIPDTMFCALLBACK']._serialized_start=2651 - _globals['_PUBLISHSIPDTMFCALLBACK']._serialized_end=2708 - _globals['_SETLOCALMETADATAREQUEST']._serialized_start=2710 - _globals['_SETLOCALMETADATAREQUEST']._serialized_end=2813 - _globals['_SETLOCALMETADATARESPONSE']._serialized_start=2815 - _globals['_SETLOCALMETADATARESPONSE']._serialized_end=2859 - _globals['_SETLOCALMETADATACALLBACK']._serialized_start=2861 - _globals['_SETLOCALMETADATACALLBACK']._serialized_end=2920 - _globals['_SENDCHATMESSAGEREQUEST']._serialized_start=2923 - _globals['_SENDCHATMESSAGEREQUEST']._serialized_end=3081 - _globals['_EDITCHATMESSAGEREQUEST']._serialized_start=3084 - _globals['_EDITCHATMESSAGEREQUEST']._serialized_end=3298 - _globals['_SENDCHATMESSAGERESPONSE']._serialized_start=3300 - _globals['_SENDCHATMESSAGERESPONSE']._serialized_end=3343 - _globals['_SENDCHATMESSAGECALLBACK']._serialized_start=3345 - _globals['_SENDCHATMESSAGECALLBACK']._serialized_end=3468 - _globals['_SETLOCALATTRIBUTESREQUEST']._serialized_start=3471 - _globals['_SETLOCALATTRIBUTESREQUEST']._serialized_end=3610 - _globals['_ATTRIBUTESENTRY']._serialized_start=3612 - _globals['_ATTRIBUTESENTRY']._serialized_end=3657 - _globals['_SETLOCALATTRIBUTESRESPONSE']._serialized_start=3659 - _globals['_SETLOCALATTRIBUTESRESPONSE']._serialized_end=3705 - _globals['_SETLOCALATTRIBUTESCALLBACK']._serialized_start=3707 - _globals['_SETLOCALATTRIBUTESCALLBACK']._serialized_end=3768 - _globals['_SETLOCALNAMEREQUEST']._serialized_start=3770 - _globals['_SETLOCALNAMEREQUEST']._serialized_end=3865 - _globals['_SETLOCALNAMERESPONSE']._serialized_start=3867 - _globals['_SETLOCALNAMERESPONSE']._serialized_end=3907 - _globals['_SETLOCALNAMECALLBACK']._serialized_start=3909 - _globals['_SETLOCALNAMECALLBACK']._serialized_end=3964 - _globals['_SETSUBSCRIBEDREQUEST']._serialized_start=3966 - _globals['_SETSUBSCRIBEDREQUEST']._serialized_end=4035 - _globals['_SETSUBSCRIBEDRESPONSE']._serialized_start=4037 - _globals['_SETSUBSCRIBEDRESPONSE']._serialized_end=4060 - _globals['_GETSESSIONSTATSREQUEST']._serialized_start=4062 - _globals['_GETSESSIONSTATSREQUEST']._serialized_end=4133 - _globals['_GETSESSIONSTATSRESPONSE']._serialized_start=4135 - _globals['_GETSESSIONSTATSRESPONSE']._serialized_end=4178 - _globals['_GETSESSIONSTATSCALLBACK']._serialized_start=4181 - _globals['_GETSESSIONSTATSCALLBACK']._serialized_end=4428 - _globals['_GETSESSIONSTATSCALLBACK_RESULT']._serialized_start=4308 - _globals['_GETSESSIONSTATSCALLBACK_RESULT']._serialized_end=4417 - _globals['_VIDEOENCODING']._serialized_start=4430 - _globals['_VIDEOENCODING']._serialized_end=4489 - _globals['_AUDIOENCODING']._serialized_start=4491 - _globals['_AUDIOENCODING']._serialized_end=4527 - _globals['_TRACKPUBLISHOPTIONS']._serialized_start=4530 - _globals['_TRACKPUBLISHOPTIONS']._serialized_end=4935 - _globals['_ICESERVER']._serialized_start=4937 - _globals['_ICESERVER']._serialized_end=4998 - _globals['_RTCCONFIG']._serialized_start=5001 - _globals['_RTCCONFIG']._serialized_end=5197 - _globals['_ROOMOPTIONS']._serialized_start=5200 - _globals['_ROOMOPTIONS']._serialized_end=5502 - _globals['_TRANSCRIPTIONSEGMENT']._serialized_start=5504 - _globals['_TRANSCRIPTIONSEGMENT']._serialized_end=5623 - _globals['_BUFFERINFO']._serialized_start=5625 - _globals['_BUFFERINFO']._serialized_end=5673 - _globals['_OWNEDBUFFER']._serialized_start=5675 - _globals['_OWNEDBUFFER']._serialized_end=5776 - _globals['_ROOMEVENT']._serialized_start=5779 - _globals['_ROOMEVENT']._serialized_end=8801 - _globals['_ROOMINFO']._serialized_start=8804 - _globals['_ROOMINFO']._serialized_end=9133 - _globals['_OWNEDROOM']._serialized_start=9135 - _globals['_OWNEDROOM']._serialized_end=9232 - _globals['_PARTICIPANTSUPDATED']._serialized_start=9234 - _globals['_PARTICIPANTSUPDATED']._serialized_end=9309 - _globals['_PARTICIPANTCONNECTED']._serialized_start=9311 - _globals['_PARTICIPANTCONNECTED']._serialized_end=9380 - _globals['_PARTICIPANTACTIVE']._serialized_start=9382 - _globals['_PARTICIPANTACTIVE']._serialized_end=9431 - _globals['_PARTICIPANTDISCONNECTED']._serialized_start=9433 - _globals['_PARTICIPANTDISCONNECTED']._serialized_end=9548 - _globals['_LOCALTRACKPUBLISHED']._serialized_start=9550 - _globals['_LOCALTRACKPUBLISHED']._serialized_end=9590 - _globals['_LOCALTRACKUNPUBLISHED']._serialized_start=9592 - _globals['_LOCALTRACKUNPUBLISHED']._serialized_end=9640 - _globals['_LOCALTRACKREPUBLISHED']._serialized_start=9642 - _globals['_LOCALTRACKREPUBLISHED']._serialized_end=9766 - _globals['_LOCALTRACKSUBSCRIBED']._serialized_start=9768 - _globals['_LOCALTRACKSUBSCRIBED']._serialized_end=9809 - _globals['_TRACKPUBLISHED']._serialized_start=9811 - _globals['_TRACKPUBLISHED']._serialized_end=9916 - _globals['_TRACKUNPUBLISHED']._serialized_start=9918 - _globals['_TRACKUNPUBLISHED']._serialized_end=9991 - _globals['_TRACKSUBSCRIBED']._serialized_start=9993 - _globals['_TRACKSUBSCRIBED']._serialized_end=10082 - _globals['_TRACKUNSUBSCRIBED']._serialized_start=10084 - _globals['_TRACKUNSUBSCRIBED']._serialized_end=10152 - _globals['_TRACKSUBSCRIPTIONFAILED']._serialized_start=10154 - _globals['_TRACKSUBSCRIPTIONFAILED']._serialized_end=10243 - _globals['_TRACKMUTED']._serialized_start=10245 - _globals['_TRACKMUTED']._serialized_end=10306 - _globals['_TRACKUNMUTED']._serialized_start=10308 - _globals['_TRACKUNMUTED']._serialized_end=10371 - _globals['_E2EESTATECHANGED']._serialized_start=10373 - _globals['_E2EESTATECHANGED']._serialized_end=10468 - _globals['_ACTIVESPEAKERSCHANGED']._serialized_start=10470 - _globals['_ACTIVESPEAKERSCHANGED']._serialized_end=10525 - _globals['_ROOMMETADATACHANGED']._serialized_start=10527 - _globals['_ROOMMETADATACHANGED']._serialized_end=10566 - _globals['_ROOMSIDCHANGED']._serialized_start=10568 - _globals['_ROOMSIDCHANGED']._serialized_end=10597 - _globals['_PARTICIPANTMETADATACHANGED']._serialized_start=10599 - _globals['_PARTICIPANTMETADATACHANGED']._serialized_end=10675 - _globals['_PARTICIPANTATTRIBUTESCHANGED']._serialized_start=10678 - _globals['_PARTICIPANTATTRIBUTESCHANGED']._serialized_end=10850 - _globals['_PARTICIPANTENCRYPTIONSTATUSCHANGED']._serialized_start=10852 - _globals['_PARTICIPANTENCRYPTIONSTATUSCHANGED']._serialized_end=10940 - _globals['_PARTICIPANTNAMECHANGED']._serialized_start=10942 - _globals['_PARTICIPANTNAMECHANGED']._serialized_end=11010 - _globals['_PARTICIPANTPERMISSIONCHANGED']._serialized_start=11012 - _globals['_PARTICIPANTPERMISSIONCHANGED']._serialized_end=11130 - _globals['_CONNECTIONQUALITYCHANGED']._serialized_start=11132 - _globals['_CONNECTIONQUALITYCHANGED']._serialized_end=11239 - _globals['_USERPACKET']._serialized_start=11241 - _globals['_USERPACKET']._serialized_end=11310 - _globals['_CHATMESSAGE']._serialized_start=11312 - _globals['_CHATMESSAGE']._serialized_end=11433 - _globals['_CHATMESSAGERECEIVED']._serialized_start=11435 - _globals['_CHATMESSAGERECEIVED']._serialized_end=11531 - _globals['_SIPDTMF']._serialized_start=11533 - _globals['_SIPDTMF']._serialized_end=11571 - _globals['_DATAPACKETRECEIVED']._serialized_start=11574 - _globals['_DATAPACKETRECEIVED']._serialized_end=11765 - _globals['_TRANSCRIPTIONRECEIVED']._serialized_start=11767 - _globals['_TRANSCRIPTIONRECEIVED']._serialized_end=11894 - _globals['_CONNECTIONSTATECHANGED']._serialized_start=11896 - _globals['_CONNECTIONSTATECHANGED']._serialized_end=11967 - _globals['_CONNECTED']._serialized_start=11969 - _globals['_CONNECTED']._serialized_end=11980 - _globals['_DISCONNECTED']._serialized_start=11982 - _globals['_DISCONNECTED']._serialized_end=12045 - _globals['_RECONNECTING']._serialized_start=12047 - _globals['_RECONNECTING']._serialized_end=12061 - _globals['_RECONNECTED']._serialized_start=12063 - _globals['_RECONNECTED']._serialized_end=12076 - _globals['_TOKENREFRESHED']._serialized_start=12078 - _globals['_TOKENREFRESHED']._serialized_end=12109 - _globals['_ROOMEOS']._serialized_start=12111 - _globals['_ROOMEOS']._serialized_end=12120 - _globals['_DATASTREAM']._serialized_start=12123 - _globals['_DATASTREAM']._serialized_end=13033 - _globals['_DATASTREAM_TEXTHEADER']._serialized_start=12138 - _globals['_DATASTREAM_TEXTHEADER']._serialized_end=12308 - _globals['_DATASTREAM_BYTEHEADER']._serialized_start=12310 - _globals['_DATASTREAM_BYTEHEADER']._serialized_end=12336 - _globals['_DATASTREAM_HEADER']._serialized_start=12339 - _globals['_DATASTREAM_HEADER']._serialized_end=12702 - _globals['_DATASTREAM_HEADER_ATTRIBUTESENTRY']._serialized_start=12635 - _globals['_DATASTREAM_HEADER_ATTRIBUTESENTRY']._serialized_end=12684 - _globals['_DATASTREAM_CHUNK']._serialized_start=12704 - _globals['_DATASTREAM_CHUNK']._serialized_end=12797 - _globals['_DATASTREAM_TRAILER']._serialized_start=12800 - _globals['_DATASTREAM_TRAILER']._serialized_end=12966 - _globals['_DATASTREAM_TRAILER_ATTRIBUTESENTRY']._serialized_start=12635 - _globals['_DATASTREAM_TRAILER_ATTRIBUTESENTRY']._serialized_end=12684 - _globals['_DATASTREAM_OPERATIONTYPE']._serialized_start=12968 - _globals['_DATASTREAM_OPERATIONTYPE']._serialized_end=13033 - _globals['_DATASTREAMHEADERRECEIVED']._serialized_start=13035 - _globals['_DATASTREAMHEADERRECEIVED']._serialized_end=13141 - _globals['_DATASTREAMCHUNKRECEIVED']._serialized_start=13143 - _globals['_DATASTREAMCHUNKRECEIVED']._serialized_end=13246 - _globals['_DATASTREAMTRAILERRECEIVED']._serialized_start=13248 - _globals['_DATASTREAMTRAILERRECEIVED']._serialized_end=13357 - _globals['_SENDSTREAMHEADERREQUEST']._serialized_start=13360 - _globals['_SENDSTREAMHEADERREQUEST']._serialized_end=13552 - _globals['_SENDSTREAMCHUNKREQUEST']._serialized_start=13555 - _globals['_SENDSTREAMCHUNKREQUEST']._serialized_end=13744 - _globals['_SENDSTREAMTRAILERREQUEST']._serialized_start=13747 - _globals['_SENDSTREAMTRAILERREQUEST']._serialized_end=13942 - _globals['_SENDSTREAMHEADERRESPONSE']._serialized_start=13944 - _globals['_SENDSTREAMHEADERRESPONSE']._serialized_end=13988 - _globals['_SENDSTREAMCHUNKRESPONSE']._serialized_start=13990 - _globals['_SENDSTREAMCHUNKRESPONSE']._serialized_end=14033 - _globals['_SENDSTREAMTRAILERRESPONSE']._serialized_start=14035 - _globals['_SENDSTREAMTRAILERRESPONSE']._serialized_end=14080 - _globals['_SENDSTREAMHEADERCALLBACK']._serialized_start=14082 - _globals['_SENDSTREAMHEADERCALLBACK']._serialized_end=14141 - _globals['_SENDSTREAMCHUNKCALLBACK']._serialized_start=14143 - _globals['_SENDSTREAMCHUNKCALLBACK']._serialized_end=14201 - _globals['_SENDSTREAMTRAILERCALLBACK']._serialized_start=14203 - _globals['_SENDSTREAMTRAILERCALLBACK']._serialized_end=14263 - _globals['_SETDATACHANNELBUFFEREDAMOUNTLOWTHRESHOLDREQUEST']._serialized_start=14266 - _globals['_SETDATACHANNELBUFFEREDAMOUNTLOWTHRESHOLDREQUEST']._serialized_end=14413 - _globals['_SETDATACHANNELBUFFEREDAMOUNTLOWTHRESHOLDRESPONSE']._serialized_start=14415 - _globals['_SETDATACHANNELBUFFEREDAMOUNTLOWTHRESHOLDRESPONSE']._serialized_end=14465 - _globals['_DATACHANNELBUFFEREDAMOUNTLOWTHRESHOLDCHANGED']._serialized_start=14467 - _globals['_DATACHANNELBUFFEREDAMOUNTLOWTHRESHOLDCHANGED']._serialized_end=14577 - _globals['_BYTESTREAMOPENED']._serialized_start=14579 - _globals['_BYTESTREAMOPENED']._serialized_end=14681 - _globals['_TEXTSTREAMOPENED']._serialized_start=14683 - _globals['_TEXTSTREAMOPENED']._serialized_end=14785 - _globals['_DATATRACKPUBLISHED']._serialized_start=14787 - _globals['_DATATRACKPUBLISHED']._serialized_end=14859 - _globals['_DATATRACKUNPUBLISHED']._serialized_start=14861 - _globals['_DATATRACKUNPUBLISHED']._serialized_end=14896 + _globals['_UNPUBLISHTRACKREQUEST']._serialized_start=1527 + _globals['_UNPUBLISHTRACKREQUEST']._serialized_end=1656 + _globals['_UNPUBLISHTRACKRESPONSE']._serialized_start=1658 + _globals['_UNPUBLISHTRACKRESPONSE']._serialized_end=1700 + _globals['_UNPUBLISHTRACKCALLBACK']._serialized_start=1702 + _globals['_UNPUBLISHTRACKCALLBACK']._serialized_end=1759 + _globals['_PUBLISHDATAREQUEST']._serialized_start=1762 + _globals['_PUBLISHDATAREQUEST']._serialized_end=1973 + _globals['_PUBLISHDATARESPONSE']._serialized_start=1975 + _globals['_PUBLISHDATARESPONSE']._serialized_end=2014 + _globals['_PUBLISHDATACALLBACK']._serialized_start=2016 + _globals['_PUBLISHDATACALLBACK']._serialized_end=2070 + _globals['_PUBLISHTRANSCRIPTIONREQUEST']._serialized_start=2073 + _globals['_PUBLISHTRANSCRIPTIONREQUEST']._serialized_end=2265 + _globals['_PUBLISHTRANSCRIPTIONRESPONSE']._serialized_start=2267 + _globals['_PUBLISHTRANSCRIPTIONRESPONSE']._serialized_end=2315 + _globals['_PUBLISHTRANSCRIPTIONCALLBACK']._serialized_start=2317 + _globals['_PUBLISHTRANSCRIPTIONCALLBACK']._serialized_end=2380 + _globals['_PUBLISHSIPDTMFREQUEST']._serialized_start=2383 + _globals['_PUBLISHSIPDTMFREQUEST']._serialized_end=2527 + _globals['_PUBLISHSIPDTMFRESPONSE']._serialized_start=2529 + _globals['_PUBLISHSIPDTMFRESPONSE']._serialized_end=2571 + _globals['_PUBLISHSIPDTMFCALLBACK']._serialized_start=2573 + _globals['_PUBLISHSIPDTMFCALLBACK']._serialized_end=2630 + _globals['_SETLOCALMETADATAREQUEST']._serialized_start=2632 + _globals['_SETLOCALMETADATAREQUEST']._serialized_end=2735 + _globals['_SETLOCALMETADATARESPONSE']._serialized_start=2737 + _globals['_SETLOCALMETADATARESPONSE']._serialized_end=2781 + _globals['_SETLOCALMETADATACALLBACK']._serialized_start=2783 + _globals['_SETLOCALMETADATACALLBACK']._serialized_end=2842 + _globals['_SENDCHATMESSAGEREQUEST']._serialized_start=2845 + _globals['_SENDCHATMESSAGEREQUEST']._serialized_end=3003 + _globals['_EDITCHATMESSAGEREQUEST']._serialized_start=3006 + _globals['_EDITCHATMESSAGEREQUEST']._serialized_end=3220 + _globals['_SENDCHATMESSAGERESPONSE']._serialized_start=3222 + _globals['_SENDCHATMESSAGERESPONSE']._serialized_end=3265 + _globals['_SENDCHATMESSAGECALLBACK']._serialized_start=3267 + _globals['_SENDCHATMESSAGECALLBACK']._serialized_end=3390 + _globals['_SETLOCALATTRIBUTESREQUEST']._serialized_start=3393 + _globals['_SETLOCALATTRIBUTESREQUEST']._serialized_end=3532 + _globals['_ATTRIBUTESENTRY']._serialized_start=3534 + _globals['_ATTRIBUTESENTRY']._serialized_end=3579 + _globals['_SETLOCALATTRIBUTESRESPONSE']._serialized_start=3581 + _globals['_SETLOCALATTRIBUTESRESPONSE']._serialized_end=3627 + _globals['_SETLOCALATTRIBUTESCALLBACK']._serialized_start=3629 + _globals['_SETLOCALATTRIBUTESCALLBACK']._serialized_end=3690 + _globals['_SETLOCALNAMEREQUEST']._serialized_start=3692 + _globals['_SETLOCALNAMEREQUEST']._serialized_end=3787 + _globals['_SETLOCALNAMERESPONSE']._serialized_start=3789 + _globals['_SETLOCALNAMERESPONSE']._serialized_end=3829 + _globals['_SETLOCALNAMECALLBACK']._serialized_start=3831 + _globals['_SETLOCALNAMECALLBACK']._serialized_end=3886 + _globals['_SETSUBSCRIBEDREQUEST']._serialized_start=3888 + _globals['_SETSUBSCRIBEDREQUEST']._serialized_end=3957 + _globals['_SETSUBSCRIBEDRESPONSE']._serialized_start=3959 + _globals['_SETSUBSCRIBEDRESPONSE']._serialized_end=3982 + _globals['_GETSESSIONSTATSREQUEST']._serialized_start=3984 + _globals['_GETSESSIONSTATSREQUEST']._serialized_end=4055 + _globals['_GETSESSIONSTATSRESPONSE']._serialized_start=4057 + _globals['_GETSESSIONSTATSRESPONSE']._serialized_end=4100 + _globals['_GETSESSIONSTATSCALLBACK']._serialized_start=4103 + _globals['_GETSESSIONSTATSCALLBACK']._serialized_end=4350 + _globals['_GETSESSIONSTATSCALLBACK_RESULT']._serialized_start=4230 + _globals['_GETSESSIONSTATSCALLBACK_RESULT']._serialized_end=4339 + _globals['_VIDEOENCODING']._serialized_start=4352 + _globals['_VIDEOENCODING']._serialized_end=4411 + _globals['_AUDIOENCODING']._serialized_start=4413 + _globals['_AUDIOENCODING']._serialized_end=4449 + _globals['_TRACKPUBLISHOPTIONS']._serialized_start=4452 + _globals['_TRACKPUBLISHOPTIONS']._serialized_end=4857 + _globals['_ICESERVER']._serialized_start=4859 + _globals['_ICESERVER']._serialized_end=4920 + _globals['_RTCCONFIG']._serialized_start=4923 + _globals['_RTCCONFIG']._serialized_end=5119 + _globals['_ROOMOPTIONS']._serialized_start=5122 + _globals['_ROOMOPTIONS']._serialized_end=5424 + _globals['_TRANSCRIPTIONSEGMENT']._serialized_start=5426 + _globals['_TRANSCRIPTIONSEGMENT']._serialized_end=5545 + _globals['_BUFFERINFO']._serialized_start=5547 + _globals['_BUFFERINFO']._serialized_end=5595 + _globals['_OWNEDBUFFER']._serialized_start=5597 + _globals['_OWNEDBUFFER']._serialized_end=5698 + _globals['_ROOMEVENT']._serialized_start=5701 + _globals['_ROOMEVENT']._serialized_end=8723 + _globals['_ROOMINFO']._serialized_start=8726 + _globals['_ROOMINFO']._serialized_end=9055 + _globals['_OWNEDROOM']._serialized_start=9057 + _globals['_OWNEDROOM']._serialized_end=9154 + _globals['_PARTICIPANTSUPDATED']._serialized_start=9156 + _globals['_PARTICIPANTSUPDATED']._serialized_end=9231 + _globals['_PARTICIPANTCONNECTED']._serialized_start=9233 + _globals['_PARTICIPANTCONNECTED']._serialized_end=9302 + _globals['_PARTICIPANTACTIVE']._serialized_start=9304 + _globals['_PARTICIPANTACTIVE']._serialized_end=9353 + _globals['_PARTICIPANTDISCONNECTED']._serialized_start=9355 + _globals['_PARTICIPANTDISCONNECTED']._serialized_end=9470 + _globals['_LOCALTRACKPUBLISHED']._serialized_start=9472 + _globals['_LOCALTRACKPUBLISHED']._serialized_end=9512 + _globals['_LOCALTRACKUNPUBLISHED']._serialized_start=9514 + _globals['_LOCALTRACKUNPUBLISHED']._serialized_end=9562 + _globals['_LOCALTRACKREPUBLISHED']._serialized_start=9564 + _globals['_LOCALTRACKREPUBLISHED']._serialized_end=9688 + _globals['_LOCALTRACKSUBSCRIBED']._serialized_start=9690 + _globals['_LOCALTRACKSUBSCRIBED']._serialized_end=9731 + _globals['_TRACKPUBLISHED']._serialized_start=9733 + _globals['_TRACKPUBLISHED']._serialized_end=9838 + _globals['_TRACKUNPUBLISHED']._serialized_start=9840 + _globals['_TRACKUNPUBLISHED']._serialized_end=9913 + _globals['_TRACKSUBSCRIBED']._serialized_start=9915 + _globals['_TRACKSUBSCRIBED']._serialized_end=10004 + _globals['_TRACKUNSUBSCRIBED']._serialized_start=10006 + _globals['_TRACKUNSUBSCRIBED']._serialized_end=10074 + _globals['_TRACKSUBSCRIPTIONFAILED']._serialized_start=10076 + _globals['_TRACKSUBSCRIPTIONFAILED']._serialized_end=10165 + _globals['_TRACKMUTED']._serialized_start=10167 + _globals['_TRACKMUTED']._serialized_end=10228 + _globals['_TRACKUNMUTED']._serialized_start=10230 + _globals['_TRACKUNMUTED']._serialized_end=10293 + _globals['_E2EESTATECHANGED']._serialized_start=10295 + _globals['_E2EESTATECHANGED']._serialized_end=10390 + _globals['_ACTIVESPEAKERSCHANGED']._serialized_start=10392 + _globals['_ACTIVESPEAKERSCHANGED']._serialized_end=10447 + _globals['_ROOMMETADATACHANGED']._serialized_start=10449 + _globals['_ROOMMETADATACHANGED']._serialized_end=10488 + _globals['_ROOMSIDCHANGED']._serialized_start=10490 + _globals['_ROOMSIDCHANGED']._serialized_end=10519 + _globals['_PARTICIPANTMETADATACHANGED']._serialized_start=10521 + _globals['_PARTICIPANTMETADATACHANGED']._serialized_end=10597 + _globals['_PARTICIPANTATTRIBUTESCHANGED']._serialized_start=10600 + _globals['_PARTICIPANTATTRIBUTESCHANGED']._serialized_end=10772 + _globals['_PARTICIPANTENCRYPTIONSTATUSCHANGED']._serialized_start=10774 + _globals['_PARTICIPANTENCRYPTIONSTATUSCHANGED']._serialized_end=10862 + _globals['_PARTICIPANTNAMECHANGED']._serialized_start=10864 + _globals['_PARTICIPANTNAMECHANGED']._serialized_end=10932 + _globals['_PARTICIPANTPERMISSIONCHANGED']._serialized_start=10934 + _globals['_PARTICIPANTPERMISSIONCHANGED']._serialized_end=11052 + _globals['_CONNECTIONQUALITYCHANGED']._serialized_start=11054 + _globals['_CONNECTIONQUALITYCHANGED']._serialized_end=11161 + _globals['_USERPACKET']._serialized_start=11163 + _globals['_USERPACKET']._serialized_end=11232 + _globals['_CHATMESSAGE']._serialized_start=11234 + _globals['_CHATMESSAGE']._serialized_end=11355 + _globals['_CHATMESSAGERECEIVED']._serialized_start=11357 + _globals['_CHATMESSAGERECEIVED']._serialized_end=11453 + _globals['_SIPDTMF']._serialized_start=11455 + _globals['_SIPDTMF']._serialized_end=11493 + _globals['_DATAPACKETRECEIVED']._serialized_start=11496 + _globals['_DATAPACKETRECEIVED']._serialized_end=11687 + _globals['_TRANSCRIPTIONRECEIVED']._serialized_start=11689 + _globals['_TRANSCRIPTIONRECEIVED']._serialized_end=11816 + _globals['_CONNECTIONSTATECHANGED']._serialized_start=11818 + _globals['_CONNECTIONSTATECHANGED']._serialized_end=11889 + _globals['_CONNECTED']._serialized_start=11891 + _globals['_CONNECTED']._serialized_end=11902 + _globals['_DISCONNECTED']._serialized_start=11904 + _globals['_DISCONNECTED']._serialized_end=11967 + _globals['_RECONNECTING']._serialized_start=11969 + _globals['_RECONNECTING']._serialized_end=11983 + _globals['_RECONNECTED']._serialized_start=11985 + _globals['_RECONNECTED']._serialized_end=11998 + _globals['_TOKENREFRESHED']._serialized_start=12000 + _globals['_TOKENREFRESHED']._serialized_end=12031 + _globals['_ROOMEOS']._serialized_start=12033 + _globals['_ROOMEOS']._serialized_end=12042 + _globals['_DATASTREAM']._serialized_start=12045 + _globals['_DATASTREAM']._serialized_end=12955 + _globals['_DATASTREAM_TEXTHEADER']._serialized_start=12060 + _globals['_DATASTREAM_TEXTHEADER']._serialized_end=12230 + _globals['_DATASTREAM_BYTEHEADER']._serialized_start=12232 + _globals['_DATASTREAM_BYTEHEADER']._serialized_end=12258 + _globals['_DATASTREAM_HEADER']._serialized_start=12261 + _globals['_DATASTREAM_HEADER']._serialized_end=12624 + _globals['_DATASTREAM_HEADER_ATTRIBUTESENTRY']._serialized_start=12557 + _globals['_DATASTREAM_HEADER_ATTRIBUTESENTRY']._serialized_end=12606 + _globals['_DATASTREAM_CHUNK']._serialized_start=12626 + _globals['_DATASTREAM_CHUNK']._serialized_end=12719 + _globals['_DATASTREAM_TRAILER']._serialized_start=12722 + _globals['_DATASTREAM_TRAILER']._serialized_end=12888 + _globals['_DATASTREAM_TRAILER_ATTRIBUTESENTRY']._serialized_start=12557 + _globals['_DATASTREAM_TRAILER_ATTRIBUTESENTRY']._serialized_end=12606 + _globals['_DATASTREAM_OPERATIONTYPE']._serialized_start=12890 + _globals['_DATASTREAM_OPERATIONTYPE']._serialized_end=12955 + _globals['_DATASTREAMHEADERRECEIVED']._serialized_start=12957 + _globals['_DATASTREAMHEADERRECEIVED']._serialized_end=13063 + _globals['_DATASTREAMCHUNKRECEIVED']._serialized_start=13065 + _globals['_DATASTREAMCHUNKRECEIVED']._serialized_end=13168 + _globals['_DATASTREAMTRAILERRECEIVED']._serialized_start=13170 + _globals['_DATASTREAMTRAILERRECEIVED']._serialized_end=13279 + _globals['_SENDSTREAMHEADERREQUEST']._serialized_start=13282 + _globals['_SENDSTREAMHEADERREQUEST']._serialized_end=13474 + _globals['_SENDSTREAMCHUNKREQUEST']._serialized_start=13477 + _globals['_SENDSTREAMCHUNKREQUEST']._serialized_end=13666 + _globals['_SENDSTREAMTRAILERREQUEST']._serialized_start=13669 + _globals['_SENDSTREAMTRAILERREQUEST']._serialized_end=13864 + _globals['_SENDSTREAMHEADERRESPONSE']._serialized_start=13866 + _globals['_SENDSTREAMHEADERRESPONSE']._serialized_end=13910 + _globals['_SENDSTREAMCHUNKRESPONSE']._serialized_start=13912 + _globals['_SENDSTREAMCHUNKRESPONSE']._serialized_end=13955 + _globals['_SENDSTREAMTRAILERRESPONSE']._serialized_start=13957 + _globals['_SENDSTREAMTRAILERRESPONSE']._serialized_end=14002 + _globals['_SENDSTREAMHEADERCALLBACK']._serialized_start=14004 + _globals['_SENDSTREAMHEADERCALLBACK']._serialized_end=14063 + _globals['_SENDSTREAMCHUNKCALLBACK']._serialized_start=14065 + _globals['_SENDSTREAMCHUNKCALLBACK']._serialized_end=14123 + _globals['_SENDSTREAMTRAILERCALLBACK']._serialized_start=14125 + _globals['_SENDSTREAMTRAILERCALLBACK']._serialized_end=14185 + _globals['_SETDATACHANNELBUFFEREDAMOUNTLOWTHRESHOLDREQUEST']._serialized_start=14188 + _globals['_SETDATACHANNELBUFFEREDAMOUNTLOWTHRESHOLDREQUEST']._serialized_end=14335 + _globals['_SETDATACHANNELBUFFEREDAMOUNTLOWTHRESHOLDRESPONSE']._serialized_start=14337 + _globals['_SETDATACHANNELBUFFEREDAMOUNTLOWTHRESHOLDRESPONSE']._serialized_end=14387 + _globals['_DATACHANNELBUFFEREDAMOUNTLOWTHRESHOLDCHANGED']._serialized_start=14389 + _globals['_DATACHANNELBUFFEREDAMOUNTLOWTHRESHOLDCHANGED']._serialized_end=14499 + _globals['_BYTESTREAMOPENED']._serialized_start=14501 + _globals['_BYTESTREAMOPENED']._serialized_end=14603 + _globals['_TEXTSTREAMOPENED']._serialized_start=14605 + _globals['_TEXTSTREAMOPENED']._serialized_end=14707 + _globals['_DATATRACKPUBLISHED']._serialized_start=14709 + _globals['_DATATRACKPUBLISHED']._serialized_end=14781 + _globals['_DATATRACKUNPUBLISHED']._serialized_start=14783 + _globals['_DATATRACKUNPUBLISHED']._serialized_end=14818 # @@protoc_insertion_point(module_scope) diff --git a/livekit-rtc/livekit/rtc/_proto/room_pb2.pyi b/livekit-rtc/livekit/rtc/_proto/room_pb2.pyi index 58302e57..e9015c67 100644 --- a/livekit-rtc/livekit/rtc/_proto/room_pb2.pyi +++ b/livekit-rtc/livekit/rtc/_proto/room_pb2.pyi @@ -461,32 +461,6 @@ class PublishTrackCallback(google.protobuf.message.Message): global___PublishTrackCallback = PublishTrackCallback -@typing.final -class ReadyForRoomEventRequest(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - ROOM_HANDLE_FIELD_NUMBER: builtins.int - room_handle: builtins.int - def __init__( - self, - *, - room_handle: builtins.int | None = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["room_handle", b"room_handle"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["room_handle", b"room_handle"]) -> None: ... - -global___ReadyForRoomEventRequest = ReadyForRoomEventRequest - -@typing.final -class ReadyForRoomEventResponse(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - def __init__( - self, - ) -> None: ... - -global___ReadyForRoomEventResponse = ReadyForRoomEventResponse - @typing.final class UnpublishTrackRequest(google.protobuf.message.Message): """Unpublish a track from the room""" diff --git a/livekit-rtc/livekit/rtc/platform_audio.py b/livekit-rtc/livekit/rtc/platform_audio.py new file mode 100644 index 00000000..e9723efd --- /dev/null +++ b/livekit-rtc/livekit/rtc/platform_audio.py @@ -0,0 +1,369 @@ +# Copyright 2023 LiveKit, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +PlatformAudio - Platform audio device management via WebRTC's ADM + +PlatformAudio provides access to the platform's audio devices (microphones and +speakers) via WebRTC's Audio Device Module (ADM). This is the recommended way +to handle audio in most applications because: + +- Built-in echo cancellation (AEC), noise suppression (NS), and auto gain control (AGC) +- Automatic device enumeration and selection +- Efficient hardware-accelerated audio processing on supported platforms +- No need for external audio libraries + +For custom audio processing pipelines where you need direct access to audio frames, +use the synthetic mode with AudioSource instead. See AudioSource for more details. + +# Usage + +```python +from livekit import rtc + +# Create PlatformAudio instance (enables ADM) +platform_audio = rtc.PlatformAudio() + +# List available devices +print("Microphones:") +for device in platform_audio.recording_devices(): + print(f" [{device.index}] {device.name} (ID: {device.id})") + +print("Speakers:") +for device in platform_audio.playout_devices(): + print(f" [{device.index}] {device.name} (ID: {device.id})") + +# Select specific devices (optional - uses default if not called) +platform_audio.set_recording_device(mic_device.id) +platform_audio.set_playout_device(speaker_device.id) + +# Create audio source for publishing +audio_source = platform_audio.create_audio_source() + +# Create and publish track +track = rtc.LocalAudioTrack.create_audio_track("microphone", audio_source) +await room.local_participant.publish_track(track) +``` + +# Limitations + +- No direct access to captured audio frames (ADM sends directly to WebRTC) +- For frame-level processing, use synthetic mode with AudioSource.capture_frame() +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import List, Optional + +from ._ffi_client import FfiHandle, FfiClient +from ._proto import audio_frame_pb2 as proto_audio_frame +from ._proto import ffi_pb2 as proto_ffi + + +class PlatformAudioError(Exception): + """Exception raised when PlatformAudio operations fail.""" + + pass + + +@dataclass +class AudioDeviceInfo: + """Information about an audio device. + + Attributes: + index: Device index (0-based). Note: indices can change when devices are + added/removed, so prefer using `id` for device selection. + name: Device name as reported by the operating system. + id: Platform-specific unique device identifier (GUID). This is stable across + device additions/removals and should be preferred over index for device + selection. + """ + + index: int + name: str + id: str + + @classmethod + def _from_proto(cls, proto: proto_audio_frame.AudioDeviceInfo) -> "AudioDeviceInfo": + return cls(index=proto.index, name=proto.name, id=proto.guid) + + +@dataclass +class PlatformAudioOptions: + """Audio processing options for PlatformAudio. + + These options configure WebRTC's audio processing pipeline when using + PlatformAudio for microphone capture. + + Attributes: + echo_cancellation: Enable acoustic echo cancellation (AEC) to remove + echo from speaker playback. Default: True. + noise_suppression: Enable noise suppression to remove background noise. + Default: True. + auto_gain_control: Enable automatic gain control to normalize audio levels. + Default: True. + prefer_hardware: Prefer hardware audio processing when available. + - iOS: Uses Voice Processing I/O (VPIO) for low-latency processing + - Android: Hardware support varies by device + - Desktop: Generally not available + Default: True on iOS, False on other platforms. + """ + + echo_cancellation: bool = True + noise_suppression: bool = True + auto_gain_control: bool = True + prefer_hardware: bool = False + + def _to_proto(self) -> proto_audio_frame.AudioSourceOptions: + return proto_audio_frame.AudioSourceOptions( + echo_cancellation=self.echo_cancellation, + noise_suppression=self.noise_suppression, + auto_gain_control=self.auto_gain_control, + prefer_hardware=self.prefer_hardware, + ) + + +class PlatformAudioSource: + """Audio source backed by PlatformAudio (WebRTC ADM). + + This source captures audio from the selected microphone via the platform's + Audio Device Module. Unlike AudioSource (synthetic mode), frames are captured + and sent directly by the ADM - there is no `capture_frame()` method. + + Use this with LocalAudioTrack.create_audio_track() to publish microphone audio. + + Note: This class is created via PlatformAudio.create_audio_source() and should + not be instantiated directly. + """ + + def __init__(self, ffi_handle: FfiHandle, info: proto_audio_frame.AudioSourceInfo): + self._ffi_handle = ffi_handle + self._info = info + + @property + def _handle(self) -> int: + """Internal FFI handle for use with LocalAudioTrack.create_audio_track().""" + return self._ffi_handle.handle + + +class PlatformAudio: + """Platform audio device management via WebRTC's Audio Device Module (ADM). + + PlatformAudio provides the recommended way to handle audio capture and playback + in LiveKit applications. It uses WebRTC's ADM for efficient, hardware-accelerated + audio processing with built-in echo cancellation, noise suppression, and + automatic gain control. + + Key features: + - Device enumeration: List available microphones and speakers + - Device selection: Choose specific input/output devices + - Audio processing: Built-in AEC, NS, and AGC + - Automatic playout: Received audio is automatically played through speakers + + Example: + ```python + # Create PlatformAudio (keeps ADM alive) + platform_audio = rtc.PlatformAudio() + + # Enumerate and select devices + mics = platform_audio.recording_devices() + platform_audio.set_recording_device(mics[0].id) + + # Create source and publish track + source = platform_audio.create_audio_source() + track = rtc.LocalAudioTrack.create_audio_track("mic", source) + await room.local_participant.publish_track(track) + ``` + + Note: + The PlatformAudio instance must be kept alive while audio is needed. + When all PlatformAudio instances are garbage collected, the ADM is + automatically disabled. + """ + + def __init__(self) -> None: + """Initialize PlatformAudio and enable the Audio Device Module. + + Raises: + PlatformAudioError: If ADM initialization fails. + """ + req = proto_ffi.FfiRequest() + req.new_platform_audio.SetInParent() + + resp = FfiClient.instance.request(req) + + if resp.new_platform_audio.HasField("error"): + raise PlatformAudioError( + f"Failed to initialize PlatformAudio: {resp.new_platform_audio.error}" + ) + + self._info = resp.new_platform_audio.platform_audio.info + self._ffi_handle = FfiHandle(resp.new_platform_audio.platform_audio.handle.id) + + def recording_devices(self) -> List[AudioDeviceInfo]: + """Get available recording devices (microphones). + + Returns: + List of AudioDeviceInfo for each available microphone. + + Raises: + PlatformAudioError: If device enumeration fails. + """ + req = proto_ffi.FfiRequest() + req.get_audio_devices.platform_audio_handle = self._ffi_handle.handle + + resp = FfiClient.instance.request(req) + + if resp.get_audio_devices.HasField("error") and resp.get_audio_devices.error: + raise PlatformAudioError( + f"Failed to enumerate recording devices: {resp.get_audio_devices.error}" + ) + + return [ + AudioDeviceInfo._from_proto(d) + for d in resp.get_audio_devices.recording_devices + ] + + def playout_devices(self) -> List[AudioDeviceInfo]: + """Get available playout devices (speakers/headphones). + + Returns: + List of AudioDeviceInfo for each available speaker. + + Raises: + PlatformAudioError: If device enumeration fails. + """ + req = proto_ffi.FfiRequest() + req.get_audio_devices.platform_audio_handle = self._ffi_handle.handle + + resp = FfiClient.instance.request(req) + + if resp.get_audio_devices.HasField("error") and resp.get_audio_devices.error: + raise PlatformAudioError( + f"Failed to enumerate playout devices: {resp.get_audio_devices.error}" + ) + + return [ + AudioDeviceInfo._from_proto(d) + for d in resp.get_audio_devices.playout_devices + ] + + def set_recording_device(self, device_id: str) -> None: + """Select the recording device (microphone) to use. + + Call this before creating audio tracks to select which microphone to use. + If not called, the system default microphone is used. + + Args: + device_id: The device ID (GUID) from AudioDeviceInfo.id. Use the ID + rather than index for stable device selection across hot-plug events. + + Raises: + PlatformAudioError: If device selection fails. + """ + req = proto_ffi.FfiRequest() + req.set_recording_device.platform_audio_handle = self._ffi_handle.handle + req.set_recording_device.device_id = device_id + + resp = FfiClient.instance.request(req) + + if ( + resp.set_recording_device.HasField("error") + and resp.set_recording_device.error + ): + raise PlatformAudioError( + f"Failed to set recording device: {resp.set_recording_device.error}" + ) + + def set_playout_device(self, device_id: str) -> None: + """Select the playout device (speaker) to use. + + Call this before connecting to a room to select which speaker to use + for audio output. If not called, the system default speaker is used. + + Args: + device_id: The device ID (GUID) from AudioDeviceInfo.id. Use the ID + rather than index for stable device selection across hot-plug events. + + Raises: + PlatformAudioError: If device selection fails. + """ + req = proto_ffi.FfiRequest() + req.set_playout_device.platform_audio_handle = self._ffi_handle.handle + req.set_playout_device.device_id = device_id + + resp = FfiClient.instance.request(req) + + if ( + resp.set_playout_device.HasField("error") + and resp.set_playout_device.error + ): + raise PlatformAudioError( + f"Failed to set playout device: {resp.set_playout_device.error}" + ) + + def create_audio_source( + self, options: Optional[PlatformAudioOptions] = None + ) -> PlatformAudioSource: + """Create an audio source for publishing microphone audio. + + The returned source captures audio from the selected microphone (or system + default) and can be used with LocalAudioTrack.create_audio_track() to + publish audio. + + Args: + options: Audio processing options (AEC, NS, AGC, prefer_hardware). + If None, defaults are used (all processing enabled). + + Returns: + PlatformAudioSource that can be passed to LocalAudioTrack.create_audio_track(). + + Raises: + PlatformAudioError: If source creation fails. + + Example: + ```python + source = platform_audio.create_audio_source( + PlatformAudioOptions( + echo_cancellation=True, + noise_suppression=True, + auto_gain_control=True, + ) + ) + track = rtc.LocalAudioTrack.create_audio_track("microphone", source) + ``` + """ + if options is None: + options = PlatformAudioOptions() + + req = proto_ffi.FfiRequest() + req.new_audio_source.type = ( + proto_audio_frame.AudioSourceType.AUDIO_SOURCE_PLATFORM + ) + req.new_audio_source.platform_audio_handle = self._ffi_handle.handle + req.new_audio_source.options.CopyFrom(options._to_proto()) + # For platform audio, the ADM determines the actual sample rate and channels. + # These fields are ignored but required by older proto versions (will be optional + # in livekit-ffi >= 0.12.58). Use standard WebRTC defaults. + req.new_audio_source.sample_rate = 48000 + req.new_audio_source.num_channels = 1 + + resp = FfiClient.instance.request(req) + source_info = resp.new_audio_source.source + + return PlatformAudioSource( + FfiHandle(source_info.handle.id), + source_info, + ) diff --git a/livekit-rtc/livekit/rtc/room.py b/livekit-rtc/livekit/rtc/room.py index aa96d1a3..23d5a4ad 100644 --- a/livekit-rtc/livekit/rtc/room.py +++ b/livekit-rtc/livekit/rtc/room.py @@ -555,10 +555,11 @@ def on_participant_connected(participant): # start listening to room events self._task = self._loop.create_task(self._listen_task()) + # TODO(sxian): Re-enable once a new livekit-ffi release includes ReadyForRoomEvent # Unblock the FFI server once this SDK is ready to receive room events. - ready_req = proto_ffi.FfiRequest() - ready_req.ready_for_room_event.room_handle = self._ffi_handle.handle - FfiClient.instance.request(ready_req) + # ready_req = proto_ffi.FfiRequest() + # ready_req.ready_for_room_event.room_handle = self._ffi_handle.handle + # FfiClient.instance.request(ready_req) async def get_rtc_stats(self) -> RtcStats: if not self.isconnected(): diff --git a/livekit-rtc/livekit/rtc/track.py b/livekit-rtc/livekit/rtc/track.py index 8a6fe692..31784cd0 100644 --- a/livekit-rtc/livekit/rtc/track.py +++ b/livekit-rtc/livekit/rtc/track.py @@ -21,6 +21,7 @@ if TYPE_CHECKING: from .audio_source import AudioSource from .video_source import VideoSource + from .platform_audio import PlatformAudioSource class Track: @@ -72,7 +73,34 @@ def __init__(self, info: proto_track.OwnedTrack): super().__init__(info) @staticmethod - def create_audio_track(name: str, source: "AudioSource") -> "LocalAudioTrack": + def create_audio_track( + name: str, source: Union["AudioSource", "PlatformAudioSource"] + ) -> "LocalAudioTrack": + """Create a local audio track from an audio source. + + Args: + name: The name of the track (e.g., "microphone", "audio-file"). + source: Either an AudioSource (synthetic mode for manual frame capture) + or a PlatformAudioSource (from PlatformAudio, uses WebRTC ADM). + + Returns: + A LocalAudioTrack that can be published to a room. + + Example with PlatformAudio (recommended for most use cases): + ```python + platform_audio = rtc.PlatformAudio() + source = platform_audio.create_audio_source() + track = rtc.LocalAudioTrack.create_audio_track("microphone", source) + ``` + + Example with AudioSource (synthetic mode for custom processing): + ```python + # Synthetic mode: You must manually capture frames + source = rtc.AudioSource(sample_rate=48000, num_channels=1) + track = rtc.LocalAudioTrack.create_audio_track("audio", source) + # Then in a loop: await source.capture_frame(frame) + ``` + """ req = proto_ffi.FfiRequest() req.create_audio_track.name = name req.create_audio_track.source_handle = source._ffi_handle.handle diff --git a/livekit-rtc/rust-sdks b/livekit-rtc/rust-sdks index 041f6036..497527d4 160000 --- a/livekit-rtc/rust-sdks +++ b/livekit-rtc/rust-sdks @@ -1 +1 @@ -Subproject commit 041f6036dc9ab3bd0df529b07251131df8c107fa +Subproject commit 497527d4169a62ac38d3bc7f7651395465806f84 diff --git a/tests/rtc/test_platform_audio.py b/tests/rtc/test_platform_audio.py new file mode 100644 index 00000000..64c6e30e --- /dev/null +++ b/tests/rtc/test_platform_audio.py @@ -0,0 +1,280 @@ +""" +Tests for PlatformAudio functionality. + +These tests require audio hardware to be available. On CI environments without +audio devices, tests will be skipped automatically. +""" + +import pytest +from typing import Optional + +from livekit import rtc + + +# Global to cache PlatformAudio availability check +_platform_audio_available: Optional[bool] = None +_platform_audio_error: Optional[str] = None + + +def _check_platform_audio_available() -> tuple[bool, Optional[str]]: + """Check if PlatformAudio can be initialized on this system.""" + global _platform_audio_available, _platform_audio_error + + if _platform_audio_available is not None: + return _platform_audio_available, _platform_audio_error + + try: + pa = rtc.PlatformAudio() + _platform_audio_available = True + _platform_audio_error = None + # Keep reference to avoid cleanup issues + del pa + except rtc.PlatformAudioError as e: + _platform_audio_available = False + _platform_audio_error = str(e) + + return _platform_audio_available, _platform_audio_error + + +def requires_platform_audio(func): + """Decorator to skip tests if PlatformAudio is not available.""" + + @pytest.mark.skipif( + not _check_platform_audio_available()[0], + reason=f"PlatformAudio not available: {_check_platform_audio_available()[1]}", + ) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + + wrapper.__name__ = func.__name__ + wrapper.__doc__ = func.__doc__ + return wrapper + + +# Use a module-scoped fixture to avoid creating multiple PlatformAudio instances +@pytest.fixture(scope="module") +def platform_audio(): + """Create a PlatformAudio instance for testing.""" + available, error = _check_platform_audio_available() + if not available: + pytest.skip(f"PlatformAudio not available: {error}") + + pa = rtc.PlatformAudio() + yield pa + # Cleanup handled by garbage collection + + +class TestPlatformAudioCreation: + """Tests for PlatformAudio initialization.""" + + def test_platform_audio_creation(self, platform_audio): + """Test that PlatformAudio can be created successfully.""" + assert platform_audio is not None + + def test_platform_audio_multiple_instances(self, platform_audio): + """Test that multiple PlatformAudio instances can coexist.""" + # Creating another instance should reuse the same underlying ADM + available, error = _check_platform_audio_available() + if not available: + pytest.skip(f"PlatformAudio not available: {error}") + + pa2 = rtc.PlatformAudio() + assert pa2 is not None + # Both should work + assert platform_audio is not None + + +class TestDeviceEnumeration: + """Tests for audio device enumeration.""" + + def test_recording_devices_returns_list(self, platform_audio): + """Test that recording_devices() returns a list.""" + devices = platform_audio.recording_devices() + assert isinstance(devices, list) + + def test_playout_devices_returns_list(self, platform_audio): + """Test that playout_devices() returns a list.""" + devices = platform_audio.playout_devices() + assert isinstance(devices, list) + + def test_recording_device_info_structure(self, platform_audio): + """Test that recording devices have correct structure.""" + devices = platform_audio.recording_devices() + if not devices: + pytest.skip("No recording devices available") + + device = devices[0] + assert isinstance(device, rtc.AudioDeviceInfo) + assert isinstance(device.index, int) + assert isinstance(device.name, str) + assert isinstance(device.id, str) + assert device.index >= 0 + assert len(device.name) > 0 + + def test_playout_device_info_structure(self, platform_audio): + """Test that playout devices have correct structure.""" + devices = platform_audio.playout_devices() + if not devices: + pytest.skip("No playout devices available") + + device = devices[0] + assert isinstance(device, rtc.AudioDeviceInfo) + assert isinstance(device.index, int) + assert isinstance(device.name, str) + assert isinstance(device.id, str) + assert device.index >= 0 + assert len(device.name) > 0 + + def test_device_indices_are_sequential(self, platform_audio): + """Test that device indices start at 0 and are sequential.""" + recording = platform_audio.recording_devices() + playout = platform_audio.playout_devices() + + for i, device in enumerate(recording): + assert device.index == i, f"Recording device index mismatch: {device.index} != {i}" + + for i, device in enumerate(playout): + assert device.index == i, f"Playout device index mismatch: {device.index} != {i}" + + +class TestDeviceSelection: + """Tests for audio device selection.""" + + def test_set_recording_device_valid(self, platform_audio): + """Test setting a valid recording device.""" + devices = platform_audio.recording_devices() + if not devices: + pytest.skip("No recording devices available") + + # Should not raise + platform_audio.set_recording_device(devices[0].id) + + def test_set_playout_device_valid(self, platform_audio): + """Test setting a valid playout device.""" + devices = platform_audio.playout_devices() + if not devices: + pytest.skip("No playout devices available") + + # Should not raise + platform_audio.set_playout_device(devices[0].id) + + def test_set_recording_device_invalid(self, platform_audio): + """Test that setting an invalid recording device raises an error.""" + with pytest.raises(rtc.PlatformAudioError) as exc_info: + platform_audio.set_recording_device("invalid-device-id-that-does-not-exist") + + assert "not found" in str(exc_info.value).lower() or "failed" in str(exc_info.value).lower() + + def test_set_playout_device_invalid(self, platform_audio): + """Test that setting an invalid playout device raises an error.""" + with pytest.raises(rtc.PlatformAudioError) as exc_info: + platform_audio.set_playout_device("invalid-device-id-that-does-not-exist") + + assert "not found" in str(exc_info.value).lower() or "failed" in str(exc_info.value).lower() + + +class TestAudioSourceCreation: + """Tests for PlatformAudioSource creation.""" + + def test_create_audio_source_default_options(self, platform_audio): + """Test creating an audio source with default options.""" + source = platform_audio.create_audio_source() + assert source is not None + assert isinstance(source, rtc.PlatformAudioSource) + + def test_create_audio_source_custom_options(self, platform_audio): + """Test creating an audio source with custom options.""" + options = rtc.PlatformAudioOptions( + echo_cancellation=True, + noise_suppression=True, + auto_gain_control=True, + prefer_hardware=False, + ) + source = platform_audio.create_audio_source(options) + assert source is not None + assert isinstance(source, rtc.PlatformAudioSource) + + def test_create_audio_source_all_processing_disabled(self, platform_audio): + """Test creating an audio source with all processing disabled.""" + options = rtc.PlatformAudioOptions( + echo_cancellation=False, + noise_suppression=False, + auto_gain_control=False, + ) + source = platform_audio.create_audio_source(options) + assert source is not None + + def test_audio_source_has_handle(self, platform_audio): + """Test that created audio source has a valid internal handle.""" + source = platform_audio.create_audio_source() + # The _handle property is used internally for track creation + assert hasattr(source, "_handle") + assert source._handle > 0 + + def test_create_multiple_audio_sources(self, platform_audio): + """Test creating multiple audio sources from the same PlatformAudio.""" + source1 = platform_audio.create_audio_source() + source2 = platform_audio.create_audio_source() + + assert source1 is not None + assert source2 is not None + # Each source should have a unique handle + assert source1._handle != source2._handle + + +class TestPlatformAudioOptions: + """Tests for PlatformAudioOptions dataclass.""" + + def test_default_options(self): + """Test default PlatformAudioOptions values.""" + options = rtc.PlatformAudioOptions() + assert options.echo_cancellation is True + assert options.noise_suppression is True + assert options.auto_gain_control is True + assert options.prefer_hardware is False + + def test_custom_options(self): + """Test custom PlatformAudioOptions values.""" + options = rtc.PlatformAudioOptions( + echo_cancellation=False, + noise_suppression=False, + auto_gain_control=False, + prefer_hardware=True, + ) + assert options.echo_cancellation is False + assert options.noise_suppression is False + assert options.auto_gain_control is False + assert options.prefer_hardware is True + + +class TestAudioDeviceInfo: + """Tests for AudioDeviceInfo dataclass.""" + + def test_audio_device_info_creation(self): + """Test creating AudioDeviceInfo manually.""" + info = rtc.AudioDeviceInfo(index=0, name="Test Mic", id="test-guid-123") + assert info.index == 0 + assert info.name == "Test Mic" + assert info.id == "test-guid-123" + + def test_audio_device_info_equality(self): + """Test AudioDeviceInfo equality comparison.""" + info1 = rtc.AudioDeviceInfo(index=0, name="Test Mic", id="guid-1") + info2 = rtc.AudioDeviceInfo(index=0, name="Test Mic", id="guid-1") + info3 = rtc.AudioDeviceInfo(index=1, name="Other Mic", id="guid-2") + + assert info1 == info2 + assert info1 != info3 + + +class TestIntegrationWithTrack: + """Integration tests with LocalAudioTrack.""" + + def test_create_track_from_platform_audio_source(self, platform_audio): + """Test creating a LocalAudioTrack from PlatformAudioSource.""" + source = platform_audio.create_audio_source() + track = rtc.LocalAudioTrack.create_audio_track("test-mic", source) + + assert track is not None + assert track.name == "test-mic" + assert track.kind == rtc.TrackKind.KIND_AUDIO