From 4465fa24d9e3ce991eac731deca8ea87d4474c16 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Tue, 24 Dec 2024 16:34:03 +0100 Subject: [PATCH] feat: Enable audio message support for linux and windows --- lib/pages/chat/events/audio_player.dart | 3 +- lib/pages/chat/events/message_content.dart | 21 ++----- lib/widgets/matrix.dart | 5 ++ licenses.yaml | 1 + linux/flutter/generated_plugin_registrant.cc | 4 ++ linux/flutter/generated_plugins.cmake | 1 + pubspec.lock | 56 +++++++++++++++++++ pubspec.yaml | 3 + snap/snapcraft.yaml | 1 + .../flutter/generated_plugin_registrant.cc | 3 + windows/flutter/generated_plugins.cmake | 1 + 11 files changed, 82 insertions(+), 17 deletions(-) diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index 1fb65dc24..12ebb2bd6 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:io'; +import 'dart:math'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -334,7 +335,7 @@ class AudioPlayerState extends State { ? widget.color.withAlpha(128) : Colors.transparent, max: maxPosition, - value: currentPosition, + value: max(0, currentPosition), onChanged: (position) => audioPlayer == null ? _startAction() : audioPlayer.seek( diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index 8f5d47485..5f5bedc89 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -13,7 +13,6 @@ import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../../../config/app_config.dart'; -import '../../../utils/platform_infos.dart'; import '../../../utils/url_launcher.dart'; import '../../bootstrap/bootstrap_dialog.dart'; import 'audio_player.dart'; @@ -141,25 +140,15 @@ class MessageContent extends StatelessWidget { case CuteEventContent.eventType: return CuteContent(event); case MessageTypes.Audio: - if (PlatformInfos.isMobile || - PlatformInfos.isMacOS || - PlatformInfos.isWeb - // Disabled until https://github.com/bleonard252/just_audio_mpv/issues/3 - // is fixed - // || PlatformInfos.isLinux - ) { - return AudioPlayerWidget( - event, - color: textColor, - fontSize: fontSize, - ); - } - return MessageDownloadContent(event, textColor); + return AudioPlayerWidget( + event, + color: textColor, + fontSize: fontSize, + ); case MessageTypes.Video: return EventVideoPlayer(event); case MessageTypes.File: return MessageDownloadContent(event, textColor); - case MessageTypes.Text: case MessageTypes.Notice: case MessageTypes.Emote: diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 1dac4ae9c..1f4e87f65 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -10,6 +10,7 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:http/http.dart' as http; import 'package:image_picker/image_picker.dart'; import 'package:intl/intl.dart'; +import 'package:just_audio_media_kit/just_audio_media_kit.dart'; import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; import 'package:provider/provider.dart'; @@ -216,6 +217,10 @@ class MatrixState extends State with WidgetsBindingObserver { super.initState(); WidgetsBinding.instance.addObserver(this); initMatrix(); + if (PlatformInfos.isLinux || PlatformInfos.isWindows) { + JustAudioMediaKit.ensureInitialized(); + JustAudioMediaKit.title = AppConfig.applicationName; + } if (PlatformInfos.isWeb) { initConfig().then((_) => initSettings()); } else { diff --git a/licenses.yaml b/licenses.yaml index ebab43440..02f264052 100644 --- a/licenses.yaml +++ b/licenses.yaml @@ -25,6 +25,7 @@ packageLicenseOverride: latlong2: Apache-2.0 platform_detect: Apache-2.0 rxdart: Apache-2.0 + just_audio_media_kit: Apache-2.0 # flutter's internal packages flutter_driver: BSD-3-Clause diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index b5155de25..c317fea9d 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -41,6 +42,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) handy_window_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "HandyWindowPlugin"); handy_window_plugin_register_with_registrar(handy_window_registrar); + g_autoptr(FlPluginRegistrar) media_kit_libs_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "MediaKitLibsLinuxPlugin"); + media_kit_libs_linux_plugin_register_with_registrar(media_kit_libs_linux_registrar); g_autoptr(FlPluginRegistrar) pasteboard_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "PasteboardPlugin"); pasteboard_plugin_register_with_registrar(pasteboard_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index dab6fedfc..2068e8b95 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -10,6 +10,7 @@ list(APPEND FLUTTER_PLUGIN_LIST flutter_secure_storage_linux flutter_webrtc handy_window + media_kit_libs_linux pasteboard record_linux sqlcipher_flutter_libs diff --git a/pubspec.lock b/pubspec.lock index 9246006de..e1ddb40f8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1018,6 +1018,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.41" + just_audio_media_kit: + dependency: "direct main" + description: + name: just_audio_media_kit + sha256: "9f3517213dfc7bbaf6980656feb66c35600f114c7efc0b5b3f4476cd5c18b45e" + url: "https://pub.dev" + source: hosted + version: "2.0.6" just_audio_platform_interface: dependency: transitive description: @@ -1162,6 +1170,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.36.0" + media_kit: + dependency: transitive + description: + name: media_kit + sha256: "1f1deee148533d75129a6f38251ff8388e33ee05fc2d20a6a80e57d6051b7b62" + url: "https://pub.dev" + source: hosted + version: "1.1.11" + media_kit_libs_linux: + dependency: "direct main" + description: + name: media_kit_libs_linux + sha256: e186891c31daa6bedab4d74dcdb4e8adfccc7d786bfed6ad81fe24a3b3010310 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + media_kit_libs_windows_audio: + dependency: "direct main" + description: + name: media_kit_libs_windows_audio + sha256: c2fd558cc87b9d89a801141fcdffe02e338a3b21a41a18fbd63d5b221a1b8e53 + url: "https://pub.dev" + source: hosted + version: "1.0.9" meta: dependency: transitive description: @@ -1634,6 +1666,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.28.0" + safe_local_storage: + dependency: transitive + description: + name: safe_local_storage + sha256: ede4eb6cb7d88a116b3d3bf1df70790b9e2038bc37cb19112e381217c74d9440 + url: "https://pub.dev" + source: hosted + version: "1.0.2" safe_url_check: dependency: transitive description: @@ -2063,6 +2103,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.2" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec" + url: "https://pub.dev" + source: hosted + version: "1.1.0" unorm_dart: dependency: transitive description: @@ -2071,6 +2119,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" + uri_parser: + dependency: transitive + description: + name: uri_parser + sha256: "6543c9fd86d2862fac55d800a43e67c0dcd1a41677cb69c2f8edfe73bbcf1835" + url: "https://pub.dev" + source: hosted + version: "2.0.2" url_launcher: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 87c27e566..4f77dd847 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -60,9 +60,12 @@ dependencies: image_picker: ^1.1.0 intl: any just_audio: ^0.9.39 + just_audio_media_kit: ^2.0.6 latlong2: ^0.9.1 linkify: ^5.0.0 matrix: ^0.36.0 + media_kit_libs_linux: ^1.1.3 + media_kit_libs_windows_audio: ^1.0.9 mime: ^1.0.6 native_imaging: ^0.1.1 opus_caf_converter_dart: ^1.0.1 diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 87efdcd88..e14a18620 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -76,6 +76,7 @@ parts: stage-packages: - libsecret-1-0 - libjsoncpp25 + - libmpv-dev slots: dbus-svc: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index eb0b6129f..8b22fb870 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -36,6 +37,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("FlutterWebRTCPlugin")); GeolocatorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("GeolocatorWindows")); + MediaKitLibsWindowsAudioPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("MediaKitLibsWindowsAudioPluginCApi")); PasteboardPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PasteboardPlugin")); PermissionHandlerWindowsPluginRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 627fe7248..5d845e301 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -10,6 +10,7 @@ list(APPEND FLUTTER_PLUGIN_LIST flutter_secure_storage_windows flutter_webrtc geolocator_windows + media_kit_libs_windows_audio pasteboard permission_handler_windows record_windows