AudioService - GachonCapstoneTeam/TTS_JAVA GitHub Wiki

🎡 AudioService

AudioServiceλŠ” μ˜€λ””μ˜€ νŒŒμΌμ„ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μž¬μƒν•˜κΈ° μœ„ν•œ Foreground Service둜, ν™ˆ/상세화면 μ–‘μͺ½μ—μ„œ κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©λ˜λŠ” TTS μ˜€λ””μ˜€ ν”Œλ ˆμ΄μ–΄μž…λ‹ˆλ‹€. MediaPlayerλ₯Ό 기반으둜 ν•˜λ©°, μ„œλΉ„μŠ€ 바인딩을 톡해 λ‹€λ₯Έ μ•‘ν‹°λΉ„ν‹°λ‚˜ ν”„λž˜κ·Έλ¨ΌνŠΈμ™€ μ—°λ™λ©λ‹ˆλ‹€.


βœ… μ£Όμš” κΈ°λŠ₯ μš”μ•½

κΈ°λŠ₯ μ„€λͺ…
μ˜€λ””μ˜€ μž¬μƒ 및 μΌμ‹œμ •μ§€ TTS둜 λ³€ν™˜λœ μ˜€λ””μ˜€ νŒŒμΌμ„ μž¬μƒν•˜κ³  μΌμ‹œμ •μ§€
Foreground Service μœ μ§€ μ•± μ’…λ£Œ μ‹œμ—λ„ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μž¬μƒ μœ μ§€
μž¬μƒ μƒνƒœ 콜백 전달 SeekBar μ—…λ°μ΄νŠΈ λ“± UI 동기화λ₯Ό μœ„ν•œ Listener 제곡
νŠΈλž™ μ™„λ£Œ μ‹œ λ‹€μŒ νŠΈλž™ μ „ν™˜ onCompletionListener ν™œμš©
νŠΈλž™ μœ„μΉ˜ μ§€μ • μž¬μƒ/이동 μž¬μƒ μœ„μΉ˜ μ§€μ • 및 seekTo() 지원
μƒνƒœ μœ μ§€ 및 μž¬μƒ 동기화 Home ↔ Original κ°„ μž¬μƒ μƒνƒœ μœ μ§€ 지원

μ˜€λ””μ˜€ μž¬μƒ


πŸ”§ μ£Όμš” 둜직 μ„€λͺ…

μ˜€λ””μ˜€ μ€€λΉ„ 및 μž¬μƒ - prepareAudio()

public void prepareAudio(String audioFilePath, int position, boolean play) {
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setDataSource(audioFilePath);
    mediaPlayer.prepareAsync();
    mediaPlayer.setOnPreparedListener(mp -> {
        if (position > 0) mp.seekTo(position);
        if (play) mp.start();
    });
}
  • μ§€μ •λœ μ˜€λ””μ˜€ 경둜λ₯Ό 기반으둜 MediaPlayerλ₯Ό μ€€λΉ„ν•˜κ³ , ν•„μš” μ‹œ λ°”λ‘œ μž¬μƒν•©λ‹ˆλ‹€.

μΌμ‹œμ •μ§€ 및 μž¬μ‹œμž‘

public void pauseAudio() {
    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
        mediaPlayer.pause();
    }
}

public void resumeAudio() {
    if (mediaPlayer != null && isPrepared) {
        mediaPlayer.start();
    }
}
  • pauseAudio()λŠ” μΌμ‹œμ •μ§€, resumeAudio()λŠ” λ‹€μ‹œ μž¬μƒμ„ λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

μž¬μƒ μœ„μΉ˜ λ³€κ²½ 및 μ§„ν–‰λ₯  전달

public void seekTo(int position) {
    if (mediaPlayer != null && isPrepared) {
        mediaPlayer.seekTo(position);
    }
}

progressHandler.postDelayed(() -> {
    if (mediaPlayer.isPlaying()) {
        progressUpdateListener.onProgressUpdate(getCurrentPosition(), getDuration());
    }
}, 1000);
  • μ‚¬μš©μžκ°€ SeekBarλ₯Ό 움직이면 seekTo()둜 μ΄λ™ν•˜κ³ , 주기적으둜 ν˜„μž¬ μ§„ν–‰ μƒνƒœλ₯Ό 콜백으둜 μ „λ‹¬ν•©λ‹ˆλ‹€.

λ‹€μŒ νŠΈλž™ 콜백 μ„€μ •

mediaPlayer.setOnCompletionListener(mp -> {
    if (nextTrackListener != null) {
        nextTrackListener.onTrackCompleted();
    }
});
  • νŠΈλž™ μž¬μƒμ΄ μ™„λ£Œλ˜λ©΄ onTrackCompleted()λ₯Ό ν˜ΈμΆœν•˜μ—¬ λ‹€μŒ νŠΈλž™μœΌλ‘œ λ„˜μ–΄κ°ˆ 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

πŸ”— κ΄€λ ¨ 클래슀

  • HomeFragment: μž¬μƒ μš”μ²­μ„ λ³΄λ‚΄λŠ” μ£Όμš” UI
  • OriginalActivity: 전체화면 ν”Œλ ˆμ΄μ–΄ μΈν„°νŽ˜μ΄μŠ€
  • TTSHelper: ν…μŠ€νŠΈ β†’ μ˜€λ””μ˜€ 파일 생성