- Add spectrum-analyzer crate for FFT processing - Create visualizer module with: - RingBuffer: lockless SPSC buffer for audio samples - FFT processor: dedicated thread for spectrum analysis - TappedSource: rodio Source wrapper for sample capture - VisualizerTap: shared state for audio thread integration - Add Tauri commands: set_visualizer_enabled, is_visualizer_enabled - Register visualizer in AppState and lib.rs Backend compiles. Next: integrate with audio thread to capture samples.
121 lines
2.7 KiB
TOML
121 lines
2.7 KiB
TOML
[package]
|
|
name = "qbz-nix"
|
|
version = "1.1.7"
|
|
description = "Native high-fidelity client for Qobuz™ subscribers on Linux with Hi-Fi audio support (uses the Qobuz API; not certified by Qobuz)"
|
|
authors = ["blitzkriegfc"]
|
|
edition = "2021"
|
|
|
|
[lib]
|
|
name = "qbz_nix_lib"
|
|
crate-type = ["staticlib", "cdylib", "rlib"]
|
|
|
|
[build-dependencies]
|
|
tauri-build = { version = "2", features = [] }
|
|
|
|
[dependencies]
|
|
# Tauri
|
|
tauri = { version = "2", features = ["protocol-asset", "tray-icon"] }
|
|
tauri-plugin-opener = "2"
|
|
|
|
# Serialization
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
|
|
# HTTP Client
|
|
reqwest = { version = "0.12", features = ["json", "cookies", "rustls-tls", "stream", "blocking"], default-features = false }
|
|
|
|
# Async Runtime
|
|
tokio = { version = "1", features = ["full"] }
|
|
|
|
# Crypto (for API signatures)
|
|
md-5 = "0.10"
|
|
base64 = "0.22"
|
|
|
|
# Regex (for bundle parsing)
|
|
regex = "1"
|
|
lazy_static = "1.4"
|
|
|
|
# Time
|
|
chrono = "0.4"
|
|
|
|
# Error handling
|
|
thiserror = "2"
|
|
anyhow = "1"
|
|
|
|
# Logging
|
|
log = "0.4"
|
|
env_logger = "0.11"
|
|
|
|
# Random number generation (for shuffle)
|
|
rand = "0.8"
|
|
|
|
# Audio playback
|
|
rodio = { version = "0.19", features = ["symphonia-all"] }
|
|
symphonia = { version = "0.5", features = ["all"] }
|
|
|
|
# Audio visualization (FFT)
|
|
spectrum-analyzer = "1.5"
|
|
|
|
# Media controls (MPRIS on Linux)
|
|
souvlaki = "0.7"
|
|
|
|
# Desktop notifications
|
|
notify-rust = "4"
|
|
|
|
# Image processing (tray icon + thumbnails)
|
|
image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp"] }
|
|
|
|
# URL opening
|
|
open = "5"
|
|
|
|
# Local library
|
|
walkdir = "2"
|
|
lofty = "0.18"
|
|
rusqlite = { version = "0.31", features = ["bundled"] }
|
|
dirs = "5"
|
|
filetime = "0.2"
|
|
glob = "0.3"
|
|
uuid = { version = "1", features = ["v4"] }
|
|
|
|
# File dialogs - platform specific (see target dependencies below)
|
|
|
|
# URL encoding
|
|
urlencoding = "2"
|
|
|
|
# Environment variables
|
|
dotenvy = "0.15"
|
|
|
|
# Secure credential storage (system keyring)
|
|
keyring = "3"
|
|
|
|
# Clipboard
|
|
tauri-plugin-clipboard-manager = "2"
|
|
|
|
# Casting (Chromecast, AirPlay, DLNA)
|
|
rust_cast = "0.18.1"
|
|
mdns-sd = "0.11"
|
|
tiny_http = "0.12"
|
|
rupnp = { version = "3", features = ["full_device_spec"] }
|
|
futures-util = "0.3"
|
|
|
|
# Platform-specific dependencies
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
# Note: xdg-portal feature disabled due to ashpd/zbus version incompatibility
|
|
tauri-plugin-dialog = { version = "2.6.0" }
|
|
|
|
# Direct ALSA access for bit-perfect playback (bypasses CPAL limitations)
|
|
alsa = "0.9"
|
|
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
tauri-plugin-dialog = { version = "2.6.0" }
|
|
|
|
[target.'cfg(target_os = "windows")'.dependencies]
|
|
tauri-plugin-dialog = { version = "2.6.0" }
|
|
|
|
[dev-dependencies]
|
|
tempfile = "3"
|
|
|
|
[patch.crates-io]
|
|
cpal = { path = "vendor/cpal" }
|
|
rodio = { path = "vendor/rodio" }
|