먼저 현재 앱과 예전 예제를 구분하기
이 글은 2026년 11월 4일 다라리 Flutter 프로젝트의 audio_mixer_service.dart와 sleep_timer_controller.dart를 읽은 기록입니다. 이전 글에 있던 두 HTML 오디오 채널을 3초간 겹치는 예제는 현재 Flutter 오디오 구현을 설명하는 코드가 아니어서 교체했습니다.
확인한 서비스는 일반 사운드에 SoLoud를 쓰고 로컬 음악 재생에는 별도 just_audio 플레이어를 둡니다. 실제 공개 앱의 버전과 기기별 동작은 소스 검토만으로 확인되지 않습니다. 아래 내용은 이 로컬 구현의 흐름과 직접 비교해 볼 항목을 설명합니다.
반복의 틈과 파형의 단절은 다른 문제
짧은 소리의 끝과 시작을 이으면 두 종류의 이음새가 생길 수 있습니다. 다음 재생을 준비하는 동안 침묵이 생기는 경우와, 소리가 계속 나도 파일의 끝과 시작 파형이 달라 클릭처럼 들리는 경우입니다. 반복 옵션을 켰다는 사실만으로 둘 다 해결되지는 않습니다.
확인한 코드는 소스를 메모리에 로드하고 재생 시 looping: shouldLoop를 넘깁니다. 음원마다 반복 여부를 정하는 선택이 있으므로 모든 소리가 같은 길이로 자동 반복된다고 설명하면 안 됩니다. 플러그인의 반복 API와 음원의 실제 이음새를 나눠 확인해야 합니다. API의 범위는 flutter_soloud 문서에서 확인할 수 있습니다.
재생 시작과 믹서 음량 바꾸기
새 사운드는 음량 0으로 시작한 뒤 목표 음량까지 페이드합니다. 이미 재생 중인 채널의 음량을 갱신하는 경로도 있습니다. 이는 켜는 순간 음량이 갑자기 바뀌는 것을 줄이기 위한 전환이며, 파일 끝과 시작을 겹쳐 잇는 듀얼 채널 크로스페이드와는 다릅니다.
재현할 때는 한 소리를 켜고 끄는 경우와 여러 소리를 섞는 경우를 나눕니다. 파일 자체가 조용한 구간에서 시작할 수도 있으므로 “안 들린다”는 현상만으로 재생이 실패했다고 판단하지 않습니다. 앱 음량·기기 미디어 음량·출력 장치를 함께 확인하고, 소리를 바꿀 때 기존 채널이 남는지도 들어봅니다.
타이머가 끝나면 무엇이 일어날까
확인한 타이머 컨트롤러는 종료 시점을 저장하고 남은 시간을 갱신합니다. 종료 시에는 타이머·재생 상태를 정리한 뒤 fadeOutAndStop()을 호출합니다. 오디오 서비스는 활성 SoLoud 핸들의 음량을 낮추고, 별도 로컬 음악 플레이어도 단계적으로 줄인 후 정지합니다.
현재 메서드의 기본 페이드 길이는 5초입니다. 이는 확인한 소스의 기본값이며 모든 배포 버전의 설정을 보장하는 값이 아닙니다. 중간에 페이드가 취소되면 원래 음량을 복원하는 경로도 있어, 종료 직전 타이머를 바꾸거나 취소하는 상황은 별도로 시험해야 합니다.
귀로 확인할 때 기록할 조건
- 하나의 음원을 충분히 반복해 같은 지점에서 틈이나 클릭이 들리는지 확인합니다.
- 같은 파일을 단독 재생했을 때와 믹서에서 여러 소리와 함께 재생했을 때를 비교합니다.
- 타이머 종료 시 일반 사운드와 로컬 음악이 함께 줄어드는지 확인합니다.
- 타이머 취소·재설정과 출력 장치 변경을 나눠 확인하고 앱 버전·기기·음원 이름을 기록합니다.
이 소스 검토에서는 실제 단말의 이음새나 타이머 정확도를 측정하지 않았습니다. 음원과 장치에 따라 다를 수 있는 청감 결과를 “완전히 끊김 없음”으로 보장하지 않습니다. 사용하는 방법과 지원 경로는 다라리 제품 안내에서 이어서 볼 수 있습니다.