Imported from hyuunnn/band-mr (
AGENTS.md). Install upstream withnpx skills add hyuunnn/band-mr. Copyright stays with the author.
AGENTS.md โ ๊ฐ๋ฐ ๊ท์น
Android ยท Kotlin ยท Compose ์ฑ. ์ค์ ๊ฐ์ ์์ค, ๊ตฌํ ๋ฐฐ๊ฒฝ์ KDoc์ ์ฐธ๊ณ ํ๋ค. ์ด ๋ฌธ์์๋ ๊ฒ์ฆ ๋ฐฉ๋ฒ๊ณผ ํ๊ท ๋ฐฉ์ง ๊ท์น๋ง ๋๋ค.
๋น๋ยท๊ฒ์ฆ
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
export ANDROID_HOME=/opt/homebrew/share/android-commandlinetools
./gradlew :app:testDebugUnitTest
./gradlew :app:assembleDebug
./gradlew :app:assembleRelease
- Homebrew JDK 17์ด
java_home์ ๋ฑ๋ก๋์ง ์์๋ค๋ฉดJAVA_HOME=/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home์ ์ฌ์ฉํ๋ค. - ๋ฐฐํฌ๋ release APK.
local.propertiesยท์๋ช ํคยทkeystore.properties๋ ์ปค๋ฐํ์ง ์๋๋ค. adb/sdkmanager๋/opt/homebrew/bin. - AGP ๋ด์ฅ Kotlin์ ์ฌ์ฉํ๋ค.
kotlin.android๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ KSP๋ฅผ Kotlin๊ณผ ๊ฐ์ ๋ฒ์ ์ผ๋ก ๋ง์ถ์ง ์๋๋ค. - ๋ก์ง ์์ ํ
testDebugUnitTestํ์. DSP ์์ ์ ๊ธฐ์กด ๊ตฌํ๊ณผ ์์นยท๋ฐ์ดํธ ๋น๊ต ํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ค. - ์ฐ๊ฒฐ๋ SM-S931N(Android 16)์์ ์ค๊ธฐ๊ธฐ ๊ฒ์ฆ ๊ฐ๋ฅ. ๋ฏธ์ฐ๊ฒฐ ์ ๋น๋ยทJVM ํ ์คํธ๋ก ๊ฒ์ฆํ๋ค.
์ฝ๋ ์ง๋
app/src/main/java/com/bandmr/app/ ๊ธฐ์ค.
| ๊ฒฝ๋ก | ๋ด๋น |
|---|---|
audio/ |
AudioTrackEngine, SourceWavPlayer, StemMixPlayer, PlayerController, MixCache, DSPยทWAVยทํํ |
io/ |
FilePromote, CacheStorage |
separation/ |
๋ชจ๋ธ ๊ด๋ฆฌ, MixCache ์ ๋ ฅ ๋ถ๋ฆฌ, StemFiles, SeparationCommit, SepBus |
playback/ |
PlaybackService, MediaSessionยท์๋ฆผ, SkipButton ๊ณตํต ์ ์ |
export/ |
๋ฏน์คยท์คํ WAV ์ ์ฅ, writeMixWav |
youtube/ |
NewPipeExtractor โ ์๋ณธ ํ์ผ โ Song โ MixCache |
data/, ui/ |
RoomยทDataStore, ๋ผ์ด๋ธ๋ฌ๋ฆฌยทํ๋ ์ด์ดยท์ค์ |
๋ชจ๋ธ ๋ณํ์ tools/README.md, ๋ผ์ด์ ์ค๋ THIRD_PARTY_NOTICES.md.
ํจํค์งยทํ๋ฉด
- ABI๋
arm64-v8a๋ง.material-icons-extended๋ ์ถ๊ฐํ์ง ์๊ณ ํ์ํ ์์ด์ฝ์ ๋ฒกํฐ ๋ฆฌ์์ค๋ก ๋๋ค. - R8์ ์ผ๋ฉด NewPipeExtractor/rhino keep ๊ท์น์ด ํ์ํ๋ค.
- ์ฒซ ํ๋ ์ ์ ์ ํ
๋ง๋
startupDesign(), ๊ณก ๋ชฉ๋ก์librarySongs()๋ก ์ฝ๋๋ค. - ๋ชฉ๋ก์
librarySongState๋ฅผ ๊ตฌ๋ ํ๋ค. ์ด๊ธฐ ๋ชฉ๋ก์ ์ฒซ ํ๋ ์ ์ ์ ์ฝ๊ณ , Room ๊ด์ฐฐ์appScope์์ ๊ณ์ํด ํ๋ฉด ๋ฐ์ ๊ณก ์ถ๊ฐยท์ญ์ ยท๋ถ๋ฆฌ ์ํ ๋ณ๊ฒฝ๋ ๋ฐ์ํ๋ค. ํ๋ฉด ์๋ช ์๋ง ์บ์ ๊ฐฑ์ ์ ๋ฌถ์ง ์๋๋ค. - ์์ ํ๋ฉด์
setSplashScreenTheme(Theme.BandMR.*)๋ก ์ค์ ํ๋ค. ๊ธฐ์กด ์คํ์ผ ์ด๋ฆ์ ์ ์งํ๊ณ ๋ฐฐ๊ฒฝ์์Theme.kt์ ๋ง์ถ๋ค. ์์ด์ฝ์ ๋ฐ๋ก ์ง์ ํ์ง ์๋๋ค. - ์์คํ
๋ฐ ์์ด์ฝ์
SideEffect์์ ์ฑ ํ ๋ง๋ก ์ฌ์ค์ ํ๋ค. ๊ตฌ์ฑ ๋ณ๊ฒฝ ์์๋ ์ ์ฉํด์ผ ํ๋ค.
์ฌ์
- AI OFF๋ MixCache WAV๋ง ์ฌ์ํ๋ค. ์์ถ ์๋ณธ์ ์ง์ ์คํธ๋ฆฌ๋ฐ์ ๊ธ์งํ๋ค.
- ์ข
๋ฃ๋
PlayerController.release()๋ก ๋ชจ์๋ค. ์ฑ๊ธํด ์ฝ๋ฃจํด ์ค์ฝํ๋ ์ทจ์ํ์ง ์๋๋ค. ํ ์ด๋์ ์ข ๋ฃ๊ฐ ์๋๋ค. - ํด์ ์
releaseEpoch๋ฅผ ์ฌ๋ ค ์ด๋ฆฐ ํ๋ฉด์ ์์ง ์ฌ์ค๋น๋ฅผ ์๋ฆฐ๋ค. ์ข ๋ฃ ์ค ์๋ฆผ ์ฌ๋ฑ๋ก์PlaybackService.stopping์ผ๋ก ๋ง๋๋ค. - ์๋ฆผยท์ ๊ธํ๋ฉดยท๋ธ๋ฃจํฌ์ค ๋ช
๋ น์
setPlaying(Boolean). ํ ๊ธ์ ํ๋ฉด์playPause()๋ง ์ฌ์ฉํ๋ค. - ์ฌ์ FGS๋
setPlaying์ ์ฌ์ ์๋ ์์ ์ ์์ํ๋ค.isPlaying๊ด์ฐฐ๋ก ๊ธฐ๋ํ์ง ์๋๋ค. - ๊ณก๋ ์ฝ๋ฐฑ์ ์คํ ์์ ์
released์ ์ฌ์์ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.released๋release()์์๋ง ์ธ์ด๋ค. - ์๋ฆผ ์ข
๋ฃ๋ ์ ๋ชฉยท์ฌ์ ์ํ ์์ชฝ ๋ณ๊ฒฝ์์ ํ์ ํ๊ณ , ์๋น์ค ์ข
๋ฃ ์์ฒญ ์ ์
stopping์ ์ธ์ ์ฌ๋ฑ๋ก์ ๋ง๋๋ค. StemMixPlayer.renderChunk๋ ์์๋ฅผ ๋ฐํํ๋ค. ์ ๋ ฅ์ด ์์ผ๋ฉด ๋ฌด์, ๋ซํ ๋ฆฌ๋ ์์ธ๋ ์คํ ๋ณ๋ก ์ฒ๋ฆฌํ๋ค.ensureLoaded๋separatedTierยทstemsDir๋ณ๊ฒฝ ์ ๋ฏน์๋ฅผ ๋ค์ ์ฐ๋ค. ๊ฒ์ธยทํคยท๋ฐฐ์์ setter๋ก ์ ์ฉํ๋ค.- ์ฌ๋ถ๋ฆฌ ์์ ์
release()๋ฅผ ํธ์ถํ์ง ์๋๋ค. ๊ธฐ์กด ์คํ ๋ฆฌ๋๋ ํ์ผ ๊ต์ฒด ์ค์๋ ์ ์งํ๊ณ , ์๋ฃ ํensureLoaded๋ก ์์นยท์ฌ์ ์ํ๋ฅผ ์ด์ด ์ ์คํ ์ ์ฐ๋ค. - ํ๋ฉด ํธ์ง๊ฐ์ ๊ณก์ ์ฒ์ ์ด ๋ ์ ์ฅ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ค. ๊ฐ์ ๊ณก์ ์์ง ์ฌ์ค๋น๋ ํ์ฌ ํธ์ง๊ฐ์ ์ ์งํ๋ค.
- ํ๋ ์ด์ด์ ๊ณก ๋ก๋ฉ๊ณผ ์ค์ ๊ณก ๋ถ์ฌ๋ฅผ ๊ตฌ๋ถํ๋ค. ๊ณก ๋ถ์ฌ๋ ์๋ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋์ ์ ๊ณตํ๊ณ , ์ฒ์ ์ฝ์ ๋ชฉ๋ก ์บ์๋ฅผ ํธ์ง๊ฐ ์ด๊ธฐํ์ ์ฌ์ฌ์ฉํ์ง ์๋๋ค.
- A-B ๋ฐ๋ณต์ ์ค๋์ค ์ค๋ ๋์์ ์ฒ๋ฆฌํ๋ค. ๊ณก ์ ํ์
setLoop(..., apply=false)ํ ์ ์์ง์ ์ ์ฉํ๋ค. - write ํ ํธ๋ ์ฌ์์์
stateLock์์์isPlaying์ ํ์ธํด pause์ ์ง๋ ฌํํ๋ค. - pause์ flush๋ง ์ ๊ฑฐํ์ง ์๋๋ค. ๋ณ๊ฒฝํ๋ ค๋ฉด ์ฌ๊ฐ ์ ํธ๋ ์์,
stopEngine์ join ์ flush, ์คํ ์ผ ์ฒญํฌ flush๋ ํจ๊ป ์ฒ๋ฆฌํ๋ค. ํ์ฌ ์ต๋ ๋ฒํผ๋งํผ์ ์์น ์คํต์ ํ์ฉ๋ ๋์์ด๋ค. - ๋ฐฐ์์
AudioTrack.setPlaybackParams(speed, pitch=1)๋ก๋ง ์ ์ฉํ๊ณ ์ํฌยท์ฌ๊ฐ ๋ ๋ค์ ๊ฑด๋ค.
DSP
- ์ํฌ๋
processorsDirty๋ง ์ธ์ด๋ค. ์ค๋์ค ์ค๋ ๋๊ฐframePosยท๊ณก๋ ํ์ ยท๋ ๋ ์ ์ ์ ์๋ฆฌ ๋ฆฌ์ ํ๋ค. UI ์ค๋ ๋์์ DSP๋ฅผ ๋ฆฌ์ ํ์ง ์๋๋ค. - ํค ๋ณ๊ฒฝ์ ์์ฒญ๊ฐ๋ง ๊ธฐ๋กํ๊ณ ํผ์น ์ํ๋ ์ค๋์ค ์ค๋ ๋์ ์ฒญํฌ ๊ฒฝ๊ณ์์ ์ ์ฉํ๋ค. ํค ๋ณ๊ฒฝ๋ง์ผ๋ก ์ ๊ฑฐ DSP๋ฅผ ๋ฆฌ์ ํ์ง ์๋๋ค.
- ์ฒด์ธ ๊ฐ์ฒด ๊ต์ฒด๋ muteMask ๋ณ๊ฒฝ ์์๋ง ํ๋ค.
chain์@Volatile์ ์ ์งํ๋ค. - AI ์ ์ฉ ์คํ ์ 0% ์ค์ ์ ๋ณด์กดํ๋ DSP ์ฒ๋ฆฌยทdrain์์๋ ์ ์ธํ๋ค. AI ์ ์ฉ ๋นํธ๋ง ์์ผ๋ฉด ์ฒด์ธ ์ ๋ ฅ PCM์ ๊ทธ๋๋ก ๋ด๋ณด๋ด๊ณ drain ์ถ๋ ฅ์ ๋ง๋ค์ง ์๋๋ค.
SpectralStage.reset()์magHist๊น์ง ๋น์ด๋ค. ๋ฆฌ์ ์ถ๋ ฅ์ ์ ์ฒด์ธ ์ถ๋ ฅ๊ณผ ๊ฐ์์ผ ํ๋ค.- 0๋ฐ์ ํผ์น๋ ํจ์ค์ค๋ฃจ. ๊ธฐ๋ณธ ํ์์ interleaved stereo PCM16์ด๋ฉฐ ๋ชจ๋
ธ๋
chCount=1์ ์ฒ๋ฆฌํ๋ค. - WAVยทFOURCC๋ little-endian. ํ์ดํ๋ผ์ธ๊ณผ msโํ๋ ์ ์ํ์
PIPELINE_SAMPLE_RATE(44.1kHz) ๊ณ ์ ์ด๋ฉฐ ๋ถ์ผ์น ์คํ ์ ์ ์ธํ๋ค.
ํ์ผยท์บ์
- ์์ ๊ณ ์ ์ ๋ฆฌ์ DB ๋ชฉ๋ก ์กฐํ๋ถํฐ ์ญ์ ์๋ฃ๊น์ง๋
startupCleanup์ผ๋ก ์ ํ์ผ ์์ ๊ณผ ๋ถ๋ฆฌํ๋ค.MixCache.prepare์ ์ ํ๋ธ ์๋ณธ ์์ฑยท์ฌ์ฌ์ฉ์ ์ด ์ ํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ, ์ดํ์ ์ฌ์ ๋ณํ ์ ์ฒด๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค. ์์ ์์ ์ ์คํจยท์คํ ์ ์ทจ์๋ ๋๊ธฐ๋ฅผ ํด์ ํด์ผ ํ๋ค. - ๋ด๋ถ ์ฐ์ถ๋ฌผ ์น๊ฒฉ์
FilePromote๋ฅผ ์ฌ์ฉํ๋ค. ๋ณต์ฌ ์คํจ ์ ๋ชฉ์ ์ง๋ฅผ ์ง์ฐ๋ฉฐ, ๋ถ๋ฆฌ ์ค ๊ธฐ์กด ์ ์ ์คํ ์ ๋จผ์ ์ง์ฐ์ง ์๋๋ค. - MixCache๋ ๋์ฝ๋ฉ์
.part์ WavWriter์ ์ง์ ์ฐ๋ 1ํจ์ค. close ํ ์น๊ฒฉํ๊ณ , 0ํ๋ ์์ ๊ฑฐ๋ถํ๋ค(44๋ฐ์ดํธ ํค๋๋ ์ผ๋ฐ ํ์ผ ๊ฒ์ฌยทWavReader๋ฅผ ํต๊ณผํ๋ค). - ์ด ์ ์๊ฑฐ๋ ๊ธธ์ด๊ฐ 0์ธ ์บ์๋
MixCache.delete๋ก WAVยทpeaks๋ฅผ ํจ๊ป ๋ฒ๋ฆฐ๋ค. - MixCache์ ๊ณก๋ณ ์ ๊ธ์ suspend ๊ฐ๋ฅํ Mutex๋ก ์ ์งํ๋ค. ์บ์ ์น๊ฒฉ์
withStemMutation์์์ DB์ ๊ณก์ด ๋จ์ ์๋์ง ํ์ธํ ๋ค ์ํํด, ๊ณก ์ญ์ ์ดํ ์ ์ ์บ์๊ฐ ๋ค์ ์๊ธฐ์ง ์๊ฒ ํ๋ค. ๋์ฝ๋ฉ ์ ์ฒด๋ฅผ ํ์ ์ ๊ธ์ผ๋ก ๊ฐ์ธ์ง ์๋๋ค. - ๋ก์ปฌ ๊ณก ๋ฑ๋ก ํ์ ์บ์ ์ฌ์ ๋ณํ์
appScope์์ ์คํํด ํ๋ฉด ์ดํ๋ก ์ค๋จํ์ง ์๋๋ค. ์ทจ์ ํ์ธ์ ๊ทธ ์์ ์ ์ฝ๋ฃจํด ์ปจํ ์คํธ์ ์ฐ๊ฒฐํ๊ณ , ์ทจ์ ์์ธ๋ ์ผ๋ฐ ์คํจ๋ก ์ผํค์ง ์๋๋ค. - ์บ์ ํ์ ์ฉ๋ยท๋ฒํผยท์ญ์ ๋์์
CacheStorage.clearable*๋ก ๋ง์ถ๋ค. ์ง๊ณยท์ญ์ ๋ ๊ฐ์ ์ ์ด๋ฅผ ์ฐ๊ณ , ์ผ๋ฐ ์ ๋ฆฌ์์ ์์ ์ค.part/.tmp๋ฅผ ์ ์ธํ๋ค. - ์ฌ์ ์บ์ ๋น์ฐ๊ธฐ๋ ์์ ์ฌ์ ๋ณํ๊ณผ ๊ธฐ์กด ์ฌ์ ์ค๋น์ ๋์ฝ๋ฉ ์ทจ์๋ฅผ ์ ๋ฌํ๊ณ ๋ ๋ค ์ข
๋ฃํ ๋ค ์ญ์ ํ๋ค. ์ ๋ฆฌ๋
appScope์์ ์๋ฃํด ์ค์ ํ๋ฉด ์ดํ๋ก ์ค๋จํ์ง ์๋๋ค. ์ผ๋ฐ ์ฌ์ ํด์ ๋ ์๋ฃ ์ฝ๋ฐฑ๋ง ๋ฌดํจํํ๋ฉฐ, ๊ณก ์ถ๊ฐยท๋ด๋ณด๋ด๊ธฐ๊ฐ ์์ฒญํ ์บ์ ์์ฑ์ ์ผ๊ด ์ฐจ๋จํ์ง ์๋๋ค. - ์ ์ฒด ์คํ
์ญ์ ๋ ๋ถ๋ฆฌ๋ฅผ ์ทจ์ํ๊ณ
withStemMutation์์์.partํฌํจ ์ญ์ (includeInFlight)์ DB ํด์ ๋ฅผ ํจ๊ป ์ํํ๋ค. - ์คํ
๊ฒฝ๋ก๋
StemFiles๋ก ํต์ผํ๋ค. ๋ถ๋ฆฌยท๊ณ ์ ์ ๋ฆฌยท์ฉ๋ ์ง๊ณยท์ญ์ ์์ ๋ณ๋๋ก ์กฐํฉํ์ง ์๋๋ค. - ํํ
.peaks๋ FilePromote ๋์์์ ์ ์ธํ๋ค. ๋ง๋ ์ยท์๋ณธ ํฌ๊ธฐ ๋ถ์ผ์น๋ ์์ ์ ์ฌ๊ณ์ฐํ๋ฉฐ ํ์์ฉ ํ์ผ ์ค๋ฅ๋ ์ ํํ์ง ์๋๋ค. - ํํ ์ํ๋ songId๋ก rememberํ๋ค. ์ค๋น ์ํ ๋ณํ๋ก ๋น์ฐ์ง ์์ผ๋ฉฐ ์บ์ ๋๊ธฐ๋
MixCache.awaitReady๋ฅผ ์ด๋ค. ์๋ณธ ์ฌ์ ๋ชจ๋์์๋ ์ฌ์๊ธฐ์ ์ค๋น ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ , ์คํ ์ฌ์ ๋ชจ๋์์๋ง ํํ์ด ์บ์ ์์ฑ์ ์์ฒญํ๋ค.
๋ถ๋ฆฌยท์ ํ๋ธ
- ๋ถ๋ฆฌยท๋ด๋ณด๋ด๊ธฐ ์ ๋ ฅ์ MixCache WAV. ๋ณ๋ raw ๋์ฝ๋ฉ์ ๋ง๋ค์ง ์๋๋ค.
OrtSession์ ๋ถ๋ฆฌ๋ง๋ค ์ด๊ณ ๋ซ๋๋ค. ์ธ์ ์บ์๋ ๊ธ์งํ๋ค.- ์ถ๋ก ์
Tier.segmentSamples๊ณ ์ shape, ๋ง์ง๋ง ์ฒญํฌ๋ 0 ํจ๋ฉ. ๋์ ์ถ์ ์ฌ์ฉํ์ง ์๋๋ค. - ์ทจ์๋
currentCoroutineContext()[Job]์ผ๋ก ํ์ ํ๋ค. ์ ๋ถ๋ฆฌ๋ ์ด์ Job์ joinํ ๋ค ์์ํ๋ค. - ์
๋ ฅ ๋์ฝ๋ฉ์ ์งํ๋ฅ ยท์ถ๋ ฅ ์ ๋ฌด์ ๋ฌด๊ดํ๊ฒ ๋ฐ๋ณต๋ง๋ค ์ทจ์๋ฅผ ํ์ธํ๊ณ , ์บ์ ์น๊ฒฉ ์ ์๋ ๋ค์ ํ์ธํ๋ค.
MixCache.prepare์ ์ทจ์ ํ์ธ์checkCancelled์ด๋ฆ ์ธ์๋ก ์ ๋ฌํ๋ค(๋ง์ง๋ง ๋๋ค๋ ์งํ๋ฅ ์ฝ๋ฐฑ). - ๋ง์ง๋ง ์ถ๋ก ํยท๊ฒฐ๊ณผ ๋ฐํ ์ ์๋ ์ทจ์๋ฅผ ํ์ธํ๋ค. ์น๊ฒฉยทDB ๊ฐฑ์ ์
commitSeparation์ ์งง์NonCancellable๊ตฌ๊ฐ์์ ํ์ ํ๋ค. ์ถ๋ก ์ ์ฒด๋ฅผ ๊ฐ์ธ์ง ์๋๋ค. - ์คํ ์น๊ฒฉ๋ ํ์ ์ ๊ธ ์์์ ๊ณก ์กด์ฌ๋ฅผ ํ์ธํ๋ค. ์ญ์ ๊ฐ ๋จผ์ ๋๋ฌ์ผ๋ฉด ์น๊ฒฉยทDB ๊ฐฑ์ ์ ๊ฑด๋๋ฐ๊ณ ๋ถ๋ฆฌ ์์ ์ด ์์ ์ฐ์ถ๋ฌผ์ ์ ๋ฆฌํ๋ค.
SepBus๋ ๋ง์ง๋ง ์๋์ ์งํยท์ค๋ฅ๋ง ๋ด๊ณ , ์๋ฃ ์ฌ๋ถ๋Song.isSeparated๋ก ํ๋จํ๋ค.- ๋ชจ๋ธ ๋ค์ด๋ก๋๋ Range ์ด์ด๋ฐ๊ธฐ.
.tmp๋ ๋คํธ์ํฌ ์คํจ ์ ๋ณด์กดํ๊ณ ๋ฌด๊ฒฐ์ฑ ์คํจ ์ ์ญ์ ํ๋ค. - ๊ฐ์ ์ ํ๋ธ ์์๋ ํคยท๋ฐฐ์์ ๋ฐ๋ก ์ค์ ํ ์ ์๊ฒ ๋งค๋ฒ ์ Song์ผ๋ก ๋ฑ๋กํ๋ค. ์ค๋ณต ๋ฑ๋ก์ ์๋๋ ๊ธฐ๋ฅ์ด๋ฉฐ, ๋ฒ๊ทธ ์์ ๋ช ๋ชฉ์ผ๋ก ๊ธฐ์กด ํ ์ฌ์ฌ์ฉ์ด๋ ์ค๋ณต ์ฐจ๋จ์ผ๋ก ๋ฐ๊พธ์ง ์๋๋ค.
- ์ ํ๋ธ ์๋ณธ ํ์ผ์ ์์ผ๋ฉด ์ฌ์ฌ์ฉํ๊ณ ์์ผ๋ฉด ๋ค์ ๋ฐ๋๋ค. ๊ฐ์ ์์์ DB ํ์ด ์๋ค๋ ์ด์ ๋ก ๋ค์ด๋ก๋ ๊ฒฝ๋ก๋ฅผ ๊ฑด๋๋ฐ์ง ์๋๋ค.
- ๊ธธ์ด ๋ฏธ์ ๋ค์ด๋ก๋๋ ์์ ์ค ์ฐ๊ฒฐ ์ค๋ฅ๋ ์คํจ๋ก ์ฒ๋ฆฌํด ๋ถ๋ถ ํ์ผ์ ๋ฒ๋ฆฐ๋ค. ์ ์ EOFยท์ ๋ ์์ ๊ณผ ์์ ์๋ฃ ํ ์ ๋ ฅ close ์์ธ๋ฅผ ๊ตฌ๋ถํ๋ค.
- ์ ํ๋ธ ์ถ๊ฐ ์คํจยท์ทจ์ ์ ์ด๋ฒ ์ ๊ท ํ๊ณผ ์บ์๋ง ๋กค๋ฐฑํ๋ค. ๊ธฐ์กด ๊ณกยท์ค์ ยท์บ์๋ ๋ณด์กดํ๊ณ , ์์ฑ๋ ๋ค์ด๋ก๋ ์๋ณธ์ ๊ฐ์ ์คํ ์์ ์ฌ์๋์ฉ์ผ๋ก ๋จ๊ธด๋ค. ์ฌ์์ ์ DB ์ฐธ์กฐ๊ฐ ์๋ ์๋ณธ์ ๊ณ ์ ์ ๋ฆฌ ๋์์ด๋ค.
- ์ ํ๋ธ ์์
์
importMutex๋ก ์ ๋ฆฌ๊น์ง ์ง๋ ฌํํ๊ณ ์์ ๋ณ ์์ ํ์ผ์ ์ฌ์ฉํ๋ค. ๋ฆ์ ์ํ ์ฝ๋ฐฑ์ ํ์ฌ ํ์ฑ Job๋ง ํ์ฉํ๋ค. - ์์ ์ํ
Resolving์ Job ๋ฑ๋ก ํnext.start()์ ์ ๋ฐํํ๋ค. ๋๊ธฐ UI ๋๋ฝ๊ณผ ์ฆ์ ์คํจ ์ํ ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ๋ง๋๋ค. - ์ ํ๋ธ ์ํฌํธยท๋ชจ๋ธ ๋ค์ด๋ก๋๋
appScope์์ ์คํํ๋ค(FGS ์๋).
๋ฐ์ดํฐยท๋ด๋ณด๋ด๊ธฐยท๋ชจ๋ธ
- Song ์ ์ฅ์ ์ปฌ๋ผ๋ณ UPDATE๋ง ์ฌ์ฉํ๋ค.
get โ copy โ update๋ ๊ธ์งํ๋ค. - ๋ณผ๋ฅจ ๊ธฐ์ค์
stemGainsPacked. AI ON ๊ฒ์ธ๊ณผ AI OFF ์ฒดํฌยทmuteMask๋Stem๋ณํ ํจ์๋ก ํ์ํ๋ค. DB์ muteMask ์ปฌ๋ผ์ ์ด์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฉ์ด๋ค. - ๋ฏน์ค ๋ด๋ณด๋ด๊ธฐ๋ ์ ์ฒด ๊ณกยท์๊ณก ํ
ํฌ. ๋ณผ๋ฅจยทํค๋ง ์ ์ฉํ๊ณ ๋ฐฐ์ยทA-B๋ ์ ์ธํ๋ค. ํผ์น๋
PitchShifter.renderTo๋ฅผ ๊ณต์ ํ๋ค. ์คํ ๊ฐ๋ณ ๋ด๋ณด๋ด๊ธฐ๋ ๋ถ๋ฆฌ WAV๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ๋ค. writeMixWav๋ ์ ์ฅ๋ง๋ค ๊ณ ์ ์์ WAV๋ฅผ ์ฐ๋ฉฐ, closeยท์ทจ์ ํ์ธ ํ ๋ชฉ์ ์ง๋ก ๋ณต์ฌํ๋ค.- ์คํ ๊ฐ๋ณ ์ ์ฅ์ ์ด๊ธฐยท๋ณต์ฌยทclose ์คํจ ์ ํ์ฌ ๋ฌธ์๋ง ์ญ์ ํ๊ณ ์์ ์๋ฃํ ํ์ผ์ ๋ณด์กดํ๋ค. ์ฑ๊ณต ๊ฐ์๋ close ํ ์ฌ๋ฆฐ๋ค.
ModelConfig.stemOrder๋Tier.stemOrder์ ์ผ์น์ํจ๋ค. ๋ชจ๋ธ ๊ท๊ฒฉยท๊ฒฝ๋ก๋ ModelCatalog/Tier๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค.- ๋ชจ๋ธ ์ฌ์
๋ก๋ ์
ModelCatalog.kt์ SHA-256 ํ์ ๊ฐฑ์ ํ๋ค. ๋ผ์ด์ ์ค ๊ณ ์ง๋ ์ ์งํ๋ค. - ๊ธฐ์กด ๋ชจ๋ธ์ ํ ๊ฒ์ฆ์ IO์์ ์ํํ๊ณ , ๊ฒ์ฆ ์ ์๋ ๋ถ๋ฆฌ์ ๊ณต๊ฐํ์ง ์๋๋ค. ๋ค์ด๋ก๋ ์๋ฃ๋ ๊ทธ๋์์ ์๋ ๋ชจ๋ธ ์ ํ์ ๋ฎ์ง ์๋๋ค.
- ๋ค๋ฅธ ๋ชจ๋ธ์ ๋ค์ด๋ก๋ ๋ฒํผ ์ ๊ธ์
ModelState.Downloading๋ ํ์ธํด ์ค์ ํ๋ฉด ์ฌ์ง์ ํ์๋ ์ ์งํ๋ค. - ์ค์ ์ ์ ๋ฆฌยท๋ชจ๋ธ ์์
์ ์คํจ ์ ์ค๋ฅ๋ฅผ ํ์ํ๊ณ
finally์์ ๋ฒํผ ์ ๊ธ์ ํด์ ํ๋ค.CancellationException์ ์คํจ๋ก ์ผํค์ง ์๋๋ค. - ํ๋ ์ด์ด๋ ๋ชจ๋ธ
Checking์ ๋ฏธ๋ค์ด๋ก๋ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ์ง ์๋๋ค. ํ์ธ ์ค์๋ ์ฌ์์ ํด์ ํ์ง ์๊ณ ๋ถ๋ฆฌ ๋ฒํผ์ ๋นํ์ฑํํ๋ฉฐ, ๊ฒ์ฆ ์๋ฃ๋ฅผ ๊ด์ฐฐํด ๊ฐฑ์ ํ๋ค. - ์ด์ id
balancedยทquality๋ 6์คํ ์ผ๋ก ์ฝ๋๋ค.Tier.of(FOUR, BALANCED)๋ Demucs 4์คํ ์ด๋ค. - ์นดํ๋ก๊ทธ์ ์๋ ๋ชจ๋ธ ID๋
Tier.fromId์์ null๋ก ๋ฐํํ๋ค. ๋ค๋ฅธ ๋ชจ๋ธ๋ก ๋์ฒดํ์ง ์๊ณ , ์ ๋ถ๋ฆฌ์๋ ์ค์ ์์ ์ ํจํ ๋ชจ๋ธ์ ์ ํํ๋๋ก ์๋ดํ๋ค.
