Skip to content

Commit 29cd2a4

Browse files
feat: Add smoothTransition option for AudioVisualizer. (#773)
* feat: Add smoothTransition option for AudioVisualizer. * Fix smoothTransition option issues (#774) * Use smoothingTimeConstant override on the web * Fix Kotlin assignment --------- Co-authored-by: Catalin Voss <[email protected]>
1 parent e7811b4 commit 29cd2a4

File tree

8 files changed

+39
-7
lines changed

8 files changed

+39
-7
lines changed

android/src/main/kotlin/io/livekit/plugin/LiveKitPlugin.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class LiveKitPlugin: FlutterPlugin, MethodCallHandler {
5858
var audioTrack: LKAudioTrack? = null
5959
val barCount = call.argument<Int>("barCount") ?: 7
6060
val isCentered = call.argument<Boolean>("isCentered") ?: true
61+
var smoothTransition = call.argument<Boolean>("smoothTransition") ?: true
6162

6263
val track = flutterWebRTCPlugin.getLocalTrack(trackId)
6364
if (track != null) {
@@ -75,7 +76,8 @@ class LiveKitPlugin: FlutterPlugin, MethodCallHandler {
7576
}
7677

7778
val visualizer = Visualizer(
78-
barCount = barCount, isCentered = isCentered,
79+
barCount = barCount, isCentered = isCentered,
80+
smoothTransition = smoothTransition,
7981
audioTrack = audioTrack, binaryMessenger = binaryMessenger!!,
8082
visualizerId = visualizerId)
8183

android/src/main/kotlin/io/livekit/plugin/Visualizer.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import kotlin.math.*
2828
class Visualizer(
2929
private var barCount: Int,
3030
private var isCentered: Boolean,
31+
private var smoothTransition: Boolean,
3132
audioTrack: LKAudioTrack,
3233
binaryMessenger: BinaryMessenger,
3334
visualizerId: String
@@ -79,9 +80,13 @@ class Visualizer(
7980
amplitudes = centerBands(amplitudes)
8081
}
8182

82-
bands = bands.mapIndexed { index, value ->
83-
smoothTransition(value, amplitudes[index], 0.3f)
84-
}.toFloatArray()
83+
if(this.smoothTransition) {
84+
bands = bands.mapIndexed { index, value ->
85+
smoothTransition(value, amplitudes[index], 0.3f)
86+
}.toFloatArray()
87+
} else {
88+
bands = amplitudes
89+
}
8590

8691
handler.post {
8792
eventSink?.success(bands)

lib/src/support/native.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class Native {
5555
bool isCentered = true,
5656
int barCount = 7,
5757
String visualizerId = '',
58+
bool smoothTransition = true,
5859
}) async {
5960
try {
6061
final result = await channel.invokeMethod<bool>(
@@ -64,6 +65,7 @@ class Native {
6465
'isCentered': isCentered,
6566
'barCount': barCount,
6667
'visualizerId': visualizerId,
68+
'smoothTransition': smoothTransition,
6769
},
6870
);
6971
return result == true;

lib/src/track/audio_visualizer.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ import 'audio_visualizer_native.dart'
99
class AudioVisualizerOptions {
1010
final bool centeredBands;
1111
final int barCount;
12+
final bool smoothTransition;
1213
const AudioVisualizerOptions({
1314
this.centeredBands = true,
1415
this.barCount = 7,
16+
this.smoothTransition = true,
1517
});
1618
}
1719

lib/src/track/audio_visualizer_native.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class AudioVisualizerNative extends AudioVisualizer {
3333
isCentered: visualizerOptions.centeredBands,
3434
barCount: visualizerOptions.barCount,
3535
visualizerId: visualizerId,
36+
smoothTransition: visualizerOptions.smoothTransition,
3637
);
3738

3839
_eventChannel = EventChannel(

lib/src/track/audio_visualizer_web.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,19 @@ class AudioVisualizerWeb extends AudioVisualizer {
3434

3535
final bands = visualizerOptions.barCount;
3636

37-
_audioAnalyser = createAudioAnalyser(_audioTrack!, options.analyserOptions);
37+
// Override smoothingTimeConstant to a very low valiue if smoothTransition is false
38+
var currentAnalyserOptions =
39+
options.analyserOptions ?? const AudioAnalyserOptions();
40+
if (!visualizerOptions.smoothTransition) {
41+
currentAnalyserOptions = AudioAnalyserOptions(
42+
fftSize: currentAnalyserOptions.fftSize,
43+
maxDecibels: currentAnalyserOptions.maxDecibels,
44+
minDecibels: currentAnalyserOptions.minDecibels,
45+
smoothingTimeConstant: 0.02,
46+
);
47+
}
48+
49+
_audioAnalyser = createAudioAnalyser(_audioTrack!, currentAnalyserOptions);
3850

3951
final bufferLength = _audioAnalyser?.analyser.frequencyBinCount;
4052

shared_swift/LiveKitPlugin.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ public class LiveKitPlugin: NSObject, FlutterPlugin {
113113
let visualizerId = args["visualizerId"] as? String
114114
let barCount = args["barCount"] as? Int ?? 7
115115
let isCentered = args["isCentered"] as? Bool ?? true
116+
let smoothTransition = args["smoothTransition"] as? Bool ?? true
116117

117118
if visualizerId == nil {
118119
result(FlutterError(code: "visualizerId", message: "visualizerId is required", details: nil))
@@ -129,6 +130,7 @@ public class LiveKitPlugin: NSObject, FlutterPlugin {
129130
binaryMessenger: self.binaryMessenger!,
130131
bandCount: barCount,
131132
isCentered: isCentered,
133+
smoothTransition: smoothTransition,
132134
visualizerId: unwrappedVisualizerId)
133135

134136
tracks[unwrappedTrackId] = lkLocalTrack
@@ -143,6 +145,7 @@ public class LiveKitPlugin: NSObject, FlutterPlugin {
143145
binaryMessenger: self.binaryMessenger!,
144146
bandCount: barCount,
145147
isCentered: isCentered,
148+
smoothTransition: smoothTransition,
146149
visualizerId: unwrappedVisualizerId)
147150
tracks[unwrappedTrackId] = lkRemoteTrack
148151
processors[unwrappedVisualizerId] = processor

shared_swift/Visualizer.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class Visualizer: NSObject, RTCAudioRenderer, FlutterStreamHandler {
4343

4444
public let isCentered: Bool
4545
public let smoothingFactor: Float
46-
46+
public let smoothTransition: Bool
4747
public var bands: [Float]
4848

4949
private let _processor: AudioVisualizeProcessor
@@ -53,11 +53,13 @@ public class Visualizer: NSObject, RTCAudioRenderer, FlutterStreamHandler {
5353
binaryMessenger: FlutterBinaryMessenger,
5454
bandCount: Int = 7,
5555
isCentered: Bool = true,
56+
smoothTransition: Bool = true,
5657
smoothingFactor: Float = 0.3,
5758
visualizerId: String)
5859
{
5960
self.isCentered = isCentered
6061
self.smoothingFactor = smoothingFactor
62+
self.smoothTransition = smoothTransition
6163
bands = Array(repeating: 0.0, count: bandCount)
6264
_processor = AudioVisualizeProcessor(bandsCount: bandCount)
6365
_track = track
@@ -86,7 +88,10 @@ public class Visualizer: NSObject, RTCAudioRenderer, FlutterStreamHandler {
8688
guard let self else { return }
8789

8890
self.bands = zip(self.bands, newBands).map { old, new in
89-
self._smoothTransition(from: old, to: new, factor: self.smoothingFactor)
91+
if(self.smoothTransition) {
92+
return self._smoothTransition(from: old, to: new, factor: self.smoothingFactor)
93+
}
94+
return new
9095
}
9196
self.eventSink?(self.bands)
9297
}

0 commit comments

Comments
 (0)