diff --git a/lib/src/agent/session.dart b/lib/src/agent/session.dart index deae3289..c19461ed 100644 --- a/lib/src/agent/session.dart +++ b/lib/src/agent/session.dart @@ -146,9 +146,21 @@ 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) { + if (!identical(value.room, room)) { + // Keep Session.room authoritative to avoid split-brain state. + value = value.copyWith(room: room); + } + _options = value; + notifyListeners(); + } + + SessionOptions _options; + final Agent _agent = Agent(); Agent get agent => _agent; @@ -211,7 +223,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..8de39c8d 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.preConnectAudio = false, 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: