import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_status.dart'; import 'package:audio_session/audio_session.dart'; class AudioSessionHandler { late AudioSession session; bool _playInterrupted = false; void setActive(bool active) { session.setActive(active); } AudioSessionHandler() { initSession(); } Future initSession() async { session = await AudioSession.instance; session.configure( const AudioSessionConfiguration.music().copyWith( avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.notifyOthersOnDeactivation, ), ); session.interruptionEventStream.listen((event) { final playerStatus = PlPlayerController.getPlayerStatusIfExists(); // final player = PlPlayerController.getInstance(); if (event.begin) { if (playerStatus != PlayerStatus.playing) return; // if (!player.playerStatus.playing) return; switch (event.type) { case AudioInterruptionType.duck: PlPlayerController.setVolumeIfExists( (PlPlayerController.getVolumeIfExists() ?? 0) * 0.5, ); // player.setVolume(player.volume.value * 0.5); break; case AudioInterruptionType.pause: PlPlayerController.pauseIfExists(isInterrupt: true); // player.pause(isInterrupt: true); _playInterrupted = true; break; case AudioInterruptionType.unknown: PlPlayerController.pauseIfExists(isInterrupt: true); // player.pause(isInterrupt: true); _playInterrupted = true; break; } } else { switch (event.type) { case AudioInterruptionType.duck: PlPlayerController.setVolumeIfExists( (PlPlayerController.getVolumeIfExists() ?? 0) * 2, ); // player.setVolume(player.volume.value * 2); break; case AudioInterruptionType.pause: if (_playInterrupted) PlPlayerController.playIfExists(); //player.play(); break; case AudioInterruptionType.unknown: break; } _playInterrupted = false; } }); // 耳机拔出暂停 session.becomingNoisyEventStream.listen((_) { PlPlayerController.pauseIfExists(); // final player = PlPlayerController.getInstance(); // if (player.playerStatus.playing) { // player.pause(); // } }); } }