Skip to content

Commit 0f683d2

Browse files
✨ Add onCompletion stream 🐛 The visualization gets stuck incomplete.
1 parent 8e276f9 commit 0f683d2

File tree

8 files changed

+44
-13
lines changed

8 files changed

+44
-13
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 1.0.1
2+
3+
- Added `onCompletion` stream to get event when audio is finished playing.
4+
- Fixed [#145](https://github.com/SimformSolutionsPvtLtd/audio_waveforms/issues/145) - The visualization gets stuck incomplete.
5+
16
## 1.0.0
27

38
- Reworked waveforms from audio file

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ controller.onPlayerStateChanged.listen((state) {}); // Listening
129129
controller.onCurrentDurationChanged.listen((duration) {}); // Listening to current duration changes
130130
controller.onCurrentExtractedWaveformData.listen((data) {}); // Listening to latest extraction data
131131
controller.onExtractionProgress.listen((progress) {}); // Listening to extraction progress
132+
controller.onCompletion.listen((_){}); // Listening to audio completion
132133
controller.stopAllPlayer(); // Stop all registered audio players
133134
controller.dispose(); // Dispose controller
134135
```

android/src/main/kotlin/com/simform/audio_waveforms/Utils.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ object Constants {
6161
const val noOfSamples = "noOfSamples"
6262
const val onCurrentExtractedWaveformData = "onCurrentExtractedWaveformData"
6363
const val waveformData = "waveformData"
64-
const val onExtractionProgressUpdate = "onExtractionProgressUpdate"
6564
}
6665

6766
enum class FinishMode(val value:Int) {

lib/src/audio_file_waveforms.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ class _AudioFileWaveformsState extends State<AudioFileWaveforms>
111111
late Clip? clipBehavior;
112112
late PlayerWaveStyle? playerWaveStyle;
113113
late StreamSubscription<int> onCurrentDurationSubscription;
114+
late StreamSubscription<void> onCompletionSubscription;
114115
StreamSubscription<List<double>>? onCurrentExtractedWaveformData;
115116

116117
@override
@@ -135,6 +136,11 @@ class _AudioFileWaveformsState extends State<AudioFileWaveforms>
135136
_updatePlayerPercent(widget.size);
136137
});
137138

139+
onCompletionSubscription =
140+
widget.playerController.onCompletion.listen((event) {
141+
_seekProgress.value = widget.playerController.maxDuration;
142+
_updatePlayerPercent(widget.size);
143+
});
138144
if (widget.waveformData.isNotEmpty) {
139145
_addWaveformData(widget.waveformData);
140146
} else {
@@ -155,6 +161,7 @@ class _AudioFileWaveformsState extends State<AudioFileWaveforms>
155161
void dispose() {
156162
onCurrentDurationSubscription.cancel();
157163
onCurrentExtractedWaveformData?.cancel();
164+
onCompletionSubscription.cancel();
158165
widget.playerController.removeListener(_addWaveformDataFromController);
159166
_growingWaveController.dispose();
160167
super.dispose();

lib/src/base/audio_waveforms_interface.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@ class AudioWaveformsInterface {
169169
var duration = call.arguments[Constants.current];
170170
var key = call.arguments[Constants.playerKey];
171171
if (duration.runtimeType == int) {
172-
var indentifier = PlayerIdentifier<int>(key, duration);
173-
PlatformStreams.instance.addCurrentDurationEvent(indentifier);
172+
var identifier = PlayerIdentifier<int>(key, duration);
173+
PlatformStreams.instance.addCurrentDurationEvent(identifier);
174174
}
175175
break;
176176
case Constants.onDidFinishPlayingAudio:
@@ -181,8 +181,10 @@ class AudioWaveformsInterface {
181181
: call.arguments[Constants.finishtype] == 1
182182
? PlayerState.paused
183183
: PlayerState.stopped;
184-
var indentifier = PlayerIdentifier<PlayerState>(key, playerState);
185-
PlatformStreams.instance.addPlayerStateEvent(indentifier);
184+
var stateIdentifier = PlayerIdentifier<PlayerState>(key, playerState);
185+
var completionIdentifier = PlayerIdentifier<void>(key, null);
186+
PlatformStreams.instance.addCompletionEvent(completionIdentifier);
187+
PlatformStreams.instance.addPlayerStateEvent(stateIdentifier);
186188
if (PlatformStreams.instance.playerControllerFactory[key] != null) {
187189
PlatformStreams.instance.playerControllerFactory[key]
188190
?._playerState = playerState;
@@ -204,7 +206,7 @@ class AudioWaveformsInterface {
204206
});
205207
}
206208

207-
void removeMethodCallHandeler() {
209+
void removeMethodCallHandler() {
208210
_methodChannel.setMethodCallHandler(null);
209211
}
210212
}

lib/src/base/platform_streams.dart

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class PlatformStreams {
3232
StreamController<PlayerIdentifier<List<double>>>.broadcast();
3333
_extractionProgressController =
3434
StreamController<PlayerIdentifier<double>>.broadcast();
35+
_completionController =
36+
StreamController<PlayerIdentifier<void>>.broadcast();
3537
await AudioWaveformsInterface.instance.setMethodCallHandler();
3638
}
3739

@@ -47,11 +49,15 @@ class PlatformStreams {
4749
Stream<PlayerIdentifier<double>> get onExtractionProgress =>
4850
_extractionProgressController.stream;
4951

52+
Stream<PlayerIdentifier<void>> get onCompletion =>
53+
_completionController.stream;
54+
5055
late StreamController<PlayerIdentifier<int>> _currentDurationController;
5156
late StreamController<PlayerIdentifier<PlayerState>> _playerStateController;
5257
late StreamController<PlayerIdentifier<List<double>>>
5358
_extractedWaveformDataController;
5459
late StreamController<PlayerIdentifier<double>> _extractionProgressController;
60+
late StreamController<PlayerIdentifier<void>> _completionController;
5561

5662
void addCurrentDurationEvent(PlayerIdentifier<int> playerIdentifier) {
5763
if (!_currentDurationController.isClosed) {
@@ -72,18 +78,25 @@ class PlatformStreams {
7278
}
7379
}
7480

75-
void addExtractionProgress(PlayerIdentifier<double> progress) async {
81+
void addExtractionProgress(PlayerIdentifier<double> progress) {
7682
if (!_extractionProgressController.isClosed) {
7783
_extractionProgressController.add(progress);
7884
}
7985
}
8086

87+
void addCompletionEvent(PlayerIdentifier<void> event) {
88+
if (!_completionController.isClosed) {
89+
_completionController.add(event);
90+
}
91+
}
92+
8193
void dispose() {
8294
_currentDurationController.close();
8395
_playerStateController.close();
8496
_extractedWaveformDataController.close();
8597
_currentDurationController.close();
86-
AudioWaveformsInterface.instance.removeMethodCallHandeler();
98+
_completionController.close();
99+
AudioWaveformsInterface.instance.removeMethodCallHandler();
87100
isInitialised = false;
88101
}
89102
}

lib/src/controllers/player_controller.dart

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ class PlayerController extends ChangeNotifier {
6363
Stream<double> get onExtractionProgress =>
6464
PlatformStreams.instance.onExtractionProgress.filter(playerKey);
6565

66+
/// A stream to get events when audio is finished playing.
67+
Stream<void> get onCompletion =>
68+
PlatformStreams.instance.onCompletion.filter(playerKey);
69+
6670
PlayerController() {
6771
if (!PlatformStreams.instance.isInitialised) {
6872
PlatformStreams.instance.init();
@@ -166,7 +170,7 @@ class PlayerController extends ChangeNotifier {
166170
if (_playerState == PlayerState.initialized ||
167171
_playerState == PlayerState.paused) {
168172
final isStarted = await AudioWaveformsInterface.instance
169-
.startPlayer(_playerKey.toString(), finishMode);
173+
.startPlayer(playerKey, finishMode);
170174
if (isStarted) {
171175
_setPlayerState(PlayerState.playing);
172176
} else {
@@ -189,8 +193,8 @@ class PlayerController extends ChangeNotifier {
189193

190194
/// A function to stop player. After calling this, resources are freed.
191195
Future<void> stopPlayer() async {
192-
final isStopped = await AudioWaveformsInterface.instance
193-
.stopPlayer(_playerKey.toString());
196+
final isStopped =
197+
await AudioWaveformsInterface.instance.stopPlayer(playerKey);
194198
if (isStopped) {
195199
_setPlayerState(PlayerState.stopped);
196200
}
@@ -206,7 +210,7 @@ class PlayerController extends ChangeNotifier {
206210
/// Default to 1.0
207211
Future<bool> setVolume(double volume) async {
208212
final result = await AudioWaveformsInterface.instance
209-
.setVolume(volume, _playerKey.toString());
213+
.setVolume(volume, playerKey);
210214
return result;
211215
}
212216

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: audio_waveforms
22
description: A Flutter package that allow you to generate waveform while recording audio or from audio file.
3-
version: 1.0.0
3+
version: 1.0.1
44
homepage: https://github.com/SimformSolutionsPvtLtd/audio_waveforms
55
issue_tracker: https://github.com/SimformSolutionsPvtLtd/audio_waveforms/issues
66

0 commit comments

Comments
 (0)