diff --git a/Runtime/Plugins/ffi-ios-arm64/liblivekit_ffi.a b/Runtime/Plugins/ffi-ios-arm64/liblivekit_ffi.a index 233ba035..6102a559 100644 --- a/Runtime/Plugins/ffi-ios-arm64/liblivekit_ffi.a +++ b/Runtime/Plugins/ffi-ios-arm64/liblivekit_ffi.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b4d17138b8362b19de0710e277fef9a294abd534bb5da570c6c22d69969fd66b -size 484185448 +oid sha256:b4f31df25da8a1b92689e34d771890d93df2306195a3597e173b75947dcb04fb +size 605825312 diff --git a/Runtime/Plugins/ffi-macos-arm64/liblivekit_ffi.dylib b/Runtime/Plugins/ffi-macos-arm64/liblivekit_ffi.dylib index 9854d51e..eb0c31de 100644 --- a/Runtime/Plugins/ffi-macos-arm64/liblivekit_ffi.dylib +++ b/Runtime/Plugins/ffi-macos-arm64/liblivekit_ffi.dylib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9f27cca65792654cc064865b48893195435908595dccb5560f7f931f3378fe36 -size 17597104 +oid sha256:1666df4e698c88baa414fc0b1b8162c75c1b674a2cd66184e7ca66e52262625d +size 17379744 diff --git a/Runtime/Plugins/iOS.meta b/Runtime/Plugins/iOS.meta new file mode 100644 index 00000000..bff0c975 --- /dev/null +++ b/Runtime/Plugins/iOS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f9dc9cc15b6914ff0bc3ccd2a0096200 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Plugins/iOS/LiveKitAudioSession.mm b/Runtime/Plugins/iOS/LiveKitAudioSession.mm new file mode 100644 index 00000000..e6c2b7b2 --- /dev/null +++ b/Runtime/Plugins/iOS/LiveKitAudioSession.mm @@ -0,0 +1,70 @@ +/* + * Copyright 2024 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. + */ + +#import + +extern "C" { + +/// Configures the iOS audio session for VoIP/WebRTC use. +/// This sets AVAudioSessionCategoryPlayAndRecord with VoiceChat mode, +/// which enables the VPIO (Voice Processing IO) AudioUnit for: +/// - Hardware echo cancellation (AEC) +/// - Automatic gain control (AGC) +/// - Noise suppression (NS) +/// +/// Call this before creating PlatformAudio to ensure WebRTC can +/// properly initialize the microphone and speaker. +void LiveKit_ConfigureAudioSessionForVoIP() { + AVAudioSession* session = [AVAudioSession sharedInstance]; + NSError* error = nil; + + // Configure for VoIP with echo cancellation + BOOL success = [session setCategory:AVAudioSessionCategoryPlayAndRecord + mode:AVAudioSessionModeVoiceChat + options:AVAudioSessionCategoryOptionDefaultToSpeaker | + AVAudioSessionCategoryOptionAllowBluetooth | + AVAudioSessionCategoryOptionAllowBluetoothA2DP + error:&error]; + + if (!success || error) { + NSLog(@"LiveKit: Failed to configure VoIP audio session: %@", error.localizedDescription); + return; + } + + // Activate the audio session + success = [session setActive:YES error:&error]; + if (!success || error) { + NSLog(@"LiveKit: Failed to activate audio session: %@", error.localizedDescription); + return; + } + + NSLog(@"LiveKit: Audio session configured for VoIP (PlayAndRecord + VoiceChat mode)"); +} + +/// Restores the audio session to the default ambient category. +/// Call this when PlatformAudio is disposed if you want to restore +/// the original audio behavior. +void LiveKit_RestoreDefaultAudioSession() { + AVAudioSession* session = [AVAudioSession sharedInstance]; + NSError* error = nil; + + [session setCategory:AVAudioSessionCategoryAmbient error:&error]; + if (error) { + NSLog(@"LiveKit: Failed to restore default audio session: %@", error.localizedDescription); + } +} + +} diff --git a/Runtime/Plugins/iOS/LiveKitAudioSession.mm.meta b/Runtime/Plugins/iOS/LiveKitAudioSession.mm.meta new file mode 100644 index 00000000..8a957390 --- /dev/null +++ b/Runtime/Plugins/iOS/LiveKitAudioSession.mm.meta @@ -0,0 +1,42 @@ +fileFormatVersion: 2 +guid: 27d51b1df7f4b469a8a9c97f2349face +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + VisionOS: VisionOS + second: + enabled: 1 + settings: {} + - first: + iPhone: iOS + second: + enabled: 1 + settings: {} + - first: + tvOS: tvOS + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Plugins/iOS/liblivekit_ffi.a b/Runtime/Plugins/iOS/liblivekit_ffi.a new file mode 100644 index 00000000..f6e59d9e --- /dev/null +++ b/Runtime/Plugins/iOS/liblivekit_ffi.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07f507aab5a0a241d674b81460dee4a2d99b0996debb3d07a92bf41f63be783d +size 564011360 diff --git a/Runtime/Plugins/iOS/liblivekit_ffi.a.meta b/Runtime/Plugins/iOS/liblivekit_ffi.a.meta new file mode 100644 index 00000000..3534c748 --- /dev/null +++ b/Runtime/Plugins/iOS/liblivekit_ffi.a.meta @@ -0,0 +1,27 @@ +fileFormatVersion: 2 +guid: 96afae52e55d443c796a803ca8331e93 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Internal/FFIClients/FfiRequestExtensions.cs b/Runtime/Scripts/Internal/FFIClients/FfiRequestExtensions.cs index 93caf2db..89b23c11 100644 --- a/Runtime/Scripts/Internal/FFIClients/FfiRequestExtensions.cs +++ b/Runtime/Scripts/Internal/FFIClients/FfiRequestExtensions.cs @@ -149,6 +149,19 @@ public static void Inject(this FfiRequest ffiRequest, T request) case RemixAndResampleRequest remixAndResampleRequest: ffiRequest.RemixAndResample = remixAndResampleRequest; break; + // PlatformAudio + case NewPlatformAudioRequest newPlatformAudioRequest: + ffiRequest.NewPlatformAudio = newPlatformAudioRequest; + break; + case GetAudioDevicesRequest getAudioDevicesRequest: + ffiRequest.GetAudioDevices = getAudioDevicesRequest; + break; + case SetRecordingDeviceRequest setRecordingDeviceRequest: + ffiRequest.SetRecordingDevice = setRecordingDeviceRequest; + break; + case SetPlayoutDeviceRequest setPlayoutDeviceRequest: + ffiRequest.SetPlayoutDevice = setPlayoutDeviceRequest; + break; case LocalTrackMuteRequest localTrackMuteRequest: ffiRequest.LocalTrackMute = localTrackMuteRequest; break; diff --git a/Runtime/Scripts/PlatformAudio.cs b/Runtime/Scripts/PlatformAudio.cs new file mode 100644 index 00000000..e731ebba --- /dev/null +++ b/Runtime/Scripts/PlatformAudio.cs @@ -0,0 +1,351 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using LiveKit.Proto; +using LiveKit.Internal; +using LiveKit.Internal.FFIClients.Requests; + +namespace LiveKit +{ +#if UNITY_IOS && !UNITY_EDITOR + internal static class IOSAudioSessionHelper + { + /// + /// Configures the iOS audio session for VoIP/WebRTC. + /// Must be called before creating PlatformAudio. + /// + [DllImport("__Internal")] + internal static extern void LiveKit_ConfigureAudioSessionForVoIP(); + + /// + /// Restores the iOS audio session to ambient mode. + /// + [DllImport("__Internal")] + internal static extern void LiveKit_RestoreDefaultAudioSession(); + } +#endif + + /// + /// Information about an audio device (microphone or speaker). + /// + public struct AudioDevice + { + /// Device index (0-based). Note: indices can change when devices are added/removed. + public uint Index; + /// Device name as reported by the operating system. + public string Name; + /// + /// Platform-specific unique device identifier (GUID). + /// This is stable across device additions/removals and should be preferred + /// over index for device selection. + /// + public string Guid; + } + + /// + /// Platform audio device management using WebRTC's Audio Device Module (ADM). + /// + /// PlatformAudio provides access to the platform's audio devices (microphones and + /// speakers) and enables automatic audio capture and playback through WebRTC's ADM. + /// + /// Key features: + /// - Echo cancellation (AEC) + /// - Automatic gain control (AGC) + /// - Noise suppression (NS) + /// - Automatic speaker playout for remote audio + /// + /// Usage: + /// 1. Create a PlatformAudio instance (enables ADM) + /// 2. Optionally enumerate and select devices + /// 3. Create audio tracks using PlatformAudioSource + /// 4. Remote audio automatically plays through speakers + /// + /// + /// + /// // Create PlatformAudio (enables ADM) + /// var platformAudio = new PlatformAudio(); + /// + /// // Enumerate devices + /// var (recording, playout) = platformAudio.GetDevices(); + /// foreach (var device in recording) + /// Debug.Log($"Mic {device.Index}: {device.Name}"); + /// + /// // Select devices + /// platformAudio.SetRecordingDevice(0); + /// platformAudio.SetPlayoutDevice(0); + /// + /// // Create audio source and track + /// var source = new PlatformAudioSource(platformAudio); + /// var track = LocalAudioTrack.CreateAudioTrack("microphone", source, room); + /// + /// // Publish track + /// await room.LocalParticipant.PublishTrack(track, options); + /// + /// // Dispose when done + /// platformAudio.Dispose(); + /// + /// + public sealed class PlatformAudio : IDisposable + { + internal readonly FfiHandle Handle; + private readonly PlatformAudioInfo _info; + private bool _disposed = false; + + /// + /// Number of available recording (microphone) devices. + /// + public int RecordingDeviceCount => _info.RecordingDeviceCount; + + /// + /// Number of available playout (speaker) devices. + /// + public int PlayoutDeviceCount => _info.PlayoutDeviceCount; + + /// + /// Creates a new PlatformAudio instance, enabling the platform ADM. + /// + /// This must be called before creating any PlatformAudioSource or connecting + /// to a room if you want automatic speaker playout for remote audio. + /// + /// On iOS, this automatically configures the audio session for VoIP mode + /// (PlayAndRecord category with VoiceChat mode) to enable hardware echo + /// cancellation and microphone input. + /// + /// + /// Thrown if the platform ADM could not be initialized (e.g., no audio devices, + /// missing permissions). + /// + public PlatformAudio() + { +#if UNITY_IOS && !UNITY_EDITOR + // Configure iOS audio session for VoIP before initializing WebRTC ADM. + // This sets PlayAndRecord category with VoiceChat mode for hardware AEC. + IOSAudioSessionHelper.LiveKit_ConfigureAudioSessionForVoIP(); +#endif + + using var request = FFIBridge.Instance.NewRequest(); + using var response = request.Send(); + FfiResponse res = response; + + if (res.NewPlatformAudio.MessageCase == NewPlatformAudioResponse.MessageOneofCase.Error) + throw new InvalidOperationException($"Failed to create PlatformAudio: {res.NewPlatformAudio.Error}"); + + var platformAudio = res.NewPlatformAudio.PlatformAudio; + Handle = FfiHandle.FromOwnedHandle(platformAudio.Handle); + _info = platformAudio.Info; + + Utils.Debug($"PlatformAudio created: {RecordingDeviceCount} recording devices, {PlayoutDeviceCount} playout devices"); + } + + /// + /// Gets the lists of available recording and playout devices. + /// + /// + /// A tuple containing: + /// - Recording: List of available microphones + /// - Playout: List of available speakers/headphones + /// + /// + /// Thrown if device enumeration failed. + /// + public (List Recording, List Playout) GetDevices() + { + using var request = FFIBridge.Instance.NewRequest(); + request.request.PlatformAudioHandle = (ulong)Handle.DangerousGetHandle(); + + using var response = request.Send(); + FfiResponse res = response; + + if (res.GetAudioDevices.HasError && !string.IsNullOrEmpty(res.GetAudioDevices.Error)) + throw new InvalidOperationException($"Failed to get audio devices: {res.GetAudioDevices.Error}"); + + var recording = new List(); + foreach (var device in res.GetAudioDevices.RecordingDevices) + { + recording.Add(new AudioDevice { + Index = device.Index, + Name = device.Name, + Guid = device.HasGuid ? device.Guid : null + }); + } + + var playout = new List(); + foreach (var device in res.GetAudioDevices.PlayoutDevices) + { + playout.Add(new AudioDevice { + Index = device.Index, + Name = device.Name, + Guid = device.HasGuid ? device.Guid : null + }); + } + + return (recording, playout); + } + + /// + /// Sets the recording device (microphone) by index. + /// + /// Call this before creating audio tracks to select which microphone to use. + /// Device indices are 0-based and must be less than RecordingDeviceCount. + /// + /// Note: Prefer SetRecordingDeviceByGuid for robust device selection across hot-plug events. + /// + /// Device index from GetDevices().Recording + /// + /// Thrown if the device index is invalid or the operation failed. + /// + public void SetRecordingDevice(uint index) + { + using var request = FFIBridge.Instance.NewRequest(); + request.request.PlatformAudioHandle = (ulong)Handle.DangerousGetHandle(); + request.request.Index = index; + + using var response = request.Send(); + FfiResponse res = response; + + if (res.SetRecordingDevice.HasError && !string.IsNullOrEmpty(res.SetRecordingDevice.Error)) + throw new InvalidOperationException($"Failed to set recording device: {res.SetRecordingDevice.Error}"); + + Utils.Debug($"PlatformAudio: set recording device to index {index}"); + } + + /// + /// Sets the recording device (microphone) by GUID. + /// + /// This is the preferred method for device selection as GUIDs are stable + /// across device hot-plug events, unlike indices which can change. + /// + /// Device GUID from GetDevices().Recording[i].Guid + /// + /// Thrown if the device is not found or the operation failed. + /// + public void SetRecordingDeviceByGuid(string guid) + { + using var request = FFIBridge.Instance.NewRequest(); + request.request.PlatformAudioHandle = (ulong)Handle.DangerousGetHandle(); + request.request.Guid = guid; + + using var response = request.Send(); + FfiResponse res = response; + + if (res.SetRecordingDevice.HasError && !string.IsNullOrEmpty(res.SetRecordingDevice.Error)) + throw new InvalidOperationException($"Failed to set recording device by GUID: {res.SetRecordingDevice.Error}"); + + Utils.Debug($"PlatformAudio: set recording device to GUID {guid}"); + } + + /// + /// Sets the playout device (speaker/headphones) by index. + /// + /// Call this before connecting to select which speaker to use for remote audio. + /// Device indices are 0-based and must be less than PlayoutDeviceCount. + /// + /// Note: Prefer SetPlayoutDeviceByGuid for robust device selection across hot-plug events. + /// + /// Device index from GetDevices().Playout + /// + /// Thrown if the device index is invalid or the operation failed. + /// + public void SetPlayoutDevice(uint index) + { + using var request = FFIBridge.Instance.NewRequest(); + request.request.PlatformAudioHandle = (ulong)Handle.DangerousGetHandle(); + request.request.Index = index; + + using var response = request.Send(); + FfiResponse res = response; + + if (res.SetPlayoutDevice.HasError && !string.IsNullOrEmpty(res.SetPlayoutDevice.Error)) + throw new InvalidOperationException($"Failed to set playout device: {res.SetPlayoutDevice.Error}"); + + Utils.Debug($"PlatformAudio: set playout device to index {index}"); + } + + /// + /// Sets the playout device (speaker/headphones) by GUID. + /// + /// This is the preferred method for device selection as GUIDs are stable + /// across device hot-plug events, unlike indices which can change. + /// + /// Device GUID from GetDevices().Playout[i].Guid + /// + /// Thrown if the device is not found or the operation failed. + /// + public void SetPlayoutDeviceByGuid(string guid) + { + using var request = FFIBridge.Instance.NewRequest(); + request.request.PlatformAudioHandle = (ulong)Handle.DangerousGetHandle(); + request.request.Guid = guid; + + using var response = request.Send(); + FfiResponse res = response; + + if (res.SetPlayoutDevice.HasError && !string.IsNullOrEmpty(res.SetPlayoutDevice.Error)) + throw new InvalidOperationException($"Failed to set playout device by GUID: {res.SetPlayoutDevice.Error}"); + + Utils.Debug($"PlatformAudio: set playout device to GUID {guid}"); + } + + /// + /// Starts recording from the microphone. + /// + /// Recording is started automatically when PlatformAudio is created. + /// Use this to resume recording after calling StopRecording. + /// This turns on the system's recording privacy indicator (e.g., on macOS/iOS). + /// + /// + /// Thrown if the operation failed. + /// + public void StartRecording() + { + using var request = FFIBridge.Instance.NewRequest(); + request.request.PlatformAudioHandle = (ulong)Handle.DangerousGetHandle(); + + using var response = request.Send(); + FfiResponse res = response; + + if (res.StartRecording.HasError && !string.IsNullOrEmpty(res.StartRecording.Error)) + throw new InvalidOperationException($"Failed to start recording: {res.StartRecording.Error}"); + + Utils.Debug("PlatformAudio: started recording"); + } + + /// + /// Stops recording from the microphone. + /// + /// Use this to temporarily stop recording without disposing PlatformAudio. + /// This turns off the system's recording privacy indicator (e.g., on macOS/iOS). + /// Call StartRecording to resume recording. + /// + /// + /// Thrown if the operation failed. + /// + public void StopRecording() + { + using var request = FFIBridge.Instance.NewRequest(); + request.request.PlatformAudioHandle = (ulong)Handle.DangerousGetHandle(); + + using var response = request.Send(); + FfiResponse res = response; + + if (res.StopRecording.HasError && !string.IsNullOrEmpty(res.StopRecording.Error)) + throw new InvalidOperationException($"Failed to stop recording: {res.StopRecording.Error}"); + + Utils.Debug("PlatformAudio: stopped recording"); + } + + /// + /// Releases the PlatformAudio resources. + /// + /// When disposed, the platform ADM may be disabled if this was the last + /// PlatformAudio instance. + /// + public void Dispose() + { + if (_disposed) return; + Handle.Dispose(); + _disposed = true; + Utils.Debug("PlatformAudio disposed"); + } + } +} diff --git a/Runtime/Scripts/PlatformAudio.cs.meta b/Runtime/Scripts/PlatformAudio.cs.meta new file mode 100644 index 00000000..6fadaf57 --- /dev/null +++ b/Runtime/Scripts/PlatformAudio.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 84e509f50b0674233812310ab67ccd9c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/PlatformAudioSource.cs b/Runtime/Scripts/PlatformAudioSource.cs new file mode 100644 index 00000000..f0be42b5 --- /dev/null +++ b/Runtime/Scripts/PlatformAudioSource.cs @@ -0,0 +1,161 @@ +using System; +using LiveKit.Proto; +using LiveKit.Internal; +using LiveKit.Internal.FFIClients.Requests; + +namespace LiveKit +{ + /// + /// Options for audio processing when creating a PlatformAudioSource. + /// + public struct AudioProcessingOptions + { + /// Enable echo cancellation (AEC). Default: true. + public bool EchoCancellation; + /// Enable noise suppression (NS). Default: true. + public bool NoiseSuppression; + /// Enable automatic gain control (AGC). Default: true. + public bool AutoGainControl; + /// Prefer hardware audio processing (e.g., iOS VPIO). Lower latency. Default: true. + public bool PreferHardware; + + /// + /// Default audio processing options with all processing enabled and hardware preferred. + /// + public static AudioProcessingOptions Default => new AudioProcessingOptions + { + EchoCancellation = true, + NoiseSuppression = true, + AutoGainControl = true, + PreferHardware = true + }; + } + + /// + /// Audio source that captures from the platform microphone via WebRTC's ADM. + /// + /// Unlike MicrophoneSource which uses Unity's Microphone API and manually pushes + /// audio frames, PlatformAudioSource lets WebRTC's ADM handle capture directly. + /// This provides: + /// - Echo cancellation (AEC) that works with speaker playout + /// - Lower latency (single audio path, no Unity intermediate) + /// - Automatic gain control and noise suppression + /// + /// Requires PlatformAudio to be created first to enable the ADM. + /// + /// + /// + /// // Create PlatformAudio first (enables ADM) + /// var platformAudio = new PlatformAudio(); + /// + /// // Create audio source with default options + /// var source = new PlatformAudioSource(platformAudio); + /// + /// // Or with custom options + /// var options = new AudioProcessingOptions { + /// EchoCancellation = true, + /// NoiseSuppression = true, + /// AutoGainControl = true, + /// PreferHardware = true + /// }; + /// var source = new PlatformAudioSource(platformAudio, options); + /// + /// // Create and publish track + /// var track = LocalAudioTrack.CreateAudioTrack("microphone", source, room); + /// await room.LocalParticipant.PublishTrack(track, options); + /// + /// + public sealed class PlatformAudioSource : IRtcSource, IDisposable + { + internal readonly FfiHandle Handle; + private readonly PlatformAudio _platformAudio; + private bool _disposed = false; + private bool _muted = false; + + /// + /// Whether the audio source is muted. + /// + public override bool Muted => _muted; + + /// + /// Creates a new platform audio source with default audio processing options. + /// + /// The source will capture audio from the microphone selected via + /// PlatformAudio.SetRecordingDevice(), or the default device if none selected. + /// + /// + /// The PlatformAudio instance. Must be kept alive while this source is in use. + /// + /// + /// Thrown if platformAudio is null. + /// + public PlatformAudioSource(PlatformAudio platformAudio) + : this(platformAudio, AudioProcessingOptions.Default) + { + } + + /// + /// Creates a new platform audio source with custom audio processing options. + /// + /// The source will capture audio from the microphone selected via + /// PlatformAudio.SetRecordingDevice(), or the default device if none selected. + /// + /// + /// The PlatformAudio instance. Must be kept alive while this source is in use. + /// + /// Audio processing options to configure on the ADM. + /// + /// Thrown if platformAudio is null. + /// + public PlatformAudioSource(PlatformAudio platformAudio, AudioProcessingOptions options) + { + if (platformAudio == null) + throw new ArgumentNullException(nameof(platformAudio)); + + _platformAudio = platformAudio; + + using var request = FFIBridge.Instance.NewRequest(); + var newAudioSource = request.request; + newAudioSource.Type = AudioSourceType.AudioSourcePlatform; + newAudioSource.NumChannels = 2; + newAudioSource.SampleRate = 48000; + + // Pass the platform audio handle so the Rust side can configure audio processing + newAudioSource.PlatformAudioHandle = (ulong)platformAudio.Handle.DangerousGetHandle(); + + // Configure audio processing options + newAudioSource.Options = request.TempResource(); + newAudioSource.Options.EchoCancellation = options.EchoCancellation; + newAudioSource.Options.AutoGainControl = options.AutoGainControl; + newAudioSource.Options.NoiseSuppression = options.NoiseSuppression; + newAudioSource.Options.PreferHardware = options.PreferHardware; + + using var response = request.Send(); + FfiResponse res = response; + + Handle = FfiHandle.FromOwnedHandle(res.NewAudioSource.Source.Handle); + Utils.Debug($"PlatformAudioSource created: handle={Handle.DangerousGetHandle()}, AEC={options.EchoCancellation}, NS={options.NoiseSuppression}, AGC={options.AutoGainControl}, HW={options.PreferHardware}"); + } + + /// + /// Mutes or unmutes the audio source. + /// + /// True to mute, false to unmute. + public override void SetMute(bool muted) + { + _muted = muted; + Utils.Debug($"PlatformAudioSource: muted={muted}"); + } + + /// + /// Releases the audio source resources. + /// + public void Dispose() + { + if (_disposed) return; + Handle.Dispose(); + _disposed = true; + Utils.Debug("PlatformAudioSource disposed"); + } + } +} diff --git a/Runtime/Scripts/PlatformAudioSource.cs.meta b/Runtime/Scripts/PlatformAudioSource.cs.meta new file mode 100644 index 00000000..c05fe981 --- /dev/null +++ b/Runtime/Scripts/PlatformAudioSource.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f15bdf32fdae64d69ba90ab6cabc47d5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Proto/AudioFrame.cs b/Runtime/Scripts/Proto/AudioFrame.cs index f28a9d5a..3d693d1f 100644 --- a/Runtime/Scripts/Proto/AudioFrame.cs +++ b/Runtime/Scripts/Proto/AudioFrame.cs @@ -41,101 +41,127 @@ static AudioFrameReflection() { "b19maWx0ZXJfb3B0aW9ucxgIIAEoCRIVCg1mcmFtZV9zaXplX21zGAkgASgN", "EhkKEXF1ZXVlX3NpemVfZnJhbWVzGAogASgNIlUKIkF1ZGlvU3RyZWFtRnJv", "bVBhcnRpY2lwYW50UmVzcG9uc2USLwoGc3RyZWFtGAEgAigLMh8ubGl2ZWtp", - "dC5wcm90by5Pd25lZEF1ZGlvU3RyZWFtIrsBChVOZXdBdWRpb1NvdXJjZVJl", + "dC5wcm90by5Pd25lZEF1ZGlvU3RyZWFtItoBChVOZXdBdWRpb1NvdXJjZVJl", "cXVlc3QSLAoEdHlwZRgBIAIoDjIeLmxpdmVraXQucHJvdG8uQXVkaW9Tb3Vy", "Y2VUeXBlEjIKB29wdGlvbnMYAiABKAsyIS5saXZla2l0LnByb3RvLkF1ZGlv", "U291cmNlT3B0aW9ucxITCgtzYW1wbGVfcmF0ZRgDIAIoDRIUCgxudW1fY2hh", - "bm5lbHMYBCACKA0SFQoNcXVldWVfc2l6ZV9tcxgFIAEoDSJJChZOZXdBdWRp", - "b1NvdXJjZVJlc3BvbnNlEi8KBnNvdXJjZRgBIAIoCzIfLmxpdmVraXQucHJv", - "dG8uT3duZWRBdWRpb1NvdXJjZSKAAQoYQ2FwdHVyZUF1ZGlvRnJhbWVSZXF1", - "ZXN0EhUKDXNvdXJjZV9oYW5kbGUYASACKAQSMwoGYnVmZmVyGAIgAigLMiMu", - "bGl2ZWtpdC5wcm90by5BdWRpb0ZyYW1lQnVmZmVySW5mbxIYChByZXF1ZXN0", - "X2FzeW5jX2lkGAMgASgEIi0KGUNhcHR1cmVBdWRpb0ZyYW1lUmVzcG9uc2US", - "EAoIYXN5bmNfaWQYASACKAQiPAoZQ2FwdHVyZUF1ZGlvRnJhbWVDYWxsYmFj", - "axIQCghhc3luY19pZBgBIAIoBBINCgVlcnJvchgCIAEoCSIwChdDbGVhckF1", - "ZGlvQnVmZmVyUmVxdWVzdBIVCg1zb3VyY2VfaGFuZGxlGAEgAigEIhoKGENs", - "ZWFyQXVkaW9CdWZmZXJSZXNwb25zZSIaChhOZXdBdWRpb1Jlc2FtcGxlclJl", - "cXVlc3QiUgoZTmV3QXVkaW9SZXNhbXBsZXJSZXNwb25zZRI1CglyZXNhbXBs", - "ZXIYASACKAsyIi5saXZla2l0LnByb3RvLk93bmVkQXVkaW9SZXNhbXBsZXIi", - "kwEKF1JlbWl4QW5kUmVzYW1wbGVSZXF1ZXN0EhgKEHJlc2FtcGxlcl9oYW5k", - "bGUYASACKAQSMwoGYnVmZmVyGAIgAigLMiMubGl2ZWtpdC5wcm90by5BdWRp", - "b0ZyYW1lQnVmZmVySW5mbxIUCgxudW1fY2hhbm5lbHMYAyACKA0SEwoLc2Ft", - "cGxlX3JhdGUYBCACKA0iUAoYUmVtaXhBbmRSZXNhbXBsZVJlc3BvbnNlEjQK", - "BmJ1ZmZlchgBIAIoCzIkLmxpdmVraXQucHJvdG8uT3duZWRBdWRpb0ZyYW1l", - "QnVmZmVyIpUBCg1OZXdBcG1SZXF1ZXN0Eh4KFmVjaG9fY2FuY2VsbGVyX2Vu", - "YWJsZWQYASACKAgSHwoXZ2Fpbl9jb250cm9sbGVyX2VuYWJsZWQYAiACKAgS", - "IAoYaGlnaF9wYXNzX2ZpbHRlcl9lbmFibGVkGAMgAigIEiEKGW5vaXNlX3N1", - "cHByZXNzaW9uX2VuYWJsZWQYBCACKAgiNgoOTmV3QXBtUmVzcG9uc2USJAoD", - "YXBtGAEgAigLMhcubGl2ZWtpdC5wcm90by5Pd25lZEFwbSJ4ChdBcG1Qcm9j", - "ZXNzU3RyZWFtUmVxdWVzdBISCgphcG1faGFuZGxlGAEgAigEEhAKCGRhdGFf", - "cHRyGAIgAigEEgwKBHNpemUYAyACKA0SEwoLc2FtcGxlX3JhdGUYBCACKA0S", - "FAoMbnVtX2NoYW5uZWxzGAUgAigNIikKGEFwbVByb2Nlc3NTdHJlYW1SZXNw", - "b25zZRINCgVlcnJvchgBIAEoCSJ/Ch5BcG1Qcm9jZXNzUmV2ZXJzZVN0cmVh", - "bVJlcXVlc3QSEgoKYXBtX2hhbmRsZRgBIAIoBBIQCghkYXRhX3B0chgCIAIo", - "BBIMCgRzaXplGAMgAigNEhMKC3NhbXBsZV9yYXRlGAQgAigNEhQKDG51bV9j", - "aGFubmVscxgFIAIoDSIwCh9BcG1Qcm9jZXNzUmV2ZXJzZVN0cmVhbVJlc3Bv", - "bnNlEg0KBWVycm9yGAEgASgJIkAKGEFwbVNldFN0cmVhbURlbGF5UmVxdWVz", - "dBISCgphcG1faGFuZGxlGAEgAigEEhAKCGRlbGF5X21zGAIgAigFIioKGUFw", - "bVNldFN0cmVhbURlbGF5UmVzcG9uc2USDQoFZXJyb3IYASABKAkinAIKFk5l", - "d1NveFJlc2FtcGxlclJlcXVlc3QSEgoKaW5wdXRfcmF0ZRgBIAIoARITCgtv", - "dXRwdXRfcmF0ZRgCIAIoARIUCgxudW1fY2hhbm5lbHMYAyACKA0SPAoPaW5w", - "dXRfZGF0YV90eXBlGAQgAigOMiMubGl2ZWtpdC5wcm90by5Tb3hSZXNhbXBs", - "ZXJEYXRhVHlwZRI9ChBvdXRwdXRfZGF0YV90eXBlGAUgAigOMiMubGl2ZWtp", - "dC5wcm90by5Tb3hSZXNhbXBsZXJEYXRhVHlwZRI3Cg5xdWFsaXR5X3JlY2lw", - "ZRgGIAIoDjIfLmxpdmVraXQucHJvdG8uU294UXVhbGl0eVJlY2lwZRINCgVm", - "bGFncxgHIAEoDSJsChdOZXdTb3hSZXNhbXBsZXJSZXNwb25zZRI1CglyZXNh", - "bXBsZXIYASABKAsyIC5saXZla2l0LnByb3RvLk93bmVkU294UmVzYW1wbGVy", - "SAASDwoFZXJyb3IYAiABKAlIAEIJCgdtZXNzYWdlIlMKF1B1c2hTb3hSZXNh", - "bXBsZXJSZXF1ZXN0EhgKEHJlc2FtcGxlcl9oYW5kbGUYASACKAQSEAoIZGF0", - "YV9wdHIYAiACKAQSDAoEc2l6ZRgDIAIoDSJLChhQdXNoU294UmVzYW1wbGVy", - "UmVzcG9uc2USEgoKb3V0cHV0X3B0chgBIAIoBBIMCgRzaXplGAIgAigNEg0K", - "BWVycm9yGAMgASgJIjQKGEZsdXNoU294UmVzYW1wbGVyUmVxdWVzdBIYChBy", - "ZXNhbXBsZXJfaGFuZGxlGAEgAigEIkwKGUZsdXNoU294UmVzYW1wbGVyUmVz", - "cG9uc2USEgoKb3V0cHV0X3B0chgBIAIoBBIMCgRzaXplGAIgAigNEg0KBWVy", - "cm9yGAMgASgJInAKFEF1ZGlvRnJhbWVCdWZmZXJJbmZvEhAKCGRhdGFfcHRy", - "GAEgAigEEhQKDG51bV9jaGFubmVscxgCIAIoDRITCgtzYW1wbGVfcmF0ZRgD", - "IAIoDRIbChNzYW1wbGVzX3Blcl9jaGFubmVsGAQgAigNInkKFU93bmVkQXVk", - "aW9GcmFtZUJ1ZmZlchItCgZoYW5kbGUYASACKAsyHS5saXZla2l0LnByb3Rv", - "LkZmaU93bmVkSGFuZGxlEjEKBGluZm8YAiACKAsyIy5saXZla2l0LnByb3Rv", - "LkF1ZGlvRnJhbWVCdWZmZXJJbmZvIj8KD0F1ZGlvU3RyZWFtSW5mbxIsCgR0", - "eXBlGAEgAigOMh4ubGl2ZWtpdC5wcm90by5BdWRpb1N0cmVhbVR5cGUibwoQ", - "T3duZWRBdWRpb1N0cmVhbRItCgZoYW5kbGUYASACKAsyHS5saXZla2l0LnBy", - "b3RvLkZmaU93bmVkSGFuZGxlEiwKBGluZm8YAiACKAsyHi5saXZla2l0LnBy", - "b3RvLkF1ZGlvU3RyZWFtSW5mbyKfAQoQQXVkaW9TdHJlYW1FdmVudBIVCg1z", - "dHJlYW1faGFuZGxlGAEgAigEEjsKDmZyYW1lX3JlY2VpdmVkGAIgASgLMiEu", - "bGl2ZWtpdC5wcm90by5BdWRpb0ZyYW1lUmVjZWl2ZWRIABIsCgNlb3MYAyAB", - "KAsyHS5saXZla2l0LnByb3RvLkF1ZGlvU3RyZWFtRU9TSABCCQoHbWVzc2Fn", - "ZSJJChJBdWRpb0ZyYW1lUmVjZWl2ZWQSMwoFZnJhbWUYASACKAsyJC5saXZl", - "a2l0LnByb3RvLk93bmVkQXVkaW9GcmFtZUJ1ZmZlciIQCg5BdWRpb1N0cmVh", - "bUVPUyJlChJBdWRpb1NvdXJjZU9wdGlvbnMSGQoRZWNob19jYW5jZWxsYXRp", - "b24YASACKAgSGQoRbm9pc2Vfc3VwcHJlc3Npb24YAiACKAgSGQoRYXV0b19n", - "YWluX2NvbnRyb2wYAyACKAgiPwoPQXVkaW9Tb3VyY2VJbmZvEiwKBHR5cGUY", - "AiACKA4yHi5saXZla2l0LnByb3RvLkF1ZGlvU291cmNlVHlwZSJvChBPd25l", - "ZEF1ZGlvU291cmNlEi0KBmhhbmRsZRgBIAIoCzIdLmxpdmVraXQucHJvdG8u", - "RmZpT3duZWRIYW5kbGUSLAoEaW5mbxgCIAIoCzIeLmxpdmVraXQucHJvdG8u", - "QXVkaW9Tb3VyY2VJbmZvIhQKEkF1ZGlvUmVzYW1wbGVySW5mbyJ1ChNPd25l", - "ZEF1ZGlvUmVzYW1wbGVyEi0KBmhhbmRsZRgBIAIoCzIdLmxpdmVraXQucHJv", - "dG8uRmZpT3duZWRIYW5kbGUSLwoEaW5mbxgCIAIoCzIhLmxpdmVraXQucHJv", - "dG8uQXVkaW9SZXNhbXBsZXJJbmZvIjkKCE93bmVkQXBtEi0KBmhhbmRsZRgB", - "IAIoCzIdLmxpdmVraXQucHJvdG8uRmZpT3duZWRIYW5kbGUiEgoQU294UmVz", - "YW1wbGVySW5mbyJxChFPd25lZFNveFJlc2FtcGxlchItCgZoYW5kbGUYASAC", - "KAsyHS5saXZla2l0LnByb3RvLkZmaU93bmVkSGFuZGxlEi0KBGluZm8YAiAC", - "KAsyHy5saXZla2l0LnByb3RvLlNveFJlc2FtcGxlckluZm8iXAocTG9hZEF1", - "ZGlvRmlsdGVyUGx1Z2luUmVxdWVzdBITCgtwbHVnaW5fcGF0aBgBIAIoCRIU", - "CgxkZXBlbmRlbmNpZXMYAiADKAkSEQoJbW9kdWxlX2lkGAMgAigJIi4KHUxv", - "YWRBdWRpb0ZpbHRlclBsdWdpblJlc3BvbnNlEg0KBWVycm9yGAEgASgJKkoK", - "FFNveFJlc2FtcGxlckRhdGFUeXBlEhgKFFNPWFJfREFUQVRZUEVfSU5UMTZJ", - "EAASGAoUU09YUl9EQVRBVFlQRV9JTlQxNlMQASqLAQoQU294UXVhbGl0eVJl", - "Y2lwZRIWChJTT1hSX1FVQUxJVFlfUVVJQ0sQABIUChBTT1hSX1FVQUxJVFlf", - "TE9XEAESFwoTU09YUl9RVUFMSVRZX01FRElVTRACEhUKEVNPWFJfUVVBTElU", - "WV9ISUdIEAMSGQoVU09YUl9RVUFMSVRZX1ZFUllISUdIEAQqlwEKC1NveEZs", - "YWdCaXRzEhYKElNPWFJfUk9MTE9GRl9TTUFMTBAAEhcKE1NPWFJfUk9MTE9G", - "Rl9NRURJVU0QARIVChFTT1hSX1JPTExPRkZfTk9ORRACEhgKFFNPWFJfSElH", - "SF9QUkVDX0NMT0NLEAMSGQoVU09YUl9ET1VCTEVfUFJFQ0lTSU9OEAQSCwoH", - "U09YUl9WUhAFKkEKD0F1ZGlvU3RyZWFtVHlwZRIXChNBVURJT19TVFJFQU1f", - "TkFUSVZFEAASFQoRQVVESU9fU1RSRUFNX0hUTUwQASoqCg9BdWRpb1NvdXJj", - "ZVR5cGUSFwoTQVVESU9fU09VUkNFX05BVElWRRAAQhCqAg1MaXZlS2l0LlBy", - "b3Rv")); + "bm5lbHMYBCACKA0SFQoNcXVldWVfc2l6ZV9tcxgFIAEoDRIdChVwbGF0Zm9y", + "bV9hdWRpb19oYW5kbGUYBiABKAQiSQoWTmV3QXVkaW9Tb3VyY2VSZXNwb25z", + "ZRIvCgZzb3VyY2UYASACKAsyHy5saXZla2l0LnByb3RvLk93bmVkQXVkaW9T", + "b3VyY2UigAEKGENhcHR1cmVBdWRpb0ZyYW1lUmVxdWVzdBIVCg1zb3VyY2Vf", + "aGFuZGxlGAEgAigEEjMKBmJ1ZmZlchgCIAIoCzIjLmxpdmVraXQucHJvdG8u", + "QXVkaW9GcmFtZUJ1ZmZlckluZm8SGAoQcmVxdWVzdF9hc3luY19pZBgDIAEo", + "BCItChlDYXB0dXJlQXVkaW9GcmFtZVJlc3BvbnNlEhAKCGFzeW5jX2lkGAEg", + "AigEIjwKGUNhcHR1cmVBdWRpb0ZyYW1lQ2FsbGJhY2sSEAoIYXN5bmNfaWQY", + "ASACKAQSDQoFZXJyb3IYAiABKAkiMAoXQ2xlYXJBdWRpb0J1ZmZlclJlcXVl", + "c3QSFQoNc291cmNlX2hhbmRsZRgBIAIoBCIaChhDbGVhckF1ZGlvQnVmZmVy", + "UmVzcG9uc2UiGgoYTmV3QXVkaW9SZXNhbXBsZXJSZXF1ZXN0IlIKGU5ld0F1", + "ZGlvUmVzYW1wbGVyUmVzcG9uc2USNQoJcmVzYW1wbGVyGAEgAigLMiIubGl2", + "ZWtpdC5wcm90by5Pd25lZEF1ZGlvUmVzYW1wbGVyIpMBChdSZW1peEFuZFJl", + "c2FtcGxlUmVxdWVzdBIYChByZXNhbXBsZXJfaGFuZGxlGAEgAigEEjMKBmJ1", + "ZmZlchgCIAIoCzIjLmxpdmVraXQucHJvdG8uQXVkaW9GcmFtZUJ1ZmZlcklu", + "Zm8SFAoMbnVtX2NoYW5uZWxzGAMgAigNEhMKC3NhbXBsZV9yYXRlGAQgAigN", + "IlAKGFJlbWl4QW5kUmVzYW1wbGVSZXNwb25zZRI0CgZidWZmZXIYASACKAsy", + "JC5saXZla2l0LnByb3RvLk93bmVkQXVkaW9GcmFtZUJ1ZmZlciKVAQoNTmV3", + "QXBtUmVxdWVzdBIeChZlY2hvX2NhbmNlbGxlcl9lbmFibGVkGAEgAigIEh8K", + "F2dhaW5fY29udHJvbGxlcl9lbmFibGVkGAIgAigIEiAKGGhpZ2hfcGFzc19m", + "aWx0ZXJfZW5hYmxlZBgDIAIoCBIhChlub2lzZV9zdXBwcmVzc2lvbl9lbmFi", + "bGVkGAQgAigIIjYKDk5ld0FwbVJlc3BvbnNlEiQKA2FwbRgBIAIoCzIXLmxp", + "dmVraXQucHJvdG8uT3duZWRBcG0ieAoXQXBtUHJvY2Vzc1N0cmVhbVJlcXVl", + "c3QSEgoKYXBtX2hhbmRsZRgBIAIoBBIQCghkYXRhX3B0chgCIAIoBBIMCgRz", + "aXplGAMgAigNEhMKC3NhbXBsZV9yYXRlGAQgAigNEhQKDG51bV9jaGFubmVs", + "cxgFIAIoDSIpChhBcG1Qcm9jZXNzU3RyZWFtUmVzcG9uc2USDQoFZXJyb3IY", + "ASABKAkifwoeQXBtUHJvY2Vzc1JldmVyc2VTdHJlYW1SZXF1ZXN0EhIKCmFw", + "bV9oYW5kbGUYASACKAQSEAoIZGF0YV9wdHIYAiACKAQSDAoEc2l6ZRgDIAIo", + "DRITCgtzYW1wbGVfcmF0ZRgEIAIoDRIUCgxudW1fY2hhbm5lbHMYBSACKA0i", + "MAofQXBtUHJvY2Vzc1JldmVyc2VTdHJlYW1SZXNwb25zZRINCgVlcnJvchgB", + "IAEoCSJAChhBcG1TZXRTdHJlYW1EZWxheVJlcXVlc3QSEgoKYXBtX2hhbmRs", + "ZRgBIAIoBBIQCghkZWxheV9tcxgCIAIoBSIqChlBcG1TZXRTdHJlYW1EZWxh", + "eVJlc3BvbnNlEg0KBWVycm9yGAEgASgJIpwCChZOZXdTb3hSZXNhbXBsZXJS", + "ZXF1ZXN0EhIKCmlucHV0X3JhdGUYASACKAESEwoLb3V0cHV0X3JhdGUYAiAC", + "KAESFAoMbnVtX2NoYW5uZWxzGAMgAigNEjwKD2lucHV0X2RhdGFfdHlwZRgE", + "IAIoDjIjLmxpdmVraXQucHJvdG8uU294UmVzYW1wbGVyRGF0YVR5cGUSPQoQ", + "b3V0cHV0X2RhdGFfdHlwZRgFIAIoDjIjLmxpdmVraXQucHJvdG8uU294UmVz", + "YW1wbGVyRGF0YVR5cGUSNwoOcXVhbGl0eV9yZWNpcGUYBiACKA4yHy5saXZl", + "a2l0LnByb3RvLlNveFF1YWxpdHlSZWNpcGUSDQoFZmxhZ3MYByABKA0ibAoX", + "TmV3U294UmVzYW1wbGVyUmVzcG9uc2USNQoJcmVzYW1wbGVyGAEgASgLMiAu", + "bGl2ZWtpdC5wcm90by5Pd25lZFNveFJlc2FtcGxlckgAEg8KBWVycm9yGAIg", + "ASgJSABCCQoHbWVzc2FnZSJTChdQdXNoU294UmVzYW1wbGVyUmVxdWVzdBIY", + "ChByZXNhbXBsZXJfaGFuZGxlGAEgAigEEhAKCGRhdGFfcHRyGAIgAigEEgwK", + "BHNpemUYAyACKA0iSwoYUHVzaFNveFJlc2FtcGxlclJlc3BvbnNlEhIKCm91", + "dHB1dF9wdHIYASACKAQSDAoEc2l6ZRgCIAIoDRINCgVlcnJvchgDIAEoCSI0", + "ChhGbHVzaFNveFJlc2FtcGxlclJlcXVlc3QSGAoQcmVzYW1wbGVyX2hhbmRs", + "ZRgBIAIoBCJMChlGbHVzaFNveFJlc2FtcGxlclJlc3BvbnNlEhIKCm91dHB1", + "dF9wdHIYASACKAQSDAoEc2l6ZRgCIAIoDRINCgVlcnJvchgDIAEoCSJwChRB", + "dWRpb0ZyYW1lQnVmZmVySW5mbxIQCghkYXRhX3B0chgBIAIoBBIUCgxudW1f", + "Y2hhbm5lbHMYAiACKA0SEwoLc2FtcGxlX3JhdGUYAyACKA0SGwoTc2FtcGxl", + "c19wZXJfY2hhbm5lbBgEIAIoDSJ5ChVPd25lZEF1ZGlvRnJhbWVCdWZmZXIS", + "LQoGaGFuZGxlGAEgAigLMh0ubGl2ZWtpdC5wcm90by5GZmlPd25lZEhhbmRs", + "ZRIxCgRpbmZvGAIgAigLMiMubGl2ZWtpdC5wcm90by5BdWRpb0ZyYW1lQnVm", + "ZmVySW5mbyI/Cg9BdWRpb1N0cmVhbUluZm8SLAoEdHlwZRgBIAIoDjIeLmxp", + "dmVraXQucHJvdG8uQXVkaW9TdHJlYW1UeXBlIm8KEE93bmVkQXVkaW9TdHJl", + "YW0SLQoGaGFuZGxlGAEgAigLMh0ubGl2ZWtpdC5wcm90by5GZmlPd25lZEhh", + "bmRsZRIsCgRpbmZvGAIgAigLMh4ubGl2ZWtpdC5wcm90by5BdWRpb1N0cmVh", + "bUluZm8inwEKEEF1ZGlvU3RyZWFtRXZlbnQSFQoNc3RyZWFtX2hhbmRsZRgB", + "IAIoBBI7Cg5mcmFtZV9yZWNlaXZlZBgCIAEoCzIhLmxpdmVraXQucHJvdG8u", + "QXVkaW9GcmFtZVJlY2VpdmVkSAASLAoDZW9zGAMgASgLMh0ubGl2ZWtpdC5w", + "cm90by5BdWRpb1N0cmVhbUVPU0gAQgkKB21lc3NhZ2UiSQoSQXVkaW9GcmFt", + "ZVJlY2VpdmVkEjMKBWZyYW1lGAEgAigLMiQubGl2ZWtpdC5wcm90by5Pd25l", + "ZEF1ZGlvRnJhbWVCdWZmZXIiEAoOQXVkaW9TdHJlYW1FT1MifgoSQXVkaW9T", + "b3VyY2VPcHRpb25zEhkKEWVjaG9fY2FuY2VsbGF0aW9uGAEgAigIEhkKEW5v", + "aXNlX3N1cHByZXNzaW9uGAIgAigIEhkKEWF1dG9fZ2Fpbl9jb250cm9sGAMg", + "AigIEhcKD3ByZWZlcl9oYXJkd2FyZRgEIAEoCCI/Cg9BdWRpb1NvdXJjZUlu", + "Zm8SLAoEdHlwZRgCIAIoDjIeLmxpdmVraXQucHJvdG8uQXVkaW9Tb3VyY2VU", + "eXBlIm8KEE93bmVkQXVkaW9Tb3VyY2USLQoGaGFuZGxlGAEgAigLMh0ubGl2", + "ZWtpdC5wcm90by5GZmlPd25lZEhhbmRsZRIsCgRpbmZvGAIgAigLMh4ubGl2", + "ZWtpdC5wcm90by5BdWRpb1NvdXJjZUluZm8iFAoSQXVkaW9SZXNhbXBsZXJJ", + "bmZvInUKE093bmVkQXVkaW9SZXNhbXBsZXISLQoGaGFuZGxlGAEgAigLMh0u", + "bGl2ZWtpdC5wcm90by5GZmlPd25lZEhhbmRsZRIvCgRpbmZvGAIgAigLMiEu", + "bGl2ZWtpdC5wcm90by5BdWRpb1Jlc2FtcGxlckluZm8iOQoIT3duZWRBcG0S", + "LQoGaGFuZGxlGAEgAigLMh0ubGl2ZWtpdC5wcm90by5GZmlPd25lZEhhbmRs", + "ZSISChBTb3hSZXNhbXBsZXJJbmZvInEKEU93bmVkU294UmVzYW1wbGVyEi0K", + "BmhhbmRsZRgBIAIoCzIdLmxpdmVraXQucHJvdG8uRmZpT3duZWRIYW5kbGUS", + "LQoEaW5mbxgCIAIoCzIfLmxpdmVraXQucHJvdG8uU294UmVzYW1wbGVySW5m", + "byJcChxMb2FkQXVkaW9GaWx0ZXJQbHVnaW5SZXF1ZXN0EhMKC3BsdWdpbl9w", + "YXRoGAEgAigJEhQKDGRlcGVuZGVuY2llcxgCIAMoCRIRCgltb2R1bGVfaWQY", + "AyACKAkiLgodTG9hZEF1ZGlvRmlsdGVyUGx1Z2luUmVzcG9uc2USDQoFZXJy", + "b3IYASABKAkiPAoPQXVkaW9EZXZpY2VJbmZvEg0KBWluZGV4GAEgAigNEgwK", + "BG5hbWUYAiACKAkSDAoEZ3VpZBgDIAEoCSJRChFQbGF0Zm9ybUF1ZGlvSW5m", + "bxIeChZyZWNvcmRpbmdfZGV2aWNlX2NvdW50GAEgAigFEhwKFHBsYXlvdXRf", + "ZGV2aWNlX2NvdW50GAIgAigFInMKEk93bmVkUGxhdGZvcm1BdWRpbxItCgZo", + "YW5kbGUYASACKAsyHS5saXZla2l0LnByb3RvLkZmaU93bmVkSGFuZGxlEi4K", + "BGluZm8YAiACKAsyIC5saXZla2l0LnByb3RvLlBsYXRmb3JtQXVkaW9JbmZv", + "IhkKF05ld1BsYXRmb3JtQXVkaW9SZXF1ZXN0InMKGE5ld1BsYXRmb3JtQXVk", + "aW9SZXNwb25zZRI7Cg5wbGF0Zm9ybV9hdWRpbxgBIAEoCzIhLmxpdmVraXQu", + "cHJvdG8uT3duZWRQbGF0Zm9ybUF1ZGlvSAASDwoFZXJyb3IYAiABKAlIAEIJ", + "CgdtZXNzYWdlIjcKFkdldEF1ZGlvRGV2aWNlc1JlcXVlc3QSHQoVcGxhdGZv", + "cm1fYXVkaW9faGFuZGxlGAEgAigEIpwBChdHZXRBdWRpb0RldmljZXNSZXNw", + "b25zZRI3Cg9wbGF5b3V0X2RldmljZXMYASADKAsyHi5saXZla2l0LnByb3Rv", + "LkF1ZGlvRGV2aWNlSW5mbxI5ChFyZWNvcmRpbmdfZGV2aWNlcxgCIAMoCzIe", + "LmxpdmVraXQucHJvdG8uQXVkaW9EZXZpY2VJbmZvEg0KBWVycm9yGAMgASgJ", + "ImUKGVNldFJlY29yZGluZ0RldmljZVJlcXVlc3QSHQoVcGxhdGZvcm1fYXVk", + "aW9faGFuZGxlGAEgAigEEg8KBWluZGV4GAIgASgNSAASDgoEZ3VpZBgDIAEo", + "CUgAQggKBmRldmljZSIrChpTZXRSZWNvcmRpbmdEZXZpY2VSZXNwb25zZRIN", + "CgVlcnJvchgBIAEoCSJjChdTZXRQbGF5b3V0RGV2aWNlUmVxdWVzdBIdChVw", + "bGF0Zm9ybV9hdWRpb19oYW5kbGUYASACKAQSDwoFaW5kZXgYAiABKA1IABIO", + "CgRndWlkGAMgASgJSABCCAoGZGV2aWNlIikKGFNldFBsYXlvdXREZXZpY2VS", + "ZXNwb25zZRINCgVlcnJvchgBIAEoCSI2ChVTdGFydFJlY29yZGluZ1JlcXVl", + "c3QSHQoVcGxhdGZvcm1fYXVkaW9faGFuZGxlGAEgAigEIicKFlN0YXJ0UmVj", + "b3JkaW5nUmVzcG9uc2USDQoFZXJyb3IYASABKAkiNQoUU3RvcFJlY29yZGlu", + "Z1JlcXVlc3QSHQoVcGxhdGZvcm1fYXVkaW9faGFuZGxlGAEgAigEIiYKFVN0", + "b3BSZWNvcmRpbmdSZXNwb25zZRINCgVlcnJvchgBIAEoCSpKChRTb3hSZXNh", + "bXBsZXJEYXRhVHlwZRIYChRTT1hSX0RBVEFUWVBFX0lOVDE2SRAAEhgKFFNP", + "WFJfREFUQVRZUEVfSU5UMTZTEAEqiwEKEFNveFF1YWxpdHlSZWNpcGUSFgoS", + "U09YUl9RVUFMSVRZX1FVSUNLEAASFAoQU09YUl9RVUFMSVRZX0xPVxABEhcK", + "E1NPWFJfUVVBTElUWV9NRURJVU0QAhIVChFTT1hSX1FVQUxJVFlfSElHSBAD", + "EhkKFVNPWFJfUVVBTElUWV9WRVJZSElHSBAEKpcBCgtTb3hGbGFnQml0cxIW", + "ChJTT1hSX1JPTExPRkZfU01BTEwQABIXChNTT1hSX1JPTExPRkZfTUVESVVN", + "EAESFQoRU09YUl9ST0xMT0ZGX05PTkUQAhIYChRTT1hSX0hJR0hfUFJFQ19D", + "TE9DSxADEhkKFVNPWFJfRE9VQkxFX1BSRUNJU0lPThAEEgsKB1NPWFJfVlIQ", + "BSpBCg9BdWRpb1N0cmVhbVR5cGUSFwoTQVVESU9fU1RSRUFNX05BVElWRRAA", + "EhUKEUFVRElPX1NUUkVBTV9IVE1MEAEqRQoPQXVkaW9Tb3VyY2VUeXBlEhcK", + "E0FVRElPX1NPVVJDRV9OQVRJVkUQABIZChVBVURJT19TT1VSQ0VfUExBVEZP", + "Uk0QAUIQqgINTGl2ZUtpdC5Qcm90bw==")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::LiveKit.Proto.HandleReflection.Descriptor, global::LiveKit.Proto.TrackReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::LiveKit.Proto.SoxResamplerDataType), typeof(global::LiveKit.Proto.SoxQualityRecipe), typeof(global::LiveKit.Proto.SoxFlagBits), typeof(global::LiveKit.Proto.AudioStreamType), typeof(global::LiveKit.Proto.AudioSourceType), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -143,7 +169,7 @@ static AudioFrameReflection() { new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.NewAudioStreamResponse), global::LiveKit.Proto.NewAudioStreamResponse.Parser, new[]{ "Stream" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.AudioStreamFromParticipantRequest), global::LiveKit.Proto.AudioStreamFromParticipantRequest.Parser, new[]{ "ParticipantHandle", "Type", "TrackSource", "SampleRate", "NumChannels", "AudioFilterModuleId", "AudioFilterOptions", "FrameSizeMs", "QueueSizeFrames" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.AudioStreamFromParticipantResponse), global::LiveKit.Proto.AudioStreamFromParticipantResponse.Parser, new[]{ "Stream" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.NewAudioSourceRequest), global::LiveKit.Proto.NewAudioSourceRequest.Parser, new[]{ "Type", "Options", "SampleRate", "NumChannels", "QueueSizeMs" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.NewAudioSourceRequest), global::LiveKit.Proto.NewAudioSourceRequest.Parser, new[]{ "Type", "Options", "SampleRate", "NumChannels", "QueueSizeMs", "PlatformAudioHandle" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.NewAudioSourceResponse), global::LiveKit.Proto.NewAudioSourceResponse.Parser, new[]{ "Source" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.CaptureAudioFrameRequest), global::LiveKit.Proto.CaptureAudioFrameRequest.Parser, new[]{ "SourceHandle", "Buffer", "RequestAsyncId" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.CaptureAudioFrameResponse), global::LiveKit.Proto.CaptureAudioFrameResponse.Parser, new[]{ "AsyncId" }, null, null, null, null), @@ -175,7 +201,7 @@ static AudioFrameReflection() { new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.AudioStreamEvent), global::LiveKit.Proto.AudioStreamEvent.Parser, new[]{ "StreamHandle", "FrameReceived", "Eos" }, new[]{ "Message" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.AudioFrameReceived), global::LiveKit.Proto.AudioFrameReceived.Parser, new[]{ "Frame" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.AudioStreamEOS), global::LiveKit.Proto.AudioStreamEOS.Parser, null, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.AudioSourceOptions), global::LiveKit.Proto.AudioSourceOptions.Parser, new[]{ "EchoCancellation", "NoiseSuppression", "AutoGainControl" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.AudioSourceOptions), global::LiveKit.Proto.AudioSourceOptions.Parser, new[]{ "EchoCancellation", "NoiseSuppression", "AutoGainControl", "PreferHardware" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.AudioSourceInfo), global::LiveKit.Proto.AudioSourceInfo.Parser, new[]{ "Type" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.OwnedAudioSource), global::LiveKit.Proto.OwnedAudioSource.Parser, new[]{ "Handle", "Info" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.AudioResamplerInfo), global::LiveKit.Proto.AudioResamplerInfo.Parser, null, null, null, null, null), @@ -184,7 +210,22 @@ static AudioFrameReflection() { new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.SoxResamplerInfo), global::LiveKit.Proto.SoxResamplerInfo.Parser, null, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.OwnedSoxResampler), global::LiveKit.Proto.OwnedSoxResampler.Parser, new[]{ "Handle", "Info" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.LoadAudioFilterPluginRequest), global::LiveKit.Proto.LoadAudioFilterPluginRequest.Parser, new[]{ "PluginPath", "Dependencies", "ModuleId" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.LoadAudioFilterPluginResponse), global::LiveKit.Proto.LoadAudioFilterPluginResponse.Parser, new[]{ "Error" }, null, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.LoadAudioFilterPluginResponse), global::LiveKit.Proto.LoadAudioFilterPluginResponse.Parser, new[]{ "Error" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.AudioDeviceInfo), global::LiveKit.Proto.AudioDeviceInfo.Parser, new[]{ "Index", "Name", "Guid" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.PlatformAudioInfo), global::LiveKit.Proto.PlatformAudioInfo.Parser, new[]{ "RecordingDeviceCount", "PlayoutDeviceCount" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.OwnedPlatformAudio), global::LiveKit.Proto.OwnedPlatformAudio.Parser, new[]{ "Handle", "Info" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.NewPlatformAudioRequest), global::LiveKit.Proto.NewPlatformAudioRequest.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.NewPlatformAudioResponse), global::LiveKit.Proto.NewPlatformAudioResponse.Parser, new[]{ "PlatformAudio", "Error" }, new[]{ "Message" }, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.GetAudioDevicesRequest), global::LiveKit.Proto.GetAudioDevicesRequest.Parser, new[]{ "PlatformAudioHandle" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.GetAudioDevicesResponse), global::LiveKit.Proto.GetAudioDevicesResponse.Parser, new[]{ "PlayoutDevices", "RecordingDevices", "Error" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.SetRecordingDeviceRequest), global::LiveKit.Proto.SetRecordingDeviceRequest.Parser, new[]{ "PlatformAudioHandle", "Index", "Guid" }, new[]{ "Device" }, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.SetRecordingDeviceResponse), global::LiveKit.Proto.SetRecordingDeviceResponse.Parser, new[]{ "Error" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.SetPlayoutDeviceRequest), global::LiveKit.Proto.SetPlayoutDeviceRequest.Parser, new[]{ "PlatformAudioHandle", "Index", "Guid" }, new[]{ "Device" }, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.SetPlayoutDeviceResponse), global::LiveKit.Proto.SetPlayoutDeviceResponse.Parser, new[]{ "Error" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.StartRecordingRequest), global::LiveKit.Proto.StartRecordingRequest.Parser, new[]{ "PlatformAudioHandle" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.StartRecordingResponse), global::LiveKit.Proto.StartRecordingResponse.Parser, new[]{ "Error" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.StopRecordingRequest), global::LiveKit.Proto.StopRecordingRequest.Parser, new[]{ "PlatformAudioHandle" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.StopRecordingResponse), global::LiveKit.Proto.StopRecordingResponse.Parser, new[]{ "Error" }, null, null, null, null) })); } #endregion @@ -240,7 +281,15 @@ public enum AudioStreamType { } public enum AudioSourceType { + /// + /// Push-based audio source - manually capture frames via CaptureAudioFrameRequest + /// [pbr::OriginalName("AUDIO_SOURCE_NATIVE")] AudioSourceNative = 0, + /// + /// Platform ADM-based audio source - captures from microphone automatically + /// Requires PlatformAudio to be created first to enable ADM recording + /// + [pbr::OriginalName("AUDIO_SOURCE_PLATFORM")] AudioSourcePlatform = 1, } #endregion @@ -1940,6 +1989,7 @@ public NewAudioSourceRequest(NewAudioSourceRequest other) : this() { sampleRate_ = other.sampleRate_; numChannels_ = other.numChannels_; queueSizeMs_ = other.queueSizeMs_; + platformAudioHandle_ = other.platformAudioHandle_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -2069,6 +2119,37 @@ public void ClearQueueSizeMs() { _hasBits0 &= ~8; } + /// Field number for the "platform_audio_handle" field. + public const int PlatformAudioHandleFieldNumber = 6; + private readonly static ulong PlatformAudioHandleDefaultValue = 0UL; + + private ulong platformAudioHandle_; + /// + /// For AudioSourcePlatform: the PlatformAudio handle to configure audio processing on. + /// If provided with options, audio processing will be configured on the PlatformAudio. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong PlatformAudioHandle { + get { if ((_hasBits0 & 16) != 0) { return platformAudioHandle_; } else { return PlatformAudioHandleDefaultValue; } } + set { + _hasBits0 |= 16; + platformAudioHandle_ = value; + } + } + /// Gets whether the "platform_audio_handle" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasPlatformAudioHandle { + get { return (_hasBits0 & 16) != 0; } + } + /// Clears the value of the "platform_audio_handle" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearPlatformAudioHandle() { + _hasBits0 &= ~16; + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -2089,6 +2170,7 @@ public bool Equals(NewAudioSourceRequest other) { if (SampleRate != other.SampleRate) return false; if (NumChannels != other.NumChannels) return false; if (QueueSizeMs != other.QueueSizeMs) return false; + if (PlatformAudioHandle != other.PlatformAudioHandle) return false; return Equals(_unknownFields, other._unknownFields); } @@ -2101,6 +2183,7 @@ public override int GetHashCode() { if (HasSampleRate) hash ^= SampleRate.GetHashCode(); if (HasNumChannels) hash ^= NumChannels.GetHashCode(); if (HasQueueSizeMs) hash ^= QueueSizeMs.GetHashCode(); + if (HasPlatformAudioHandle) hash ^= PlatformAudioHandle.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -2139,6 +2222,10 @@ public void WriteTo(pb::CodedOutputStream output) { output.WriteRawTag(40); output.WriteUInt32(QueueSizeMs); } + if (HasPlatformAudioHandle) { + output.WriteRawTag(48); + output.WriteUInt64(PlatformAudioHandle); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -2169,6 +2256,10 @@ public void WriteTo(pb::CodedOutputStream output) { output.WriteRawTag(40); output.WriteUInt32(QueueSizeMs); } + if (HasPlatformAudioHandle) { + output.WriteRawTag(48); + output.WriteUInt64(PlatformAudioHandle); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -2194,6 +2285,9 @@ public int CalculateSize() { if (HasQueueSizeMs) { size += 1 + pb::CodedOutputStream.ComputeUInt32Size(QueueSizeMs); } + if (HasPlatformAudioHandle) { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PlatformAudioHandle); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -2224,6 +2318,9 @@ public void MergeFrom(NewAudioSourceRequest other) { if (other.HasQueueSizeMs) { QueueSizeMs = other.QueueSizeMs; } + if (other.HasPlatformAudioHandle) { + PlatformAudioHandle = other.PlatformAudioHandle; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -2266,6 +2363,10 @@ public void MergeFrom(pb::CodedInputStream input) { QueueSizeMs = input.ReadUInt32(); break; } + case 48: { + PlatformAudioHandle = input.ReadUInt64(); + break; + } } } #endif @@ -2308,6 +2409,10 @@ public void MergeFrom(pb::CodedInputStream input) { QueueSizeMs = input.ReadUInt32(); break; } + case 48: { + PlatformAudioHandle = input.ReadUInt64(); + break; + } } } } @@ -10842,6 +10947,7 @@ public AudioSourceOptions(AudioSourceOptions other) : this() { echoCancellation_ = other.echoCancellation_; noiseSuppression_ = other.noiseSuppression_; autoGainControl_ = other.autoGainControl_; + preferHardware_ = other.preferHardware_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -10932,6 +11038,37 @@ public void ClearAutoGainControl() { _hasBits0 &= ~4; } + /// Field number for the "prefer_hardware" field. + public const int PreferHardwareFieldNumber = 4; + private readonly static bool PreferHardwareDefaultValue = false; + + private bool preferHardware_; + /// + /// Prefer hardware audio processing (e.g., iOS VPIO). Lower latency. + /// Only applies to AudioSourcePlatform. Default: true. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool PreferHardware { + get { if ((_hasBits0 & 8) != 0) { return preferHardware_; } else { return PreferHardwareDefaultValue; } } + set { + _hasBits0 |= 8; + preferHardware_ = value; + } + } + /// Gets whether the "prefer_hardware" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasPreferHardware { + get { return (_hasBits0 & 8) != 0; } + } + /// Clears the value of the "prefer_hardware" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearPreferHardware() { + _hasBits0 &= ~8; + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -10950,6 +11087,7 @@ public bool Equals(AudioSourceOptions other) { if (EchoCancellation != other.EchoCancellation) return false; if (NoiseSuppression != other.NoiseSuppression) return false; if (AutoGainControl != other.AutoGainControl) return false; + if (PreferHardware != other.PreferHardware) return false; return Equals(_unknownFields, other._unknownFields); } @@ -10960,6 +11098,7 @@ public override int GetHashCode() { if (HasEchoCancellation) hash ^= EchoCancellation.GetHashCode(); if (HasNoiseSuppression) hash ^= NoiseSuppression.GetHashCode(); if (HasAutoGainControl) hash ^= AutoGainControl.GetHashCode(); + if (HasPreferHardware) hash ^= PreferHardware.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -10990,6 +11129,10 @@ public void WriteTo(pb::CodedOutputStream output) { output.WriteRawTag(24); output.WriteBool(AutoGainControl); } + if (HasPreferHardware) { + output.WriteRawTag(32); + output.WriteBool(PreferHardware); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -11012,6 +11155,10 @@ public void WriteTo(pb::CodedOutputStream output) { output.WriteRawTag(24); output.WriteBool(AutoGainControl); } + if (HasPreferHardware) { + output.WriteRawTag(32); + output.WriteBool(PreferHardware); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -11031,6 +11178,9 @@ public int CalculateSize() { if (HasAutoGainControl) { size += 1 + 1; } + if (HasPreferHardware) { + size += 1 + 1; + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -11052,6 +11202,9 @@ public void MergeFrom(AudioSourceOptions other) { if (other.HasAutoGainControl) { AutoGainControl = other.AutoGainControl; } + if (other.HasPreferHardware) { + PreferHardware = other.PreferHardware; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -11083,6 +11236,10 @@ public void MergeFrom(pb::CodedInputStream input) { AutoGainControl = input.ReadBool(); break; } + case 32: { + PreferHardware = input.ReadBool(); + break; + } } } #endif @@ -11114,6 +11271,10 @@ public void MergeFrom(pb::CodedInputStream input) { AutoGainControl = input.ReadBool(); break; } + case 32: { + PreferHardware = input.ReadBool(); + break; + } } } } @@ -13137,6 +13298,3889 @@ public void MergeFrom(pb::CodedInputStream input) { } + /// + /// Information about an audio device. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class AudioDeviceInfo : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new AudioDeviceInfo()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[46]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AudioDeviceInfo() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AudioDeviceInfo(AudioDeviceInfo other) : this() { + _hasBits0 = other._hasBits0; + index_ = other.index_; + name_ = other.name_; + guid_ = other.guid_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AudioDeviceInfo Clone() { + return new AudioDeviceInfo(this); + } + + /// Field number for the "index" field. + public const int IndexFieldNumber = 1; + private readonly static uint IndexDefaultValue = 0; + + private uint index_; + /// + /// Device index (0-based). Note: indices can change when devices are added/removed. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint Index { + get { if ((_hasBits0 & 1) != 0) { return index_; } else { return IndexDefaultValue; } } + set { + _hasBits0 |= 1; + index_ = value; + } + } + /// Gets whether the "index" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasIndex { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "index" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearIndex() { + _hasBits0 &= ~1; + } + + /// Field number for the "name" field. + public const int NameFieldNumber = 2; + private readonly static string NameDefaultValue = ""; + + private string name_; + /// + /// Device name as reported by the operating system. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Name { + get { return name_ ?? NameDefaultValue; } + set { + name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasName { + get { return name_ != null; } + } + /// Clears the value of the "name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearName() { + name_ = null; + } + + /// Field number for the "guid" field. + public const int GuidFieldNumber = 3; + private readonly static string GuidDefaultValue = ""; + + private string guid_; + /// + /// 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 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Guid { + get { return guid_ ?? GuidDefaultValue; } + set { + guid_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "guid" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasGuid { + get { return guid_ != null; } + } + /// Clears the value of the "guid" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearGuid() { + guid_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as AudioDeviceInfo); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(AudioDeviceInfo other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Index != other.Index) return false; + if (Name != other.Name) return false; + if (Guid != other.Guid) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (HasIndex) hash ^= Index.GetHashCode(); + if (HasName) hash ^= Name.GetHashCode(); + if (HasGuid) hash ^= Guid.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (HasIndex) { + output.WriteRawTag(8); + output.WriteUInt32(Index); + } + if (HasName) { + output.WriteRawTag(18); + output.WriteString(Name); + } + if (HasGuid) { + output.WriteRawTag(26); + output.WriteString(Guid); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (HasIndex) { + output.WriteRawTag(8); + output.WriteUInt32(Index); + } + if (HasName) { + output.WriteRawTag(18); + output.WriteString(Name); + } + if (HasGuid) { + output.WriteRawTag(26); + output.WriteString(Guid); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (HasIndex) { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Index); + } + if (HasName) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); + } + if (HasGuid) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Guid); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(AudioDeviceInfo other) { + if (other == null) { + return; + } + if (other.HasIndex) { + Index = other.Index; + } + if (other.HasName) { + Name = other.Name; + } + if (other.HasGuid) { + Guid = other.Guid; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Index = input.ReadUInt32(); + break; + } + case 18: { + Name = input.ReadString(); + break; + } + case 26: { + Guid = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + Index = input.ReadUInt32(); + break; + } + case 18: { + Name = input.ReadString(); + break; + } + case 26: { + Guid = input.ReadString(); + break; + } + } + } + } + #endif + + } + + /// + /// Information about a PlatformAudio instance. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class PlatformAudioInfo : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new PlatformAudioInfo()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[47]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public PlatformAudioInfo() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public PlatformAudioInfo(PlatformAudioInfo other) : this() { + _hasBits0 = other._hasBits0; + recordingDeviceCount_ = other.recordingDeviceCount_; + playoutDeviceCount_ = other.playoutDeviceCount_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public PlatformAudioInfo Clone() { + return new PlatformAudioInfo(this); + } + + /// Field number for the "recording_device_count" field. + public const int RecordingDeviceCountFieldNumber = 1; + private readonly static int RecordingDeviceCountDefaultValue = 0; + + private int recordingDeviceCount_; + /// + /// Number of available recording (microphone) devices. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int RecordingDeviceCount { + get { if ((_hasBits0 & 1) != 0) { return recordingDeviceCount_; } else { return RecordingDeviceCountDefaultValue; } } + set { + _hasBits0 |= 1; + recordingDeviceCount_ = value; + } + } + /// Gets whether the "recording_device_count" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasRecordingDeviceCount { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "recording_device_count" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearRecordingDeviceCount() { + _hasBits0 &= ~1; + } + + /// Field number for the "playout_device_count" field. + public const int PlayoutDeviceCountFieldNumber = 2; + private readonly static int PlayoutDeviceCountDefaultValue = 0; + + private int playoutDeviceCount_; + /// + /// Number of available playout (speaker) devices. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int PlayoutDeviceCount { + get { if ((_hasBits0 & 2) != 0) { return playoutDeviceCount_; } else { return PlayoutDeviceCountDefaultValue; } } + set { + _hasBits0 |= 2; + playoutDeviceCount_ = value; + } + } + /// Gets whether the "playout_device_count" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasPlayoutDeviceCount { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "playout_device_count" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearPlayoutDeviceCount() { + _hasBits0 &= ~2; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as PlatformAudioInfo); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(PlatformAudioInfo other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (RecordingDeviceCount != other.RecordingDeviceCount) return false; + if (PlayoutDeviceCount != other.PlayoutDeviceCount) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (HasRecordingDeviceCount) hash ^= RecordingDeviceCount.GetHashCode(); + if (HasPlayoutDeviceCount) hash ^= PlayoutDeviceCount.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (HasRecordingDeviceCount) { + output.WriteRawTag(8); + output.WriteInt32(RecordingDeviceCount); + } + if (HasPlayoutDeviceCount) { + output.WriteRawTag(16); + output.WriteInt32(PlayoutDeviceCount); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (HasRecordingDeviceCount) { + output.WriteRawTag(8); + output.WriteInt32(RecordingDeviceCount); + } + if (HasPlayoutDeviceCount) { + output.WriteRawTag(16); + output.WriteInt32(PlayoutDeviceCount); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (HasRecordingDeviceCount) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(RecordingDeviceCount); + } + if (HasPlayoutDeviceCount) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(PlayoutDeviceCount); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(PlatformAudioInfo other) { + if (other == null) { + return; + } + if (other.HasRecordingDeviceCount) { + RecordingDeviceCount = other.RecordingDeviceCount; + } + if (other.HasPlayoutDeviceCount) { + PlayoutDeviceCount = other.PlayoutDeviceCount; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + RecordingDeviceCount = input.ReadInt32(); + break; + } + case 16: { + PlayoutDeviceCount = input.ReadInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + RecordingDeviceCount = input.ReadInt32(); + break; + } + case 16: { + PlayoutDeviceCount = input.ReadInt32(); + break; + } + } + } + } + #endif + + } + + /// + /// Owned PlatformAudio handle with info. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class OwnedPlatformAudio : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new OwnedPlatformAudio()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[48]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public OwnedPlatformAudio() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public OwnedPlatformAudio(OwnedPlatformAudio other) : this() { + handle_ = other.handle_ != null ? other.handle_.Clone() : null; + info_ = other.info_ != null ? other.info_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public OwnedPlatformAudio Clone() { + return new OwnedPlatformAudio(this); + } + + /// Field number for the "handle" field. + public const int HandleFieldNumber = 1; + private global::LiveKit.Proto.FfiOwnedHandle handle_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.FfiOwnedHandle Handle { + get { return handle_; } + set { + handle_ = value; + } + } + + /// Field number for the "info" field. + public const int InfoFieldNumber = 2; + private global::LiveKit.Proto.PlatformAudioInfo info_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.PlatformAudioInfo Info { + get { return info_; } + set { + info_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as OwnedPlatformAudio); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(OwnedPlatformAudio other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (!object.Equals(Handle, other.Handle)) return false; + if (!object.Equals(Info, other.Info)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (handle_ != null) hash ^= Handle.GetHashCode(); + if (info_ != null) hash ^= Info.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (handle_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Handle); + } + if (info_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Info); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (handle_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Handle); + } + if (info_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Info); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (handle_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Handle); + } + if (info_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Info); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(OwnedPlatformAudio other) { + if (other == null) { + return; + } + if (other.handle_ != null) { + if (handle_ == null) { + Handle = new global::LiveKit.Proto.FfiOwnedHandle(); + } + Handle.MergeFrom(other.Handle); + } + if (other.info_ != null) { + if (info_ == null) { + Info = new global::LiveKit.Proto.PlatformAudioInfo(); + } + Info.MergeFrom(other.Info); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (handle_ == null) { + Handle = new global::LiveKit.Proto.FfiOwnedHandle(); + } + input.ReadMessage(Handle); + break; + } + case 18: { + if (info_ == null) { + Info = new global::LiveKit.Proto.PlatformAudioInfo(); + } + input.ReadMessage(Info); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + if (handle_ == null) { + Handle = new global::LiveKit.Proto.FfiOwnedHandle(); + } + input.ReadMessage(Handle); + break; + } + case 18: { + if (info_ == null) { + Info = new global::LiveKit.Proto.PlatformAudioInfo(); + } + input.ReadMessage(Info); + break; + } + } + } + } + #endif + + } + + /// + /// 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. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class NewPlatformAudioRequest : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new NewPlatformAudioRequest()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[49]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public NewPlatformAudioRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public NewPlatformAudioRequest(NewPlatformAudioRequest other) : this() { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public NewPlatformAudioRequest Clone() { + return new NewPlatformAudioRequest(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as NewPlatformAudioRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(NewPlatformAudioRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(NewPlatformAudioRequest other) { + if (other == null) { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } + #endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class NewPlatformAudioResponse : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new NewPlatformAudioResponse()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[50]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public NewPlatformAudioResponse() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public NewPlatformAudioResponse(NewPlatformAudioResponse other) : this() { + switch (other.MessageCase) { + case MessageOneofCase.PlatformAudio: + PlatformAudio = other.PlatformAudio.Clone(); + break; + case MessageOneofCase.Error: + Error = other.Error; + break; + } + + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public NewPlatformAudioResponse Clone() { + return new NewPlatformAudioResponse(this); + } + + /// Field number for the "platform_audio" field. + public const int PlatformAudioFieldNumber = 1; + /// + /// The PlatformAudio handle on success. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.OwnedPlatformAudio PlatformAudio { + get { return messageCase_ == MessageOneofCase.PlatformAudio ? (global::LiveKit.Proto.OwnedPlatformAudio) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.PlatformAudio; + } + } + + /// Field number for the "error" field. + public const int ErrorFieldNumber = 2; + /// + /// Error message if creation failed. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Error { + get { return HasError ? (string) message_ : ""; } + set { + message_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + messageCase_ = MessageOneofCase.Error; + } + } + /// Gets whether the "error" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasError { + get { return messageCase_ == MessageOneofCase.Error; } + } + /// Clears the value of the oneof if it's currently set to "error" + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearError() { + if (HasError) { + ClearMessage(); + } + } + + private object message_; + /// Enum of possible cases for the "message" oneof. + public enum MessageOneofCase { + None = 0, + PlatformAudio = 1, + Error = 2, + } + private MessageOneofCase messageCase_ = MessageOneofCase.None; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public MessageOneofCase MessageCase { + get { return messageCase_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearMessage() { + messageCase_ = MessageOneofCase.None; + message_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as NewPlatformAudioResponse); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(NewPlatformAudioResponse other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (!object.Equals(PlatformAudio, other.PlatformAudio)) return false; + if (Error != other.Error) return false; + if (MessageCase != other.MessageCase) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (messageCase_ == MessageOneofCase.PlatformAudio) hash ^= PlatformAudio.GetHashCode(); + if (HasError) hash ^= Error.GetHashCode(); + hash ^= (int) messageCase_; + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (messageCase_ == MessageOneofCase.PlatformAudio) { + output.WriteRawTag(10); + output.WriteMessage(PlatformAudio); + } + if (HasError) { + output.WriteRawTag(18); + output.WriteString(Error); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (messageCase_ == MessageOneofCase.PlatformAudio) { + output.WriteRawTag(10); + output.WriteMessage(PlatformAudio); + } + if (HasError) { + output.WriteRawTag(18); + output.WriteString(Error); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (messageCase_ == MessageOneofCase.PlatformAudio) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlatformAudio); + } + if (HasError) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Error); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(NewPlatformAudioResponse other) { + if (other == null) { + return; + } + switch (other.MessageCase) { + case MessageOneofCase.PlatformAudio: + if (PlatformAudio == null) { + PlatformAudio = new global::LiveKit.Proto.OwnedPlatformAudio(); + } + PlatformAudio.MergeFrom(other.PlatformAudio); + break; + case MessageOneofCase.Error: + Error = other.Error; + break; + } + + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + global::LiveKit.Proto.OwnedPlatformAudio subBuilder = new global::LiveKit.Proto.OwnedPlatformAudio(); + if (messageCase_ == MessageOneofCase.PlatformAudio) { + subBuilder.MergeFrom(PlatformAudio); + } + input.ReadMessage(subBuilder); + PlatformAudio = subBuilder; + break; + } + case 18: { + Error = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + global::LiveKit.Proto.OwnedPlatformAudio subBuilder = new global::LiveKit.Proto.OwnedPlatformAudio(); + if (messageCase_ == MessageOneofCase.PlatformAudio) { + subBuilder.MergeFrom(PlatformAudio); + } + input.ReadMessage(subBuilder); + PlatformAudio = subBuilder; + break; + } + case 18: { + Error = input.ReadString(); + break; + } + } + } + } + #endif + + } + + /// + /// Get available audio devices. + /// + /// Returns lists of available recording (microphone) and playout (speaker) devices. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class GetAudioDevicesRequest : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new GetAudioDevicesRequest()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[51]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public GetAudioDevicesRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public GetAudioDevicesRequest(GetAudioDevicesRequest other) : this() { + _hasBits0 = other._hasBits0; + platformAudioHandle_ = other.platformAudioHandle_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public GetAudioDevicesRequest Clone() { + return new GetAudioDevicesRequest(this); + } + + /// Field number for the "platform_audio_handle" field. + public const int PlatformAudioHandleFieldNumber = 1; + private readonly static ulong PlatformAudioHandleDefaultValue = 0UL; + + private ulong platformAudioHandle_; + /// + /// The PlatformAudio handle. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong PlatformAudioHandle { + get { if ((_hasBits0 & 1) != 0) { return platformAudioHandle_; } else { return PlatformAudioHandleDefaultValue; } } + set { + _hasBits0 |= 1; + platformAudioHandle_ = value; + } + } + /// Gets whether the "platform_audio_handle" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasPlatformAudioHandle { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "platform_audio_handle" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearPlatformAudioHandle() { + _hasBits0 &= ~1; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as GetAudioDevicesRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(GetAudioDevicesRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (PlatformAudioHandle != other.PlatformAudioHandle) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (HasPlatformAudioHandle) hash ^= PlatformAudioHandle.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (HasPlatformAudioHandle) { + output.WriteRawTag(8); + output.WriteUInt64(PlatformAudioHandle); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (HasPlatformAudioHandle) { + output.WriteRawTag(8); + output.WriteUInt64(PlatformAudioHandle); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (HasPlatformAudioHandle) { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PlatformAudioHandle); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(GetAudioDevicesRequest other) { + if (other == null) { + return; + } + if (other.HasPlatformAudioHandle) { + PlatformAudioHandle = other.PlatformAudioHandle; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + PlatformAudioHandle = input.ReadUInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + PlatformAudioHandle = input.ReadUInt64(); + break; + } + } + } + } + #endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class GetAudioDevicesResponse : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new GetAudioDevicesResponse()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[52]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public GetAudioDevicesResponse() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public GetAudioDevicesResponse(GetAudioDevicesResponse other) : this() { + playoutDevices_ = other.playoutDevices_.Clone(); + recordingDevices_ = other.recordingDevices_.Clone(); + error_ = other.error_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public GetAudioDevicesResponse Clone() { + return new GetAudioDevicesResponse(this); + } + + /// Field number for the "playout_devices" field. + public const int PlayoutDevicesFieldNumber = 1; + private static readonly pb::FieldCodec _repeated_playoutDevices_codec + = pb::FieldCodec.ForMessage(10, global::LiveKit.Proto.AudioDeviceInfo.Parser); + private readonly pbc::RepeatedField playoutDevices_ = new pbc::RepeatedField(); + /// + /// Available playout devices (speakers/headphones). + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField PlayoutDevices { + get { return playoutDevices_; } + } + + /// Field number for the "recording_devices" field. + public const int RecordingDevicesFieldNumber = 2; + private static readonly pb::FieldCodec _repeated_recordingDevices_codec + = pb::FieldCodec.ForMessage(18, global::LiveKit.Proto.AudioDeviceInfo.Parser); + private readonly pbc::RepeatedField recordingDevices_ = new pbc::RepeatedField(); + /// + /// Available recording devices (microphones). + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField RecordingDevices { + get { return recordingDevices_; } + } + + /// Field number for the "error" field. + public const int ErrorFieldNumber = 3; + private readonly static string ErrorDefaultValue = ""; + + private string error_; + /// + /// Error message if enumeration failed, empty/absent on success. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Error { + get { return error_ ?? ErrorDefaultValue; } + set { + error_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "error" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasError { + get { return error_ != null; } + } + /// Clears the value of the "error" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearError() { + error_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as GetAudioDevicesResponse); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(GetAudioDevicesResponse other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if(!playoutDevices_.Equals(other.playoutDevices_)) return false; + if(!recordingDevices_.Equals(other.recordingDevices_)) return false; + if (Error != other.Error) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + hash ^= playoutDevices_.GetHashCode(); + hash ^= recordingDevices_.GetHashCode(); + if (HasError) hash ^= Error.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + playoutDevices_.WriteTo(output, _repeated_playoutDevices_codec); + recordingDevices_.WriteTo(output, _repeated_recordingDevices_codec); + if (HasError) { + output.WriteRawTag(26); + output.WriteString(Error); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + playoutDevices_.WriteTo(ref output, _repeated_playoutDevices_codec); + recordingDevices_.WriteTo(ref output, _repeated_recordingDevices_codec); + if (HasError) { + output.WriteRawTag(26); + output.WriteString(Error); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + size += playoutDevices_.CalculateSize(_repeated_playoutDevices_codec); + size += recordingDevices_.CalculateSize(_repeated_recordingDevices_codec); + if (HasError) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Error); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(GetAudioDevicesResponse other) { + if (other == null) { + return; + } + playoutDevices_.Add(other.playoutDevices_); + recordingDevices_.Add(other.recordingDevices_); + if (other.HasError) { + Error = other.Error; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + playoutDevices_.AddEntriesFrom(input, _repeated_playoutDevices_codec); + break; + } + case 18: { + recordingDevices_.AddEntriesFrom(input, _repeated_recordingDevices_codec); + break; + } + case 26: { + Error = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + playoutDevices_.AddEntriesFrom(ref input, _repeated_playoutDevices_codec); + break; + } + case 18: { + recordingDevices_.AddEntriesFrom(ref input, _repeated_recordingDevices_codec); + break; + } + case 26: { + Error = input.ReadString(); + break; + } + } + } + } + #endif + + } + + /// + /// Set the recording device (microphone). + /// + /// Call this before creating audio tracks to select which microphone to use. + /// Prefer using GUID over index for robust device selection across hot-plug events. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class SetRecordingDeviceRequest : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new SetRecordingDeviceRequest()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[53]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SetRecordingDeviceRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SetRecordingDeviceRequest(SetRecordingDeviceRequest other) : this() { + _hasBits0 = other._hasBits0; + platformAudioHandle_ = other.platformAudioHandle_; + switch (other.DeviceCase) { + case DeviceOneofCase.Index: + Index = other.Index; + break; + case DeviceOneofCase.Guid: + Guid = other.Guid; + break; + } + + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SetRecordingDeviceRequest Clone() { + return new SetRecordingDeviceRequest(this); + } + + /// Field number for the "platform_audio_handle" field. + public const int PlatformAudioHandleFieldNumber = 1; + private readonly static ulong PlatformAudioHandleDefaultValue = 0UL; + + private ulong platformAudioHandle_; + /// + /// The PlatformAudio handle. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong PlatformAudioHandle { + get { if ((_hasBits0 & 1) != 0) { return platformAudioHandle_; } else { return PlatformAudioHandleDefaultValue; } } + set { + _hasBits0 |= 1; + platformAudioHandle_ = value; + } + } + /// Gets whether the "platform_audio_handle" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasPlatformAudioHandle { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "platform_audio_handle" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearPlatformAudioHandle() { + _hasBits0 &= ~1; + } + + /// Field number for the "index" field. + public const int IndexFieldNumber = 2; + /// + /// Device index (0-based). Note: indices can change when devices are added/removed. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint Index { + get { return HasIndex ? (uint) device_ : 0; } + set { + device_ = value; + deviceCase_ = DeviceOneofCase.Index; + } + } + /// Gets whether the "index" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasIndex { + get { return deviceCase_ == DeviceOneofCase.Index; } + } + /// Clears the value of the oneof if it's currently set to "index" + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearIndex() { + if (HasIndex) { + ClearDevice(); + } + } + + /// Field number for the "guid" field. + public const int GuidFieldNumber = 3; + /// + /// Device GUID from AudioDeviceInfo.guid (preferred - stable across device changes). + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Guid { + get { return HasGuid ? (string) device_ : ""; } + set { + device_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + deviceCase_ = DeviceOneofCase.Guid; + } + } + /// Gets whether the "guid" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasGuid { + get { return deviceCase_ == DeviceOneofCase.Guid; } + } + /// Clears the value of the oneof if it's currently set to "guid" + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearGuid() { + if (HasGuid) { + ClearDevice(); + } + } + + private object device_; + /// Enum of possible cases for the "device" oneof. + public enum DeviceOneofCase { + None = 0, + Index = 2, + Guid = 3, + } + private DeviceOneofCase deviceCase_ = DeviceOneofCase.None; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public DeviceOneofCase DeviceCase { + get { return deviceCase_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearDevice() { + deviceCase_ = DeviceOneofCase.None; + device_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as SetRecordingDeviceRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(SetRecordingDeviceRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (PlatformAudioHandle != other.PlatformAudioHandle) return false; + if (Index != other.Index) return false; + if (Guid != other.Guid) return false; + if (DeviceCase != other.DeviceCase) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (HasPlatformAudioHandle) hash ^= PlatformAudioHandle.GetHashCode(); + if (HasIndex) hash ^= Index.GetHashCode(); + if (HasGuid) hash ^= Guid.GetHashCode(); + hash ^= (int) deviceCase_; + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (HasPlatformAudioHandle) { + output.WriteRawTag(8); + output.WriteUInt64(PlatformAudioHandle); + } + if (HasIndex) { + output.WriteRawTag(16); + output.WriteUInt32(Index); + } + if (HasGuid) { + output.WriteRawTag(26); + output.WriteString(Guid); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (HasPlatformAudioHandle) { + output.WriteRawTag(8); + output.WriteUInt64(PlatformAudioHandle); + } + if (HasIndex) { + output.WriteRawTag(16); + output.WriteUInt32(Index); + } + if (HasGuid) { + output.WriteRawTag(26); + output.WriteString(Guid); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (HasPlatformAudioHandle) { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PlatformAudioHandle); + } + if (HasIndex) { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Index); + } + if (HasGuid) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Guid); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(SetRecordingDeviceRequest other) { + if (other == null) { + return; + } + if (other.HasPlatformAudioHandle) { + PlatformAudioHandle = other.PlatformAudioHandle; + } + switch (other.DeviceCase) { + case DeviceOneofCase.Index: + Index = other.Index; + break; + case DeviceOneofCase.Guid: + Guid = other.Guid; + break; + } + + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + PlatformAudioHandle = input.ReadUInt64(); + break; + } + case 16: { + Index = input.ReadUInt32(); + break; + } + case 26: { + Guid = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + PlatformAudioHandle = input.ReadUInt64(); + break; + } + case 16: { + Index = input.ReadUInt32(); + break; + } + case 26: { + Guid = input.ReadString(); + break; + } + } + } + } + #endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class SetRecordingDeviceResponse : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new SetRecordingDeviceResponse()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[54]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SetRecordingDeviceResponse() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SetRecordingDeviceResponse(SetRecordingDeviceResponse other) : this() { + error_ = other.error_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SetRecordingDeviceResponse Clone() { + return new SetRecordingDeviceResponse(this); + } + + /// Field number for the "error" field. + public const int ErrorFieldNumber = 1; + private readonly static string ErrorDefaultValue = ""; + + private string error_; + /// + /// Error message if the operation failed: + /// - "Invalid device index" if index >= recording device count + /// - "Device not found" if GUID doesn't match any device + /// - Other platform-specific errors + /// Empty/absent on success. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Error { + get { return error_ ?? ErrorDefaultValue; } + set { + error_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "error" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasError { + get { return error_ != null; } + } + /// Clears the value of the "error" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearError() { + error_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as SetRecordingDeviceResponse); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(SetRecordingDeviceResponse other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Error != other.Error) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (HasError) hash ^= Error.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (HasError) { + output.WriteRawTag(10); + output.WriteString(Error); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (HasError) { + output.WriteRawTag(10); + output.WriteString(Error); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (HasError) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Error); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(SetRecordingDeviceResponse other) { + if (other == null) { + return; + } + if (other.HasError) { + Error = other.Error; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Error = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + Error = input.ReadString(); + break; + } + } + } + } + #endif + + } + + /// + /// Set the playout device (speaker/headphones). + /// + /// Call this before connecting to select which speaker to use for audio output. + /// Prefer using GUID over index for robust device selection across hot-plug events. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class SetPlayoutDeviceRequest : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new SetPlayoutDeviceRequest()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[55]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SetPlayoutDeviceRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SetPlayoutDeviceRequest(SetPlayoutDeviceRequest other) : this() { + _hasBits0 = other._hasBits0; + platformAudioHandle_ = other.platformAudioHandle_; + switch (other.DeviceCase) { + case DeviceOneofCase.Index: + Index = other.Index; + break; + case DeviceOneofCase.Guid: + Guid = other.Guid; + break; + } + + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SetPlayoutDeviceRequest Clone() { + return new SetPlayoutDeviceRequest(this); + } + + /// Field number for the "platform_audio_handle" field. + public const int PlatformAudioHandleFieldNumber = 1; + private readonly static ulong PlatformAudioHandleDefaultValue = 0UL; + + private ulong platformAudioHandle_; + /// + /// The PlatformAudio handle. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong PlatformAudioHandle { + get { if ((_hasBits0 & 1) != 0) { return platformAudioHandle_; } else { return PlatformAudioHandleDefaultValue; } } + set { + _hasBits0 |= 1; + platformAudioHandle_ = value; + } + } + /// Gets whether the "platform_audio_handle" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasPlatformAudioHandle { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "platform_audio_handle" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearPlatformAudioHandle() { + _hasBits0 &= ~1; + } + + /// Field number for the "index" field. + public const int IndexFieldNumber = 2; + /// + /// Device index (0-based). Note: indices can change when devices are added/removed. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint Index { + get { return HasIndex ? (uint) device_ : 0; } + set { + device_ = value; + deviceCase_ = DeviceOneofCase.Index; + } + } + /// Gets whether the "index" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasIndex { + get { return deviceCase_ == DeviceOneofCase.Index; } + } + /// Clears the value of the oneof if it's currently set to "index" + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearIndex() { + if (HasIndex) { + ClearDevice(); + } + } + + /// Field number for the "guid" field. + public const int GuidFieldNumber = 3; + /// + /// Device GUID from AudioDeviceInfo.guid (preferred - stable across device changes). + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Guid { + get { return HasGuid ? (string) device_ : ""; } + set { + device_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + deviceCase_ = DeviceOneofCase.Guid; + } + } + /// Gets whether the "guid" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasGuid { + get { return deviceCase_ == DeviceOneofCase.Guid; } + } + /// Clears the value of the oneof if it's currently set to "guid" + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearGuid() { + if (HasGuid) { + ClearDevice(); + } + } + + private object device_; + /// Enum of possible cases for the "device" oneof. + public enum DeviceOneofCase { + None = 0, + Index = 2, + Guid = 3, + } + private DeviceOneofCase deviceCase_ = DeviceOneofCase.None; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public DeviceOneofCase DeviceCase { + get { return deviceCase_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearDevice() { + deviceCase_ = DeviceOneofCase.None; + device_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as SetPlayoutDeviceRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(SetPlayoutDeviceRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (PlatformAudioHandle != other.PlatformAudioHandle) return false; + if (Index != other.Index) return false; + if (Guid != other.Guid) return false; + if (DeviceCase != other.DeviceCase) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (HasPlatformAudioHandle) hash ^= PlatformAudioHandle.GetHashCode(); + if (HasIndex) hash ^= Index.GetHashCode(); + if (HasGuid) hash ^= Guid.GetHashCode(); + hash ^= (int) deviceCase_; + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (HasPlatformAudioHandle) { + output.WriteRawTag(8); + output.WriteUInt64(PlatformAudioHandle); + } + if (HasIndex) { + output.WriteRawTag(16); + output.WriteUInt32(Index); + } + if (HasGuid) { + output.WriteRawTag(26); + output.WriteString(Guid); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (HasPlatformAudioHandle) { + output.WriteRawTag(8); + output.WriteUInt64(PlatformAudioHandle); + } + if (HasIndex) { + output.WriteRawTag(16); + output.WriteUInt32(Index); + } + if (HasGuid) { + output.WriteRawTag(26); + output.WriteString(Guid); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (HasPlatformAudioHandle) { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PlatformAudioHandle); + } + if (HasIndex) { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Index); + } + if (HasGuid) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Guid); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(SetPlayoutDeviceRequest other) { + if (other == null) { + return; + } + if (other.HasPlatformAudioHandle) { + PlatformAudioHandle = other.PlatformAudioHandle; + } + switch (other.DeviceCase) { + case DeviceOneofCase.Index: + Index = other.Index; + break; + case DeviceOneofCase.Guid: + Guid = other.Guid; + break; + } + + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + PlatformAudioHandle = input.ReadUInt64(); + break; + } + case 16: { + Index = input.ReadUInt32(); + break; + } + case 26: { + Guid = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + PlatformAudioHandle = input.ReadUInt64(); + break; + } + case 16: { + Index = input.ReadUInt32(); + break; + } + case 26: { + Guid = input.ReadString(); + break; + } + } + } + } + #endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class SetPlayoutDeviceResponse : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new SetPlayoutDeviceResponse()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[56]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SetPlayoutDeviceResponse() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SetPlayoutDeviceResponse(SetPlayoutDeviceResponse other) : this() { + error_ = other.error_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SetPlayoutDeviceResponse Clone() { + return new SetPlayoutDeviceResponse(this); + } + + /// Field number for the "error" field. + public const int ErrorFieldNumber = 1; + private readonly static string ErrorDefaultValue = ""; + + private string error_; + /// + /// Error message if the operation failed: + /// - "Invalid device index" if index >= playout device count + /// - "Device not found" if GUID doesn't match any device + /// - Other platform-specific errors + /// Empty/absent on success. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Error { + get { return error_ ?? ErrorDefaultValue; } + set { + error_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "error" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasError { + get { return error_ != null; } + } + /// Clears the value of the "error" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearError() { + error_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as SetPlayoutDeviceResponse); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(SetPlayoutDeviceResponse other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Error != other.Error) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (HasError) hash ^= Error.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (HasError) { + output.WriteRawTag(10); + output.WriteString(Error); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (HasError) { + output.WriteRawTag(10); + output.WriteString(Error); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (HasError) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Error); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(SetPlayoutDeviceResponse other) { + if (other == null) { + return; + } + if (other.HasError) { + Error = other.Error; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Error = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + Error = input.ReadString(); + break; + } + } + } + } + #endif + + } + + /// + /// 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. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class StartRecordingRequest : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new StartRecordingRequest()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[57]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StartRecordingRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StartRecordingRequest(StartRecordingRequest other) : this() { + _hasBits0 = other._hasBits0; + platformAudioHandle_ = other.platformAudioHandle_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StartRecordingRequest Clone() { + return new StartRecordingRequest(this); + } + + /// Field number for the "platform_audio_handle" field. + public const int PlatformAudioHandleFieldNumber = 1; + private readonly static ulong PlatformAudioHandleDefaultValue = 0UL; + + private ulong platformAudioHandle_; + /// + /// The PlatformAudio handle. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong PlatformAudioHandle { + get { if ((_hasBits0 & 1) != 0) { return platformAudioHandle_; } else { return PlatformAudioHandleDefaultValue; } } + set { + _hasBits0 |= 1; + platformAudioHandle_ = value; + } + } + /// Gets whether the "platform_audio_handle" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasPlatformAudioHandle { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "platform_audio_handle" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearPlatformAudioHandle() { + _hasBits0 &= ~1; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as StartRecordingRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(StartRecordingRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (PlatformAudioHandle != other.PlatformAudioHandle) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (HasPlatformAudioHandle) hash ^= PlatformAudioHandle.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (HasPlatformAudioHandle) { + output.WriteRawTag(8); + output.WriteUInt64(PlatformAudioHandle); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (HasPlatformAudioHandle) { + output.WriteRawTag(8); + output.WriteUInt64(PlatformAudioHandle); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (HasPlatformAudioHandle) { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PlatformAudioHandle); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(StartRecordingRequest other) { + if (other == null) { + return; + } + if (other.HasPlatformAudioHandle) { + PlatformAudioHandle = other.PlatformAudioHandle; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + PlatformAudioHandle = input.ReadUInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + PlatformAudioHandle = input.ReadUInt64(); + break; + } + } + } + } + #endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class StartRecordingResponse : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new StartRecordingResponse()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[58]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StartRecordingResponse() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StartRecordingResponse(StartRecordingResponse other) : this() { + error_ = other.error_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StartRecordingResponse Clone() { + return new StartRecordingResponse(this); + } + + /// Field number for the "error" field. + public const int ErrorFieldNumber = 1; + private readonly static string ErrorDefaultValue = ""; + + private string error_; + /// + /// Error message if the operation failed. + /// Empty/absent on success. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Error { + get { return error_ ?? ErrorDefaultValue; } + set { + error_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "error" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasError { + get { return error_ != null; } + } + /// Clears the value of the "error" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearError() { + error_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as StartRecordingResponse); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(StartRecordingResponse other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Error != other.Error) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (HasError) hash ^= Error.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (HasError) { + output.WriteRawTag(10); + output.WriteString(Error); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (HasError) { + output.WriteRawTag(10); + output.WriteString(Error); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (HasError) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Error); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(StartRecordingResponse other) { + if (other == null) { + return; + } + if (other.HasError) { + Error = other.Error; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Error = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + Error = input.ReadString(); + break; + } + } + } + } + #endif + + } + + /// + /// 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. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class StopRecordingRequest : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new StopRecordingRequest()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[59]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StopRecordingRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StopRecordingRequest(StopRecordingRequest other) : this() { + _hasBits0 = other._hasBits0; + platformAudioHandle_ = other.platformAudioHandle_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StopRecordingRequest Clone() { + return new StopRecordingRequest(this); + } + + /// Field number for the "platform_audio_handle" field. + public const int PlatformAudioHandleFieldNumber = 1; + private readonly static ulong PlatformAudioHandleDefaultValue = 0UL; + + private ulong platformAudioHandle_; + /// + /// The PlatformAudio handle. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong PlatformAudioHandle { + get { if ((_hasBits0 & 1) != 0) { return platformAudioHandle_; } else { return PlatformAudioHandleDefaultValue; } } + set { + _hasBits0 |= 1; + platformAudioHandle_ = value; + } + } + /// Gets whether the "platform_audio_handle" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasPlatformAudioHandle { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "platform_audio_handle" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearPlatformAudioHandle() { + _hasBits0 &= ~1; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as StopRecordingRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(StopRecordingRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (PlatformAudioHandle != other.PlatformAudioHandle) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (HasPlatformAudioHandle) hash ^= PlatformAudioHandle.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (HasPlatformAudioHandle) { + output.WriteRawTag(8); + output.WriteUInt64(PlatformAudioHandle); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (HasPlatformAudioHandle) { + output.WriteRawTag(8); + output.WriteUInt64(PlatformAudioHandle); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (HasPlatformAudioHandle) { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(PlatformAudioHandle); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(StopRecordingRequest other) { + if (other == null) { + return; + } + if (other.HasPlatformAudioHandle) { + PlatformAudioHandle = other.PlatformAudioHandle; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + PlatformAudioHandle = input.ReadUInt64(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + PlatformAudioHandle = input.ReadUInt64(); + break; + } + } + } + } + #endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class StopRecordingResponse : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new StopRecordingResponse()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::LiveKit.Proto.AudioFrameReflection.Descriptor.MessageTypes[60]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StopRecordingResponse() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StopRecordingResponse(StopRecordingResponse other) : this() { + error_ = other.error_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StopRecordingResponse Clone() { + return new StopRecordingResponse(this); + } + + /// Field number for the "error" field. + public const int ErrorFieldNumber = 1; + private readonly static string ErrorDefaultValue = ""; + + private string error_; + /// + /// Error message if the operation failed. + /// Empty/absent on success. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Error { + get { return error_ ?? ErrorDefaultValue; } + set { + error_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "error" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasError { + get { return error_ != null; } + } + /// Clears the value of the "error" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearError() { + error_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as StopRecordingResponse); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(StopRecordingResponse other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Error != other.Error) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (HasError) hash ^= Error.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (HasError) { + output.WriteRawTag(10); + output.WriteString(Error); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (HasError) { + output.WriteRawTag(10); + output.WriteString(Error); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (HasError) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Error); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(StopRecordingResponse other) { + if (other == null) { + return; + } + if (other.HasError) { + Error = other.Error; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Error = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + Error = input.ReadString(); + break; + } + } + } + } + #endif + + } + #endregion } diff --git a/Runtime/Scripts/Proto/Ffi.cs b/Runtime/Scripts/Proto/Ffi.cs index b0a8bdbb..cc597cd0 100644 --- a/Runtime/Scripts/Proto/Ffi.cs +++ b/Runtime/Scripts/Proto/Ffi.cs @@ -27,7 +27,7 @@ static FfiReflection() { "CglmZmkucHJvdG8SDWxpdmVraXQucHJvdG8aCmUyZWUucHJvdG8aC3RyYWNr", "LnByb3RvGhd0cmFja19wdWJsaWNhdGlvbi5wcm90bxoKcm9vbS5wcm90bxoR", "dmlkZW9fZnJhbWUucHJvdG8aEWF1ZGlvX2ZyYW1lLnByb3RvGglycGMucHJv", - "dG8aEWRhdGFfc3RyZWFtLnByb3RvGhBkYXRhX3RyYWNrLnByb3RvIqAqCgpG", + "dG8aEWRhdGFfc3RyZWFtLnByb3RvGhBkYXRhX3RyYWNrLnByb3RvIrotCgpG", "ZmlSZXF1ZXN0EjAKB2Rpc3Bvc2UYAiABKAsyHS5saXZla2l0LnByb3RvLkRp", "c3Bvc2VSZXF1ZXN0SAASMAoHY29ubmVjdBgDIAEoCzIdLmxpdmVraXQucHJv", "dG8uQ29ubmVjdFJlcXVlc3RIABI2CgpkaXNjb25uZWN0GAQgASgLMiAubGl2", @@ -147,206 +147,224 @@ static FfiReflection() { "ZXN0SAASWgoecmVtb3RlX2RhdGFfdHJhY2tfaXNfcHVibGlzaGVkGEogASgL", "MjAubGl2ZWtpdC5wcm90by5SZW1vdGVEYXRhVHJhY2tJc1B1Ymxpc2hlZFJl", "cXVlc3RIABJLChZkYXRhX3RyYWNrX3N0cmVhbV9yZWFkGEsgASgLMikubGl2", - "ZWtpdC5wcm90by5EYXRhVHJhY2tTdHJlYW1SZWFkUmVxdWVzdEgAQgkKB21l", - "c3NhZ2UipioKC0ZmaVJlc3BvbnNlEjEKB2Rpc3Bvc2UYAiABKAsyHi5saXZl", - "a2l0LnByb3RvLkRpc3Bvc2VSZXNwb25zZUgAEjEKB2Nvbm5lY3QYAyABKAsy", - "Hi5saXZla2l0LnByb3RvLkNvbm5lY3RSZXNwb25zZUgAEjcKCmRpc2Nvbm5l", - "Y3QYBCABKAsyIS5saXZla2l0LnByb3RvLkRpc2Nvbm5lY3RSZXNwb25zZUgA", - "EjwKDXB1Ymxpc2hfdHJhY2sYBSABKAsyIy5saXZla2l0LnByb3RvLlB1Ymxp", - "c2hUcmFja1Jlc3BvbnNlSAASQAoPdW5wdWJsaXNoX3RyYWNrGAYgASgLMiUu", - "bGl2ZWtpdC5wcm90by5VbnB1Ymxpc2hUcmFja1Jlc3BvbnNlSAASOgoMcHVi", - "bGlzaF9kYXRhGAcgASgLMiIubGl2ZWtpdC5wcm90by5QdWJsaXNoRGF0YVJl", - "c3BvbnNlSAASPgoOc2V0X3N1YnNjcmliZWQYCCABKAsyJC5saXZla2l0LnBy", - "b3RvLlNldFN1YnNjcmliZWRSZXNwb25zZUgAEkUKEnNldF9sb2NhbF9tZXRh", - "ZGF0YRgJIAEoCzInLmxpdmVraXQucHJvdG8uU2V0TG9jYWxNZXRhZGF0YVJl", - "c3BvbnNlSAASPQoOc2V0X2xvY2FsX25hbWUYCiABKAsyIy5saXZla2l0LnBy", - "b3RvLlNldExvY2FsTmFtZVJlc3BvbnNlSAASSQoUc2V0X2xvY2FsX2F0dHJp", - "YnV0ZXMYCyABKAsyKS5saXZla2l0LnByb3RvLlNldExvY2FsQXR0cmlidXRl", - "c1Jlc3BvbnNlSAASQwoRZ2V0X3Nlc3Npb25fc3RhdHMYDCABKAsyJi5saXZl", - "a2l0LnByb3RvLkdldFNlc3Npb25TdGF0c1Jlc3BvbnNlSAASTAoVcHVibGlz", - "aF90cmFuc2NyaXB0aW9uGA0gASgLMisubGl2ZWtpdC5wcm90by5QdWJsaXNo", - "VHJhbnNjcmlwdGlvblJlc3BvbnNlSAASQQoQcHVibGlzaF9zaXBfZHRtZhgO", - "IAEoCzIlLmxpdmVraXQucHJvdG8uUHVibGlzaFNpcER0bWZSZXNwb25zZUgA", - "EkUKEmNyZWF0ZV92aWRlb190cmFjaxgPIAEoCzInLmxpdmVraXQucHJvdG8u", - "Q3JlYXRlVmlkZW9UcmFja1Jlc3BvbnNlSAASRQoSY3JlYXRlX2F1ZGlvX3Ry", - "YWNrGBAgASgLMicubGl2ZWtpdC5wcm90by5DcmVhdGVBdWRpb1RyYWNrUmVz", - "cG9uc2VIABJBChBsb2NhbF90cmFja19tdXRlGBEgASgLMiUubGl2ZWtpdC5w", - "cm90by5Mb2NhbFRyYWNrTXV0ZVJlc3BvbnNlSAASRwoTZW5hYmxlX3JlbW90", - "ZV90cmFjaxgSIAEoCzIoLmxpdmVraXQucHJvdG8uRW5hYmxlUmVtb3RlVHJh", - "Y2tSZXNwb25zZUgAEjQKCWdldF9zdGF0cxgTIAEoCzIfLmxpdmVraXQucHJv", - "dG8uR2V0U3RhdHNSZXNwb25zZUgAEmQKInNldF90cmFja19zdWJzY3JpcHRp", - "b25fcGVybWlzc2lvbnMYLyABKAsyNi5saXZla2l0LnByb3RvLlNldFRyYWNr", - "U3Vic2NyaXB0aW9uUGVybWlzc2lvbnNSZXNwb25zZUgAEkEKEG5ld192aWRl", - "b19zdHJlYW0YFCABKAsyJS5saXZla2l0LnByb3RvLk5ld1ZpZGVvU3RyZWFt", - "UmVzcG9uc2VIABJBChBuZXdfdmlkZW9fc291cmNlGBUgASgLMiUubGl2ZWtp", - "dC5wcm90by5OZXdWaWRlb1NvdXJjZVJlc3BvbnNlSAASRwoTY2FwdHVyZV92", - "aWRlb19mcmFtZRgWIAEoCzIoLmxpdmVraXQucHJvdG8uQ2FwdHVyZVZpZGVv", - "RnJhbWVSZXNwb25zZUgAEjwKDXZpZGVvX2NvbnZlcnQYFyABKAsyIy5saXZl", - "a2l0LnByb3RvLlZpZGVvQ29udmVydFJlc3BvbnNlSAASWgoddmlkZW9fc3Ry", - "ZWFtX2Zyb21fcGFydGljaXBhbnQYGCABKAsyMS5saXZla2l0LnByb3RvLlZp", - "ZGVvU3RyZWFtRnJvbVBhcnRpY2lwYW50UmVzcG9uc2VIABJBChBuZXdfYXVk", - "aW9fc3RyZWFtGBkgASgLMiUubGl2ZWtpdC5wcm90by5OZXdBdWRpb1N0cmVh", - "bVJlc3BvbnNlSAASQQoQbmV3X2F1ZGlvX3NvdXJjZRgaIAEoCzIlLmxpdmVr", - "aXQucHJvdG8uTmV3QXVkaW9Tb3VyY2VSZXNwb25zZUgAEkcKE2NhcHR1cmVf", - "YXVkaW9fZnJhbWUYGyABKAsyKC5saXZla2l0LnByb3RvLkNhcHR1cmVBdWRp", - "b0ZyYW1lUmVzcG9uc2VIABJFChJjbGVhcl9hdWRpb19idWZmZXIYHCABKAsy", - "Jy5saXZla2l0LnByb3RvLkNsZWFyQXVkaW9CdWZmZXJSZXNwb25zZUgAEkcK", - "E25ld19hdWRpb19yZXNhbXBsZXIYHSABKAsyKC5saXZla2l0LnByb3RvLk5l", - "d0F1ZGlvUmVzYW1wbGVyUmVzcG9uc2VIABJFChJyZW1peF9hbmRfcmVzYW1w", - "bGUYHiABKAsyJy5saXZla2l0LnByb3RvLlJlbWl4QW5kUmVzYW1wbGVSZXNw", - "b25zZUgAEloKHWF1ZGlvX3N0cmVhbV9mcm9tX3BhcnRpY2lwYW50GB8gASgL", - "MjEubGl2ZWtpdC5wcm90by5BdWRpb1N0cmVhbUZyb21QYXJ0aWNpcGFudFJl", - "c3BvbnNlSAASKwoEZTJlZRggIAEoCzIbLmxpdmVraXQucHJvdG8uRTJlZVJl", - "c3BvbnNlSAASQwoRbmV3X3NveF9yZXNhbXBsZXIYISABKAsyJi5saXZla2l0", - "LnByb3RvLk5ld1NveFJlc2FtcGxlclJlc3BvbnNlSAASRQoScHVzaF9zb3hf", - "cmVzYW1wbGVyGCIgASgLMicubGl2ZWtpdC5wcm90by5QdXNoU294UmVzYW1w", - "bGVyUmVzcG9uc2VIABJHChNmbHVzaF9zb3hfcmVzYW1wbGVyGCMgASgLMigu", - "bGl2ZWtpdC5wcm90by5GbHVzaFNveFJlc2FtcGxlclJlc3BvbnNlSAASQwoR", - "c2VuZF9jaGF0X21lc3NhZ2UYJCABKAsyJi5saXZla2l0LnByb3RvLlNlbmRD", - "aGF0TWVzc2FnZVJlc3BvbnNlSAASOAoLcGVyZm9ybV9ycGMYJSABKAsyIS5s", - "aXZla2l0LnByb3RvLlBlcmZvcm1ScGNSZXNwb25zZUgAEkcKE3JlZ2lzdGVy", - "X3JwY19tZXRob2QYJiABKAsyKC5saXZla2l0LnByb3RvLlJlZ2lzdGVyUnBj", - "TWV0aG9kUmVzcG9uc2VIABJLChV1bnJlZ2lzdGVyX3JwY19tZXRob2QYJyAB", - "KAsyKi5saXZla2l0LnByb3RvLlVucmVnaXN0ZXJScGNNZXRob2RSZXNwb25z", - "ZUgAElwKHnJwY19tZXRob2RfaW52b2NhdGlvbl9yZXNwb25zZRgoIAEoCzIy", - "LmxpdmVraXQucHJvdG8uUnBjTWV0aG9kSW52b2NhdGlvblJlc3BvbnNlUmVz", - "cG9uc2VIABJeCh9lbmFibGVfcmVtb3RlX3RyYWNrX3B1YmxpY2F0aW9uGCkg", - "ASgLMjMubGl2ZWtpdC5wcm90by5FbmFibGVSZW1vdGVUcmFja1B1YmxpY2F0", - "aW9uUmVzcG9uc2VIABJxCil1cGRhdGVfcmVtb3RlX3RyYWNrX3B1YmxpY2F0", - "aW9uX2RpbWVuc2lvbhgqIAEoCzI8LmxpdmVraXQucHJvdG8uVXBkYXRlUmVt", - "b3RlVHJhY2tQdWJsaWNhdGlvbkRpbWVuc2lvblJlc3BvbnNlSAASRQoSc2Vu", - "ZF9zdHJlYW1faGVhZGVyGCsgASgLMicubGl2ZWtpdC5wcm90by5TZW5kU3Ry", - "ZWFtSGVhZGVyUmVzcG9uc2VIABJDChFzZW5kX3N0cmVhbV9jaHVuaxgsIAEo", - "CzImLmxpdmVraXQucHJvdG8uU2VuZFN0cmVhbUNodW5rUmVzcG9uc2VIABJH", - "ChNzZW5kX3N0cmVhbV90cmFpbGVyGC0gASgLMigubGl2ZWtpdC5wcm90by5T", - "ZW5kU3RyZWFtVHJhaWxlclJlc3BvbnNlSAASeQouc2V0X2RhdGFfY2hhbm5l", - "bF9idWZmZXJlZF9hbW91bnRfbG93X3RocmVzaG9sZBguIAEoCzI/LmxpdmVr", - "aXQucHJvdG8uU2V0RGF0YUNoYW5uZWxCdWZmZXJlZEFtb3VudExvd1RocmVz", - "aG9sZFJlc3BvbnNlSAASUAoYbG9hZF9hdWRpb19maWx0ZXJfcGx1Z2luGDAg", - "ASgLMiwubGl2ZWtpdC5wcm90by5Mb2FkQXVkaW9GaWx0ZXJQbHVnaW5SZXNw", - "b25zZUgAEjAKB25ld19hcG0YMSABKAsyHS5saXZla2l0LnByb3RvLk5ld0Fw", - "bVJlc3BvbnNlSAASRQoSYXBtX3Byb2Nlc3Nfc3RyZWFtGDIgASgLMicubGl2", - "ZWtpdC5wcm90by5BcG1Qcm9jZXNzU3RyZWFtUmVzcG9uc2VIABJUChphcG1f", - "cHJvY2Vzc19yZXZlcnNlX3N0cmVhbRgzIAEoCzIuLmxpdmVraXQucHJvdG8u", - "QXBtUHJvY2Vzc1JldmVyc2VTdHJlYW1SZXNwb25zZUgAEkgKFGFwbV9zZXRf", - "c3RyZWFtX2RlbGF5GDQgASgLMigubGl2ZWtpdC5wcm90by5BcG1TZXRTdHJl", - "YW1EZWxheVJlc3BvbnNlSAASVwoVYnl0ZV9yZWFkX2luY3JlbWVudGFsGDUg", - "ASgLMjYubGl2ZWtpdC5wcm90by5CeXRlU3RyZWFtUmVhZGVyUmVhZEluY3Jl", - "bWVudGFsUmVzcG9uc2VIABJHCg1ieXRlX3JlYWRfYWxsGDYgASgLMi4ubGl2", - "ZWtpdC5wcm90by5CeXRlU3RyZWFtUmVhZGVyUmVhZEFsbFJlc3BvbnNlSAAS", - "UAoSYnl0ZV93cml0ZV90b19maWxlGDcgASgLMjIubGl2ZWtpdC5wcm90by5C", - "eXRlU3RyZWFtUmVhZGVyV3JpdGVUb0ZpbGVSZXNwb25zZUgAElcKFXRleHRf", - "cmVhZF9pbmNyZW1lbnRhbBg4IAEoCzI2LmxpdmVraXQucHJvdG8uVGV4dFN0", - "cmVhbVJlYWRlclJlYWRJbmNyZW1lbnRhbFJlc3BvbnNlSAASRwoNdGV4dF9y", - "ZWFkX2FsbBg5IAEoCzIuLmxpdmVraXQucHJvdG8uVGV4dFN0cmVhbVJlYWRl", - "clJlYWRBbGxSZXNwb25zZUgAEjoKCXNlbmRfZmlsZRg6IAEoCzIlLmxpdmVr", - "aXQucHJvdG8uU3RyZWFtU2VuZEZpbGVSZXNwb25zZUgAEjoKCXNlbmRfdGV4", - "dBg7IAEoCzIlLmxpdmVraXQucHJvdG8uU3RyZWFtU2VuZFRleHRSZXNwb25z", - "ZUgAEkEKEGJ5dGVfc3RyZWFtX29wZW4YPCABKAsyJS5saXZla2l0LnByb3Rv", - "LkJ5dGVTdHJlYW1PcGVuUmVzcG9uc2VIABJJChFieXRlX3N0cmVhbV93cml0", - "ZRg9IAEoCzIsLmxpdmVraXQucHJvdG8uQnl0ZVN0cmVhbVdyaXRlcldyaXRl", - "UmVzcG9uc2VIABJJChFieXRlX3N0cmVhbV9jbG9zZRg+IAEoCzIsLmxpdmVr", - "aXQucHJvdG8uQnl0ZVN0cmVhbVdyaXRlckNsb3NlUmVzcG9uc2VIABJBChB0", - "ZXh0X3N0cmVhbV9vcGVuGD8gASgLMiUubGl2ZWtpdC5wcm90by5UZXh0U3Ry", - "ZWFtT3BlblJlc3BvbnNlSAASSQoRdGV4dF9zdHJlYW1fd3JpdGUYQCABKAsy", - "LC5saXZla2l0LnByb3RvLlRleHRTdHJlYW1Xcml0ZXJXcml0ZVJlc3BvbnNl", - "SAASSQoRdGV4dF9zdHJlYW1fY2xvc2UYQSABKAsyLC5saXZla2l0LnByb3Rv", - "LlRleHRTdHJlYW1Xcml0ZXJDbG9zZVJlc3BvbnNlSAASPAoKc2VuZF9ieXRl", - "cxhCIAEoCzImLmxpdmVraXQucHJvdG8uU3RyZWFtU2VuZEJ5dGVzUmVzcG9u", - "c2VIABJnCiRzZXRfcmVtb3RlX3RyYWNrX3B1YmxpY2F0aW9uX3F1YWxpdHkY", - "QyABKAsyNy5saXZla2l0LnByb3RvLlNldFJlbW90ZVRyYWNrUHVibGljYXRp", - "b25RdWFsaXR5UmVzcG9uc2VIABJFChJwdWJsaXNoX2RhdGFfdHJhY2sYRCAB", - "KAsyJy5saXZla2l0LnByb3RvLlB1Ymxpc2hEYXRhVHJhY2tSZXNwb25zZUgA", - "ElEKGWxvY2FsX2RhdGFfdHJhY2tfdHJ5X3B1c2gYRSABKAsyLC5saXZla2l0", - "LnByb3RvLkxvY2FsRGF0YVRyYWNrVHJ5UHVzaFJlc3BvbnNlSAASVAoabG9j", - "YWxfZGF0YV90cmFja191bnB1Ymxpc2gYRiABKAsyLi5saXZla2l0LnByb3Rv", - "LkxvY2FsRGF0YVRyYWNrVW5wdWJsaXNoUmVzcG9uc2VIABJZCh1sb2NhbF9k", - "YXRhX3RyYWNrX2lzX3B1Ymxpc2hlZBhHIAEoCzIwLmxpdmVraXQucHJvdG8u", - "TG9jYWxEYXRhVHJhY2tJc1B1Ymxpc2hlZFJlc3BvbnNlSAASSQoUc3Vic2Ny", - "aWJlX2RhdGFfdHJhY2sYSCABKAsyKS5saXZla2l0LnByb3RvLlN1YnNjcmli", - "ZURhdGFUcmFja1Jlc3BvbnNlSAASWwoecmVtb3RlX2RhdGFfdHJhY2tfaXNf", - "cHVibGlzaGVkGEkgASgLMjEubGl2ZWtpdC5wcm90by5SZW1vdGVEYXRhVHJh", - "Y2tJc1B1Ymxpc2hlZFJlc3BvbnNlSAASTAoWZGF0YV90cmFja19zdHJlYW1f", - "cmVhZBhKIAEoCzIqLmxpdmVraXQucHJvdG8uRGF0YVRyYWNrU3RyZWFtUmVh", - "ZFJlc3BvbnNlSABCCQoHbWVzc2FnZSKUFgoIRmZpRXZlbnQSLgoKcm9vbV9l", - "dmVudBgBIAEoCzIYLmxpdmVraXQucHJvdG8uUm9vbUV2ZW50SAASMAoLdHJh", - "Y2tfZXZlbnQYAiABKAsyGS5saXZla2l0LnByb3RvLlRyYWNrRXZlbnRIABI9", - "ChJ2aWRlb19zdHJlYW1fZXZlbnQYAyABKAsyHy5saXZla2l0LnByb3RvLlZp", - "ZGVvU3RyZWFtRXZlbnRIABI9ChJhdWRpb19zdHJlYW1fZXZlbnQYBCABKAsy", - "Hy5saXZla2l0LnByb3RvLkF1ZGlvU3RyZWFtRXZlbnRIABIxCgdjb25uZWN0", - "GAUgASgLMh4ubGl2ZWtpdC5wcm90by5Db25uZWN0Q2FsbGJhY2tIABI3Cgpk", - "aXNjb25uZWN0GAcgASgLMiEubGl2ZWtpdC5wcm90by5EaXNjb25uZWN0Q2Fs", - "bGJhY2tIABIxCgdkaXNwb3NlGAggASgLMh4ubGl2ZWtpdC5wcm90by5EaXNw", - "b3NlQ2FsbGJhY2tIABI8Cg1wdWJsaXNoX3RyYWNrGAkgASgLMiMubGl2ZWtp", - "dC5wcm90by5QdWJsaXNoVHJhY2tDYWxsYmFja0gAEkAKD3VucHVibGlzaF90", - "cmFjaxgKIAEoCzIlLmxpdmVraXQucHJvdG8uVW5wdWJsaXNoVHJhY2tDYWxs", - "YmFja0gAEjoKDHB1Ymxpc2hfZGF0YRgLIAEoCzIiLmxpdmVraXQucHJvdG8u", - "UHVibGlzaERhdGFDYWxsYmFja0gAEkwKFXB1Ymxpc2hfdHJhbnNjcmlwdGlv", - "bhgMIAEoCzIrLmxpdmVraXQucHJvdG8uUHVibGlzaFRyYW5zY3JpcHRpb25D", - "YWxsYmFja0gAEkcKE2NhcHR1cmVfYXVkaW9fZnJhbWUYDSABKAsyKC5saXZl", - "a2l0LnByb3RvLkNhcHR1cmVBdWRpb0ZyYW1lQ2FsbGJhY2tIABJFChJzZXRf", - "bG9jYWxfbWV0YWRhdGEYDiABKAsyJy5saXZla2l0LnByb3RvLlNldExvY2Fs", - "TWV0YWRhdGFDYWxsYmFja0gAEj0KDnNldF9sb2NhbF9uYW1lGA8gASgLMiMu", - "bGl2ZWtpdC5wcm90by5TZXRMb2NhbE5hbWVDYWxsYmFja0gAEkkKFHNldF9s", - "b2NhbF9hdHRyaWJ1dGVzGBAgASgLMikubGl2ZWtpdC5wcm90by5TZXRMb2Nh", - "bEF0dHJpYnV0ZXNDYWxsYmFja0gAEjQKCWdldF9zdGF0cxgRIAEoCzIfLmxp", - "dmVraXQucHJvdG8uR2V0U3RhdHNDYWxsYmFja0gAEicKBGxvZ3MYEiABKAsy", - "Fy5saXZla2l0LnByb3RvLkxvZ0JhdGNoSAASQwoRZ2V0X3Nlc3Npb25fc3Rh", - "dHMYEyABKAsyJi5saXZla2l0LnByb3RvLkdldFNlc3Npb25TdGF0c0NhbGxi", - "YWNrSAASJQoFcGFuaWMYFCABKAsyFC5saXZla2l0LnByb3RvLlBhbmljSAAS", - "QQoQcHVibGlzaF9zaXBfZHRtZhgVIAEoCzIlLmxpdmVraXQucHJvdG8uUHVi", - "bGlzaFNpcER0bWZDYWxsYmFja0gAEj4KDGNoYXRfbWVzc2FnZRgWIAEoCzIm", - "LmxpdmVraXQucHJvdG8uU2VuZENoYXRNZXNzYWdlQ2FsbGJhY2tIABI4Cgtw", - "ZXJmb3JtX3JwYxgXIAEoCzIhLmxpdmVraXQucHJvdG8uUGVyZm9ybVJwY0Nh", - "bGxiYWNrSAASSAoVcnBjX21ldGhvZF9pbnZvY2F0aW9uGBggASgLMicubGl2", - "ZWtpdC5wcm90by5ScGNNZXRob2RJbnZvY2F0aW9uRXZlbnRIABJFChJzZW5k", - "X3N0cmVhbV9oZWFkZXIYGSABKAsyJy5saXZla2l0LnByb3RvLlNlbmRTdHJl", - "YW1IZWFkZXJDYWxsYmFja0gAEkMKEXNlbmRfc3RyZWFtX2NodW5rGBogASgL", - "MiYubGl2ZWtpdC5wcm90by5TZW5kU3RyZWFtQ2h1bmtDYWxsYmFja0gAEkcK", - "E3NlbmRfc3RyZWFtX3RyYWlsZXIYGyABKAsyKC5saXZla2l0LnByb3RvLlNl", - "bmRTdHJlYW1UcmFpbGVyQ2FsbGJhY2tIABJIChhieXRlX3N0cmVhbV9yZWFk", - "ZXJfZXZlbnQYHCABKAsyJC5saXZla2l0LnByb3RvLkJ5dGVTdHJlYW1SZWFk", - "ZXJFdmVudEgAElUKG2J5dGVfc3RyZWFtX3JlYWRlcl9yZWFkX2FsbBgdIAEo", - "CzIuLmxpdmVraXQucHJvdG8uQnl0ZVN0cmVhbVJlYWRlclJlYWRBbGxDYWxs", - "YmFja0gAEl4KIGJ5dGVfc3RyZWFtX3JlYWRlcl93cml0ZV90b19maWxlGB4g", - "ASgLMjIubGl2ZWtpdC5wcm90by5CeXRlU3RyZWFtUmVhZGVyV3JpdGVUb0Zp", - "bGVDYWxsYmFja0gAEkEKEGJ5dGVfc3RyZWFtX29wZW4YHyABKAsyJS5saXZl", - "a2l0LnByb3RvLkJ5dGVTdHJlYW1PcGVuQ2FsbGJhY2tIABJQChhieXRlX3N0", - "cmVhbV93cml0ZXJfd3JpdGUYICABKAsyLC5saXZla2l0LnByb3RvLkJ5dGVT", - "dHJlYW1Xcml0ZXJXcml0ZUNhbGxiYWNrSAASUAoYYnl0ZV9zdHJlYW1fd3Jp", - "dGVyX2Nsb3NlGCEgASgLMiwubGl2ZWtpdC5wcm90by5CeXRlU3RyZWFtV3Jp", - "dGVyQ2xvc2VDYWxsYmFja0gAEjoKCXNlbmRfZmlsZRgiIAEoCzIlLmxpdmVr", - "aXQucHJvdG8uU3RyZWFtU2VuZEZpbGVDYWxsYmFja0gAEkgKGHRleHRfc3Ry", - "ZWFtX3JlYWRlcl9ldmVudBgjIAEoCzIkLmxpdmVraXQucHJvdG8uVGV4dFN0", - "cmVhbVJlYWRlckV2ZW50SAASVQobdGV4dF9zdHJlYW1fcmVhZGVyX3JlYWRf", - "YWxsGCQgASgLMi4ubGl2ZWtpdC5wcm90by5UZXh0U3RyZWFtUmVhZGVyUmVh", - "ZEFsbENhbGxiYWNrSAASQQoQdGV4dF9zdHJlYW1fb3BlbhglIAEoCzIlLmxp", - "dmVraXQucHJvdG8uVGV4dFN0cmVhbU9wZW5DYWxsYmFja0gAElAKGHRleHRf", - "c3RyZWFtX3dyaXRlcl93cml0ZRgmIAEoCzIsLmxpdmVraXQucHJvdG8uVGV4", - "dFN0cmVhbVdyaXRlcldyaXRlQ2FsbGJhY2tIABJQChh0ZXh0X3N0cmVhbV93", - "cml0ZXJfY2xvc2UYJyABKAsyLC5saXZla2l0LnByb3RvLlRleHRTdHJlYW1X", - "cml0ZXJDbG9zZUNhbGxiYWNrSAASOgoJc2VuZF90ZXh0GCggASgLMiUubGl2", - "ZWtpdC5wcm90by5TdHJlYW1TZW5kVGV4dENhbGxiYWNrSAASPAoKc2VuZF9i", - "eXRlcxgpIAEoCzImLmxpdmVraXQucHJvdG8uU3RyZWFtU2VuZEJ5dGVzQ2Fs", - "bGJhY2tIABJFChJwdWJsaXNoX2RhdGFfdHJhY2sYKiABKAsyJy5saXZla2l0", - "LnByb3RvLlB1Ymxpc2hEYXRhVHJhY2tDYWxsYmFja0gAEkYKF2RhdGFfdHJh", - "Y2tfc3RyZWFtX2V2ZW50GCsgASgLMiMubGl2ZWtpdC5wcm90by5EYXRhVHJh", - "Y2tTdHJlYW1FdmVudEgAQgkKB21lc3NhZ2UiHwoORGlzcG9zZVJlcXVlc3QS", - "DQoFYXN5bmMYASACKAgiIwoPRGlzcG9zZVJlc3BvbnNlEhAKCGFzeW5jX2lk", - "GAEgASgEIiMKD0Rpc3Bvc2VDYWxsYmFjaxIQCghhc3luY19pZBgBIAIoBCKF", - "AQoJTG9nUmVjb3JkEiYKBWxldmVsGAEgAigOMhcubGl2ZWtpdC5wcm90by5M", - "b2dMZXZlbBIOCgZ0YXJnZXQYAiACKAkSEwoLbW9kdWxlX3BhdGgYAyABKAkS", - "DAoEZmlsZRgEIAEoCRIMCgRsaW5lGAUgASgNEg8KB21lc3NhZ2UYBiACKAki", - "NQoITG9nQmF0Y2gSKQoHcmVjb3JkcxgBIAMoCzIYLmxpdmVraXQucHJvdG8u", - "TG9nUmVjb3JkIhgKBVBhbmljEg8KB21lc3NhZ2UYASACKAkqUwoITG9nTGV2", - "ZWwSDQoJTE9HX0VSUk9SEAASDAoITE9HX1dBUk4QARIMCghMT0dfSU5GTxAC", - "Eg0KCUxPR19ERUJVRxADEg0KCUxPR19UUkFDRRAEQhCqAg1MaXZlS2l0LlBy", - "b3Rv")); + "ZWtpdC5wcm90by5EYXRhVHJhY2tTdHJlYW1SZWFkUmVxdWVzdEgAEkQKEm5l", + "d19wbGF0Zm9ybV9hdWRpbxhMIAEoCzImLmxpdmVraXQucHJvdG8uTmV3UGxh", + "dGZvcm1BdWRpb1JlcXVlc3RIABJCChFnZXRfYXVkaW9fZGV2aWNlcxhNIAEo", + "CzIlLmxpdmVraXQucHJvdG8uR2V0QXVkaW9EZXZpY2VzUmVxdWVzdEgAEkgK", + "FHNldF9yZWNvcmRpbmdfZGV2aWNlGE4gASgLMigubGl2ZWtpdC5wcm90by5T", + "ZXRSZWNvcmRpbmdEZXZpY2VSZXF1ZXN0SAASRAoSc2V0X3BsYXlvdXRfZGV2", + "aWNlGE8gASgLMiYubGl2ZWtpdC5wcm90by5TZXRQbGF5b3V0RGV2aWNlUmVx", + "dWVzdEgAEj8KD3N0YXJ0X3JlY29yZGluZxhQIAEoCzIkLmxpdmVraXQucHJv", + "dG8uU3RhcnRSZWNvcmRpbmdSZXF1ZXN0SAASPQoOc3RvcF9yZWNvcmRpbmcY", + "USABKAsyIy5saXZla2l0LnByb3RvLlN0b3BSZWNvcmRpbmdSZXF1ZXN0SABC", + "CQoHbWVzc2FnZSLGLQoLRmZpUmVzcG9uc2USMQoHZGlzcG9zZRgCIAEoCzIe", + "LmxpdmVraXQucHJvdG8uRGlzcG9zZVJlc3BvbnNlSAASMQoHY29ubmVjdBgD", + "IAEoCzIeLmxpdmVraXQucHJvdG8uQ29ubmVjdFJlc3BvbnNlSAASNwoKZGlz", + "Y29ubmVjdBgEIAEoCzIhLmxpdmVraXQucHJvdG8uRGlzY29ubmVjdFJlc3Bv", + "bnNlSAASPAoNcHVibGlzaF90cmFjaxgFIAEoCzIjLmxpdmVraXQucHJvdG8u", + "UHVibGlzaFRyYWNrUmVzcG9uc2VIABJACg91bnB1Ymxpc2hfdHJhY2sYBiAB", + "KAsyJS5saXZla2l0LnByb3RvLlVucHVibGlzaFRyYWNrUmVzcG9uc2VIABI6", + "CgxwdWJsaXNoX2RhdGEYByABKAsyIi5saXZla2l0LnByb3RvLlB1Ymxpc2hE", + "YXRhUmVzcG9uc2VIABI+Cg5zZXRfc3Vic2NyaWJlZBgIIAEoCzIkLmxpdmVr", + "aXQucHJvdG8uU2V0U3Vic2NyaWJlZFJlc3BvbnNlSAASRQoSc2V0X2xvY2Fs", + "X21ldGFkYXRhGAkgASgLMicubGl2ZWtpdC5wcm90by5TZXRMb2NhbE1ldGFk", + "YXRhUmVzcG9uc2VIABI9Cg5zZXRfbG9jYWxfbmFtZRgKIAEoCzIjLmxpdmVr", + "aXQucHJvdG8uU2V0TG9jYWxOYW1lUmVzcG9uc2VIABJJChRzZXRfbG9jYWxf", + "YXR0cmlidXRlcxgLIAEoCzIpLmxpdmVraXQucHJvdG8uU2V0TG9jYWxBdHRy", + "aWJ1dGVzUmVzcG9uc2VIABJDChFnZXRfc2Vzc2lvbl9zdGF0cxgMIAEoCzIm", + "LmxpdmVraXQucHJvdG8uR2V0U2Vzc2lvblN0YXRzUmVzcG9uc2VIABJMChVw", + "dWJsaXNoX3RyYW5zY3JpcHRpb24YDSABKAsyKy5saXZla2l0LnByb3RvLlB1", + "Ymxpc2hUcmFuc2NyaXB0aW9uUmVzcG9uc2VIABJBChBwdWJsaXNoX3NpcF9k", + "dG1mGA4gASgLMiUubGl2ZWtpdC5wcm90by5QdWJsaXNoU2lwRHRtZlJlc3Bv", + "bnNlSAASRQoSY3JlYXRlX3ZpZGVvX3RyYWNrGA8gASgLMicubGl2ZWtpdC5w", + "cm90by5DcmVhdGVWaWRlb1RyYWNrUmVzcG9uc2VIABJFChJjcmVhdGVfYXVk", + "aW9fdHJhY2sYECABKAsyJy5saXZla2l0LnByb3RvLkNyZWF0ZUF1ZGlvVHJh", + "Y2tSZXNwb25zZUgAEkEKEGxvY2FsX3RyYWNrX211dGUYESABKAsyJS5saXZl", + "a2l0LnByb3RvLkxvY2FsVHJhY2tNdXRlUmVzcG9uc2VIABJHChNlbmFibGVf", + "cmVtb3RlX3RyYWNrGBIgASgLMigubGl2ZWtpdC5wcm90by5FbmFibGVSZW1v", + "dGVUcmFja1Jlc3BvbnNlSAASNAoJZ2V0X3N0YXRzGBMgASgLMh8ubGl2ZWtp", + "dC5wcm90by5HZXRTdGF0c1Jlc3BvbnNlSAASZAoic2V0X3RyYWNrX3N1YnNj", + "cmlwdGlvbl9wZXJtaXNzaW9ucxgvIAEoCzI2LmxpdmVraXQucHJvdG8uU2V0", + "VHJhY2tTdWJzY3JpcHRpb25QZXJtaXNzaW9uc1Jlc3BvbnNlSAASQQoQbmV3", + "X3ZpZGVvX3N0cmVhbRgUIAEoCzIlLmxpdmVraXQucHJvdG8uTmV3VmlkZW9T", + "dHJlYW1SZXNwb25zZUgAEkEKEG5ld192aWRlb19zb3VyY2UYFSABKAsyJS5s", + "aXZla2l0LnByb3RvLk5ld1ZpZGVvU291cmNlUmVzcG9uc2VIABJHChNjYXB0", + "dXJlX3ZpZGVvX2ZyYW1lGBYgASgLMigubGl2ZWtpdC5wcm90by5DYXB0dXJl", + "VmlkZW9GcmFtZVJlc3BvbnNlSAASPAoNdmlkZW9fY29udmVydBgXIAEoCzIj", + "LmxpdmVraXQucHJvdG8uVmlkZW9Db252ZXJ0UmVzcG9uc2VIABJaCh12aWRl", + "b19zdHJlYW1fZnJvbV9wYXJ0aWNpcGFudBgYIAEoCzIxLmxpdmVraXQucHJv", + "dG8uVmlkZW9TdHJlYW1Gcm9tUGFydGljaXBhbnRSZXNwb25zZUgAEkEKEG5l", + "d19hdWRpb19zdHJlYW0YGSABKAsyJS5saXZla2l0LnByb3RvLk5ld0F1ZGlv", + "U3RyZWFtUmVzcG9uc2VIABJBChBuZXdfYXVkaW9fc291cmNlGBogASgLMiUu", + "bGl2ZWtpdC5wcm90by5OZXdBdWRpb1NvdXJjZVJlc3BvbnNlSAASRwoTY2Fw", + "dHVyZV9hdWRpb19mcmFtZRgbIAEoCzIoLmxpdmVraXQucHJvdG8uQ2FwdHVy", + "ZUF1ZGlvRnJhbWVSZXNwb25zZUgAEkUKEmNsZWFyX2F1ZGlvX2J1ZmZlchgc", + "IAEoCzInLmxpdmVraXQucHJvdG8uQ2xlYXJBdWRpb0J1ZmZlclJlc3BvbnNl", + "SAASRwoTbmV3X2F1ZGlvX3Jlc2FtcGxlchgdIAEoCzIoLmxpdmVraXQucHJv", + "dG8uTmV3QXVkaW9SZXNhbXBsZXJSZXNwb25zZUgAEkUKEnJlbWl4X2FuZF9y", + "ZXNhbXBsZRgeIAEoCzInLmxpdmVraXQucHJvdG8uUmVtaXhBbmRSZXNhbXBs", + "ZVJlc3BvbnNlSAASWgodYXVkaW9fc3RyZWFtX2Zyb21fcGFydGljaXBhbnQY", + "HyABKAsyMS5saXZla2l0LnByb3RvLkF1ZGlvU3RyZWFtRnJvbVBhcnRpY2lw", + "YW50UmVzcG9uc2VIABIrCgRlMmVlGCAgASgLMhsubGl2ZWtpdC5wcm90by5F", + "MmVlUmVzcG9uc2VIABJDChFuZXdfc294X3Jlc2FtcGxlchghIAEoCzImLmxp", + "dmVraXQucHJvdG8uTmV3U294UmVzYW1wbGVyUmVzcG9uc2VIABJFChJwdXNo", + "X3NveF9yZXNhbXBsZXIYIiABKAsyJy5saXZla2l0LnByb3RvLlB1c2hTb3hS", + "ZXNhbXBsZXJSZXNwb25zZUgAEkcKE2ZsdXNoX3NveF9yZXNhbXBsZXIYIyAB", + "KAsyKC5saXZla2l0LnByb3RvLkZsdXNoU294UmVzYW1wbGVyUmVzcG9uc2VI", + "ABJDChFzZW5kX2NoYXRfbWVzc2FnZRgkIAEoCzImLmxpdmVraXQucHJvdG8u", + "U2VuZENoYXRNZXNzYWdlUmVzcG9uc2VIABI4CgtwZXJmb3JtX3JwYxglIAEo", + "CzIhLmxpdmVraXQucHJvdG8uUGVyZm9ybVJwY1Jlc3BvbnNlSAASRwoTcmVn", + "aXN0ZXJfcnBjX21ldGhvZBgmIAEoCzIoLmxpdmVraXQucHJvdG8uUmVnaXN0", + "ZXJScGNNZXRob2RSZXNwb25zZUgAEksKFXVucmVnaXN0ZXJfcnBjX21ldGhv", + "ZBgnIAEoCzIqLmxpdmVraXQucHJvdG8uVW5yZWdpc3RlclJwY01ldGhvZFJl", + "c3BvbnNlSAASXAoecnBjX21ldGhvZF9pbnZvY2F0aW9uX3Jlc3BvbnNlGCgg", + "ASgLMjIubGl2ZWtpdC5wcm90by5ScGNNZXRob2RJbnZvY2F0aW9uUmVzcG9u", + "c2VSZXNwb25zZUgAEl4KH2VuYWJsZV9yZW1vdGVfdHJhY2tfcHVibGljYXRp", + "b24YKSABKAsyMy5saXZla2l0LnByb3RvLkVuYWJsZVJlbW90ZVRyYWNrUHVi", + "bGljYXRpb25SZXNwb25zZUgAEnEKKXVwZGF0ZV9yZW1vdGVfdHJhY2tfcHVi", + "bGljYXRpb25fZGltZW5zaW9uGCogASgLMjwubGl2ZWtpdC5wcm90by5VcGRh", + "dGVSZW1vdGVUcmFja1B1YmxpY2F0aW9uRGltZW5zaW9uUmVzcG9uc2VIABJF", + "ChJzZW5kX3N0cmVhbV9oZWFkZXIYKyABKAsyJy5saXZla2l0LnByb3RvLlNl", + "bmRTdHJlYW1IZWFkZXJSZXNwb25zZUgAEkMKEXNlbmRfc3RyZWFtX2NodW5r", + "GCwgASgLMiYubGl2ZWtpdC5wcm90by5TZW5kU3RyZWFtQ2h1bmtSZXNwb25z", + "ZUgAEkcKE3NlbmRfc3RyZWFtX3RyYWlsZXIYLSABKAsyKC5saXZla2l0LnBy", + "b3RvLlNlbmRTdHJlYW1UcmFpbGVyUmVzcG9uc2VIABJ5Ci5zZXRfZGF0YV9j", + "aGFubmVsX2J1ZmZlcmVkX2Ftb3VudF9sb3dfdGhyZXNob2xkGC4gASgLMj8u", + "bGl2ZWtpdC5wcm90by5TZXREYXRhQ2hhbm5lbEJ1ZmZlcmVkQW1vdW50TG93", + "VGhyZXNob2xkUmVzcG9uc2VIABJQChhsb2FkX2F1ZGlvX2ZpbHRlcl9wbHVn", + "aW4YMCABKAsyLC5saXZla2l0LnByb3RvLkxvYWRBdWRpb0ZpbHRlclBsdWdp", + "blJlc3BvbnNlSAASMAoHbmV3X2FwbRgxIAEoCzIdLmxpdmVraXQucHJvdG8u", + "TmV3QXBtUmVzcG9uc2VIABJFChJhcG1fcHJvY2Vzc19zdHJlYW0YMiABKAsy", + "Jy5saXZla2l0LnByb3RvLkFwbVByb2Nlc3NTdHJlYW1SZXNwb25zZUgAElQK", + "GmFwbV9wcm9jZXNzX3JldmVyc2Vfc3RyZWFtGDMgASgLMi4ubGl2ZWtpdC5w", + "cm90by5BcG1Qcm9jZXNzUmV2ZXJzZVN0cmVhbVJlc3BvbnNlSAASSAoUYXBt", + "X3NldF9zdHJlYW1fZGVsYXkYNCABKAsyKC5saXZla2l0LnByb3RvLkFwbVNl", + "dFN0cmVhbURlbGF5UmVzcG9uc2VIABJXChVieXRlX3JlYWRfaW5jcmVtZW50", + "YWwYNSABKAsyNi5saXZla2l0LnByb3RvLkJ5dGVTdHJlYW1SZWFkZXJSZWFk", + "SW5jcmVtZW50YWxSZXNwb25zZUgAEkcKDWJ5dGVfcmVhZF9hbGwYNiABKAsy", + "Li5saXZla2l0LnByb3RvLkJ5dGVTdHJlYW1SZWFkZXJSZWFkQWxsUmVzcG9u", + "c2VIABJQChJieXRlX3dyaXRlX3RvX2ZpbGUYNyABKAsyMi5saXZla2l0LnBy", + "b3RvLkJ5dGVTdHJlYW1SZWFkZXJXcml0ZVRvRmlsZVJlc3BvbnNlSAASVwoV", + "dGV4dF9yZWFkX2luY3JlbWVudGFsGDggASgLMjYubGl2ZWtpdC5wcm90by5U", + "ZXh0U3RyZWFtUmVhZGVyUmVhZEluY3JlbWVudGFsUmVzcG9uc2VIABJHCg10", + "ZXh0X3JlYWRfYWxsGDkgASgLMi4ubGl2ZWtpdC5wcm90by5UZXh0U3RyZWFt", + "UmVhZGVyUmVhZEFsbFJlc3BvbnNlSAASOgoJc2VuZF9maWxlGDogASgLMiUu", + "bGl2ZWtpdC5wcm90by5TdHJlYW1TZW5kRmlsZVJlc3BvbnNlSAASOgoJc2Vu", + "ZF90ZXh0GDsgASgLMiUubGl2ZWtpdC5wcm90by5TdHJlYW1TZW5kVGV4dFJl", + "c3BvbnNlSAASQQoQYnl0ZV9zdHJlYW1fb3Blbhg8IAEoCzIlLmxpdmVraXQu", + "cHJvdG8uQnl0ZVN0cmVhbU9wZW5SZXNwb25zZUgAEkkKEWJ5dGVfc3RyZWFt", + "X3dyaXRlGD0gASgLMiwubGl2ZWtpdC5wcm90by5CeXRlU3RyZWFtV3JpdGVy", + "V3JpdGVSZXNwb25zZUgAEkkKEWJ5dGVfc3RyZWFtX2Nsb3NlGD4gASgLMiwu", + "bGl2ZWtpdC5wcm90by5CeXRlU3RyZWFtV3JpdGVyQ2xvc2VSZXNwb25zZUgA", + "EkEKEHRleHRfc3RyZWFtX29wZW4YPyABKAsyJS5saXZla2l0LnByb3RvLlRl", + "eHRTdHJlYW1PcGVuUmVzcG9uc2VIABJJChF0ZXh0X3N0cmVhbV93cml0ZRhA", + "IAEoCzIsLmxpdmVraXQucHJvdG8uVGV4dFN0cmVhbVdyaXRlcldyaXRlUmVz", + "cG9uc2VIABJJChF0ZXh0X3N0cmVhbV9jbG9zZRhBIAEoCzIsLmxpdmVraXQu", + "cHJvdG8uVGV4dFN0cmVhbVdyaXRlckNsb3NlUmVzcG9uc2VIABI8CgpzZW5k", + "X2J5dGVzGEIgASgLMiYubGl2ZWtpdC5wcm90by5TdHJlYW1TZW5kQnl0ZXNS", + "ZXNwb25zZUgAEmcKJHNldF9yZW1vdGVfdHJhY2tfcHVibGljYXRpb25fcXVh", + "bGl0eRhDIAEoCzI3LmxpdmVraXQucHJvdG8uU2V0UmVtb3RlVHJhY2tQdWJs", + "aWNhdGlvblF1YWxpdHlSZXNwb25zZUgAEkUKEnB1Ymxpc2hfZGF0YV90cmFj", + "axhEIAEoCzInLmxpdmVraXQucHJvdG8uUHVibGlzaERhdGFUcmFja1Jlc3Bv", + "bnNlSAASUQoZbG9jYWxfZGF0YV90cmFja190cnlfcHVzaBhFIAEoCzIsLmxp", + "dmVraXQucHJvdG8uTG9jYWxEYXRhVHJhY2tUcnlQdXNoUmVzcG9uc2VIABJU", + "Chpsb2NhbF9kYXRhX3RyYWNrX3VucHVibGlzaBhGIAEoCzIuLmxpdmVraXQu", + "cHJvdG8uTG9jYWxEYXRhVHJhY2tVbnB1Ymxpc2hSZXNwb25zZUgAElkKHWxv", + "Y2FsX2RhdGFfdHJhY2tfaXNfcHVibGlzaGVkGEcgASgLMjAubGl2ZWtpdC5w", + "cm90by5Mb2NhbERhdGFUcmFja0lzUHVibGlzaGVkUmVzcG9uc2VIABJJChRz", + "dWJzY3JpYmVfZGF0YV90cmFjaxhIIAEoCzIpLmxpdmVraXQucHJvdG8uU3Vi", + "c2NyaWJlRGF0YVRyYWNrUmVzcG9uc2VIABJbCh5yZW1vdGVfZGF0YV90cmFj", + "a19pc19wdWJsaXNoZWQYSSABKAsyMS5saXZla2l0LnByb3RvLlJlbW90ZURh", + "dGFUcmFja0lzUHVibGlzaGVkUmVzcG9uc2VIABJMChZkYXRhX3RyYWNrX3N0", + "cmVhbV9yZWFkGEogASgLMioubGl2ZWtpdC5wcm90by5EYXRhVHJhY2tTdHJl", + "YW1SZWFkUmVzcG9uc2VIABJFChJuZXdfcGxhdGZvcm1fYXVkaW8YSyABKAsy", + "Jy5saXZla2l0LnByb3RvLk5ld1BsYXRmb3JtQXVkaW9SZXNwb25zZUgAEkMK", + "EWdldF9hdWRpb19kZXZpY2VzGEwgASgLMiYubGl2ZWtpdC5wcm90by5HZXRB", + "dWRpb0RldmljZXNSZXNwb25zZUgAEkkKFHNldF9yZWNvcmRpbmdfZGV2aWNl", + "GE0gASgLMikubGl2ZWtpdC5wcm90by5TZXRSZWNvcmRpbmdEZXZpY2VSZXNw", + "b25zZUgAEkUKEnNldF9wbGF5b3V0X2RldmljZRhOIAEoCzInLmxpdmVraXQu", + "cHJvdG8uU2V0UGxheW91dERldmljZVJlc3BvbnNlSAASQAoPc3RhcnRfcmVj", + "b3JkaW5nGE8gASgLMiUubGl2ZWtpdC5wcm90by5TdGFydFJlY29yZGluZ1Jl", + "c3BvbnNlSAASPgoOc3RvcF9yZWNvcmRpbmcYUCABKAsyJC5saXZla2l0LnBy", + "b3RvLlN0b3BSZWNvcmRpbmdSZXNwb25zZUgAQgkKB21lc3NhZ2UilBYKCEZm", + "aUV2ZW50Ei4KCnJvb21fZXZlbnQYASABKAsyGC5saXZla2l0LnByb3RvLlJv", + "b21FdmVudEgAEjAKC3RyYWNrX2V2ZW50GAIgASgLMhkubGl2ZWtpdC5wcm90", + "by5UcmFja0V2ZW50SAASPQoSdmlkZW9fc3RyZWFtX2V2ZW50GAMgASgLMh8u", + "bGl2ZWtpdC5wcm90by5WaWRlb1N0cmVhbUV2ZW50SAASPQoSYXVkaW9fc3Ry", + "ZWFtX2V2ZW50GAQgASgLMh8ubGl2ZWtpdC5wcm90by5BdWRpb1N0cmVhbUV2", + "ZW50SAASMQoHY29ubmVjdBgFIAEoCzIeLmxpdmVraXQucHJvdG8uQ29ubmVj", + "dENhbGxiYWNrSAASNwoKZGlzY29ubmVjdBgHIAEoCzIhLmxpdmVraXQucHJv", + "dG8uRGlzY29ubmVjdENhbGxiYWNrSAASMQoHZGlzcG9zZRgIIAEoCzIeLmxp", + "dmVraXQucHJvdG8uRGlzcG9zZUNhbGxiYWNrSAASPAoNcHVibGlzaF90cmFj", + "axgJIAEoCzIjLmxpdmVraXQucHJvdG8uUHVibGlzaFRyYWNrQ2FsbGJhY2tI", + "ABJACg91bnB1Ymxpc2hfdHJhY2sYCiABKAsyJS5saXZla2l0LnByb3RvLlVu", + "cHVibGlzaFRyYWNrQ2FsbGJhY2tIABI6CgxwdWJsaXNoX2RhdGEYCyABKAsy", + "Ii5saXZla2l0LnByb3RvLlB1Ymxpc2hEYXRhQ2FsbGJhY2tIABJMChVwdWJs", + "aXNoX3RyYW5zY3JpcHRpb24YDCABKAsyKy5saXZla2l0LnByb3RvLlB1Ymxp", + "c2hUcmFuc2NyaXB0aW9uQ2FsbGJhY2tIABJHChNjYXB0dXJlX2F1ZGlvX2Zy", + "YW1lGA0gASgLMigubGl2ZWtpdC5wcm90by5DYXB0dXJlQXVkaW9GcmFtZUNh", + "bGxiYWNrSAASRQoSc2V0X2xvY2FsX21ldGFkYXRhGA4gASgLMicubGl2ZWtp", + "dC5wcm90by5TZXRMb2NhbE1ldGFkYXRhQ2FsbGJhY2tIABI9Cg5zZXRfbG9j", + "YWxfbmFtZRgPIAEoCzIjLmxpdmVraXQucHJvdG8uU2V0TG9jYWxOYW1lQ2Fs", + "bGJhY2tIABJJChRzZXRfbG9jYWxfYXR0cmlidXRlcxgQIAEoCzIpLmxpdmVr", + "aXQucHJvdG8uU2V0TG9jYWxBdHRyaWJ1dGVzQ2FsbGJhY2tIABI0CglnZXRf", + "c3RhdHMYESABKAsyHy5saXZla2l0LnByb3RvLkdldFN0YXRzQ2FsbGJhY2tI", + "ABInCgRsb2dzGBIgASgLMhcubGl2ZWtpdC5wcm90by5Mb2dCYXRjaEgAEkMK", + "EWdldF9zZXNzaW9uX3N0YXRzGBMgASgLMiYubGl2ZWtpdC5wcm90by5HZXRT", + "ZXNzaW9uU3RhdHNDYWxsYmFja0gAEiUKBXBhbmljGBQgASgLMhQubGl2ZWtp", + "dC5wcm90by5QYW5pY0gAEkEKEHB1Ymxpc2hfc2lwX2R0bWYYFSABKAsyJS5s", + "aXZla2l0LnByb3RvLlB1Ymxpc2hTaXBEdG1mQ2FsbGJhY2tIABI+CgxjaGF0", + "X21lc3NhZ2UYFiABKAsyJi5saXZla2l0LnByb3RvLlNlbmRDaGF0TWVzc2Fn", + "ZUNhbGxiYWNrSAASOAoLcGVyZm9ybV9ycGMYFyABKAsyIS5saXZla2l0LnBy", + "b3RvLlBlcmZvcm1ScGNDYWxsYmFja0gAEkgKFXJwY19tZXRob2RfaW52b2Nh", + "dGlvbhgYIAEoCzInLmxpdmVraXQucHJvdG8uUnBjTWV0aG9kSW52b2NhdGlv", + "bkV2ZW50SAASRQoSc2VuZF9zdHJlYW1faGVhZGVyGBkgASgLMicubGl2ZWtp", + "dC5wcm90by5TZW5kU3RyZWFtSGVhZGVyQ2FsbGJhY2tIABJDChFzZW5kX3N0", + "cmVhbV9jaHVuaxgaIAEoCzImLmxpdmVraXQucHJvdG8uU2VuZFN0cmVhbUNo", + "dW5rQ2FsbGJhY2tIABJHChNzZW5kX3N0cmVhbV90cmFpbGVyGBsgASgLMigu", + "bGl2ZWtpdC5wcm90by5TZW5kU3RyZWFtVHJhaWxlckNhbGxiYWNrSAASSAoY", + "Ynl0ZV9zdHJlYW1fcmVhZGVyX2V2ZW50GBwgASgLMiQubGl2ZWtpdC5wcm90", + "by5CeXRlU3RyZWFtUmVhZGVyRXZlbnRIABJVChtieXRlX3N0cmVhbV9yZWFk", + "ZXJfcmVhZF9hbGwYHSABKAsyLi5saXZla2l0LnByb3RvLkJ5dGVTdHJlYW1S", + "ZWFkZXJSZWFkQWxsQ2FsbGJhY2tIABJeCiBieXRlX3N0cmVhbV9yZWFkZXJf", + "d3JpdGVfdG9fZmlsZRgeIAEoCzIyLmxpdmVraXQucHJvdG8uQnl0ZVN0cmVh", + "bVJlYWRlcldyaXRlVG9GaWxlQ2FsbGJhY2tIABJBChBieXRlX3N0cmVhbV9v", + "cGVuGB8gASgLMiUubGl2ZWtpdC5wcm90by5CeXRlU3RyZWFtT3BlbkNhbGxi", + "YWNrSAASUAoYYnl0ZV9zdHJlYW1fd3JpdGVyX3dyaXRlGCAgASgLMiwubGl2", + "ZWtpdC5wcm90by5CeXRlU3RyZWFtV3JpdGVyV3JpdGVDYWxsYmFja0gAElAK", + "GGJ5dGVfc3RyZWFtX3dyaXRlcl9jbG9zZRghIAEoCzIsLmxpdmVraXQucHJv", + "dG8uQnl0ZVN0cmVhbVdyaXRlckNsb3NlQ2FsbGJhY2tIABI6CglzZW5kX2Zp", + "bGUYIiABKAsyJS5saXZla2l0LnByb3RvLlN0cmVhbVNlbmRGaWxlQ2FsbGJh", + "Y2tIABJIChh0ZXh0X3N0cmVhbV9yZWFkZXJfZXZlbnQYIyABKAsyJC5saXZl", + "a2l0LnByb3RvLlRleHRTdHJlYW1SZWFkZXJFdmVudEgAElUKG3RleHRfc3Ry", + "ZWFtX3JlYWRlcl9yZWFkX2FsbBgkIAEoCzIuLmxpdmVraXQucHJvdG8uVGV4", + "dFN0cmVhbVJlYWRlclJlYWRBbGxDYWxsYmFja0gAEkEKEHRleHRfc3RyZWFt", + "X29wZW4YJSABKAsyJS5saXZla2l0LnByb3RvLlRleHRTdHJlYW1PcGVuQ2Fs", + "bGJhY2tIABJQChh0ZXh0X3N0cmVhbV93cml0ZXJfd3JpdGUYJiABKAsyLC5s", + "aXZla2l0LnByb3RvLlRleHRTdHJlYW1Xcml0ZXJXcml0ZUNhbGxiYWNrSAAS", + "UAoYdGV4dF9zdHJlYW1fd3JpdGVyX2Nsb3NlGCcgASgLMiwubGl2ZWtpdC5w", + "cm90by5UZXh0U3RyZWFtV3JpdGVyQ2xvc2VDYWxsYmFja0gAEjoKCXNlbmRf", + "dGV4dBgoIAEoCzIlLmxpdmVraXQucHJvdG8uU3RyZWFtU2VuZFRleHRDYWxs", + "YmFja0gAEjwKCnNlbmRfYnl0ZXMYKSABKAsyJi5saXZla2l0LnByb3RvLlN0", + "cmVhbVNlbmRCeXRlc0NhbGxiYWNrSAASRQoScHVibGlzaF9kYXRhX3RyYWNr", + "GCogASgLMicubGl2ZWtpdC5wcm90by5QdWJsaXNoRGF0YVRyYWNrQ2FsbGJh", + "Y2tIABJGChdkYXRhX3RyYWNrX3N0cmVhbV9ldmVudBgrIAEoCzIjLmxpdmVr", + "aXQucHJvdG8uRGF0YVRyYWNrU3RyZWFtRXZlbnRIAEIJCgdtZXNzYWdlIh8K", + "DkRpc3Bvc2VSZXF1ZXN0Eg0KBWFzeW5jGAEgAigIIiMKD0Rpc3Bvc2VSZXNw", + "b25zZRIQCghhc3luY19pZBgBIAEoBCIjCg9EaXNwb3NlQ2FsbGJhY2sSEAoI", + "YXN5bmNfaWQYASACKAQihQEKCUxvZ1JlY29yZBImCgVsZXZlbBgBIAIoDjIX", + "LmxpdmVraXQucHJvdG8uTG9nTGV2ZWwSDgoGdGFyZ2V0GAIgAigJEhMKC21v", + "ZHVsZV9wYXRoGAMgASgJEgwKBGZpbGUYBCABKAkSDAoEbGluZRgFIAEoDRIP", + "CgdtZXNzYWdlGAYgAigJIjUKCExvZ0JhdGNoEikKB3JlY29yZHMYASADKAsy", + "GC5saXZla2l0LnByb3RvLkxvZ1JlY29yZCIYCgVQYW5pYxIPCgdtZXNzYWdl", + "GAEgAigJKlMKCExvZ0xldmVsEg0KCUxPR19FUlJPUhAAEgwKCExPR19XQVJO", + "EAESDAoITE9HX0lORk8QAhINCglMT0dfREVCVUcQAxINCglMT0dfVFJBQ0UQ", + "BEIQqgINTGl2ZUtpdC5Qcm90bw==")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::LiveKit.Proto.E2EeReflection.Descriptor, global::LiveKit.Proto.TrackReflection.Descriptor, global::LiveKit.Proto.TrackPublicationReflection.Descriptor, global::LiveKit.Proto.RoomReflection.Descriptor, global::LiveKit.Proto.VideoFrameReflection.Descriptor, global::LiveKit.Proto.AudioFrameReflection.Descriptor, global::LiveKit.Proto.RpcReflection.Descriptor, global::LiveKit.Proto.DataStreamReflection.Descriptor, global::LiveKit.Proto.DataTrackReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::LiveKit.Proto.LogLevel), }, null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.FfiRequest), global::LiveKit.Proto.FfiRequest.Parser, new[]{ "Dispose", "Connect", "Disconnect", "PublishTrack", "UnpublishTrack", "PublishData", "SetSubscribed", "SetLocalMetadata", "SetLocalName", "SetLocalAttributes", "GetSessionStats", "PublishTranscription", "PublishSipDtmf", "CreateVideoTrack", "CreateAudioTrack", "LocalTrackMute", "EnableRemoteTrack", "GetStats", "SetTrackSubscriptionPermissions", "NewVideoStream", "NewVideoSource", "CaptureVideoFrame", "VideoConvert", "VideoStreamFromParticipant", "NewAudioStream", "NewAudioSource", "CaptureAudioFrame", "ClearAudioBuffer", "NewAudioResampler", "RemixAndResample", "E2Ee", "AudioStreamFromParticipant", "NewSoxResampler", "PushSoxResampler", "FlushSoxResampler", "SendChatMessage", "EditChatMessage", "PerformRpc", "RegisterRpcMethod", "UnregisterRpcMethod", "RpcMethodInvocationResponse", "EnableRemoteTrackPublication", "UpdateRemoteTrackPublicationDimension", "SendStreamHeader", "SendStreamChunk", "SendStreamTrailer", "SetDataChannelBufferedAmountLowThreshold", "LoadAudioFilterPlugin", "NewApm", "ApmProcessStream", "ApmProcessReverseStream", "ApmSetStreamDelay", "ByteReadIncremental", "ByteReadAll", "ByteWriteToFile", "TextReadIncremental", "TextReadAll", "SendFile", "SendText", "ByteStreamOpen", "ByteStreamWrite", "ByteStreamClose", "TextStreamOpen", "TextStreamWrite", "TextStreamClose", "SendBytes", "SetRemoteTrackPublicationQuality", "PublishDataTrack", "LocalDataTrackTryPush", "LocalDataTrackUnpublish", "LocalDataTrackIsPublished", "SubscribeDataTrack", "RemoteDataTrackIsPublished", "DataTrackStreamRead" }, new[]{ "Message" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.FfiResponse), global::LiveKit.Proto.FfiResponse.Parser, new[]{ "Dispose", "Connect", "Disconnect", "PublishTrack", "UnpublishTrack", "PublishData", "SetSubscribed", "SetLocalMetadata", "SetLocalName", "SetLocalAttributes", "GetSessionStats", "PublishTranscription", "PublishSipDtmf", "CreateVideoTrack", "CreateAudioTrack", "LocalTrackMute", "EnableRemoteTrack", "GetStats", "SetTrackSubscriptionPermissions", "NewVideoStream", "NewVideoSource", "CaptureVideoFrame", "VideoConvert", "VideoStreamFromParticipant", "NewAudioStream", "NewAudioSource", "CaptureAudioFrame", "ClearAudioBuffer", "NewAudioResampler", "RemixAndResample", "AudioStreamFromParticipant", "E2Ee", "NewSoxResampler", "PushSoxResampler", "FlushSoxResampler", "SendChatMessage", "PerformRpc", "RegisterRpcMethod", "UnregisterRpcMethod", "RpcMethodInvocationResponse", "EnableRemoteTrackPublication", "UpdateRemoteTrackPublicationDimension", "SendStreamHeader", "SendStreamChunk", "SendStreamTrailer", "SetDataChannelBufferedAmountLowThreshold", "LoadAudioFilterPlugin", "NewApm", "ApmProcessStream", "ApmProcessReverseStream", "ApmSetStreamDelay", "ByteReadIncremental", "ByteReadAll", "ByteWriteToFile", "TextReadIncremental", "TextReadAll", "SendFile", "SendText", "ByteStreamOpen", "ByteStreamWrite", "ByteStreamClose", "TextStreamOpen", "TextStreamWrite", "TextStreamClose", "SendBytes", "SetRemoteTrackPublicationQuality", "PublishDataTrack", "LocalDataTrackTryPush", "LocalDataTrackUnpublish", "LocalDataTrackIsPublished", "SubscribeDataTrack", "RemoteDataTrackIsPublished", "DataTrackStreamRead" }, new[]{ "Message" }, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.FfiRequest), global::LiveKit.Proto.FfiRequest.Parser, new[]{ "Dispose", "Connect", "Disconnect", "PublishTrack", "UnpublishTrack", "PublishData", "SetSubscribed", "SetLocalMetadata", "SetLocalName", "SetLocalAttributes", "GetSessionStats", "PublishTranscription", "PublishSipDtmf", "CreateVideoTrack", "CreateAudioTrack", "LocalTrackMute", "EnableRemoteTrack", "GetStats", "SetTrackSubscriptionPermissions", "NewVideoStream", "NewVideoSource", "CaptureVideoFrame", "VideoConvert", "VideoStreamFromParticipant", "NewAudioStream", "NewAudioSource", "CaptureAudioFrame", "ClearAudioBuffer", "NewAudioResampler", "RemixAndResample", "E2Ee", "AudioStreamFromParticipant", "NewSoxResampler", "PushSoxResampler", "FlushSoxResampler", "SendChatMessage", "EditChatMessage", "PerformRpc", "RegisterRpcMethod", "UnregisterRpcMethod", "RpcMethodInvocationResponse", "EnableRemoteTrackPublication", "UpdateRemoteTrackPublicationDimension", "SendStreamHeader", "SendStreamChunk", "SendStreamTrailer", "SetDataChannelBufferedAmountLowThreshold", "LoadAudioFilterPlugin", "NewApm", "ApmProcessStream", "ApmProcessReverseStream", "ApmSetStreamDelay", "ByteReadIncremental", "ByteReadAll", "ByteWriteToFile", "TextReadIncremental", "TextReadAll", "SendFile", "SendText", "ByteStreamOpen", "ByteStreamWrite", "ByteStreamClose", "TextStreamOpen", "TextStreamWrite", "TextStreamClose", "SendBytes", "SetRemoteTrackPublicationQuality", "PublishDataTrack", "LocalDataTrackTryPush", "LocalDataTrackUnpublish", "LocalDataTrackIsPublished", "SubscribeDataTrack", "RemoteDataTrackIsPublished", "DataTrackStreamRead", "NewPlatformAudio", "GetAudioDevices", "SetRecordingDevice", "SetPlayoutDevice", "StartRecording", "StopRecording" }, new[]{ "Message" }, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.FfiResponse), global::LiveKit.Proto.FfiResponse.Parser, new[]{ "Dispose", "Connect", "Disconnect", "PublishTrack", "UnpublishTrack", "PublishData", "SetSubscribed", "SetLocalMetadata", "SetLocalName", "SetLocalAttributes", "GetSessionStats", "PublishTranscription", "PublishSipDtmf", "CreateVideoTrack", "CreateAudioTrack", "LocalTrackMute", "EnableRemoteTrack", "GetStats", "SetTrackSubscriptionPermissions", "NewVideoStream", "NewVideoSource", "CaptureVideoFrame", "VideoConvert", "VideoStreamFromParticipant", "NewAudioStream", "NewAudioSource", "CaptureAudioFrame", "ClearAudioBuffer", "NewAudioResampler", "RemixAndResample", "AudioStreamFromParticipant", "E2Ee", "NewSoxResampler", "PushSoxResampler", "FlushSoxResampler", "SendChatMessage", "PerformRpc", "RegisterRpcMethod", "UnregisterRpcMethod", "RpcMethodInvocationResponse", "EnableRemoteTrackPublication", "UpdateRemoteTrackPublicationDimension", "SendStreamHeader", "SendStreamChunk", "SendStreamTrailer", "SetDataChannelBufferedAmountLowThreshold", "LoadAudioFilterPlugin", "NewApm", "ApmProcessStream", "ApmProcessReverseStream", "ApmSetStreamDelay", "ByteReadIncremental", "ByteReadAll", "ByteWriteToFile", "TextReadIncremental", "TextReadAll", "SendFile", "SendText", "ByteStreamOpen", "ByteStreamWrite", "ByteStreamClose", "TextStreamOpen", "TextStreamWrite", "TextStreamClose", "SendBytes", "SetRemoteTrackPublicationQuality", "PublishDataTrack", "LocalDataTrackTryPush", "LocalDataTrackUnpublish", "LocalDataTrackIsPublished", "SubscribeDataTrack", "RemoteDataTrackIsPublished", "DataTrackStreamRead", "NewPlatformAudio", "GetAudioDevices", "SetRecordingDevice", "SetPlayoutDevice", "StartRecording", "StopRecording" }, new[]{ "Message" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.FfiEvent), global::LiveKit.Proto.FfiEvent.Parser, new[]{ "RoomEvent", "TrackEvent", "VideoStreamEvent", "AudioStreamEvent", "Connect", "Disconnect", "Dispose", "PublishTrack", "UnpublishTrack", "PublishData", "PublishTranscription", "CaptureAudioFrame", "SetLocalMetadata", "SetLocalName", "SetLocalAttributes", "GetStats", "Logs", "GetSessionStats", "Panic", "PublishSipDtmf", "ChatMessage", "PerformRpc", "RpcMethodInvocation", "SendStreamHeader", "SendStreamChunk", "SendStreamTrailer", "ByteStreamReaderEvent", "ByteStreamReaderReadAll", "ByteStreamReaderWriteToFile", "ByteStreamOpen", "ByteStreamWriterWrite", "ByteStreamWriterClose", "SendFile", "TextStreamReaderEvent", "TextStreamReaderReadAll", "TextStreamOpen", "TextStreamWriterWrite", "TextStreamWriterClose", "SendText", "SendBytes", "PublishDataTrack", "DataTrackStreamEvent" }, new[]{ "Message" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.DisposeRequest), global::LiveKit.Proto.DisposeRequest.Parser, new[]{ "Async" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::LiveKit.Proto.DisposeResponse), global::LiveKit.Proto.DisposeResponse.Parser, new[]{ "AsyncId" }, null, null, null, null), @@ -633,6 +651,24 @@ public FfiRequest(FfiRequest other) : this() { case MessageOneofCase.DataTrackStreamRead: DataTrackStreamRead = other.DataTrackStreamRead.Clone(); break; + case MessageOneofCase.NewPlatformAudio: + NewPlatformAudio = other.NewPlatformAudio.Clone(); + break; + case MessageOneofCase.GetAudioDevices: + GetAudioDevices = other.GetAudioDevices.Clone(); + break; + case MessageOneofCase.SetRecordingDevice: + SetRecordingDevice = other.SetRecordingDevice.Clone(); + break; + case MessageOneofCase.SetPlayoutDevice: + SetPlayoutDevice = other.SetPlayoutDevice.Clone(); + break; + case MessageOneofCase.StartRecording: + StartRecording = other.StartRecording.Clone(); + break; + case MessageOneofCase.StopRecording: + StopRecording = other.StopRecording.Clone(); + break; } _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); @@ -1568,6 +1604,81 @@ public FfiRequest Clone() { } } + /// Field number for the "new_platform_audio" field. + public const int NewPlatformAudioFieldNumber = 76; + /// + /// Platform Audio (ADM) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.NewPlatformAudioRequest NewPlatformAudio { + get { return messageCase_ == MessageOneofCase.NewPlatformAudio ? (global::LiveKit.Proto.NewPlatformAudioRequest) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.NewPlatformAudio; + } + } + + /// Field number for the "get_audio_devices" field. + public const int GetAudioDevicesFieldNumber = 77; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.GetAudioDevicesRequest GetAudioDevices { + get { return messageCase_ == MessageOneofCase.GetAudioDevices ? (global::LiveKit.Proto.GetAudioDevicesRequest) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.GetAudioDevices; + } + } + + /// Field number for the "set_recording_device" field. + public const int SetRecordingDeviceFieldNumber = 78; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.SetRecordingDeviceRequest SetRecordingDevice { + get { return messageCase_ == MessageOneofCase.SetRecordingDevice ? (global::LiveKit.Proto.SetRecordingDeviceRequest) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.SetRecordingDevice; + } + } + + /// Field number for the "set_playout_device" field. + public const int SetPlayoutDeviceFieldNumber = 79; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.SetPlayoutDeviceRequest SetPlayoutDevice { + get { return messageCase_ == MessageOneofCase.SetPlayoutDevice ? (global::LiveKit.Proto.SetPlayoutDeviceRequest) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.SetPlayoutDevice; + } + } + + /// Field number for the "start_recording" field. + public const int StartRecordingFieldNumber = 80; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.StartRecordingRequest StartRecording { + get { return messageCase_ == MessageOneofCase.StartRecording ? (global::LiveKit.Proto.StartRecordingRequest) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.StartRecording; + } + } + + /// Field number for the "stop_recording" field. + public const int StopRecordingFieldNumber = 81; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.StopRecordingRequest StopRecording { + get { return messageCase_ == MessageOneofCase.StopRecording ? (global::LiveKit.Proto.StopRecordingRequest) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.StopRecording; + } + } + private object message_; /// Enum of possible cases for the "message" oneof. public enum MessageOneofCase { @@ -1646,6 +1757,12 @@ public enum MessageOneofCase { SubscribeDataTrack = 73, RemoteDataTrackIsPublished = 74, DataTrackStreamRead = 75, + NewPlatformAudio = 76, + GetAudioDevices = 77, + SetRecordingDevice = 78, + SetPlayoutDevice = 79, + StartRecording = 80, + StopRecording = 81, } private MessageOneofCase messageCase_ = MessageOneofCase.None; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -1750,6 +1867,12 @@ public bool Equals(FfiRequest other) { if (!object.Equals(SubscribeDataTrack, other.SubscribeDataTrack)) return false; if (!object.Equals(RemoteDataTrackIsPublished, other.RemoteDataTrackIsPublished)) return false; if (!object.Equals(DataTrackStreamRead, other.DataTrackStreamRead)) return false; + if (!object.Equals(NewPlatformAudio, other.NewPlatformAudio)) return false; + if (!object.Equals(GetAudioDevices, other.GetAudioDevices)) return false; + if (!object.Equals(SetRecordingDevice, other.SetRecordingDevice)) return false; + if (!object.Equals(SetPlayoutDevice, other.SetPlayoutDevice)) return false; + if (!object.Equals(StartRecording, other.StartRecording)) return false; + if (!object.Equals(StopRecording, other.StopRecording)) return false; if (MessageCase != other.MessageCase) return false; return Equals(_unknownFields, other._unknownFields); } @@ -1832,6 +1955,12 @@ public override int GetHashCode() { if (messageCase_ == MessageOneofCase.SubscribeDataTrack) hash ^= SubscribeDataTrack.GetHashCode(); if (messageCase_ == MessageOneofCase.RemoteDataTrackIsPublished) hash ^= RemoteDataTrackIsPublished.GetHashCode(); if (messageCase_ == MessageOneofCase.DataTrackStreamRead) hash ^= DataTrackStreamRead.GetHashCode(); + if (messageCase_ == MessageOneofCase.NewPlatformAudio) hash ^= NewPlatformAudio.GetHashCode(); + if (messageCase_ == MessageOneofCase.GetAudioDevices) hash ^= GetAudioDevices.GetHashCode(); + if (messageCase_ == MessageOneofCase.SetRecordingDevice) hash ^= SetRecordingDevice.GetHashCode(); + if (messageCase_ == MessageOneofCase.SetPlayoutDevice) hash ^= SetPlayoutDevice.GetHashCode(); + if (messageCase_ == MessageOneofCase.StartRecording) hash ^= StartRecording.GetHashCode(); + if (messageCase_ == MessageOneofCase.StopRecording) hash ^= StopRecording.GetHashCode(); hash ^= (int) messageCase_; if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); @@ -2147,6 +2276,30 @@ public void WriteTo(pb::CodedOutputStream output) { output.WriteRawTag(218, 4); output.WriteMessage(DataTrackStreamRead); } + if (messageCase_ == MessageOneofCase.NewPlatformAudio) { + output.WriteRawTag(226, 4); + output.WriteMessage(NewPlatformAudio); + } + if (messageCase_ == MessageOneofCase.GetAudioDevices) { + output.WriteRawTag(234, 4); + output.WriteMessage(GetAudioDevices); + } + if (messageCase_ == MessageOneofCase.SetRecordingDevice) { + output.WriteRawTag(242, 4); + output.WriteMessage(SetRecordingDevice); + } + if (messageCase_ == MessageOneofCase.SetPlayoutDevice) { + output.WriteRawTag(250, 4); + output.WriteMessage(SetPlayoutDevice); + } + if (messageCase_ == MessageOneofCase.StartRecording) { + output.WriteRawTag(130, 5); + output.WriteMessage(StartRecording); + } + if (messageCase_ == MessageOneofCase.StopRecording) { + output.WriteRawTag(138, 5); + output.WriteMessage(StopRecording); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -2453,6 +2606,30 @@ public void WriteTo(pb::CodedOutputStream output) { output.WriteRawTag(218, 4); output.WriteMessage(DataTrackStreamRead); } + if (messageCase_ == MessageOneofCase.NewPlatformAudio) { + output.WriteRawTag(226, 4); + output.WriteMessage(NewPlatformAudio); + } + if (messageCase_ == MessageOneofCase.GetAudioDevices) { + output.WriteRawTag(234, 4); + output.WriteMessage(GetAudioDevices); + } + if (messageCase_ == MessageOneofCase.SetRecordingDevice) { + output.WriteRawTag(242, 4); + output.WriteMessage(SetRecordingDevice); + } + if (messageCase_ == MessageOneofCase.SetPlayoutDevice) { + output.WriteRawTag(250, 4); + output.WriteMessage(SetPlayoutDevice); + } + if (messageCase_ == MessageOneofCase.StartRecording) { + output.WriteRawTag(130, 5); + output.WriteMessage(StartRecording); + } + if (messageCase_ == MessageOneofCase.StopRecording) { + output.WriteRawTag(138, 5); + output.WriteMessage(StopRecording); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -2685,6 +2862,24 @@ public int CalculateSize() { if (messageCase_ == MessageOneofCase.DataTrackStreamRead) { size += 2 + pb::CodedOutputStream.ComputeMessageSize(DataTrackStreamRead); } + if (messageCase_ == MessageOneofCase.NewPlatformAudio) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(NewPlatformAudio); + } + if (messageCase_ == MessageOneofCase.GetAudioDevices) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(GetAudioDevices); + } + if (messageCase_ == MessageOneofCase.SetRecordingDevice) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(SetRecordingDevice); + } + if (messageCase_ == MessageOneofCase.SetPlayoutDevice) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(SetPlayoutDevice); + } + if (messageCase_ == MessageOneofCase.StartRecording) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(StartRecording); + } + if (messageCase_ == MessageOneofCase.StopRecording) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(StopRecording); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -3142,6 +3337,42 @@ public void MergeFrom(FfiRequest other) { } DataTrackStreamRead.MergeFrom(other.DataTrackStreamRead); break; + case MessageOneofCase.NewPlatformAudio: + if (NewPlatformAudio == null) { + NewPlatformAudio = new global::LiveKit.Proto.NewPlatformAudioRequest(); + } + NewPlatformAudio.MergeFrom(other.NewPlatformAudio); + break; + case MessageOneofCase.GetAudioDevices: + if (GetAudioDevices == null) { + GetAudioDevices = new global::LiveKit.Proto.GetAudioDevicesRequest(); + } + GetAudioDevices.MergeFrom(other.GetAudioDevices); + break; + case MessageOneofCase.SetRecordingDevice: + if (SetRecordingDevice == null) { + SetRecordingDevice = new global::LiveKit.Proto.SetRecordingDeviceRequest(); + } + SetRecordingDevice.MergeFrom(other.SetRecordingDevice); + break; + case MessageOneofCase.SetPlayoutDevice: + if (SetPlayoutDevice == null) { + SetPlayoutDevice = new global::LiveKit.Proto.SetPlayoutDeviceRequest(); + } + SetPlayoutDevice.MergeFrom(other.SetPlayoutDevice); + break; + case MessageOneofCase.StartRecording: + if (StartRecording == null) { + StartRecording = new global::LiveKit.Proto.StartRecordingRequest(); + } + StartRecording.MergeFrom(other.StartRecording); + break; + case MessageOneofCase.StopRecording: + if (StopRecording == null) { + StopRecording = new global::LiveKit.Proto.StopRecordingRequest(); + } + StopRecording.MergeFrom(other.StopRecording); + break; } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); @@ -3829,6 +4060,60 @@ public void MergeFrom(pb::CodedInputStream input) { DataTrackStreamRead = subBuilder; break; } + case 610: { + global::LiveKit.Proto.NewPlatformAudioRequest subBuilder = new global::LiveKit.Proto.NewPlatformAudioRequest(); + if (messageCase_ == MessageOneofCase.NewPlatformAudio) { + subBuilder.MergeFrom(NewPlatformAudio); + } + input.ReadMessage(subBuilder); + NewPlatformAudio = subBuilder; + break; + } + case 618: { + global::LiveKit.Proto.GetAudioDevicesRequest subBuilder = new global::LiveKit.Proto.GetAudioDevicesRequest(); + if (messageCase_ == MessageOneofCase.GetAudioDevices) { + subBuilder.MergeFrom(GetAudioDevices); + } + input.ReadMessage(subBuilder); + GetAudioDevices = subBuilder; + break; + } + case 626: { + global::LiveKit.Proto.SetRecordingDeviceRequest subBuilder = new global::LiveKit.Proto.SetRecordingDeviceRequest(); + if (messageCase_ == MessageOneofCase.SetRecordingDevice) { + subBuilder.MergeFrom(SetRecordingDevice); + } + input.ReadMessage(subBuilder); + SetRecordingDevice = subBuilder; + break; + } + case 634: { + global::LiveKit.Proto.SetPlayoutDeviceRequest subBuilder = new global::LiveKit.Proto.SetPlayoutDeviceRequest(); + if (messageCase_ == MessageOneofCase.SetPlayoutDevice) { + subBuilder.MergeFrom(SetPlayoutDevice); + } + input.ReadMessage(subBuilder); + SetPlayoutDevice = subBuilder; + break; + } + case 642: { + global::LiveKit.Proto.StartRecordingRequest subBuilder = new global::LiveKit.Proto.StartRecordingRequest(); + if (messageCase_ == MessageOneofCase.StartRecording) { + subBuilder.MergeFrom(StartRecording); + } + input.ReadMessage(subBuilder); + StartRecording = subBuilder; + break; + } + case 650: { + global::LiveKit.Proto.StopRecordingRequest subBuilder = new global::LiveKit.Proto.StopRecordingRequest(); + if (messageCase_ == MessageOneofCase.StopRecording) { + subBuilder.MergeFrom(StopRecording); + } + input.ReadMessage(subBuilder); + StopRecording = subBuilder; + break; + } } } #endif @@ -4514,6 +4799,60 @@ public void MergeFrom(pb::CodedInputStream input) { DataTrackStreamRead = subBuilder; break; } + case 610: { + global::LiveKit.Proto.NewPlatformAudioRequest subBuilder = new global::LiveKit.Proto.NewPlatformAudioRequest(); + if (messageCase_ == MessageOneofCase.NewPlatformAudio) { + subBuilder.MergeFrom(NewPlatformAudio); + } + input.ReadMessage(subBuilder); + NewPlatformAudio = subBuilder; + break; + } + case 618: { + global::LiveKit.Proto.GetAudioDevicesRequest subBuilder = new global::LiveKit.Proto.GetAudioDevicesRequest(); + if (messageCase_ == MessageOneofCase.GetAudioDevices) { + subBuilder.MergeFrom(GetAudioDevices); + } + input.ReadMessage(subBuilder); + GetAudioDevices = subBuilder; + break; + } + case 626: { + global::LiveKit.Proto.SetRecordingDeviceRequest subBuilder = new global::LiveKit.Proto.SetRecordingDeviceRequest(); + if (messageCase_ == MessageOneofCase.SetRecordingDevice) { + subBuilder.MergeFrom(SetRecordingDevice); + } + input.ReadMessage(subBuilder); + SetRecordingDevice = subBuilder; + break; + } + case 634: { + global::LiveKit.Proto.SetPlayoutDeviceRequest subBuilder = new global::LiveKit.Proto.SetPlayoutDeviceRequest(); + if (messageCase_ == MessageOneofCase.SetPlayoutDevice) { + subBuilder.MergeFrom(SetPlayoutDevice); + } + input.ReadMessage(subBuilder); + SetPlayoutDevice = subBuilder; + break; + } + case 642: { + global::LiveKit.Proto.StartRecordingRequest subBuilder = new global::LiveKit.Proto.StartRecordingRequest(); + if (messageCase_ == MessageOneofCase.StartRecording) { + subBuilder.MergeFrom(StartRecording); + } + input.ReadMessage(subBuilder); + StartRecording = subBuilder; + break; + } + case 650: { + global::LiveKit.Proto.StopRecordingRequest subBuilder = new global::LiveKit.Proto.StopRecordingRequest(); + if (messageCase_ == MessageOneofCase.StopRecording) { + subBuilder.MergeFrom(StopRecording); + } + input.ReadMessage(subBuilder); + StopRecording = subBuilder; + break; + } } } } @@ -4779,6 +5118,24 @@ public FfiResponse(FfiResponse other) : this() { case MessageOneofCase.DataTrackStreamRead: DataTrackStreamRead = other.DataTrackStreamRead.Clone(); break; + case MessageOneofCase.NewPlatformAudio: + NewPlatformAudio = other.NewPlatformAudio.Clone(); + break; + case MessageOneofCase.GetAudioDevices: + GetAudioDevices = other.GetAudioDevices.Clone(); + break; + case MessageOneofCase.SetRecordingDevice: + SetRecordingDevice = other.SetRecordingDevice.Clone(); + break; + case MessageOneofCase.SetPlayoutDevice: + SetPlayoutDevice = other.SetPlayoutDevice.Clone(); + break; + case MessageOneofCase.StartRecording: + StartRecording = other.StartRecording.Clone(); + break; + case MessageOneofCase.StopRecording: + StopRecording = other.StopRecording.Clone(); + break; } _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); @@ -5702,6 +6059,81 @@ public FfiResponse Clone() { } } + /// Field number for the "new_platform_audio" field. + public const int NewPlatformAudioFieldNumber = 75; + /// + /// Platform Audio (ADM) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.NewPlatformAudioResponse NewPlatformAudio { + get { return messageCase_ == MessageOneofCase.NewPlatformAudio ? (global::LiveKit.Proto.NewPlatformAudioResponse) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.NewPlatformAudio; + } + } + + /// Field number for the "get_audio_devices" field. + public const int GetAudioDevicesFieldNumber = 76; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.GetAudioDevicesResponse GetAudioDevices { + get { return messageCase_ == MessageOneofCase.GetAudioDevices ? (global::LiveKit.Proto.GetAudioDevicesResponse) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.GetAudioDevices; + } + } + + /// Field number for the "set_recording_device" field. + public const int SetRecordingDeviceFieldNumber = 77; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.SetRecordingDeviceResponse SetRecordingDevice { + get { return messageCase_ == MessageOneofCase.SetRecordingDevice ? (global::LiveKit.Proto.SetRecordingDeviceResponse) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.SetRecordingDevice; + } + } + + /// Field number for the "set_playout_device" field. + public const int SetPlayoutDeviceFieldNumber = 78; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.SetPlayoutDeviceResponse SetPlayoutDevice { + get { return messageCase_ == MessageOneofCase.SetPlayoutDevice ? (global::LiveKit.Proto.SetPlayoutDeviceResponse) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.SetPlayoutDevice; + } + } + + /// Field number for the "start_recording" field. + public const int StartRecordingFieldNumber = 79; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.StartRecordingResponse StartRecording { + get { return messageCase_ == MessageOneofCase.StartRecording ? (global::LiveKit.Proto.StartRecordingResponse) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.StartRecording; + } + } + + /// Field number for the "stop_recording" field. + public const int StopRecordingFieldNumber = 80; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::LiveKit.Proto.StopRecordingResponse StopRecording { + get { return messageCase_ == MessageOneofCase.StopRecording ? (global::LiveKit.Proto.StopRecordingResponse) message_ : null; } + set { + message_ = value; + messageCase_ = value == null ? MessageOneofCase.None : MessageOneofCase.StopRecording; + } + } + private object message_; /// Enum of possible cases for the "message" oneof. public enum MessageOneofCase { @@ -5779,6 +6211,12 @@ public enum MessageOneofCase { SubscribeDataTrack = 72, RemoteDataTrackIsPublished = 73, DataTrackStreamRead = 74, + NewPlatformAudio = 75, + GetAudioDevices = 76, + SetRecordingDevice = 77, + SetPlayoutDevice = 78, + StartRecording = 79, + StopRecording = 80, } private MessageOneofCase messageCase_ = MessageOneofCase.None; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -5882,6 +6320,12 @@ public bool Equals(FfiResponse other) { if (!object.Equals(SubscribeDataTrack, other.SubscribeDataTrack)) return false; if (!object.Equals(RemoteDataTrackIsPublished, other.RemoteDataTrackIsPublished)) return false; if (!object.Equals(DataTrackStreamRead, other.DataTrackStreamRead)) return false; + if (!object.Equals(NewPlatformAudio, other.NewPlatformAudio)) return false; + if (!object.Equals(GetAudioDevices, other.GetAudioDevices)) return false; + if (!object.Equals(SetRecordingDevice, other.SetRecordingDevice)) return false; + if (!object.Equals(SetPlayoutDevice, other.SetPlayoutDevice)) return false; + if (!object.Equals(StartRecording, other.StartRecording)) return false; + if (!object.Equals(StopRecording, other.StopRecording)) return false; if (MessageCase != other.MessageCase) return false; return Equals(_unknownFields, other._unknownFields); } @@ -5963,6 +6407,12 @@ public override int GetHashCode() { if (messageCase_ == MessageOneofCase.SubscribeDataTrack) hash ^= SubscribeDataTrack.GetHashCode(); if (messageCase_ == MessageOneofCase.RemoteDataTrackIsPublished) hash ^= RemoteDataTrackIsPublished.GetHashCode(); if (messageCase_ == MessageOneofCase.DataTrackStreamRead) hash ^= DataTrackStreamRead.GetHashCode(); + if (messageCase_ == MessageOneofCase.NewPlatformAudio) hash ^= NewPlatformAudio.GetHashCode(); + if (messageCase_ == MessageOneofCase.GetAudioDevices) hash ^= GetAudioDevices.GetHashCode(); + if (messageCase_ == MessageOneofCase.SetRecordingDevice) hash ^= SetRecordingDevice.GetHashCode(); + if (messageCase_ == MessageOneofCase.SetPlayoutDevice) hash ^= SetPlayoutDevice.GetHashCode(); + if (messageCase_ == MessageOneofCase.StartRecording) hash ^= StartRecording.GetHashCode(); + if (messageCase_ == MessageOneofCase.StopRecording) hash ^= StopRecording.GetHashCode(); hash ^= (int) messageCase_; if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); @@ -6274,6 +6724,30 @@ public void WriteTo(pb::CodedOutputStream output) { output.WriteRawTag(210, 4); output.WriteMessage(DataTrackStreamRead); } + if (messageCase_ == MessageOneofCase.NewPlatformAudio) { + output.WriteRawTag(218, 4); + output.WriteMessage(NewPlatformAudio); + } + if (messageCase_ == MessageOneofCase.GetAudioDevices) { + output.WriteRawTag(226, 4); + output.WriteMessage(GetAudioDevices); + } + if (messageCase_ == MessageOneofCase.SetRecordingDevice) { + output.WriteRawTag(234, 4); + output.WriteMessage(SetRecordingDevice); + } + if (messageCase_ == MessageOneofCase.SetPlayoutDevice) { + output.WriteRawTag(242, 4); + output.WriteMessage(SetPlayoutDevice); + } + if (messageCase_ == MessageOneofCase.StartRecording) { + output.WriteRawTag(250, 4); + output.WriteMessage(StartRecording); + } + if (messageCase_ == MessageOneofCase.StopRecording) { + output.WriteRawTag(130, 5); + output.WriteMessage(StopRecording); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -6576,6 +7050,30 @@ public void WriteTo(pb::CodedOutputStream output) { output.WriteRawTag(210, 4); output.WriteMessage(DataTrackStreamRead); } + if (messageCase_ == MessageOneofCase.NewPlatformAudio) { + output.WriteRawTag(218, 4); + output.WriteMessage(NewPlatformAudio); + } + if (messageCase_ == MessageOneofCase.GetAudioDevices) { + output.WriteRawTag(226, 4); + output.WriteMessage(GetAudioDevices); + } + if (messageCase_ == MessageOneofCase.SetRecordingDevice) { + output.WriteRawTag(234, 4); + output.WriteMessage(SetRecordingDevice); + } + if (messageCase_ == MessageOneofCase.SetPlayoutDevice) { + output.WriteRawTag(242, 4); + output.WriteMessage(SetPlayoutDevice); + } + if (messageCase_ == MessageOneofCase.StartRecording) { + output.WriteRawTag(250, 4); + output.WriteMessage(StartRecording); + } + if (messageCase_ == MessageOneofCase.StopRecording) { + output.WriteRawTag(130, 5); + output.WriteMessage(StopRecording); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -6805,6 +7303,24 @@ public int CalculateSize() { if (messageCase_ == MessageOneofCase.DataTrackStreamRead) { size += 2 + pb::CodedOutputStream.ComputeMessageSize(DataTrackStreamRead); } + if (messageCase_ == MessageOneofCase.NewPlatformAudio) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(NewPlatformAudio); + } + if (messageCase_ == MessageOneofCase.GetAudioDevices) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(GetAudioDevices); + } + if (messageCase_ == MessageOneofCase.SetRecordingDevice) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(SetRecordingDevice); + } + if (messageCase_ == MessageOneofCase.SetPlayoutDevice) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(SetPlayoutDevice); + } + if (messageCase_ == MessageOneofCase.StartRecording) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(StartRecording); + } + if (messageCase_ == MessageOneofCase.StopRecording) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(StopRecording); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -7256,6 +7772,42 @@ public void MergeFrom(FfiResponse other) { } DataTrackStreamRead.MergeFrom(other.DataTrackStreamRead); break; + case MessageOneofCase.NewPlatformAudio: + if (NewPlatformAudio == null) { + NewPlatformAudio = new global::LiveKit.Proto.NewPlatformAudioResponse(); + } + NewPlatformAudio.MergeFrom(other.NewPlatformAudio); + break; + case MessageOneofCase.GetAudioDevices: + if (GetAudioDevices == null) { + GetAudioDevices = new global::LiveKit.Proto.GetAudioDevicesResponse(); + } + GetAudioDevices.MergeFrom(other.GetAudioDevices); + break; + case MessageOneofCase.SetRecordingDevice: + if (SetRecordingDevice == null) { + SetRecordingDevice = new global::LiveKit.Proto.SetRecordingDeviceResponse(); + } + SetRecordingDevice.MergeFrom(other.SetRecordingDevice); + break; + case MessageOneofCase.SetPlayoutDevice: + if (SetPlayoutDevice == null) { + SetPlayoutDevice = new global::LiveKit.Proto.SetPlayoutDeviceResponse(); + } + SetPlayoutDevice.MergeFrom(other.SetPlayoutDevice); + break; + case MessageOneofCase.StartRecording: + if (StartRecording == null) { + StartRecording = new global::LiveKit.Proto.StartRecordingResponse(); + } + StartRecording.MergeFrom(other.StartRecording); + break; + case MessageOneofCase.StopRecording: + if (StopRecording == null) { + StopRecording = new global::LiveKit.Proto.StopRecordingResponse(); + } + StopRecording.MergeFrom(other.StopRecording); + break; } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); @@ -7934,6 +8486,60 @@ public void MergeFrom(pb::CodedInputStream input) { DataTrackStreamRead = subBuilder; break; } + case 602: { + global::LiveKit.Proto.NewPlatformAudioResponse subBuilder = new global::LiveKit.Proto.NewPlatformAudioResponse(); + if (messageCase_ == MessageOneofCase.NewPlatformAudio) { + subBuilder.MergeFrom(NewPlatformAudio); + } + input.ReadMessage(subBuilder); + NewPlatformAudio = subBuilder; + break; + } + case 610: { + global::LiveKit.Proto.GetAudioDevicesResponse subBuilder = new global::LiveKit.Proto.GetAudioDevicesResponse(); + if (messageCase_ == MessageOneofCase.GetAudioDevices) { + subBuilder.MergeFrom(GetAudioDevices); + } + input.ReadMessage(subBuilder); + GetAudioDevices = subBuilder; + break; + } + case 618: { + global::LiveKit.Proto.SetRecordingDeviceResponse subBuilder = new global::LiveKit.Proto.SetRecordingDeviceResponse(); + if (messageCase_ == MessageOneofCase.SetRecordingDevice) { + subBuilder.MergeFrom(SetRecordingDevice); + } + input.ReadMessage(subBuilder); + SetRecordingDevice = subBuilder; + break; + } + case 626: { + global::LiveKit.Proto.SetPlayoutDeviceResponse subBuilder = new global::LiveKit.Proto.SetPlayoutDeviceResponse(); + if (messageCase_ == MessageOneofCase.SetPlayoutDevice) { + subBuilder.MergeFrom(SetPlayoutDevice); + } + input.ReadMessage(subBuilder); + SetPlayoutDevice = subBuilder; + break; + } + case 634: { + global::LiveKit.Proto.StartRecordingResponse subBuilder = new global::LiveKit.Proto.StartRecordingResponse(); + if (messageCase_ == MessageOneofCase.StartRecording) { + subBuilder.MergeFrom(StartRecording); + } + input.ReadMessage(subBuilder); + StartRecording = subBuilder; + break; + } + case 642: { + global::LiveKit.Proto.StopRecordingResponse subBuilder = new global::LiveKit.Proto.StopRecordingResponse(); + if (messageCase_ == MessageOneofCase.StopRecording) { + subBuilder.MergeFrom(StopRecording); + } + input.ReadMessage(subBuilder); + StopRecording = subBuilder; + break; + } } } #endif @@ -8610,6 +9216,60 @@ public void MergeFrom(pb::CodedInputStream input) { DataTrackStreamRead = subBuilder; break; } + case 602: { + global::LiveKit.Proto.NewPlatformAudioResponse subBuilder = new global::LiveKit.Proto.NewPlatformAudioResponse(); + if (messageCase_ == MessageOneofCase.NewPlatformAudio) { + subBuilder.MergeFrom(NewPlatformAudio); + } + input.ReadMessage(subBuilder); + NewPlatformAudio = subBuilder; + break; + } + case 610: { + global::LiveKit.Proto.GetAudioDevicesResponse subBuilder = new global::LiveKit.Proto.GetAudioDevicesResponse(); + if (messageCase_ == MessageOneofCase.GetAudioDevices) { + subBuilder.MergeFrom(GetAudioDevices); + } + input.ReadMessage(subBuilder); + GetAudioDevices = subBuilder; + break; + } + case 618: { + global::LiveKit.Proto.SetRecordingDeviceResponse subBuilder = new global::LiveKit.Proto.SetRecordingDeviceResponse(); + if (messageCase_ == MessageOneofCase.SetRecordingDevice) { + subBuilder.MergeFrom(SetRecordingDevice); + } + input.ReadMessage(subBuilder); + SetRecordingDevice = subBuilder; + break; + } + case 626: { + global::LiveKit.Proto.SetPlayoutDeviceResponse subBuilder = new global::LiveKit.Proto.SetPlayoutDeviceResponse(); + if (messageCase_ == MessageOneofCase.SetPlayoutDevice) { + subBuilder.MergeFrom(SetPlayoutDevice); + } + input.ReadMessage(subBuilder); + SetPlayoutDevice = subBuilder; + break; + } + case 634: { + global::LiveKit.Proto.StartRecordingResponse subBuilder = new global::LiveKit.Proto.StartRecordingResponse(); + if (messageCase_ == MessageOneofCase.StartRecording) { + subBuilder.MergeFrom(StartRecording); + } + input.ReadMessage(subBuilder); + StartRecording = subBuilder; + break; + } + case 642: { + global::LiveKit.Proto.StopRecordingResponse subBuilder = new global::LiveKit.Proto.StopRecordingResponse(); + if (messageCase_ == MessageOneofCase.StopRecording) { + subBuilder.MergeFrom(StopRecording); + } + input.ReadMessage(subBuilder); + StopRecording = subBuilder; + break; + } } } } diff --git a/Runtime/Scripts/Track.cs b/Runtime/Scripts/Track.cs index 91cc0608..b5963a37 100644 --- a/Runtime/Scripts/Track.cs +++ b/Runtime/Scripts/Track.cs @@ -112,7 +112,7 @@ internal void UpdateMuted(bool muted) public sealed class LocalAudioTrack : Track, ILocalTrack, IAudioTrack { - RtcAudioSource _source; + IRtcSource _source; IRtcSource ILocalTrack.source { get => _source; } @@ -120,6 +120,10 @@ internal LocalAudioTrack(OwnedTrack track, Room room, RtcAudioSource source) : b _source = source; } + internal LocalAudioTrack(OwnedTrack track, Room room, PlatformAudioSource source) : base(track, room, room?.LocalParticipant) { + _source = source; + } + public static LocalAudioTrack CreateAudioTrack(string name, RtcAudioSource source, Room room) { using var request = FFIBridge.Instance.NewRequest(); @@ -133,6 +137,20 @@ public static LocalAudioTrack CreateAudioTrack(string name, RtcAudioSource sourc var track = new LocalAudioTrack(trackInfo, room, source); return track; } + + public static LocalAudioTrack CreateAudioTrack(string name, PlatformAudioSource source, Room room) + { + using var request = FFIBridge.Instance.NewRequest(); + var createTrack = request.request; + createTrack.Name = name; + createTrack.SourceHandle = (ulong)source.Handle.DangerousGetHandle(); + + using var resp = request.Send(); + FfiResponse res = resp; + var trackInfo = res.CreateAudioTrack.Track; + var track = new LocalAudioTrack(trackInfo, room, source); + return track; + } } public sealed class LocalVideoTrack : Track, ILocalTrack, IVideoTrack diff --git a/Samples~/Meet/Assets/Runtime/MeetManager.cs b/Samples~/Meet/Assets/Runtime/MeetManager.cs index fed49205..0fd3261b 100644 --- a/Samples~/Meet/Assets/Runtime/MeetManager.cs +++ b/Samples~/Meet/Assets/Runtime/MeetManager.cs @@ -8,6 +8,12 @@ /// /// Manages a LiveKit room connection with local/remote audio and video tracks. +/// +/// Supports two audio modes: +/// - PlatformAudio (default): Uses WebRTC's ADM for microphone capture and automatic +/// speaker playout. Provides echo cancellation (AEC), AGC, and noise suppression. +/// - Unity Audio: Uses Unity's Microphone API and AudioStream for manual audio handling. +/// No AEC support but gives more control over audio processing. /// [RequireComponent(typeof(TokenSourceComponent))] public class MeetManager : MonoBehaviour @@ -23,6 +29,21 @@ public class MeetManager : MonoBehaviour [SerializeField] private ParticipantTile participantTilePrefab; [SerializeField] private int frameRate = 30; + [Header("Audio Mode")] + [Tooltip("Use PlatformAudio (WebRTC ADM) for microphone capture and automatic speaker playout. " + + "Provides AEC, AGC, and NS. Disable to use Unity's Microphone API instead.")] + [SerializeField] private bool usePlatformAudio = true; + + [Header("Audio Processing (PlatformAudio only)")] + [Tooltip("Enable echo cancellation to remove echo from speaker playback.")] + [SerializeField] private bool echoCancellation = true; + [Tooltip("Enable noise suppression to remove background noise.")] + [SerializeField] private bool noiseSuppression = true; + [Tooltip("Enable auto gain control to normalize audio levels.")] + [SerializeField] private bool autoGainControl = true; + [Tooltip("Prefer hardware audio processing (e.g., iOS VPIO). Lower latency but may have different quality characteristics.")] + [SerializeField] private bool preferHardwareProcessing = true; + private const string PlaceholderTextureResourceName = "PlaceholderTileSquare"; private Texture _placeholderTexture; @@ -42,11 +63,14 @@ public class MeetManager : MonoBehaviour private RtcVideoSource _localRtcVideoSource; private RtcAudioSource _localRtcAudioSource; + private PlatformAudioSource _platformAudioSource; private LocalVideoTrack _localVideoTrack; private LocalAudioTrack _localAudioTrack; private bool _cameraActive; private bool _microphoneActive; + private PlatformAudio _platformAudio; + #region Lifecycle private void Start() @@ -62,6 +86,41 @@ private void Start() _audioTrackParent = new GameObject("AudioTrackParent").transform; _placeholderTexture = Resources.Load(PlaceholderTextureResourceName); + + if (usePlatformAudio) + InitializePlatformAudio(); + } + + private void InitializePlatformAudio() + { + try + { + _platformAudio = new PlatformAudio(); + Debug.Log($"PlatformAudio initialized: {_platformAudio.RecordingDeviceCount} mics, " + + $"{_platformAudio.PlayoutDeviceCount} speakers"); + + var (recording, playout) = _platformAudio.GetDevices(); + Debug.Log("Recording devices:"); + foreach (var device in recording) + Debug.Log($" [{device.Index}] {device.Name}"); + + Debug.Log("Playout devices:"); + foreach (var device in playout) + Debug.Log($" [{device.Index}] {device.Name}"); + + if (_platformAudio.RecordingDeviceCount > 0) + _platformAudio.SetRecordingDevice(0); + if (_platformAudio.PlayoutDeviceCount > 0) + _platformAudio.SetPlayoutDevice(0); + + Debug.Log($"PlatformAudio ready. AEC={echoCancellation}, NS={noiseSuppression}, AGC={autoGainControl}, HW={preferHardwareProcessing}"); + } + catch (System.Exception e) + { + Debug.LogError($"Failed to initialize PlatformAudio, falling back to Unity audio: {e.Message}"); + usePlatformAudio = false; + _platformAudio = null; + } } private void OnApplicationPause(bool pause) @@ -90,6 +149,8 @@ private void OnDestroy() } CleanUpAllTracks(); _webCamTexture?.Stop(); + _platformAudioSource?.Dispose(); + _platformAudio?.Dispose(); } #endregion @@ -180,7 +241,7 @@ private IEnumerator ConnectToRoom() yield break; } - Debug.Log($"Connected to {_room.Name}"); + Debug.Log($"Connected to {_room.Name} (PlatformAudio: {usePlatformAudio})"); _localId = _room.LocalParticipant.Identity; buttonBar.SetConnected(true); @@ -294,6 +355,15 @@ private void RemoveExtraVideoTile(string sid) private void AddRemoteAudioTrack(RemoteAudioTrack audioTrack) { var sid = audioTrack.Sid; + + if (usePlatformAudio && _platformAudio != null) + { + // PlatformAudio mode: ADM handles speaker playback automatically. + // No AudioStream / GameObject needed. + Debug.Log($"Remote audio track {sid} will play via PlatformAudio (automatic)"); + return; + } + var audioObject = new GameObject($"AudioTrack: {sid}"); audioObject.transform.SetParent(_audioTrackParent); @@ -308,8 +378,8 @@ private void RemoveRemoteAudioTrack(string sid) { if (_audioObjects.TryGetValue(sid, out var obj)) { - obj.GetComponent()?.Stop(); - Destroy(obj); + if (obj != null) obj.GetComponent()?.Stop(); + if (obj != null) Destroy(obj); _audioObjects.Remove(sid); } @@ -450,7 +520,68 @@ private void UnpublishLocalCamera() private IEnumerator PublishLocalMicrophone() { - if (_audioObjects.ContainsKey(LocalAudioTrackName)) yield break; + if (_microphoneActive) yield break; + + if (usePlatformAudio && _platformAudio != null) + yield return PublishLocalMicrophonePlatform(); + else + yield return PublishLocalMicrophoneUnity(); + + if (_microphoneActive && _participantTiles.TryGetValue(_localId, out var tile)) + tile.SetMicMuted(false); + } + + private IEnumerator PublishLocalMicrophonePlatform() + { + Debug.Log("Publishing microphone using PlatformAudio (ADM)"); + + // Start recording (in case it was stopped by a previous mute). + // This turns on the privacy indicator on macOS/iOS. + try + { + _platformAudio?.StartRecording(); + } + catch (System.Exception e) + { + Debug.LogWarning($"Failed to start recording (may already be started): {e.Message}"); + } + + var audioOptions = new AudioProcessingOptions + { + EchoCancellation = echoCancellation, + NoiseSuppression = noiseSuppression, + AutoGainControl = autoGainControl, + PreferHardware = preferHardwareProcessing + }; + + _platformAudioSource = new PlatformAudioSource(_platformAudio, audioOptions); + _localAudioTrack = LocalAudioTrack.CreateAudioTrack(LocalAudioTrackName, _platformAudioSource, _room); + + var options = new TrackPublishOptions + { + AudioEncoding = new AudioEncoding { MaxBitrate = 64000 }, + Source = TrackSource.SourceMicrophone + }; + + var publish = _room.LocalParticipant.PublishTrack(_localAudioTrack, options); + yield return publish; + + if (publish.IsError) + { + Debug.LogError("Failed to publish microphone track"); + _platformAudioSource?.Dispose(); + _platformAudioSource = null; + _localAudioTrack = null; + yield break; + } + + _microphoneActive = true; + Debug.Log("Microphone published via PlatformAudio (AEC enabled)"); + } + + private IEnumerator PublishLocalMicrophoneUnity() + { + Debug.Log("Publishing microphone using Unity Microphone API"); Microphone.Start(null, true, 10, 44100); @@ -470,26 +601,50 @@ private IEnumerator PublishLocalMicrophone() var publish = _room.LocalParticipant.PublishTrack(_localAudioTrack, options); yield return publish; - if (publish.IsError) yield break; + if (publish.IsError) + { + Destroy(audioObject); + _localAudioTrack = null; + yield break; + } _microphoneActive = true; _audioObjects[LocalAudioTrackName] = audioObject; _localRtcAudioSource = rtcSource; rtcSource.Start(); - if (_participantTiles.TryGetValue(_localId, out var tile)) - tile.SetMicMuted(false); + Debug.Log("Microphone published via Unity Microphone API (no AEC)"); } private void UnpublishLocalMicrophone() { - DisposeSource(ref _localRtcAudioSource); + if (usePlatformAudio && _platformAudioSource != null) + { + try + { + _platformAudio?.StopRecording(); + } + catch (System.Exception e) + { + Debug.LogWarning($"Failed to stop recording: {e.Message}"); + } - if (_audioObjects.TryGetValue(LocalAudioTrackName, out var obj)) + _platformAudioSource.Dispose(); + _platformAudioSource = null; + } + else { - obj.GetComponent()?.Stop(); - Destroy(obj); - _audioObjects.Remove(LocalAudioTrackName); + DisposeSource(ref _localRtcAudioSource); + + if (_audioObjects.TryGetValue(LocalAudioTrackName, out var obj)) + { + if (obj != null) + { + obj.GetComponent()?.Stop(); + Destroy(obj); + } + _audioObjects.Remove(LocalAudioTrackName); + } } _room.LocalParticipant.UnpublishTrack(_localAudioTrack, false); @@ -563,8 +718,12 @@ private void CleanUpAllTracks() DisposeSource(ref _localRtcAudioSource); DisposeSource(ref _localRtcVideoSource); + _platformAudioSource?.Dispose(); + _platformAudioSource = null; + foreach (var obj in _audioObjects.Values) { + if (obj == null) continue; obj.GetComponent()?.Stop(); Destroy(obj); } @@ -603,4 +762,4 @@ private void CleanUpAllTracks() } #endregion -} \ No newline at end of file +} diff --git a/Samples~/Meet/Assets/Scenes/MeetApp.unity b/Samples~/Meet/Assets/Scenes/MeetApp.unity index 2205fdcf..8ebf02ad 100644 --- a/Samples~/Meet/Assets/Scenes/MeetApp.unity +++ b/Samples~/Meet/Assets/Scenes/MeetApp.unity @@ -903,6 +903,11 @@ MonoBehaviour: videoTrackParent: {fileID: 2128321498} participantTilePrefab: {fileID: 4315784896331113596, guid: bec493bbc3d574c07b5bbf8dd2be26b3, type: 3} frameRate: 30 + usePlatformAudio: 1 + echoCancellation: 1 + noiseSuppression: 1 + autoGainControl: 1 + preferHardwareProcessing: 1 --- !u!114 &1478206705 MonoBehaviour: m_ObjectHideFlags: 0 @@ -915,7 +920,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a498c208deeab40c39b4ba609d7d222c, type: 3} m_Name: m_EditorClassIdentifier: - _config: {fileID: 11400000, guid: 1a1b8efb5101449b280f574f853b7459, type: 2} + _config: {fileID: 11400000, guid: df703bb767abf4ec7b2e3caeacea4f9f, type: 2} --- !u!1 &1651282853 GameObject: m_ObjectHideFlags: 0 diff --git a/client-sdk-rust~ b/client-sdk-rust~ index b885d475..67289ce0 160000 --- a/client-sdk-rust~ +++ b/client-sdk-rust~ @@ -1 +1 @@ -Subproject commit b885d475538ace130ea6884d615556863b2f0a44 +Subproject commit 67289ce0ee5ed90f8d627e014e05d959e3ec0ccf