mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-22 14:35:41 +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>
185 lines
4.5 KiB
TOML
185 lines
4.5 KiB
TOML
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
|
|
#
|
|
# When uploading crates to the registry Cargo will automatically
|
|
# "normalize" Cargo.toml files for maximal compatibility
|
|
# with all versions of Cargo and also rewrite `path` dependencies
|
|
# to registry (e.g., crates.io) dependencies.
|
|
#
|
|
# If you are reading this file be aware that the original Cargo.toml
|
|
# will likely look very different (and much more reasonable).
|
|
# See Cargo.toml.orig for the original contents.
|
|
|
|
[package]
|
|
edition = "2021"
|
|
rust-version = "1.70"
|
|
name = "cpal"
|
|
version = "0.15.3"
|
|
description = "Low-level cross-platform audio I/O library in pure Rust."
|
|
documentation = "https://docs.rs/cpal"
|
|
readme = "README.md"
|
|
keywords = [
|
|
"audio",
|
|
"sound",
|
|
]
|
|
license = "Apache-2.0"
|
|
repository = "https://github.com/rustaudio/cpal"
|
|
|
|
[[example]]
|
|
name = "android"
|
|
crate-type = ["cdylib"]
|
|
path = "examples/android.rs"
|
|
|
|
[[example]]
|
|
name = "beep"
|
|
|
|
[[example]]
|
|
name = "enumerate"
|
|
|
|
[[example]]
|
|
name = "feedback"
|
|
|
|
[[example]]
|
|
name = "record_wav"
|
|
|
|
[[example]]
|
|
name = "synth_tones"
|
|
|
|
[dependencies.dasp_sample]
|
|
version = "0.11"
|
|
|
|
[dev-dependencies.anyhow]
|
|
version = "1.0"
|
|
|
|
[dev-dependencies.clap]
|
|
version = "4.0"
|
|
features = ["derive"]
|
|
|
|
[dev-dependencies.hound]
|
|
version = "3.5"
|
|
|
|
[dev-dependencies.ringbuf]
|
|
version = "0.3"
|
|
|
|
[features]
|
|
asio = [
|
|
"asio-sys",
|
|
"num-traits",
|
|
]
|
|
oboe-shared-stdcxx = ["oboe/shared-stdcxx"]
|
|
|
|
[target."cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))".dependencies.js-sys]
|
|
version = "0.3.35"
|
|
|
|
[target."cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))".dependencies.wasm-bindgen]
|
|
version = "0.2.58"
|
|
optional = true
|
|
|
|
[target."cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))".dependencies.web-sys]
|
|
version = "0.3.35"
|
|
features = [
|
|
"AudioContext",
|
|
"AudioContextOptions",
|
|
"AudioBuffer",
|
|
"AudioBufferSourceNode",
|
|
"AudioNode",
|
|
"AudioDestinationNode",
|
|
"Window",
|
|
"AudioContextState",
|
|
]
|
|
|
|
[target."cfg(any(target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"netbsd\"))".dependencies.alsa]
|
|
version = "0.9"
|
|
|
|
[target."cfg(any(target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"netbsd\"))".dependencies.jack]
|
|
version = "0.11"
|
|
optional = true
|
|
|
|
[target."cfg(any(target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"netbsd\"))".dependencies.libc]
|
|
version = "0.2"
|
|
|
|
[target."cfg(any(target_os = \"macos\", target_os = \"ios\"))".dependencies.core-foundation-sys]
|
|
version = "0.8.2"
|
|
|
|
[target."cfg(any(target_os = \"macos\", target_os = \"ios\"))".dependencies.mach2]
|
|
version = "0.4"
|
|
|
|
[target."cfg(target_os = \"android\")".dependencies.jni]
|
|
version = "0.21"
|
|
|
|
[target."cfg(target_os = \"android\")".dependencies.ndk]
|
|
version = "0.8"
|
|
default-features = false
|
|
|
|
[target."cfg(target_os = \"android\")".dependencies.ndk-context]
|
|
version = "0.1"
|
|
|
|
[target."cfg(target_os = \"android\")".dependencies.oboe]
|
|
version = "0.6"
|
|
features = ["java-interface"]
|
|
|
|
[target."cfg(target_os = \"android\")".dev-dependencies.ndk-glue]
|
|
version = "0.7"
|
|
|
|
[target."cfg(target_os = \"emscripten\")".dependencies.js-sys]
|
|
version = "0.3.35"
|
|
|
|
[target."cfg(target_os = \"emscripten\")".dependencies.wasm-bindgen]
|
|
version = "0.2.89"
|
|
|
|
[target."cfg(target_os = \"emscripten\")".dependencies.wasm-bindgen-futures]
|
|
version = "0.4.33"
|
|
|
|
[target."cfg(target_os = \"emscripten\")".dependencies.web-sys]
|
|
version = "0.3.35"
|
|
features = [
|
|
"AudioContext",
|
|
"AudioContextOptions",
|
|
"AudioBuffer",
|
|
"AudioBufferSourceNode",
|
|
"AudioNode",
|
|
"AudioDestinationNode",
|
|
"Window",
|
|
"AudioContextState",
|
|
]
|
|
|
|
[target."cfg(target_os = \"ios\")".dependencies.coreaudio-rs]
|
|
version = "0.11"
|
|
features = [
|
|
"audio_unit",
|
|
"core_audio",
|
|
"audio_toolbox",
|
|
]
|
|
default-features = false
|
|
|
|
[target."cfg(target_os = \"macos\")".dependencies.coreaudio-rs]
|
|
version = "0.11"
|
|
features = [
|
|
"audio_unit",
|
|
"core_audio",
|
|
]
|
|
default-features = false
|
|
|
|
[target."cfg(target_os = \"windows\")".dependencies.asio-sys]
|
|
version = "0.2"
|
|
optional = true
|
|
|
|
[target."cfg(target_os = \"windows\")".dependencies.num-traits]
|
|
version = "0.2.6"
|
|
optional = true
|
|
|
|
[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",
|
|
]
|