https://wiwi-pe.tistory.com/275
background audio play - 7 [Custom Modifier]
https://wiwi-pe.tistory.com/274 background audio play - 6 [오디오 인터럽트]https://wiwi-pe.tistory.com/261 background audio play - 5 [SwiftUI로 변경]0. 시작한참동안 또 안건드리다가 다시 잡게되었다.이전에 잠금화면에서
wiwi-pe.tistory.com
평소에는 그냥 흘러가는데로 음악을 듣다가 최근 발묘라는 노래에 꽂혀 한곡만 듣고싶어졌다
처음 만들땐 재생 모드가 필요할가 싶었는데
설마 필요해질줄이야
아무튼 그래서 한곡 재생 만드는김에 전체 루프도 추가했다
우선 모드들 보기 편하게 enum으로 만들주고
/// 0이 노말, 루프, 원루프 순 ++
enum PlayMode: Int, CaseIterable {
// normal > 음악목록 1회씩 재생,loop > 음악목록 끝나면 처음으로 가서 재생, one_loop > 현 재생 곡 계속 반복
// 전체 반복이 그냥 loop로 해놔도 되나?
case normal = 0, loop, one_loop
}
0값을 넣어준이유는 그냥 모드 변경할때 +으로 하고싶어져서인 별 다른 이유없다
재생 모드들을 영어로 뭐라하는지 몰라서 그냥 loop, one loop로 해놨음... 귀찮
그리고 모드값 저장할 변수,
@Published private(set) var playMode: PlayMode = .normal
퍼블리쉬 달아준건 당연히 컨트롤바나 리스트에서 변경됨을 감지하기위함이고...
이건 참 편하다 예전의 나였으면
didset { notifiacation ~~ 블라블라 } 이걸 달아주고 옵저버로 받으니 어쩌니 했을텐데
그냥 퍼블리쉬 달아주면 뷰에서 감지하고 뷰업데이트해주니 좋아졌다
뭐 아무튼
모드 변경할 함수도만들어주고
func chnagePlayeMode() -> Bool {
let oldValue: Int = self.playMode.rawValue
let modeCount: Int = PlayMode.allCases.count
let newValue = oldValue + 1
if newValue < modeCount, let newMode = PlayMode(rawValue: newValue) {
playMode = newMode
return true
}
else if newValue == modeCount, let newMode = PlayMode(rawValue: 0) {
// 노말 모드로 변경
playMode = newMode
return true
}
else {
// 에러
print("error: 이상한 값이 되었다? oldValue:\(oldValue), newValue\(newValue), modeCount:\(modeCount)")
return false
}
// return false
}
외부값이라곤 그냥 이넘 모드값 가져오는거 말곤 딱히 없겠지만 그래도 혹시 모를 디버그용 모드값 출력도 달아주고
오디오 종료감지를 하는 델리게이트쪽 함수 수정....
하려니 nextMusic()쪽에서 마지막 음악을 감지하고 종료하게 해놧던게 생각나서 수정하고 끝!
하려니... 한곡 반복에 대한 플레이용이 없어서 해당 기능을 분리 및 변경해주고 끝!
플레이쪽
// musicData가 비었거나 마지막 인덱스라면 동작하지 않도록 isLast 검사
// + normal 일때만 라스트 검사 하기
@objc func nextMusic() -> Bool {
if playMode == .normal {
guard !isLast else { return false }
}
_ = next()
// let url = currentMusic?.url
// guard url != nil else {
// print("play url is nil")
// stopUpdateTimer()
// return false
// }
//
// return play(url: url!)
return currentMusicPlay()
}
func currentMusicPlay() -> Bool {
let url = currentMusic?.url
guard url != nil else {
print("play url is nil")
stopUpdateTimer()
return false
}
return play(url: url!)
}
... ~~~~
~~~~
델리게이트쪽
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
switch playMode {
case .normal, .loop:
_ = nextMusic()
case .one_loop:
_ = currentMusicPlay()
}
}
얼추 다른 플레이어랑 비슷하게 되어버렸다
그리고 이제 슬슬 앱 아이콘이 없는게 거슬려졌다
아이콘 만들어주는 무료사이트가 아직 살아있을지 모르겠네
쓰다보니 컨트롤바 버튼 만들어준걸 깜빡했는데 그냥 다른 버튼 만든 함수 그대로 쓰고
특수문자랑 숫자만 써서 표현해줬다
아이콘주면 더 이쁠거같긴한데 귀찮기도하고 만들기 싫고..
https://github.com/wiwi-git/proj_ypl
GitHub - wiwi-git/proj_ypl: ios에서 간단하게 쓸 백그라운드 플레이어가 필요하다
ios에서 간단하게 쓸 백그라운드 플레이어가 필요하다. Contribute to wiwi-git/proj_ypl development by creating an account on GitHub.
github.com
'iOS > swift' 카테고리의 다른 글
background audio play - 7 [Custom Modifier] (0) | 2025.08.20 |
---|---|
background audio play - 6 [오디오 인터럽트] (1) | 2025.08.19 |
맥os 위젯 만들기 - 2 (2) | 2025.08.01 |
맥os 위젯 만들기 테스트 (2) | 2025.07.23 |
CoreData with SwiftUI (0) | 2025.05.09 |