mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-21 22:15:40 +00:00
34b4445c13
Two independent user-facing fixes rolled together. ── Lyrics: YouLyPlus provider (issue #172) ── Adds word-by-word synced (karaoke) lyrics as an alternative lyrics mode. Backed by the public lyricsplus aggregator (Apple Music / Spotify / Musixmatch / QQ Music) — no API keys on our side, subscription costs are borne by the backend operator. Five mirrors are tried on network failure. Settings → Lyrics now exposes a mode radio (Standard vs YouLyPlus) plus a static-only toggle. YouLyPlus misses silently fall back to the existing server + LRCLIB + Netease pipeline so obscure tracks still resolve. The drag-to-reorder source list is hidden in YouLyPlus mode since the external aggregator manages its own source priority. Rendering: per-word spans on each line, active word highlighted with accent-tinted glow. Subscribed imperatively via usePlayerStore.subscribe so 500 ms progress ticks do not re-render the whole lyrics block. The Fullscreen Player reuses the same pattern; the 5-line rail layout is unchanged. white-space: pre on .fs-lyric-word preserves the trailing spaces the API embeds in each syllabus token (flex context would otherwise collapse them). i18n: new keys in all 8 locales (de, en, fr, nl, nb, ru, es, zh). ── macOS mic-prompt suppression ── Ships a vendored cpal 0.15.3 at patches/cpal-0.15.3/ wired via [patch.crates-io]. The only change is in src/host/coreaudio/macos/mod.rs: audio_unit_from_device now unconditionally uses IOType::DefaultOutput for output streams instead of conditionally choosing HalOutput. AUHAL (HalOutput) is classified as input-capable by macOS TCC and triggers the microphone-permission dialog at first launch / after each update even for playback-only apps. Previous attempts (removing NSMicrophoneUsageDescription, setting com.apple.security.device.audio-input false in Entitlements.plist) did not suppress the prompt because TCC fires at AudioUnit instantiation, not at plist level. The upstream fix in cpal PR #1070 / cpal 0.17 only helps when the pinned device equals the system default; always-DefaultOutput covers all cases. Tradeoff: per-device output selection is a no-op on macOS — the stream always follows the system default. Settings.tsx surfaces this via audioOutputDeviceMacNotice (hides the CustomSelect on macOS) and skips audio_list_devices + device-watcher effects there. Matches the behaviour of Apple Music / Spotify on macOS. Also removes the now-obsolete com.apple.security.device.audio-input entitlement (sandbox is disabled anyway, so it was ignored). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
96 lines
3.1 KiB
TOML
96 lines
3.1 KiB
TOML
[package]
|
|
name = "cpal"
|
|
version = "0.15.3"
|
|
description = "Low-level cross-platform audio I/O library in pure Rust."
|
|
repository = "https://github.com/rustaudio/cpal"
|
|
documentation = "https://docs.rs/cpal"
|
|
license = "Apache-2.0"
|
|
keywords = ["audio", "sound"]
|
|
edition = "2021"
|
|
rust-version = "1.70"
|
|
|
|
[features]
|
|
asio = ["asio-sys", "num-traits"] # Only available on Windows. See README for setup instructions.
|
|
oboe-shared-stdcxx = ["oboe/shared-stdcxx"] # Only available on Android. See README for what it does.
|
|
|
|
[dependencies]
|
|
dasp_sample = "0.11"
|
|
|
|
[dev-dependencies]
|
|
anyhow = "1.0"
|
|
hound = "3.5"
|
|
ringbuf = "0.3"
|
|
clap = { version = "4.0", features = ["derive"] }
|
|
|
|
[target.'cfg(target_os = "android")'.dev-dependencies]
|
|
ndk-glue = "0.7"
|
|
|
|
[target.'cfg(target_os = "windows")'.dependencies]
|
|
windows = { version = "0.54.0", features = [
|
|
"Win32_Media_Audio",
|
|
"Win32_Foundation",
|
|
"Win32_Devices_Properties",
|
|
"Win32_Media_KernelStreaming",
|
|
"Win32_System_Com_StructuredStorage",
|
|
"Win32_System_Threading",
|
|
"Win32_Security",
|
|
"Win32_System_SystemServices",
|
|
"Win32_System_Variant",
|
|
"Win32_Media_Multimedia",
|
|
"Win32_UI_Shell_PropertiesSystem"
|
|
]}
|
|
asio-sys = { version = "0.2", path = "asio-sys", optional = true }
|
|
num-traits = { version = "0.2.6", optional = true }
|
|
|
|
[target.'cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd", target_os = "netbsd"))'.dependencies]
|
|
alsa = "0.9"
|
|
libc = "0.2"
|
|
jack = { version = "0.11", optional = true }
|
|
|
|
[target.'cfg(any(target_os = "macos", target_os = "ios"))'.dependencies]
|
|
core-foundation-sys = "0.8.2" # For linking to CoreFoundation.framework and handling device name `CFString`s.
|
|
mach2 = "0.4" # For access to mach_timebase type.
|
|
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
coreaudio-rs = { version = "0.11", default-features = false, features = ["audio_unit", "core_audio"] }
|
|
|
|
[target.'cfg(target_os = "ios")'.dependencies]
|
|
coreaudio-rs = { version = "0.11", default-features = false, features = ["audio_unit", "core_audio", "audio_toolbox"] }
|
|
|
|
[target.'cfg(target_os = "emscripten")'.dependencies]
|
|
wasm-bindgen = { version = "0.2.89" }
|
|
wasm-bindgen-futures = "0.4.33"
|
|
js-sys = { version = "0.3.35" }
|
|
web-sys = { version = "0.3.35", features = [ "AudioContext", "AudioContextOptions", "AudioBuffer", "AudioBufferSourceNode", "AudioNode", "AudioDestinationNode", "Window", "AudioContextState"] }
|
|
|
|
[target.'cfg(all(target_arch = "wasm32", target_os = "unknown"))'.dependencies]
|
|
wasm-bindgen = { version = "0.2.58", optional = true }
|
|
js-sys = { version = "0.3.35" }
|
|
web-sys = { version = "0.3.35", features = [ "AudioContext", "AudioContextOptions", "AudioBuffer", "AudioBufferSourceNode", "AudioNode", "AudioDestinationNode", "Window", "AudioContextState"] }
|
|
|
|
[target.'cfg(target_os = "android")'.dependencies]
|
|
oboe = { version = "0.6", features = [ "java-interface" ] }
|
|
ndk = { version = "0.8", default-features = false }
|
|
ndk-context = "0.1"
|
|
jni = "0.21"
|
|
|
|
[[example]]
|
|
name = "android"
|
|
path = "examples/android.rs"
|
|
crate-type = ["cdylib"]
|
|
|
|
[[example]]
|
|
name = "beep"
|
|
|
|
[[example]]
|
|
name = "enumerate"
|
|
|
|
[[example]]
|
|
name = "feedback"
|
|
|
|
[[example]]
|
|
name = "record_wav"
|
|
|
|
[[example]]
|
|
name = "synth_tones"
|