From f9a66f4c865aba02107237636c32beb9146e1686 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Mon, 16 Jun 2025 20:51:16 +0900 Subject: [PATCH 1/2] Move transcription segment --- lib/livekit_client.dart | 25 +++++++++-------- lib/src/core/room.dart | 1 + lib/src/events.dart | 20 ++------------ lib/src/types/transcription_segment.dart | 34 ++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 31 deletions(-) create mode 100644 lib/src/types/transcription_segment.dart diff --git a/lib/livekit_client.dart b/lib/livekit_client.dart index 43d0850b3..154ff5a3b 100644 --- a/lib/livekit_client.dart +++ b/lib/livekit_client.dart @@ -17,12 +17,14 @@ library livekit_client; export 'src/constants.dart'; export 'src/core/room.dart'; -export 'src/events.dart'; -export 'src/exceptions.dart'; +export 'src/data_stream/stream_reader.dart'; +export 'src/data_stream/stream_writer.dart'; export 'src/e2ee/e2ee_manager.dart'; export 'src/e2ee/events.dart'; -export 'src/e2ee/options.dart'; export 'src/e2ee/key_provider.dart'; +export 'src/e2ee/options.dart'; +export 'src/events.dart'; +export 'src/exceptions.dart'; export 'src/extensions.dart' show WidgetsBindingCompatible; export 'src/hardware/hardware.dart'; export 'src/livekit.dart'; @@ -36,28 +38,25 @@ export 'src/publication/local.dart'; export 'src/publication/remote.dart'; export 'src/publication/track_publication.dart'; export 'src/support/platform.dart'; +export 'src/track/audio_visualizer.dart'; export 'src/track/local/audio.dart'; export 'src/track/local/local.dart'; export 'src/track/local/video.dart'; export 'src/track/options.dart'; +export 'src/track/processor.dart'; +export 'src/track/processor_native.dart' + if (dart.library.js_interop) 'src/track/processor_web.dart'; export 'src/track/remote/audio.dart'; export 'src/track/remote/remote.dart'; export 'src/track/remote/video.dart'; export 'src/track/track.dart'; - -export 'src/track/processor.dart'; -export 'src/track/processor_native.dart' - if (dart.library.js_interop) 'src/track/processor_web.dart'; - -export 'src/track/audio_visualizer.dart'; +export 'src/types/data_stream.dart'; export 'src/types/other.dart'; export 'src/types/participant_permissions.dart'; +export 'src/types/rpc.dart'; +export 'src/types/transcription_segment.dart'; export 'src/types/video_dimensions.dart'; export 'src/types/video_encoding.dart'; export 'src/types/video_parameters.dart'; -export 'src/types/rpc.dart'; export 'src/widgets/screen_select_dialog.dart'; export 'src/widgets/video_track_renderer.dart'; -export 'src/data_stream/stream_reader.dart'; -export 'src/data_stream/stream_writer.dart'; -export 'src/types/data_stream.dart'; diff --git a/lib/src/core/room.dart b/lib/src/core/room.dart index 60cf13576..478d26322 100644 --- a/lib/src/core/room.dart +++ b/lib/src/core/room.dart @@ -47,6 +47,7 @@ import '../track/track.dart'; import '../types/data_stream.dart'; import '../types/other.dart'; import '../types/rpc.dart'; +import '../types/transcription_segment.dart'; import '../utils.dart'; import 'engine.dart'; diff --git a/lib/src/events.dart b/lib/src/events.dart index aae527bb3..ef25292d7 100644 --- a/lib/src/events.dart +++ b/lib/src/events.dart @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -import 'package:livekit_client/src/track/processor.dart'; import 'core/engine.dart'; import 'core/room.dart'; import 'core/signal_client.dart'; @@ -23,9 +22,11 @@ import 'publication/local.dart'; import 'publication/remote.dart'; import 'publication/track_publication.dart'; import 'stats/stats.dart'; +import 'track/processor.dart'; import 'track/track.dart'; import 'types/other.dart'; import 'types/participant_permissions.dart'; +import 'types/transcription_segment.dart'; /// Base type for all LiveKit events. mixin LiveKitEvent {} @@ -460,23 +461,6 @@ class ParticipantPermissionsUpdatedEvent with RoomEvent, ParticipantEvent { '(participant: ${participant}, permissions: ${permissions})'; } -class TranscriptionSegment { - final String id; - final String text; - final DateTime firstReceivedTime; - final DateTime lastReceivedTime; - final bool isFinal; - final String language; - const TranscriptionSegment({ - required this.id, - required this.text, - required this.firstReceivedTime, - required this.lastReceivedTime, - required this.isFinal, - required this.language, - }); -} - /// Transcription event received from the server. class TranscriptionEvent with RoomEvent, ParticipantEvent { final Participant participant; diff --git a/lib/src/types/transcription_segment.dart b/lib/src/types/transcription_segment.dart new file mode 100644 index 000000000..37d61aded --- /dev/null +++ b/lib/src/types/transcription_segment.dart @@ -0,0 +1,34 @@ +// Copyright 2025 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 'package:flutter/foundation.dart'; + +@immutable +class TranscriptionSegment { + final String id; + final String text; + final DateTime firstReceivedTime; + final DateTime lastReceivedTime; + final bool isFinal; + final String language; + + const TranscriptionSegment({ + required this.id, + required this.text, + required this.firstReceivedTime, + required this.lastReceivedTime, + required this.isFinal, + required this.language, + }); +} From f708bcffb9ce0580ea093c4a699d6875e84a04fc Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Mon, 16 Jun 2025 20:51:42 +0900 Subject: [PATCH 2/2] Use uuidv4 for visualizer id --- lib/src/track/audio_visualizer.dart | 15 +++++++++------ lib/src/track/audio_visualizer_native.dart | 16 ++++++---------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/src/track/audio_visualizer.dart b/lib/src/track/audio_visualizer.dart index 3c240dae6..594eafa00 100644 --- a/lib/src/track/audio_visualizer.dart +++ b/lib/src/track/audio_visualizer.dart @@ -2,9 +2,11 @@ import 'package:livekit_client/src/support/disposable.dart'; import '../events.dart' show AudioVisualizerEvent; import '../managers/event.dart' show EventsEmittable; import 'local/local.dart' show AudioTrack; +import 'package:uuid/uuid.dart' as uuid; -import 'audio_visualizer_native.dart' - if (dart.library.js_interop) 'audio_visualizer_web.dart'; +import 'audio_visualizer_native.dart' if (dart.library.js_interop) 'audio_visualizer_web.dart'; + +final _uuid = uuid.Uuid(); class AudioVisualizerOptions { final bool centeredBands; @@ -17,12 +19,13 @@ class AudioVisualizerOptions { }); } -abstract class AudioVisualizer extends DisposableChangeNotifier - with EventsEmittable { +abstract class AudioVisualizer extends DisposableChangeNotifier with EventsEmittable { + // Unique Id for each visualizer + final String visualizerId = _uuid.v4(); + Future start(); Future stop(); } -AudioVisualizer createVisualizer(AudioTrack track, - {AudioVisualizerOptions? options}) => +AudioVisualizer createVisualizer(AudioTrack track, {AudioVisualizerOptions? options}) => createVisualizerImpl(track, options: options); diff --git a/lib/src/track/audio_visualizer_native.dart b/lib/src/track/audio_visualizer_native.dart index fea57a502..ca3b72503 100644 --- a/lib/src/track/audio_visualizer_native.dart +++ b/lib/src/track/audio_visualizer_native.dart @@ -1,21 +1,22 @@ import 'dart:async'; import 'package:flutter/services.dart'; - import 'package:flutter_webrtc/flutter_webrtc.dart'; -import 'package:livekit_client/src/events.dart' show AudioVisualizerEvent; -import 'package:livekit_client/src/track/local/local.dart'; +import '../events.dart' show AudioVisualizerEvent; import '../support/native.dart' show Native; +import '../track/local/local.dart'; import 'audio_visualizer.dart'; class AudioVisualizerNative extends AudioVisualizer { - final String visualizerId = '${DateTime.now().millisecondsSinceEpoch}'; EventChannel? _eventChannel; StreamSubscription? _streamSubscription; + final AudioTrack? _audioTrack; - MediaStreamTrack get mediaStreamTrack => _audioTrack!.mediaStreamTrack; final AudioVisualizerOptions visualizerOptions; + + MediaStreamTrack get mediaStreamTrack => _audioTrack!.mediaStreamTrack; + AudioVisualizerNative(this._audioTrack, {required this.visualizerOptions}) { onDispose(() async { await events.dispose(); @@ -56,11 +57,6 @@ class AudioVisualizerNative extends AudioVisualizer { await Native.stopVisualizer(mediaStreamTrack.id!, visualizerId: visualizerId); - events.emit(AudioVisualizerEvent( - track: _audioTrack!, - event: [], - )); - await _streamSubscription?.cancel(); _streamSubscription = null; _eventChannel = null;