Backend changes: - Add audio_diagnostics module to read actual hardware sample rate from /proc/asound - New command get_hardware_audio_status() parses hw_params for real-time monitoring - Add glob dependency for file pattern matching Frontend (AudioOutputBadges): - Implement 3-state DAC badge system: - Green: DAC passthrough working correctly (rates match) - Yellow: DAC passthrough ON but resampling detected (warning) - Gray: DAC passthrough OFF (intentionally disabled) - Dynamic tooltips showing actual hardware sample rate - Compare file sample rate vs hardware sample rate - Increase tooltip z-index to 9999 to prevent occlusion issues - Add pointer-events: none to tooltip to prevent interaction issues Frontend (SettingsView): - Replace hardcoded "192 kHz" with dynamic hardware sample rate - Load and display actual hardware audio status - Show format details (e.g., S32_LE) when available - Display "No active playback" when no audio is playing - Add muted styling for inactive state Frontend (QualityBadge): - Add native tooltip showing tier and format - Add cursor: help to indicate interactivity i18n: - Add "noActivePlayback" translations (EN/ES) This allows users to verify bit-perfect playback is working and detect resampling issues that would compromise audio quality.
107 lines
2.3 KiB
TOML
107 lines
2.3 KiB
TOML
[package]
|
|
name = "qbz-nix"
|
|
version = "1.1.5"
|
|
description = "Native Qobuz client for Linux with Hi-Fi audio support"
|
|
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"
|
|
|
|
# Time
|
|
chrono = "0.4"
|
|
|
|
# Error handling
|
|
thiserror = "2"
|
|
anyhow = "1"
|
|
|
|
# Logging
|
|
log = "0.4"
|
|
env_logger = "0.11"
|
|
|
|
# Audio playback
|
|
rodio = { version = "0.19", features = ["symphonia-all"] }
|
|
symphonia = { version = "0.5", features = ["all"] }
|
|
|
|
# Media controls (MPRIS on Linux)
|
|
souvlaki = "0.7"
|
|
|
|
# Desktop notifications
|
|
notify-rust = "4"
|
|
|
|
# Image decoding (for tray icon)
|
|
image = { version = "0.25", default-features = false, features = ["png"] }
|
|
|
|
# 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"
|
|
|
|
# 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.5.0" }
|
|
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
tauri-plugin-dialog = { version = "2.5.0" }
|
|
|
|
[target.'cfg(target_os = "windows")'.dependencies]
|
|
tauri-plugin-dialog = { version = "2.5.0" }
|
|
|
|
[patch.crates-io]
|
|
cpal = { path = "vendor/cpal" }
|
|
rodio = { path = "vendor/rodio" }
|