Skip to content

Commit 2a79644

Browse files
authored
fix: Return null for duration and position, if not available (#1606)
# Description If no source is set, released, or the source is a live stream, the duration and position should return null.
1 parent 217104c commit 2a79644

19 files changed

Lines changed: 106 additions & 106 deletions

File tree

packages/audioplayers/example/integration_test/app/app_source_test_data.dart

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,13 @@ class AppSourceTestData extends SourceTestData {
88
AppSourceTestData({
99
required this.sourceKey,
1010
required super.duration,
11-
super.isLiveStream,
1211
});
1312

1413
@override
1514
String toString() {
1615
return 'UiSourceTestData('
1716
'sourceKey: $sourceKey, '
18-
'duration: $duration, '
19-
'isLiveStream: $isLiveStream'
17+
'duration: $duration'
2018
')';
2119
}
2220
}
@@ -47,14 +45,12 @@ final audioTestDataList = [
4745
if (_features.hasUrlSource && _features.hasPlaylistSourceType)
4846
AppSourceTestData(
4947
sourceKey: 'url-remote-m3u8',
50-
duration: Duration.zero,
51-
isLiveStream: true,
48+
duration: null,
5249
),
5350
if (_features.hasUrlSource)
5451
AppSourceTestData(
5552
sourceKey: 'url-remote-mpga',
56-
duration: Duration.zero,
57-
isLiveStream: true,
53+
duration: null,
5854
),
5955
if (_features.hasAssetSource)
6056
AppSourceTestData(

packages/audioplayers/example/integration_test/app/tabs/controls_tab.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ Future<void> testControlsTab(
5353

5454
if (isImmediateDurationSupported) {
5555
await tester.testPosition(
56-
Duration(seconds: audioSourceTestData.duration.inSeconds ~/ 2),
56+
Duration(seconds: audioSourceTestData.duration!.inSeconds ~/ 2),
5757
matcher: greaterThanOrEqualTo,
5858
);
5959
}
@@ -97,8 +97,8 @@ Future<void> testControlsTab(
9797
await tester.pumpAndSettle();
9898
}
9999

100-
if (audioSourceTestData.duration < const Duration(seconds: 2) &&
101-
!audioSourceTestData.isLiveStream) {
100+
if (!audioSourceTestData.isLiveStream &&
101+
audioSourceTestData.duration! < const Duration(seconds: 2)) {
102102
if (features.hasReleaseModeLoop) {
103103
await tester.testReleaseMode(ReleaseMode.loop);
104104
await tester.pump(const Duration(seconds: 3));

packages/audioplayers/example/integration_test/app/tabs/properties.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import '../app_test_utils.dart';
77

88
extension PropertiesWidgetTester on WidgetTester {
99
Future<void> testDuration(
10-
Duration duration, {
10+
Duration? duration, {
1111
Duration timeout = const Duration(seconds: 4),
1212
}) async {
1313
printWithTimeOnFailure('Test Duration: $duration');
@@ -18,7 +18,12 @@ extension PropertiesWidgetTester on WidgetTester {
1818
await pump();
1919
expectWidgetHasDuration(
2020
const Key('durationText'),
21-
matcher: (Duration? actual) => durationRangeMatcher(actual, duration),
21+
// TODO(gustl22): once duration is always null for streams,
22+
// then can remove fallback for Duration.zero
23+
matcher: (Duration? actual) => durationRangeMatcher(
24+
actual ?? Duration.zero,
25+
duration ?? Duration.zero,
26+
),
2227
);
2328
},
2429
timeout: timeout,

packages/audioplayers/example/integration_test/app/tabs/stream_tab.dart

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ Future<void> testStreamsTab(
4141
// Cannot test more precisely as it is dependent on pollInterval
4242
// and updateInterval of native implementation.
4343
if (audioSourceTestData.isLiveStream ||
44-
audioSourceTestData.duration > const Duration(seconds: 2)) {
44+
audioSourceTestData.duration! > const Duration(seconds: 2)) {
4545
// Test player state: playing
4646
if (features.hasPlayerStateEvent) {
4747
// Only test, if there's enough time to be able to check playing state.
@@ -66,7 +66,10 @@ Future<void> testStreamsTab(
6666

6767
if (features.hasDurationEvent && !audioSourceTestData.isLiveStream) {
6868
// Test if onDurationText is set.
69-
await tester.testOnDuration(audioSourceTestData.duration, timeout: timeout);
69+
await tester.testOnDuration(
70+
audioSourceTestData.duration!,
71+
timeout: timeout,
72+
);
7073
}
7174

7275
const sampleDuration = Duration(seconds: 3);
@@ -75,10 +78,10 @@ Future<void> testStreamsTab(
7578
// Test player states: pause, stop, completed
7679
if (features.hasPlayerStateEvent) {
7780
if (!audioSourceTestData.isLiveStream) {
78-
if (audioSourceTestData.duration < const Duration(seconds: 2)) {
81+
if (audioSourceTestData.duration! < const Duration(seconds: 2)) {
7982
await tester.testPlayerState(PlayerState.completed, timeout: timeout);
8083
await tester.testOnPlayerState(PlayerState.completed, timeout: timeout);
81-
} else if (audioSourceTestData.duration > const Duration(seconds: 5)) {
84+
} else if (audioSourceTestData.duration! > const Duration(seconds: 5)) {
8285
await tester.scrollToAndTap(const Key('pause_button'));
8386
await tester.pumpAndSettle();
8487
await tester.testPlayerState(PlayerState.paused);
@@ -105,7 +108,7 @@ Future<void> testStreamsTab(
105108
await tester.testDuration(audioSourceTestData.duration);
106109
if (!audioSourceTestData.isLiveStream) {
107110
await tester.testOnDuration(
108-
audioSourceTestData.duration,
111+
audioSourceTestData.duration!,
109112
timeout: timeout,
110113
);
111114
}

packages/audioplayers/example/integration_test/lib/lib_source_test_data.dart

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,13 @@ class LibSourceTestData extends SourceTestData {
1111
LibSourceTestData({
1212
required this.source,
1313
required super.duration,
14-
super.isLiveStream,
1514
});
1615

1716
@override
1817
String toString() {
1918
return 'RawSourceTestData('
2019
'source: $source, '
21-
'duration: $duration, '
22-
'isLiveStream: $isLiveStream'
20+
'duration: $duration'
2321
')';
2422
}
2523
}
@@ -52,14 +50,12 @@ final audioTestDataList = [
5250
if (_features.hasUrlSource && _features.hasPlaylistSourceType)
5351
LibSourceTestData(
5452
source: UrlSource(m3u8StreamUrl),
55-
duration: Duration.zero,
56-
isLiveStream: true,
53+
duration: null,
5754
),
5855
if (_features.hasUrlSource)
5956
LibSourceTestData(
6057
source: UrlSource(mpgaStreamUrl),
61-
duration: Duration.zero,
62-
isLiveStream: true,
58+
duration: null,
6359
),
6460
if (_features.hasAssetSource)
6561
LibSourceTestData(

packages/audioplayers/example/integration_test/lib_test.dart

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ void main() {
3535
await tester.pump(const Duration(seconds: 8));
3636
for (var i = 0; i < audioTestDataList.length; i++) {
3737
final td = audioTestDataList[i];
38-
if (td.isLiveStream || td.duration > const Duration(seconds: 10)) {
38+
if (td.isLiveStream || td.duration! > const Duration(seconds: 10)) {
3939
await tester.pump();
4040
final position = await players[i].getCurrentPosition();
4141
printWithTimeOnFailure('Test position: $td');
@@ -63,7 +63,7 @@ void main() {
6363
await tester.pumpAndSettle();
6464
// Sources take some time to get initialized
6565
await tester.pump(const Duration(seconds: 8));
66-
if (td.isLiveStream || td.duration > const Duration(seconds: 10)) {
66+
if (td.isLiveStream || td.duration! > const Duration(seconds: 10)) {
6767
await tester.pump();
6868
final position = await player.getCurrentPosition();
6969
printWithTimeOnFailure('Test position: $td');
@@ -101,7 +101,8 @@ void main() {
101101
await tester.pumpLinux();
102102
await player.play(td.source);
103103
await tester.pumpAndSettle();
104-
await tester.pump(td.duration + const Duration(seconds: 8));
104+
await tester
105+
.pump((td.duration ?? Duration.zero) + const Duration(seconds: 8));
105106
expect(player.state, PlayerState.completed);
106107

107108
audioContext = AudioContextConfig(
@@ -114,7 +115,8 @@ void main() {
114115

115116
await player.resume();
116117
await tester.pumpAndSettle();
117-
await tester.pump(td.duration + const Duration(seconds: 8));
118+
await tester
119+
.pump((td.duration ?? Duration.zero) + const Duration(seconds: 8));
118120
expect(player.state, PlayerState.completed);
119121
await tester.pumpLinux();
120122
await player.dispose();
@@ -148,7 +150,8 @@ void main() {
148150
await player.setSource(td.source);
149151
await player.resume();
150152
await tester.pumpAndSettle();
151-
await tester.pump(td.duration + const Duration(seconds: 8));
153+
await tester
154+
.pump((td.duration ?? Duration.zero) + const Duration(seconds: 8));
152155
expect(player.state, PlayerState.playing);
153156
await player.stop();
154157
expect(player.state, PlayerState.stopped);
@@ -163,7 +166,8 @@ void main() {
163166

164167
await player.resume();
165168
await tester.pumpAndSettle();
166-
await tester.pump(td.duration + const Duration(seconds: 8));
169+
await tester
170+
.pump((td.duration ?? Duration.zero) + const Duration(seconds: 8));
167171
expect(player.state, PlayerState.playing);
168172
await player.stop();
169173
expect(player.state, PlayerState.stopped);

packages/audioplayers/example/integration_test/platform_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ void main() {
133133
expect(await platform.getCurrentPosition(playerId), 0);
134134
expect(
135135
await platform.getDuration(playerId),
136-
wavUrl1TestData.duration.inMilliseconds,
136+
wavUrl1TestData.duration!.inMilliseconds,
137137
);
138138
await tester.pumpLinux();
139139
});
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
/// Data of a ui test source.
22
abstract class SourceTestData {
3-
Duration duration;
3+
Duration? duration;
44

5-
bool isLiveStream;
5+
bool get isLiveStream => duration == null;
66

77
SourceTestData({
88
required this.duration,
9-
this.isLiveStream = false,
109
});
1110

1211
@override
1312
String toString() {
1413
return 'SourceTestData('
15-
'duration: $duration, '
16-
'isLiveStream: $isLiveStream'
14+
'duration: $duration'
1715
')';
1816
}
1917
}

packages/audioplayers_android/android/src/main/kotlin/xyz/luan/audioplayers/AudioplayersPlugin.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,12 @@ class AudioplayersPlugin : FlutterPlugin, IUpdateCallback {
159159
}
160160

161161
"getDuration" -> {
162-
response.success(player.getDuration() ?: 0)
162+
response.success(player.getDuration())
163163
return
164164
}
165165

166166
"getCurrentPosition" -> {
167-
response.success(player.getCurrentPosition() ?: 0)
167+
response.success(player.getCurrentPosition())
168168
return
169169
}
170170

packages/audioplayers_darwin/darwin/Classes/WrappedMediaPlayer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ class WrappedMediaPlayer {
161161
}
162162

163163
private func getCurrentCMTime() -> CMTime? {
164-
return player?.currentTime()
164+
return player?.currentItem?.currentTime()
165165
}
166166

167167
private func createPlayerItem(_ url: String, _ isLocal: Bool) -> AVPlayerItem {

0 commit comments

Comments
 (0)