Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,13 @@ class AppSourceTestData extends SourceTestData {
AppSourceTestData({
required this.sourceKey,
required super.duration,
super.isLiveStream,
});

@override
String toString() {
return 'UiSourceTestData('
'sourceKey: $sourceKey, '
'duration: $duration, '
'isLiveStream: $isLiveStream'
'duration: $duration'
')';
}
}
Expand Down Expand Up @@ -47,14 +45,12 @@ final audioTestDataList = [
if (_features.hasUrlSource && _features.hasPlaylistSourceType)
AppSourceTestData(
sourceKey: 'url-remote-m3u8',
duration: Duration.zero,
isLiveStream: true,
duration: null,
),
if (_features.hasUrlSource)
AppSourceTestData(
sourceKey: 'url-remote-mpga',
duration: Duration.zero,
isLiveStream: true,
duration: null,
),
if (_features.hasAssetSource)
AppSourceTestData(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ Future<void> testControlsTab(

if (isImmediateDurationSupported) {
await tester.testPosition(
Duration(seconds: audioSourceTestData.duration.inSeconds ~/ 2),
Duration(seconds: audioSourceTestData.duration!.inSeconds ~/ 2),
matcher: greaterThanOrEqualTo,
);
}
Expand Down Expand Up @@ -97,8 +97,8 @@ Future<void> testControlsTab(
await tester.pumpAndSettle();
}

if (audioSourceTestData.duration < const Duration(seconds: 2) &&
!audioSourceTestData.isLiveStream) {
if (!audioSourceTestData.isLiveStream &&
audioSourceTestData.duration! < const Duration(seconds: 2)) {
if (features.hasReleaseModeLoop) {
await tester.testReleaseMode(ReleaseMode.loop);
await tester.pump(const Duration(seconds: 3));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import '../app_test_utils.dart';

extension PropertiesWidgetTester on WidgetTester {
Future<void> testDuration(
Duration duration, {
Duration? duration, {
Duration timeout = const Duration(seconds: 4),
}) async {
printWithTimeOnFailure('Test Duration: $duration');
Expand All @@ -18,7 +18,12 @@ extension PropertiesWidgetTester on WidgetTester {
await pump();
expectWidgetHasDuration(
const Key('durationText'),
matcher: (Duration? actual) => durationRangeMatcher(actual, duration),
// TODO(gustl22): once duration is always null for streams,
// then can remove fallback for Duration.zero
matcher: (Duration? actual) => durationRangeMatcher(
actual ?? Duration.zero,
duration ?? Duration.zero,
),
);
},
timeout: timeout,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Future<void> testStreamsTab(
// Cannot test more precisely as it is dependent on pollInterval
// and updateInterval of native implementation.
if (audioSourceTestData.isLiveStream ||
audioSourceTestData.duration > const Duration(seconds: 2)) {
audioSourceTestData.duration! > const Duration(seconds: 2)) {
// Test player state: playing
if (features.hasPlayerStateEvent) {
// Only test, if there's enough time to be able to check playing state.
Expand All @@ -66,7 +66,10 @@ Future<void> testStreamsTab(

if (features.hasDurationEvent && !audioSourceTestData.isLiveStream) {
// Test if onDurationText is set.
await tester.testOnDuration(audioSourceTestData.duration, timeout: timeout);
await tester.testOnDuration(
audioSourceTestData.duration!,
timeout: timeout,
);
}

const sampleDuration = Duration(seconds: 3);
Expand All @@ -75,10 +78,10 @@ Future<void> testStreamsTab(
// Test player states: pause, stop, completed
if (features.hasPlayerStateEvent) {
if (!audioSourceTestData.isLiveStream) {
if (audioSourceTestData.duration < const Duration(seconds: 2)) {
if (audioSourceTestData.duration! < const Duration(seconds: 2)) {
await tester.testPlayerState(PlayerState.completed, timeout: timeout);
await tester.testOnPlayerState(PlayerState.completed, timeout: timeout);
} else if (audioSourceTestData.duration > const Duration(seconds: 5)) {
} else if (audioSourceTestData.duration! > const Duration(seconds: 5)) {
await tester.scrollToAndTap(const Key('pause_button'));
await tester.pumpAndSettle();
await tester.testPlayerState(PlayerState.paused);
Expand All @@ -105,7 +108,7 @@ Future<void> testStreamsTab(
await tester.testDuration(audioSourceTestData.duration);
if (!audioSourceTestData.isLiveStream) {
await tester.testOnDuration(
audioSourceTestData.duration,
audioSourceTestData.duration!,
timeout: timeout,
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,13 @@ class LibSourceTestData extends SourceTestData {
LibSourceTestData({
required this.source,
required super.duration,
super.isLiveStream,
});

@override
String toString() {
return 'RawSourceTestData('
'source: $source, '
'duration: $duration, '
'isLiveStream: $isLiveStream'
'duration: $duration'
')';
}
}
Expand Down Expand Up @@ -52,14 +50,12 @@ final audioTestDataList = [
if (_features.hasUrlSource && _features.hasPlaylistSourceType)
LibSourceTestData(
source: UrlSource(m3u8StreamUrl),
duration: Duration.zero,
isLiveStream: true,
duration: null,
),
if (_features.hasUrlSource)
LibSourceTestData(
source: UrlSource(mpgaStreamUrl),
duration: Duration.zero,
isLiveStream: true,
duration: null,
),
if (_features.hasAssetSource)
LibSourceTestData(
Expand Down
16 changes: 10 additions & 6 deletions packages/audioplayers/example/integration_test/lib_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ void main() {
await tester.pump(const Duration(seconds: 8));
for (var i = 0; i < audioTestDataList.length; i++) {
final td = audioTestDataList[i];
if (td.isLiveStream || td.duration > const Duration(seconds: 10)) {
if (td.isLiveStream || td.duration! > const Duration(seconds: 10)) {
await tester.pump();
final position = await players[i].getCurrentPosition();
printWithTimeOnFailure('Test position: $td');
Expand Down Expand Up @@ -63,7 +63,7 @@ void main() {
await tester.pumpAndSettle();
// Sources take some time to get initialized
await tester.pump(const Duration(seconds: 8));
if (td.isLiveStream || td.duration > const Duration(seconds: 10)) {
if (td.isLiveStream || td.duration! > const Duration(seconds: 10)) {
await tester.pump();
final position = await player.getCurrentPosition();
printWithTimeOnFailure('Test position: $td');
Expand Down Expand Up @@ -101,7 +101,8 @@ void main() {
await tester.pumpLinux();
await player.play(td.source);
await tester.pumpAndSettle();
await tester.pump(td.duration + const Duration(seconds: 8));
await tester
.pump(td.duration ?? Duration.zero + const Duration(seconds: 8));
expect(player.state, PlayerState.completed);

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

await player.resume();
await tester.pumpAndSettle();
await tester.pump(td.duration + const Duration(seconds: 8));
await tester
.pump(td.duration ?? Duration.zero + const Duration(seconds: 8));
expect(player.state, PlayerState.completed);
await tester.pumpLinux();
await player.dispose();
Expand Down Expand Up @@ -148,7 +150,8 @@ void main() {
await player.setSource(td.source);
await player.resume();
await tester.pumpAndSettle();
await tester.pump(td.duration + const Duration(seconds: 8));
await tester
.pump(td.duration ?? Duration.zero + const Duration(seconds: 8));
expect(player.state, PlayerState.playing);
await player.stop();
expect(player.state, PlayerState.stopped);
Expand All @@ -163,7 +166,8 @@ void main() {

await player.resume();
await tester.pumpAndSettle();
await tester.pump(td.duration + const Duration(seconds: 8));
await tester
.pump(td.duration ?? Duration.zero + const Duration(seconds: 8));
expect(player.state, PlayerState.playing);
await player.stop();
expect(player.state, PlayerState.stopped);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ void main() {
expect(await platform.getCurrentPosition(playerId), 0);
expect(
await platform.getDuration(playerId),
wavUrl1TestData.duration.inMilliseconds,
wavUrl1TestData.duration!.inMilliseconds,
);
await tester.pumpLinux();
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
/// Data of a ui test source.
abstract class SourceTestData {
Duration duration;
Duration? duration;

bool isLiveStream;
bool get isLiveStream => duration == null;

SourceTestData({
required this.duration,
this.isLiveStream = false,
});

@override
String toString() {
return 'SourceTestData('
'duration: $duration, '
'isLiveStream: $isLiveStream'
'duration: $duration'
')';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -159,12 +159,12 @@ class AudioplayersPlugin : FlutterPlugin, IUpdateCallback {
}

"getDuration" -> {
response.success(player.getDuration() ?: 0)
response.success(player.getDuration())
return
}

"getCurrentPosition" -> {
response.success(player.getCurrentPosition() ?: 0)
response.success(player.getCurrentPosition())
return
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ class WrappedMediaPlayer {
}

private func getCurrentCMTime() -> CMTime? {
return player?.currentTime()
return player?.currentItem?.currentTime()
}

private func createPlayerItem(_ url: String, _ isLocal: Bool) -> AVPlayerItem {
Expand Down
1 change: 1 addition & 0 deletions packages/audioplayers_linux/linux/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ add_library(${PLUGIN_NAME} SHARED
)
apply_standard_settings(${PLUGIN_NAME})
set_target_properties(${PLUGIN_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden)
target_compile_features(${PLUGIN_NAME} PRIVATE cxx_std_17)

# System-level dependencies.
find_package(PkgConfig REQUIRED)
Expand Down
20 changes: 11 additions & 9 deletions packages/audioplayers_linux/linux/audio_player.cc
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ void AudioPlayer::OnPositionUpdate() {
g_autoptr(FlValue) map = fl_value_new_map();
fl_value_set_string(map, "event",
fl_value_new_string("audio.onCurrentPosition"));
fl_value_set_string(map, "value", fl_value_new_int(GetPosition()));
fl_value_set_string(map, "value", fl_value_new_int(GetPosition().value_or(0)));
fl_event_channel_send(this->_eventChannel, map, nullptr, nullptr);
}
}
Expand All @@ -212,7 +212,7 @@ void AudioPlayer::OnDurationUpdate() {
g_autoptr(FlValue) map = fl_value_new_map();
fl_value_set_string(map, "event",
fl_value_new_string("audio.onDuration"));
fl_value_set_string(map, "value", fl_value_new_int(GetDuration()));
fl_value_set_string(map, "value", fl_value_new_int(GetDuration().value_or(0)));
fl_event_channel_send(this->_eventChannel, map, nullptr, nullptr);
}
}
Expand Down Expand Up @@ -333,7 +333,7 @@ void AudioPlayer::SetPlayback(int64_t position, double rate) {
}

void AudioPlayer::SetPlaybackRate(double rate) {
SetPlayback(GetPosition(), rate);
SetPlayback(GetPosition().value_or(0), rate);
}

/**
Expand All @@ -349,25 +349,27 @@ void AudioPlayer::SetPosition(int64_t position) {
/**
* @return int64_t the position in milliseconds
*/
int64_t AudioPlayer::GetPosition() {
std::optional<int64_t> AudioPlayer::GetPosition() {
gint64 current = 0;
if (!gst_element_query_position(playbin, GST_FORMAT_TIME, &current)) {
this->OnLog("Could not query current position.");
return 0;
return std::nullopt;
}
return current / 1000000;
return std::make_optional(current / 1000000);
}

/**
* @return int64_t the duration in milliseconds
*/
int64_t AudioPlayer::GetDuration() {
std::optional<int64_t> AudioPlayer::GetDuration() {
gint64 duration = 0;
if (!gst_element_query_duration(playbin, GST_FORMAT_TIME, &duration)) {
// FIXME: Get duration for MP3 with variable bit rate with gst-discoverer:
// https://gstreamer.freedesktop.org/documentation/pbutils/gstdiscoverer.html?gi-language=c#gst_discoverer_info_get_duration
this->OnLog("Could not query current duration.");
return 0;
return std::nullopt;
}
return duration / 1000000;
return std::make_optional(duration / 1000000);
}

void AudioPlayer::Play() {
Expand Down
5 changes: 3 additions & 2 deletions packages/audioplayers_linux/linux/audio_player.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <future>
#include <map>
#include <memory>
#include <optional>
#include <sstream>
#include <string>

Expand All @@ -24,9 +25,9 @@ class AudioPlayer {
AudioPlayer(std::string playerId, FlMethodChannel *methodChannel,
FlEventChannel *eventChannel);

int64_t GetPosition();
std::optional<int64_t> GetPosition();

int64_t GetDuration();
std::optional<int64_t> GetDuration();

bool GetLooping();

Expand Down
Loading