|
1 | 1 | import 'package:just_audio/just_audio.dart'; |
2 | 2 | import 'package:hive_flutter/hive_flutter.dart'; |
| 3 | +import 'package:audio_session/audio_session.dart'; |
3 | 4 |
|
4 | 5 | import '../utils/debug_logger_io.dart'; |
5 | 6 |
|
@@ -30,6 +31,34 @@ class AudioService { |
30 | 31 | // Load enabled state from preferences |
31 | 32 | await _loadEnabledState(); |
32 | 33 |
|
| 34 | + // Configure audio session for notification mixing (play over music) |
| 35 | + try { |
| 36 | + final session = await AudioSession.instance; |
| 37 | + await session.configure( |
| 38 | + const AudioSessionConfiguration( |
| 39 | + // iOS: ambient category plays alongside other audio |
| 40 | + avAudioSessionCategory: AVAudioSessionCategory.ambient, |
| 41 | + avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.none, |
| 42 | + avAudioSessionMode: AVAudioSessionMode.defaultMode, |
| 43 | + avAudioSessionRouteSharingPolicy: |
| 44 | + AVAudioSessionRouteSharingPolicy.defaultPolicy, |
| 45 | + avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none, |
| 46 | + // Android: transient focus allows other audio to continue |
| 47 | + androidAudioAttributes: AndroidAudioAttributes( |
| 48 | + contentType: AndroidAudioContentType.sonification, |
| 49 | + usage: AndroidAudioUsage.notification, |
| 50 | + ), |
| 51 | + androidAudioFocusGainType: |
| 52 | + AndroidAudioFocusGainType.gainTransientMayDuck, |
| 53 | + androidWillPauseWhenDucked: false, |
| 54 | + ), |
| 55 | + ); |
| 56 | + debugLog('[AUDIO] Audio session configured for notification mixing'); |
| 57 | + } catch (e) { |
| 58 | + debugError('[AUDIO] Failed to configure audio session: $e'); |
| 59 | + // Continue initialization - audio will still work, just may interrupt music |
| 60 | + } |
| 61 | + |
33 | 62 | // Create audio players |
34 | 63 | _txPlayer = AudioPlayer(); |
35 | 64 | _rxPlayer = AudioPlayer(); |
|
0 commit comments