fix(audio): 모바일 백그라운드 시 오디오 완전 정지

- AudioService: pauseAll()/resumeAll() 메서드 추가
- _isPaused 플래그로 백그라운드 시 새로운 재생 요청 차단
- playBgm/playSfx에서 일시정지 상태 체크
- game_play_screen: pauseAll() 사용으로 BGM+SFX 동시 정지
- 포그라운드 복귀 시 resumeAll() 호출 후 화면 재로드
This commit is contained in:
JiWoong Sul
2025-12-30 17:49:49 +09:00
parent a8d818917f
commit 8fd2f71a2f
2 changed files with 60 additions and 26 deletions

View File

@@ -39,6 +39,9 @@ class AudioService {
// 사용자 상호작용 발생 여부 (웹 자동재생 정책 우회용)
bool _userInteracted = false;
// 오디오 일시정지 상태 (앱 백그라운드 시)
bool _isPaused = false;
/// 서비스 초기화
Future<void> init() async {
if (_initialized || _initFailed) return;
@@ -83,6 +86,7 @@ class AudioService {
/// 다음 SFX 재생 시 함께 시작됩니다.
Future<void> playBgm(String name) async {
if (_initFailed) return; // 초기화 실패 시 무시
if (_isPaused) return; // 일시정지 상태면 무시
if (!_initialized) await init();
if (_initFailed || !_initialized) return;
if (_currentBgm == name) return; // 이미 재생 중
@@ -128,6 +132,33 @@ class AudioService {
}
}
/// 전체 오디오 일시정지 (앱 백그라운드 시)
///
/// BGM을 정지하고, 새로운 재생 요청을 무시합니다.
Future<void> pauseAll() async {
_isPaused = true;
if (!_initialized) return;
// BGM 정지 및 상태 초기화
await _bgmPlayer?.stop();
_currentBgm = null;
// 모든 SFX 정지
for (final player in _sfxPlayers) {
await player.stop();
}
debugPrint('[AudioService] All audio paused');
}
/// 전체 오디오 재개 (앱 포그라운드 복귀 시)
///
/// 일시정지 상태를 해제하고 이전 BGM을 재개합니다.
Future<void> resumeAll() async {
_isPaused = false;
debugPrint('[AudioService] Audio resumed');
}
/// SFX 재생
///
/// [name]은 assets/audio/sfx/ 폴더 내 파일명 (확장자 제외)
@@ -136,6 +167,7 @@ class AudioService {
/// 웹에서 대기 중인 BGM이 있으면 함께 재생 시작합니다.
Future<void> playSfx(String name) async {
if (_initFailed) return; // 초기화 실패 시 무시
if (_isPaused) return; // 일시정지 상태면 무시
if (!_initialized) await init();
if (_initFailed || !_initialized) return;
if (_sfxVolume == 0) return; // 볼륨이 0이면 재생 안함