diff --git a/src/features/orbit/utils/transitions.ts b/src/features/orbit/utils/transitions.ts index 5edb30a0..e4664e5d 100644 --- a/src/features/orbit/utils/transitions.ts +++ b/src/features/orbit/utils/transitions.ts @@ -3,7 +3,7 @@ import type { OrbitTransitionSettings } from '@/features/orbit/api/orbit'; import { sanitizeAutodjOverlapCapMode, sanitizeAutodjOverlapCapSec, -} from '@/utils/playback/autodjOverlapCap'; +} from '@/lib/audio/autodjOverlapCap'; /** * Bridge between the local playback-transition settings (in `authStore`) and diff --git a/src/features/playback/store/audioEventHandlers.ts b/src/features/playback/store/audioEventHandlers.ts index b6fcc415..02e42f61 100644 --- a/src/features/playback/store/audioEventHandlers.ts +++ b/src/features/playback/store/audioEventHandlers.ts @@ -28,7 +28,7 @@ import { } from '@/features/playback/utils/playback/playbackServer'; import { resolvePlaybackUrl } from '@/features/playback/utils/playback/resolvePlaybackUrl'; import { resolveReplayGainDb } from '@/features/playback/utils/audio/resolveReplayGainDb'; -import { audioPlayHiResBlendArgs } from '@/utils/audio/hiResCrossfadeResample'; +import { audioPlayHiResBlendArgs } from '@/lib/audio/hiResCrossfadeResample'; import { showToast } from '@/utils/ui/toast'; import { useAuthStore } from '@/store/authStore'; import { getPlayGeneration, setIsAudioPaused } from '@/features/playback/store/engineState'; @@ -89,7 +89,7 @@ import { } from '@/features/playback/store/seekTargetState'; import { refreshWaveformForTrack } from '@/features/playback/store/waveformRefresh'; import { analyzeBoundary, computeWaveformSilence } from '@/lib/waveform/waveformSilence'; -import { autodjMaxOverlapCapSec } from '@/utils/playback/autodjOverlapCap'; +import { autodjMaxOverlapCapSec } from '@/lib/audio/autodjOverlapCap'; import { autodjJsTriggerAtSec, clampCrossfadeSecs, diff --git a/src/features/playback/store/audioListenerSetup/authSyncListener.ts b/src/features/playback/store/audioListenerSetup/authSyncListener.ts index c443acf4..557e7f08 100644 --- a/src/features/playback/store/audioListenerSetup/authSyncListener.ts +++ b/src/features/playback/store/audioListenerSetup/authSyncListener.ts @@ -1,5 +1,5 @@ import { invoke } from '@tauri-apps/api/core'; -import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/utils/audio/loudnessPreAnalysisSlider'; +import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/lib/audio/loudnessPreAnalysisSlider'; import { useAuthStore } from '@/store/authStore'; import { onAnalysisStorageChanged } from '@/store/analysisSync'; import { emitNormalizationDebug } from '@/features/playback/store/normalizationDebug'; diff --git a/src/features/playback/store/audioListenerSetup/initialAudioSync.ts b/src/features/playback/store/audioListenerSetup/initialAudioSync.ts index 94a89685..7d1c6e9c 100644 --- a/src/features/playback/store/audioListenerSetup/initialAudioSync.ts +++ b/src/features/playback/store/audioListenerSetup/initialAudioSync.ts @@ -1,5 +1,5 @@ import { invoke } from '@tauri-apps/api/core'; -import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/utils/audio/loudnessPreAnalysisSlider'; +import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/lib/audio/loudnessPreAnalysisSlider'; import { useAuthStore } from '@/store/authStore'; import { emitNormalizationDebug } from '@/features/playback/store/normalizationDebug'; import { invokeAudioSetNormalizationDeduped } from '@/features/playback/store/normalizationIpcDedupe'; diff --git a/src/features/playback/store/crossfadePreload.ts b/src/features/playback/store/crossfadePreload.ts index d4a38253..dbcac89e 100644 --- a/src/features/playback/store/crossfadePreload.ts +++ b/src/features/playback/store/crossfadePreload.ts @@ -1,6 +1,6 @@ import { invoke } from '@tauri-apps/api/core'; import { useAuthStore } from '@/store/authStore'; -import { autodjMaxOverlapCapSec } from '@/utils/playback/autodjOverlapCap'; +import { autodjMaxOverlapCapSec } from '@/lib/audio/autodjOverlapCap'; import { computeWaveformSilence, planCrossfadeTransition } from '@/lib/waveform/waveformSilence'; import { findLocalPlaybackUrl } from '@/store/localPlaybackResolve'; import { playbackCacheKeyForRef } from '@/features/playback/utils/playback/playbackServer'; diff --git a/src/features/playback/store/engineLoadTrackAtPosition.ts b/src/features/playback/store/engineLoadTrackAtPosition.ts index 900600c7..9c49c90b 100644 --- a/src/features/playback/store/engineLoadTrackAtPosition.ts +++ b/src/features/playback/store/engineLoadTrackAtPosition.ts @@ -7,7 +7,7 @@ import { } from '@/features/playback/utils/playback/playbackServer'; import { resolvePlaybackUrl } from '@/features/playback/utils/playback/resolvePlaybackUrl'; import { resolveReplayGainDb } from '@/features/playback/utils/audio/resolveReplayGainDb'; -import { audioPlayHiResBlendArgs } from '@/utils/audio/hiResCrossfadeResample'; +import { audioPlayHiResBlendArgs } from '@/lib/audio/hiResCrossfadeResample'; import { useAuthStore } from '@/store/authStore'; import { getPlayGeneration, setIsAudioPaused } from '@/features/playback/store/engineState'; import { touchHotCacheOnPlayback } from '@/features/playback/store/hotCacheTouch'; diff --git a/src/features/playback/store/normalizationIpcDedupe.test.ts b/src/features/playback/store/normalizationIpcDedupe.test.ts index 6bbe13fd..fa5291f5 100644 --- a/src/features/playback/store/normalizationIpcDedupe.test.ts +++ b/src/features/playback/store/normalizationIpcDedupe.test.ts @@ -17,7 +17,7 @@ const { authState, invokeMock } = vi.hoisted(() => ({ vi.mock('@tauri-apps/api/core', () => ({ invoke: invokeMock })); vi.mock('@/store/authStore', () => ({ useAuthStore: { getState: () => authState } })); -vi.mock('@/utils/audio/loudnessPreAnalysisSlider', () => ({ +vi.mock('@/lib/audio/loudnessPreAnalysisSlider', () => ({ effectiveLoudnessPreAnalysisAttenuationDb: (attenuation: number) => attenuation, })); diff --git a/src/features/playback/store/normalizationIpcDedupe.ts b/src/features/playback/store/normalizationIpcDedupe.ts index 5f07a9ad..08521bd1 100644 --- a/src/features/playback/store/normalizationIpcDedupe.ts +++ b/src/features/playback/store/normalizationIpcDedupe.ts @@ -1,6 +1,6 @@ import { invoke } from '@tauri-apps/api/core'; import { useAuthStore } from '@/store/authStore'; -import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/utils/audio/loudnessPreAnalysisSlider'; +import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/lib/audio/loudnessPreAnalysisSlider'; /** * Two IPC entry points to the Rust normalization pipeline that get hammered diff --git a/src/features/playback/store/playTrackAction.ts b/src/features/playback/store/playTrackAction.ts index d27da2e9..10892f3f 100644 --- a/src/features/playback/store/playTrackAction.ts +++ b/src/features/playback/store/playTrackAction.ts @@ -33,7 +33,7 @@ import { } from '@/store/localPlaybackResolve'; import { resolvePlaybackUrl } from '@/features/playback/utils/playback/resolvePlaybackUrl'; import { resolveReplayGainDb } from '@/features/playback/utils/audio/resolveReplayGainDb'; -import { audioPlayHiResBlendArgs } from '@/utils/audio/hiResCrossfadeResample'; +import { audioPlayHiResBlendArgs } from '@/lib/audio/hiResCrossfadeResample'; import { useAuthStore } from '@/store/authStore'; import { consumeCrossfadeDynamicOverlap, getCrossfadeTransition, peekArmedCrossfadeDynamicOverlap } from '@/features/playback/store/crossfadeTrimCache'; import { diff --git a/src/features/playback/store/resumeAction.ts b/src/features/playback/store/resumeAction.ts index 4355f279..dc8a429d 100644 --- a/src/features/playback/store/resumeAction.ts +++ b/src/features/playback/store/resumeAction.ts @@ -8,7 +8,7 @@ import { } from '@/features/playback/utils/playback/playbackServer'; import { resolvePlaybackUrl } from '@/features/playback/utils/playback/resolvePlaybackUrl'; import { resolveReplayGainDb } from '@/features/playback/utils/audio/resolveReplayGainDb'; -import { audioPlayHiResBlendArgs } from '@/utils/audio/hiResCrossfadeResample'; +import { audioPlayHiResBlendArgs } from '@/lib/audio/hiResCrossfadeResample'; import { songToTrack } from '@/lib/media/songToTrack'; import { useAuthStore } from '@/store/authStore'; import { diff --git a/src/features/playback/store/updateReplayGainAction.ts b/src/features/playback/store/updateReplayGainAction.ts index e4faae4d..4af28e6f 100644 --- a/src/features/playback/store/updateReplayGainAction.ts +++ b/src/features/playback/store/updateReplayGainAction.ts @@ -1,4 +1,4 @@ -import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/utils/audio/loudnessPreAnalysisSlider'; +import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/lib/audio/loudnessPreAnalysisSlider'; import { loudnessGainPlaceholderUntilCacheDb } from '@/features/playback/utils/audio/loudnessPlaceholder'; import { resolveReplayGainDb } from '@/features/playback/utils/audio/resolveReplayGainDb'; import { useAuthStore } from '@/store/authStore'; diff --git a/src/features/playback/utils/playback/autodjManualBlend.ts b/src/features/playback/utils/playback/autodjManualBlend.ts index 0b504eed..174178e4 100644 --- a/src/features/playback/utils/playback/autodjManualBlend.ts +++ b/src/features/playback/utils/playback/autodjManualBlend.ts @@ -1,5 +1,5 @@ import { useAuthStore } from '@/store/authStore'; -import { autodjMaxOverlapCapSec } from '@/utils/playback/autodjOverlapCap'; +import { autodjMaxOverlapCapSec } from '@/lib/audio/autodjOverlapCap'; import { analyzeBoundary, planCrossfadeTransition, diff --git a/src/features/queue/components/QueueCurrentTrack.tsx b/src/features/queue/components/QueueCurrentTrack.tsx index 220b48ab..a3750701 100644 --- a/src/features/queue/components/QueueCurrentTrack.tsx +++ b/src/features/queue/components/QueueCurrentTrack.tsx @@ -9,7 +9,7 @@ import { renderStars, } from '@/utils/componentHelpers/queuePanelHelpers'; import { loudnessGainPlaceholderUntilCacheDb } from '@/features/playback/utils/audio/loudnessPlaceholder'; -import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/utils/audio/loudnessPreAnalysisSlider'; +import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/lib/audio/loudnessPreAnalysisSlider'; import { formatQueueBpmTech, formatQueueMoodLabels } from '@/lib/library/trackEnrichment'; import { useQueueTrackEnrichment } from '@/features/queue/hooks/useQueueTrackEnrichment'; import { QueueLufsTargetMenu } from '@/features/queue/components/QueueLufsTargetMenu'; diff --git a/src/features/settings/components/AudioTab.tsx b/src/features/settings/components/AudioTab.tsx index c7ee792e..93ce0263 100644 --- a/src/features/settings/components/AudioTab.tsx +++ b/src/features/settings/components/AudioTab.tsx @@ -6,7 +6,7 @@ import { Equalizer } from '@/features/equalizer'; import SettingsSubSection from '@/features/settings/components/SettingsSubSection'; import { SettingsGroup } from '@/features/settings/components/SettingsGroup'; import { SettingsToggle } from '@/features/settings/components/SettingsToggle'; -import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/utils/audio/loudnessPreAnalysisSlider'; +import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/lib/audio/loudnessPreAnalysisSlider'; import { useAudioDevicesProbe } from '@/features/playback/hooks/useAudioDevicesProbe'; import { IS_MACOS } from '@/lib/util/platform'; import { AudioOutputDeviceSection } from '@/features/settings/components/audio/AudioOutputDeviceSection'; diff --git a/src/features/settings/components/audio/HiResCrossfadeResampleBlock.tsx b/src/features/settings/components/audio/HiResCrossfadeResampleBlock.tsx index 71f3c7e8..7b158696 100644 --- a/src/features/settings/components/audio/HiResCrossfadeResampleBlock.tsx +++ b/src/features/settings/components/audio/HiResCrossfadeResampleBlock.tsx @@ -2,7 +2,7 @@ import { HI_RES_CROSSFADE_RESAMPLE_OPTIONS, type HiResCrossfadeResampleHz, sanitizeHiResCrossfadeResampleHz, -} from '@/utils/audio/hiResCrossfadeResample'; +} from '@/lib/audio/hiResCrossfadeResample'; import type { TFunction } from 'i18next'; import { SettingsSubCard, SettingsField } from '@/features/settings/components/SettingsSubCard'; diff --git a/src/features/settings/components/audio/TrackTransitionsBlock.tsx b/src/features/settings/components/audio/TrackTransitionsBlock.tsx index 15dff162..f0837813 100644 --- a/src/features/settings/components/audio/TrackTransitionsBlock.tsx +++ b/src/features/settings/components/audio/TrackTransitionsBlock.tsx @@ -5,7 +5,7 @@ import { useOrbitStore } from '@/features/orbit'; import { AUTODJ_OVERLAP_CAP_MAX_SEC, AUTODJ_OVERLAP_CAP_MIN_SEC, -} from '@/utils/playback/autodjOverlapCap'; +} from '@/lib/audio/autodjOverlapCap'; import { getTransitionMode, setTransitionMode, diff --git a/src/utils/playback/autodjOverlapCap.test.ts b/src/lib/audio/autodjOverlapCap.test.ts similarity index 95% rename from src/utils/playback/autodjOverlapCap.test.ts rename to src/lib/audio/autodjOverlapCap.test.ts index 4f46c15c..e1967764 100644 --- a/src/utils/playback/autodjOverlapCap.test.ts +++ b/src/lib/audio/autodjOverlapCap.test.ts @@ -3,7 +3,7 @@ import { autodjMaxOverlapCapSec, DEFAULT_AUTODJ_OVERLAP_CAP_SEC, sanitizeAutodjOverlapCapSec, -} from './autodjOverlapCap'; +} from '@/lib/audio/autodjOverlapCap'; describe('autodjOverlapCap', () => { it('sanitizes cap seconds to 2–30', () => { diff --git a/src/utils/playback/autodjOverlapCap.ts b/src/lib/audio/autodjOverlapCap.ts similarity index 94% rename from src/utils/playback/autodjOverlapCap.ts rename to src/lib/audio/autodjOverlapCap.ts index 1639dad0..41b84c8a 100644 --- a/src/utils/playback/autodjOverlapCap.ts +++ b/src/lib/audio/autodjOverlapCap.ts @@ -1,4 +1,4 @@ -import type { AuthState } from '../../store/authStoreTypes'; +import type { AuthState } from '@/store/authStoreTypes'; import { DYNAMIC_OVERLAP_HARD_CAP_SEC } from '@/lib/waveform/waveformSilence'; export type AutodjOverlapCapMode = 'auto' | 'limit'; diff --git a/src/utils/audio/hiResCrossfadeResample.test.ts b/src/lib/audio/hiResCrossfadeResample.test.ts similarity index 96% rename from src/utils/audio/hiResCrossfadeResample.test.ts rename to src/lib/audio/hiResCrossfadeResample.test.ts index df9d9321..a1629a71 100644 --- a/src/utils/audio/hiResCrossfadeResample.test.ts +++ b/src/lib/audio/hiResCrossfadeResample.test.ts @@ -3,7 +3,7 @@ import { DEFAULT_HI_RES_CROSSFADE_RESAMPLE_HZ, audioPlayHiResBlendArgs, sanitizeHiResCrossfadeResampleHz, -} from './hiResCrossfadeResample'; +} from '@/lib/audio/hiResCrossfadeResample'; describe('hiResCrossfadeResample', () => { it('defaults unknown values to 44.1 kHz', () => { diff --git a/src/utils/audio/hiResCrossfadeResample.ts b/src/lib/audio/hiResCrossfadeResample.ts similarity index 100% rename from src/utils/audio/hiResCrossfadeResample.ts rename to src/lib/audio/hiResCrossfadeResample.ts diff --git a/src/utils/audio/loudnessPreAnalysisSlider.ts b/src/lib/audio/loudnessPreAnalysisSlider.ts similarity index 100% rename from src/utils/audio/loudnessPreAnalysisSlider.ts rename to src/lib/audio/loudnessPreAnalysisSlider.ts diff --git a/src/store/authAudioSettingsActions.ts b/src/store/authAudioSettingsActions.ts index b2bd99de..582fa81c 100644 --- a/src/store/authAudioSettingsActions.ts +++ b/src/store/authAudioSettingsActions.ts @@ -1,8 +1,8 @@ -import { clampStoredLoudnessPreAnalysisAttenuationRefDb } from '../utils/audio/loudnessPreAnalysisSlider'; +import { clampStoredLoudnessPreAnalysisAttenuationRefDb } from '@/lib/audio/loudnessPreAnalysisSlider'; import { sanitizeAutodjOverlapCapMode, sanitizeAutodjOverlapCapSec, -} from '../utils/playback/autodjOverlapCap'; +} from '@/lib/audio/autodjOverlapCap'; import { DEFAULT_LOUDNESS_PRE_ANALYSIS_ATTENUATION_DB } from './authStoreDefaults'; import { updateReplayGainForCurrentTrack } from './playbackEngineBridge'; import type { AuthState } from './authStoreTypes'; diff --git a/src/store/authStoreHelpers.ts b/src/store/authStoreHelpers.ts index 2421e5da..92c2b0fe 100644 --- a/src/store/authStoreHelpers.ts +++ b/src/store/authStoreHelpers.ts @@ -1,4 +1,4 @@ -import { clampStoredLoudnessPreAnalysisAttenuationRefDb } from '../utils/audio/loudnessPreAnalysisSlider'; +import { clampStoredLoudnessPreAnalysisAttenuationRefDb } from '@/lib/audio/loudnessPreAnalysisSlider'; import { DEFAULT_LOUDNESS_PRE_ANALYSIS_ATTENUATION_DB, DEFAULT_LIBRARY_GRID_MAX_COLUMNS, diff --git a/src/store/authStoreRehydrate.ts b/src/store/authStoreRehydrate.ts index f80428f4..f6a58f6e 100644 --- a/src/store/authStoreRehydrate.ts +++ b/src/store/authStoreRehydrate.ts @@ -1,13 +1,13 @@ import { IS_LINUX } from '@/lib/util/platform'; -import { sanitizeHiResCrossfadeResampleHz } from '../utils/audio/hiResCrossfadeResample'; +import { sanitizeHiResCrossfadeResampleHz } from '@/lib/audio/hiResCrossfadeResample'; import { sanitizeAutodjOverlapCapMode, sanitizeAutodjOverlapCapSec, -} from '../utils/playback/autodjOverlapCap'; +} from '@/lib/audio/autodjOverlapCap'; import { LOUDNESS_PRE_ANALYSIS_REF_TARGET_LUFS, clampStoredLoudnessPreAnalysisAttenuationRefDb, -} from '../utils/audio/loudnessPreAnalysisSlider'; +} from '@/lib/audio/loudnessPreAnalysisSlider'; import { DEFAULT_LOUDNESS_PRE_ANALYSIS_ATTENUATION_DB } from './authStoreDefaults'; import { clampMixFilterMinStars, diff --git a/src/store/authStoreTypes.ts b/src/store/authStoreTypes.ts index c5466549..95aa92d1 100644 --- a/src/store/authStoreTypes.ts +++ b/src/store/authStoreTypes.ts @@ -1,4 +1,4 @@ -import type { HiResCrossfadeResampleHz } from '../utils/audio/hiResCrossfadeResample'; +import type { HiResCrossfadeResampleHz } from '@/lib/audio/hiResCrossfadeResample'; import type { EntityRatingSupportLevel } from '@/lib/api/subsonicTypes'; import type { AudiomusePluginProbeResult,