기획서를 받았을 때에는 금방 구현하고 UI개선으로 넘어갈 수 있을 것이라 생각했지만 예상외로 발목을 잡는 건수가 하나 있었으니
바로 이 부분이었다.
음악 대기열은 현재 한개의 LinkedBlockingQueue로 구현되어있다.(우선예약을 위해서는 LinkedBlockingDeque로 바꾸겠지만)
하지만 반복 모드 OFF 상태를 구현하기 위해서는 시작곡에 대한 정보를 가지고 있어야 할 필요성이 있다.
이를 위해 구상과정에서 생겨난 의식의 흐름을 공유하고자 글을 작성한다.
반복모드 ON일 때 작동 원리
곡이 완료될 경우 곡의 진행사항을 초기화하기 위해 track을 clone하여 대기열 Queue의 맨 뒤에 다시 입력되는 방식이다.
반복모드 OFF일 때 구현되어야 할 것
- 재생목록을 재생하면서 재생되어 지나친 곡들의 정보를 저장해둬야한다.
- 재생목록을 전부 재생하였을 경우 재생이 종료되어야 한다.
- 재생목록을 전부 재생한 뒤 대기열에는 지금까지 재생된 곡들이 있어야 한다.
신곡 추가 이슈
첫 곡에 해당하는 track의 정보를 저장 해 둔 채로 Queue의 맨 뒤에 다시 입력하는 방식으로 구현할 경우 새로운 곡 or 리스트를 삽입할 때 이슈가 발생할 수 있다.
기존의 코드를 유지할 경우 다음 그림과 같이 추가되는 곡이 앞으로 재생할 목록에 들어가지 않게 된다.
이를 해결하기 위해 완료된 곡을 저장하기위한 nextQueue에 저장한 뒤 곡의 재생이 모두 완료될 경우 정지 후 해당 Queue를 가져오는 형식으로 구현하고자 하였다.
구현
TrackScheduler
- 상기한 nextQueue를 추가하였다.
- repeatMode 필드를 추가하여 반복모드의 ON, OFF를 표시하였다.
- 반복모드를 ON, OFF하는 매서드를 만들어 nextQueue의 곡들을 다시 queue에 입력해주도록 하였다
- 곡 재생이 완료되었을 때 반복모드 여부에 따라 queue, nextQueue중에 선택하여 입력되도록 수정하였다.
재생목록을 전부 재생하였을 경우의 처리
재생목록을 전부 재생하였을 경우 재생이 종료되고 nextQueue의 내용을 queue에 입력시켜야 한다.
이 부분에서 문제점이 생겨난다.
해당 기능을 구현하기 위해서는 재생목록이 전부 재생된 뒤 AudioPlayer가 어떤 작업을 진행하는지 이해해야하며, 만약 위 기능을 사용하기 위한 매서드가 존재하지 않거나 불가능하게 구현되어있다면 해당 class를 생성 해 주어야 할 것이라 판단된다.
이 부분에 대해서는 한개의 글이 완성될 것이라 생각되어 별도의 글로 작성하도록 하겠다.
'개발-프로젝트 > 디스코드 봇 만들기' 카테고리의 다른 글
0. 디스코드 음악봇 만들기 프로젝트 - 주제선택, 초기기획 (0) | 2021.12.27 |
---|