NavidromeApp/project.yml
Dallas Groot c6451b440b Audio Tap FFT:
- MTAudioProcessingTap with lock-free ring buffer + pre-allocated vDSP FFT
- Tap installs on readyToPlay (fixes 'no audio track' on live streams)
- Shared tap serves FFT + Shazam simultaneously (no more tap conflict)
- Ring buffer reset on removeTap (prevents stale FFT frames)
- Simulation runs as placeholder until stream connects
- All 6 paths verified: start, station change, goLive, seekBack, bg/fg, radio→music

Bug fixes:
- playerItem tracking in radioGoLive/radioSeekBack (was orphaned)
- Combine sinks: .receive(on: .main) on all 4 notification handlers
- ShazamRecognizer stopAll: audio session now actually restores after mic fallback
- processTapBuffer/convertAndMatch methods restored (were dropped in refactor)

Lyrics:
- Bottom toolbar on overlay: Search, Timing (±0.1s/±0.5s inline), Edit
- LyricsManager.globalOffset applied to syncToTime + wordProgress
- openLyricsEditor notification wired to NowPlayingView

UI:
- Server selection button hidden when Dynamic Island active
- Debug: Capture Audio Tap (5s WAV) with share sheet in Visualizer Settings"
2026-04-14 19:45:05 -07:00

116 lines
3.4 KiB
YAML

name: NavidromePlayer
options:
bundleIdPrefix: ca.dallasgroot.navidromeplayer
deploymentTarget:
iOS: "26.0"
watchOS: "26.0"
xcodeVersion: "26.0"
groupSortPosition: top
createIntermediateGroups: true
packages:
ZIPFoundation:
url: https://github.com/weichsel/ZIPFoundation
from: "0.9.19"
ConfettiSwiftUI:
url: https://github.com/simibac/ConfettiSwiftUI
from: "3.0.0"
settings:
base:
SWIFT_VERSION: "5.9"
MARKETING_VERSION: "1.0.0"
CURRENT_PROJECT_VERSION: "9"
DEAD_CODE_STRIPPING: true
ENABLE_USER_SCRIPT_SANDBOXING: true
DEVELOPMENT_TEAM: E9C9AGS9K6
targets:
# ─────────────────────────────────────
# iOS App
# ─────────────────────────────────────
NavidromePlayer:
type: application
platform: iOS
deploymentTarget: "26.0"
sources:
- path: iOS
- path: Shared
resources:
- path: iOS/Resources
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: ca.dallasgroot.navidromeplayer.app
INFOPLIST_FILE: iOS/Resources/Info.plist
CODE_SIGN_ENTITLEMENTS: iOS/Resources/NavidromePlayer.entitlements
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
TARGETED_DEVICE_FAMILY: "1,2"
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD: true
dependencies:
- target: NavidromeWatch
embed: true
- target: NavidromeWidget
embed: true
- package: ZIPFoundation
- package: ConfettiSwiftUI
# ─────────────────────────────────────
# watchOS App
# ─────────────────────────────────────
NavidromeWatch:
type: application
platform: watchOS
deploymentTarget: "26.0"
sources:
- path: watchOS
- path: Shared
resources:
- path: watchOS/Resources
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: ca.dallasgroot.navidromeplayer.app.watchkitapp
INFOPLIST_FILE: watchOS/Resources/Info.plist
CODE_SIGN_ENTITLEMENTS: watchOS/Resources/NavidromeWatch.entitlements
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
WATCHOS_DEPLOYMENT_TARGET: "26.0"
SKIP_INSTALL: true
# ─────────────────────────────────────
# Widget Extension
# ─────────────────────────────────────
NavidromeWidget:
type: app-extension
platform: iOS
deploymentTarget: "17.0"
sources:
- path: Widget
excludes:
- "*.entitlements"
- "Info.plist"
- path: Shared/Storage/WidgetSharedState.swift
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: ca.dallasgroot.navidromeplayer.app.widget
PRODUCT_NAME: NavidromeWidget
INFOPLIST_FILE: Widget/Info.plist
CODE_SIGN_ENTITLEMENTS: Widget/NavidromeWidget.entitlements
SWIFT_EMIT_LOC_STRINGS: "YES"
SKIP_INSTALL: true
schemes:
NavidromePlayer:
build:
targets:
NavidromePlayer: all
NavidromeWatch: all
NavidromeWidget: all
run:
config: Debug
test:
config: Debug
profile:
config: Release
analyze:
config: Debug
archive:
config: Release