From 728b9c5f10d9c60b85914e6d4ae3b60288d4b120 Mon Sep 17 00:00:00 2001 From: Nitin Janyani Date: Wed, 28 Jan 2026 00:27:54 +0530 Subject: [PATCH 1/6] add control mic option to SessionOptions --- lib/src/agent/session.dart | 14 ++++++++++++-- lib/src/agent/session_options.dart | 11 +++++++++++ pubspec.lock | 8 ++++---- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/lib/src/agent/session.dart b/lib/src/agent/session.dart index deae3289..a0d9088a 100644 --- a/lib/src/agent/session.dart +++ b/lib/src/agent/session.dart @@ -146,9 +146,17 @@ class Session extends DisposableChangeNotifier { static final Uuid _uuid = const Uuid(); final Room room; - final SessionOptions _options; final _TokenSourceConfiguration _tokenSourceConfiguration; + SessionOptions get options => _options; + + set options(SessionOptions value) { + _options = value; + notifyListeners(); + } + + SessionOptions _options; + final Agent _agent = Agent(); Agent get agent => _agent; @@ -211,7 +219,9 @@ class Session extends DisposableChangeNotifier { _setConnectionState(ConnectionState.connecting); _agent.connecting(buffering: false); dispatchesAgent = await connect(); - await room.localParticipant?.setMicrophoneEnabled(true); + if (_options.defaultMicrophoneEnabled) { + await room.localParticipant?.setMicrophoneEnabled(true); + } } if (dispatchesAgent) { diff --git a/lib/src/agent/session_options.dart b/lib/src/agent/session_options.dart index eb6d262c..1c4ed441 100644 --- a/lib/src/agent/session_options.dart +++ b/lib/src/agent/session_options.dart @@ -30,21 +30,32 @@ class SessionOptions { /// to a failed state. final Duration agentConnectTimeout; + /// Whether to enable the microphone by default when the session starts. + /// + /// If set to `true`, the microphone will be enabled automatically after connecting + /// to the room. If set to `false`, the microphone will remain disabled until + /// explicitly enabled. + /// Defaults to `true`. + final bool defaultMicrophoneEnabled; + SessionOptions({ Room? room, this.preConnectAudio = true, this.agentConnectTimeout = const Duration(seconds: 20), + this.defaultMicrophoneEnabled = true, }) : room = room ?? Room(); SessionOptions copyWith({ Room? room, bool? preConnectAudio, Duration? agentConnectTimeout, + bool? defaultMicrophoneEnabled, }) { return SessionOptions( room: room ?? this.room, preConnectAudio: preConnectAudio ?? this.preConnectAudio, agentConnectTimeout: agentConnectTimeout ?? this.agentConnectTimeout, + defaultMicrophoneEnabled: defaultMicrophoneEnabled ?? this.defaultMicrophoneEnabled, ); } } diff --git a/pubspec.lock b/pubspec.lock index 8d498a6d..8e0775de 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -452,10 +452,10 @@ packages: dependency: "direct main" description: name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.16.0" mime: dependency: transitive description: @@ -721,10 +721,10 @@ packages: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.6" timing: dependency: transitive description: From d54018bde6a90f66545859ab547e68838e4bac10 Mon Sep 17 00:00:00 2001 From: Nitin Janyani <42694025+NTJ3@users.noreply.github.com> Date: Wed, 28 Jan 2026 00:40:58 +0530 Subject: [PATCH 2/6] Keep Session.room authoritative to avoid split-brain state. Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- lib/src/agent/session.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/src/agent/session.dart b/lib/src/agent/session.dart index a0d9088a..c19461ed 100644 --- a/lib/src/agent/session.dart +++ b/lib/src/agent/session.dart @@ -151,6 +151,10 @@ class Session extends DisposableChangeNotifier { SessionOptions get options => _options; set options(SessionOptions value) { + if (!identical(value.room, room)) { + // Keep Session.room authoritative to avoid split-brain state. + value = value.copyWith(room: room); + } _options = value; notifyListeners(); } From 514dc146d8bd4f4616bc7b7a9f367215ab8b14fe Mon Sep 17 00:00:00 2001 From: Nitin Janyani Date: Wed, 28 Jan 2026 00:46:23 +0530 Subject: [PATCH 3/6] set default value to false of preConnectAudio --- lib/src/agent/session_options.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/agent/session_options.dart b/lib/src/agent/session_options.dart index 1c4ed441..8de39c8d 100644 --- a/lib/src/agent/session_options.dart +++ b/lib/src/agent/session_options.dart @@ -40,7 +40,7 @@ class SessionOptions { SessionOptions({ Room? room, - this.preConnectAudio = true, + this.preConnectAudio = false, this.agentConnectTimeout = const Duration(seconds: 20), this.defaultMicrophoneEnabled = true, }) : room = room ?? Room(); From ea126730005f7dcb5ae82e0e88d6cf578d1f64b9 Mon Sep 17 00:00:00 2001 From: Nitin Janyani Date: Wed, 28 Jan 2026 00:27:54 +0530 Subject: [PATCH 4/6] add control mic option to SessionOptions --- lib/src/agent/session.dart | 14 ++++++++++++-- lib/src/agent/session_options.dart | 11 +++++++++++ pubspec.lock | 8 ++++---- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/lib/src/agent/session.dart b/lib/src/agent/session.dart index deae3289..a0d9088a 100644 --- a/lib/src/agent/session.dart +++ b/lib/src/agent/session.dart @@ -146,9 +146,17 @@ class Session extends DisposableChangeNotifier { static final Uuid _uuid = const Uuid(); final Room room; - final SessionOptions _options; final _TokenSourceConfiguration _tokenSourceConfiguration; + SessionOptions get options => _options; + + set options(SessionOptions value) { + _options = value; + notifyListeners(); + } + + SessionOptions _options; + final Agent _agent = Agent(); Agent get agent => _agent; @@ -211,7 +219,9 @@ class Session extends DisposableChangeNotifier { _setConnectionState(ConnectionState.connecting); _agent.connecting(buffering: false); dispatchesAgent = await connect(); - await room.localParticipant?.setMicrophoneEnabled(true); + if (_options.defaultMicrophoneEnabled) { + await room.localParticipant?.setMicrophoneEnabled(true); + } } if (dispatchesAgent) { diff --git a/lib/src/agent/session_options.dart b/lib/src/agent/session_options.dart index eb6d262c..1c4ed441 100644 --- a/lib/src/agent/session_options.dart +++ b/lib/src/agent/session_options.dart @@ -30,21 +30,32 @@ class SessionOptions { /// to a failed state. final Duration agentConnectTimeout; + /// Whether to enable the microphone by default when the session starts. + /// + /// If set to `true`, the microphone will be enabled automatically after connecting + /// to the room. If set to `false`, the microphone will remain disabled until + /// explicitly enabled. + /// Defaults to `true`. + final bool defaultMicrophoneEnabled; + SessionOptions({ Room? room, this.preConnectAudio = true, this.agentConnectTimeout = const Duration(seconds: 20), + this.defaultMicrophoneEnabled = true, }) : room = room ?? Room(); SessionOptions copyWith({ Room? room, bool? preConnectAudio, Duration? agentConnectTimeout, + bool? defaultMicrophoneEnabled, }) { return SessionOptions( room: room ?? this.room, preConnectAudio: preConnectAudio ?? this.preConnectAudio, agentConnectTimeout: agentConnectTimeout ?? this.agentConnectTimeout, + defaultMicrophoneEnabled: defaultMicrophoneEnabled ?? this.defaultMicrophoneEnabled, ); } } diff --git a/pubspec.lock b/pubspec.lock index 8d498a6d..8e0775de 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -452,10 +452,10 @@ packages: dependency: "direct main" description: name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.16.0" mime: dependency: transitive description: @@ -721,10 +721,10 @@ packages: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.6" timing: dependency: transitive description: From b551463b932eb9e28a19cd1bf3326950375130f5 Mon Sep 17 00:00:00 2001 From: Nitin Janyani <42694025+NTJ3@users.noreply.github.com> Date: Wed, 28 Jan 2026 00:40:58 +0530 Subject: [PATCH 5/6] Keep Session.room authoritative to avoid split-brain state. Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- lib/src/agent/session.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/src/agent/session.dart b/lib/src/agent/session.dart index a0d9088a..c19461ed 100644 --- a/lib/src/agent/session.dart +++ b/lib/src/agent/session.dart @@ -151,6 +151,10 @@ class Session extends DisposableChangeNotifier { SessionOptions get options => _options; set options(SessionOptions value) { + if (!identical(value.room, room)) { + // Keep Session.room authoritative to avoid split-brain state. + value = value.copyWith(room: room); + } _options = value; notifyListeners(); } From 6645c2fc5994d72e60b7cc18858a9461fb115b68 Mon Sep 17 00:00:00 2001 From: Nitin Janyani Date: Wed, 28 Jan 2026 00:46:23 +0530 Subject: [PATCH 6/6] set default value to false of preConnectAudio --- lib/src/agent/session_options.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/agent/session_options.dart b/lib/src/agent/session_options.dart index 1c4ed441..8de39c8d 100644 --- a/lib/src/agent/session_options.dart +++ b/lib/src/agent/session_options.dart @@ -40,7 +40,7 @@ class SessionOptions { SessionOptions({ Room? room, - this.preConnectAudio = true, + this.preConnectAudio = false, this.agentConnectTimeout = const Duration(seconds: 20), this.defaultMicrophoneEnabled = true, }) : room = room ?? Room();