Skip to content

Commit 0cd3772

Browse files
committed
get audio session id, send it to AudioTrack in libmpv, broadcast it to other apps. Fixes KRTirtho#1221
1 parent 0e73443 commit 0cd3772

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed

lib/services/audio_player/mk_state_player.dart

+42-6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import 'package:flutter_desktop_tools/flutter_desktop_tools.dart';
33
import 'package:catcher_2/catcher_2.dart';
44
import 'package:collection/collection.dart';
55
import 'package:media_kit/media_kit.dart';
6+
import 'package:flutter_broadcasts/flutter_broadcasts.dart';
7+
import 'package:package_info_plus/package_info_plus.dart';
8+
import 'package:audio_session/audio_session.dart';
69
// ignore: implementation_imports
710
import 'package:spotube/services/audio_player/playback_state.dart';
811

@@ -14,13 +17,23 @@ class MkPlayerWithState extends Player {
1417
final StreamController<bool> _shuffleStream;
1518
final StreamController<PlaylistMode> _loopModeStream;
1619

20+
static const String EXTRA_PACKAGE_NAME = "android.media.extra.PACKAGE_NAME";
21+
static const String EXTRA_AUDIO_SESSION = "android.media.extra.AUDIO_SESSION";
22+
static const String ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION =
23+
"android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION";
24+
static const String ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION =
25+
"android.media.action.CLOSE_AUDIO_EFFECT_CONTROL_SESSION";
26+
1727
late final List<StreamSubscription> _subscriptions;
1828

1929
bool _shuffled;
2030
PlaylistMode _loopMode;
2131

2232
Playlist? _playlist;
2333
List<Media>? _tempMedias;
34+
int _androidAudioSessionId = 0;
35+
String _packageName = "";
36+
AndroidAudioManager? _androidAudioManager;
2437

2538
MkPlayerWithState({super.configuration})
2639
: _playerStateStream = StreamController.broadcast(),
@@ -64,11 +77,33 @@ class MkPlayerWithState extends Player {
6477
Catcher2.reportCheckedError('[MediaKitError] \n$event', null);
6578
}),
6679
];
67-
if (super.platform is NativePlayer) {
68-
NativePlayer playerNative = super.platform as NativePlayer;
69-
if (DesktopTools.platform.isAndroid) {
70-
playerNative.setProperty("ao", "audiotrack,opensles");
71-
}
80+
PackageInfo.fromPlatform().then((packageInfo) {
81+
_packageName = packageInfo.packageName;
82+
});
83+
if (DesktopTools.platform.isAndroid) {
84+
_androidAudioManager = AndroidAudioManager();
85+
AudioSession.instance.then((s) async {
86+
_androidAudioSessionId =
87+
await _androidAudioManager!.generateAudioSessionId();
88+
notifyAudioSessionUpdate(true);
89+
90+
nativePlayer.setProperty(
91+
"audiotrack-session-id", _androidAudioSessionId.toString());
92+
nativePlayer.setProperty("ao", "audiotrack,opensles,");
93+
});
94+
}
95+
}
96+
97+
Future<void> notifyAudioSessionUpdate(bool active) async {
98+
if (DesktopTools.platform.isAndroid) {
99+
sendBroadcast(BroadcastMessage(
100+
name: active
101+
? ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION
102+
: ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION,
103+
data: {
104+
EXTRA_AUDIO_SESSION: _androidAudioSessionId,
105+
EXTRA_PACKAGE_NAME: _packageName
106+
}));
72107
}
73108
}
74109

@@ -146,10 +181,11 @@ class MkPlayerWithState extends Player {
146181
}
147182

148183
@override
149-
Future<void> dispose() {
184+
Future<void> dispose() async {
150185
for (var element in _subscriptions) {
151186
element.cancel();
152187
}
188+
await notifyAudioSessionUpdate(false);
153189
return super.dispose();
154190
}
155191

pubspec.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ dependencies:
122122
app_links: ^3.5.0
123123
win32_registry: ^1.1.2
124124
flutter_sharing_intent: ^1.1.0
125+
flutter_broadcasts: ^0.4.0
125126

126127
dev_dependencies:
127128
build_runner: ^2.3.2

0 commit comments

Comments
 (0)