← Work
HighSleep 로고

HighSleep

올케어디엑스, 2023.08 ~ 2024.03 · 앱 풀스택 개발, 양대 스토어 출시

수면 음악 반복 재생 때마다 1초씩 소리 공백

2출시한 스토어
1s0반복 재생 끊김

배경

숙면 유도 사운드 앱입니다. 음악 프로듀서와 함께 앱과 음원을 서로 맞춰 가며 만들었습니다. 음원 끝에 3초를 비워 달라는 요구는 제가, 멜로디와 자연음, 주파수를 동시에 재생해 달라는 요구는 프로듀서가 내는 식이었습니다. 기획자, 디자이너와 함께 Flutter 코드베이스 하나로 iOS와 Android를 같이 출시했습니다.

문제

수면 음악은 자는 동안 계속 반복 재생되는데, 음원이 끝나고 처음으로 돌아갈 때 1초쯤 소리가 비었습니다. 자는 중에 소리가 갑자기 끊기면 깰 수 있어서 이 공백을 없애는 게 중요했습니다. App Store는 개인정보 정책 문제로 심사를 반려했습니다.

판단

멜로디와 자연음, 수면 주파수를 트랙 세 개로 나눠서 멜로디가 끝나도 자연음은 계속 흐르게 했습니다. 그런데 오디오 인스턴스 세 개가 따로 놀아서 재생과 정지에 딜레이가 생겼습니다. ViewModel 하나가 세 개를 같이 관리하도록 묶었습니다. 회원과 음원, 좋아요 데이터는 Firebase Auth, Firestore, Storage, Cloud Functions로 설계했고 로그인은 Google, Apple, 카카오 소셜 로그인으로 연동했습니다. 음원을 올리고 태그를 다는 관리자 웹과 회사 홈페이지는 Next.js로 만들었습니다. 반려는 회원 탈퇴 기능을 만들고 약관을 앱 안에서 볼 수 있게 해서 해결했습니다.

결과

반복 재생할 때 끊기는 부분이 없어졌고 트랙마다 음량을 조절해 취향대로 조합할 수 있게 됐습니다. iOS와 Android 심사를 모두 통과해 출시했습니다.

개선 전

개선 전: 반복 재생 사이 1초 공백, 오디오 인스턴스 세 개를 따로 제어1초 공백음원 1회 재생그다음 재생오디오 인스턴스 3개 제각각멜로디자연음주파수재생, 정지에 딜레이

개선 후

개선 후: ViewModel 하나가 세 트랙을 같이 제어하고 자연음은 계속 이어진다ViewModel 하나멜로디자연음주파수멜로디자연음멜로디가 끝나도 자연음은 이어짐공백 0
트랙 3개를 ViewModel 하나로 묶어 제어해서 반복 재생 때 1초씩 비던 소리와 재생, 정지 딜레이를 없앴습니다. 트랙별 음량 조절도 가능해졌습니다.

곡을 넘길 때마다 수면 주파수까지 처음부터 다시 재생

문제

곡을 넘기면 멜로디와 자연음만 바뀌면 되는데, 곡과 상관없는 수면 주파수 트랙까지 처음부터 다시 재생됐습니다.

판단

곡을 넘길 때마다 플레이어 세 개 모두 setUrl로 음원을 다시 불러오고 볼륨과 반복 모드를 다시 설정하고 있었습니다. setUrl을 부르면 재생 위치가 0으로 돌아갑니다. 그래서 첫 초기화 여부로 나눠, 그 뒤 곡 전환에서는 멜로디와 자연음의 URL만 바꾸고 수면 주파수 플레이어는 잠깐 멈췄다가 이어서 재생하게 했습니다.

결과

곡을 넘겨도 수면 주파수가 처음으로 돌아가지 않고 이어서 재생되고, 전환할 때마다 같은 수면 주파수 파일을 다시 받던 요청도 없어졌습니다.

  • Flutter
  • Firebase