refactor: remove duplicate audio sessions

This commit is contained in:
edde746
2025-11-08 08:35:52 +01:00
parent fac7aed1e7
commit 0d4f7a9e9f
4 changed files with 16 additions and 53 deletions
+3 -47
View File
@@ -4,7 +4,6 @@ import 'package:flutter/services.dart';
import 'package:media_kit/media_kit.dart'; import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart'; import 'package:media_kit_video/media_kit_video.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:audio_session/audio_session.dart';
import '../models/plex_metadata.dart'; import '../models/plex_metadata.dart';
import '../models/plex_user_profile.dart'; import '../models/plex_user_profile.dart';
import '../providers/plex_client_provider.dart'; import '../providers/plex_client_provider.dart';
@@ -167,9 +166,6 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> {
final savedVolume = settingsService.getVolume(); final savedVolume = settingsService.getVolume();
player!.setVolume(savedVolume); player!.setVolume(savedVolume);
// Initialize audio session for proper OS integration
await _initializeAudioSession();
// Update media service manager with new player // Update media service manager with new player
await _updateMediaService(); await _updateMediaService();
@@ -237,48 +233,6 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> {
} }
} }
Future<void> _initializeAudioSession() async {
try {
final session = await AudioSession.instance;
await session.configure(const AudioSessionConfiguration(
avAudioSessionCategory: AVAudioSessionCategory.playback,
avAudioSessionMode: AVAudioSessionMode.moviePlayback,
androidAudioAttributes: AndroidAudioAttributes(
contentType: AndroidAudioContentType.movie,
usage: AndroidAudioUsage.media,
),
androidAudioFocusGainType: AndroidAudioFocusGainType.gain,
));
// Handle interruptions (phone calls, other apps, etc.)
session.interruptionEventStream.listen((event) {
if (event.begin) {
// Pause on interruption
player?.pause();
appLogger.i('Playback paused due to interruption');
} else {
// Resume after interruption if needed (user can manually play)
switch (event.type) {
case AudioInterruptionType.pause:
case AudioInterruptionType.duck:
// Don't auto-resume for these types
break;
case AudioInterruptionType.unknown:
break;
}
}
});
// Handle audio becoming noisy (headphones unplugged)
session.becomingNoisyEventStream.listen((_) {
player?.pause();
appLogger.i('Playback paused due to audio becoming noisy (headphones unplugged?)');
});
} catch (e) {
appLogger.w('Failed to configure audio session', error: e);
}
}
Future<void> _updateMediaService() async { Future<void> _updateMediaService() async {
if (!mounted) return; if (!mounted) return;
@@ -341,7 +295,9 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> {
widget.metadata.ratingKey, widget.metadata.ratingKey,
loopQueue: loopQueue, loopQueue: loopQueue,
); );
previous = playbackState.getPreviousEpisode(widget.metadata.ratingKey); previous = playbackState.getPreviousEpisode(
widget.metadata.ratingKey,
);
} else { } else {
// Use chronological order even in shuffle mode // Use chronological order even in shuffle mode
next = await client.findAdjacentEpisode(widget.metadata, 1); next = await client.findAdjacentEpisode(widget.metadata, 1);
+2
View File
@@ -40,6 +40,8 @@ class MediaServiceManager {
androidNotificationOngoing: false, androidNotificationOngoing: false,
androidStopForegroundOnPause: true, androidStopForegroundOnPause: true,
androidNotificationIcon: 'drawable/ic_stat_notification', androidNotificationIcon: 'drawable/ic_stat_notification',
// Configure audio session for proper media playback
preloadArtwork: true,
), ),
); );
+6 -5
View File
@@ -44,10 +44,11 @@ packages:
audio_service: audio_service:
dependency: "direct main" dependency: "direct main"
description: description:
name: audio_service path: audio_service
sha256: cb122c7c2639d2a992421ef96b67948ad88c5221da3365ccef1031393a76e044 ref: "4ca42f391183854095188a5a10fa6b59cd641e68"
url: "https://pub.dev" resolved-ref: "4ca42f391183854095188a5a10fa6b59cd641e68"
source: hosted url: "https://github.com/marckornberger/audio_service.git"
source: git
version: "0.18.18" version: "0.18.18"
audio_service_platform_interface: audio_service_platform_interface:
dependency: transitive dependency: transitive
@@ -66,7 +67,7 @@ packages:
source: hosted source: hosted
version: "0.1.4" version: "0.1.4"
audio_session: audio_session:
dependency: "direct main" dependency: transitive
description: description:
name: audio_session name: audio_session
sha256: "8f96a7fecbb718cb093070f868b4cdcb8a9b1053dce342ff8ab2fde10eb9afb7" sha256: "8f96a7fecbb718cb093070f868b4cdcb8a9b1053dce342ff8ab2fde10eb9afb7"
+5 -1
View File
@@ -26,7 +26,6 @@ dependencies:
hotkey_manager: ^0.2.3 hotkey_manager: ^0.2.3
flex_color_picker: ^3.6.0 flex_color_picker: ^3.6.0
audio_service: ^0.18.18 audio_service: ^0.18.18
audio_session: ^0.2.1
qr_flutter: ^4.1.0 qr_flutter: ^4.1.0
dependency_overrides: dependency_overrides:
@@ -40,6 +39,11 @@ dependency_overrides:
url: https://github.com/edde746/media-kit url: https://github.com/edde746/media-kit
ref: b6de7e44148043bd26f2569e8062dc8bce4f11b9 ref: b6de7e44148043bd26f2569e8062dc8bce4f11b9
path: libs/universal/media_kit_libs_video path: libs/universal/media_kit_libs_video
audio_service:
git:
url: https://github.com/marckornberger/audio_service.git
ref: 4ca42f391183854095188a5a10fa6b59cd641e68
path: audio_service
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: