Files
psysonic/src-tauri/patches/cpal-0.15.3/CHANGELOG.md
T
Psychotoxical 34b4445c13 feat(lyrics): YouLyPlus karaoke + fix(macos): suppress mic prompt
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>
2026-04-17 21:30:31 +02:00

7.7 KiB

Unreleased

Version 0.15.3 (2024-03-04)

  • Add try_with_sample_rate, a non-panicking variant of with_sample_rate.
  • struct platform::Stream is now #[must_use].
  • enum SupportedBufferSize and struct SupportedStreamConfigRange are now Copy.
  • platform::Device is now Clone.
  • Remove parking_lot dependency in favor of the std library.
  • Fix crash on web/wasm when atomics flag is enabled.
  • Improve Examples: Migrate wasm example to trunk, Improve syth-thones example.
  • Improve CI: Update actions, Use Android 30 API level in CI, Remove asmjs-unknown-emscripten target.
  • Update windows dependency to v0.54
  • Update jni dependency to 0.21
  • Update alsa dependency to 0.9
  • Update oboe dependency to 0.6
  • Update ndk dependency to 0.8 and disable default-features.
  • Update wasm-bindgen to 0.2.89

Version 0.15.2 (2023-03-30)

  • webaudio: support multichannel output streams
  • Update windows dependency
  • wasapi: fix some thread panics

Version 0.15.1 (2023-03-14)

  • Add feature oboe-shared-stdcxx to enable shared-stdcxx on oboe for Android support
  • Remove thiserror dependency
  • Swith mach dependency to mach2

Version 0.15.0 (2023-01-29)

  • Update windows-rs, jack, coreaudio-sys, oboe, alsa dependencies
  • Switch to the dasp_sample crate for the sample trait
  • Switch to web-sys on the emscripten target
  • Adopt edition 2021
  • Add disconnection detection on Mac OS

Version 0.14.1 (2022-10-23)

  • Support the 0.6.1 release of alsa-rs
  • Fix asio feature broken in 0.14.0
  • NetBSD support
  • CI improvements

Version 0.14.0 (2022-08-22)

  • Switch to windows-rs crate
  • Turn ndk-glue into a dev-dependency and use ndk-context instead
  • Update dependencies (ndk, ndk-glue, parking_lot, once_cell, jack)

Version 0.13.5 (2022-01-28)

  • Faster sample format conversion
  • Update dependencies (ndk, oboe, ndk-glue, jack, alsa, nix)

Version 0.13.4 (2021-08-08)

  • wasapi: Allow both threading models and switch the default to STA
  • Update dependencies (core-foundation-sys, jni, rust-jack)
  • Alsa: improve stream setup parameters

Version 0.13.3 (2021-03-29)

  • Give each thread a unique name
  • Fix distortion regression on some alsa configs

Version 0.13.2 (2021-03-16)

  • Update dependencies (ndk, nix, oboe, jni, etc)

Version 0.13.1 (2020-11-08)

  • Don't panic when device is plugged out on Windows
  • Update parking_lot dependency

Version 0.13.0 (2020-10-28)

  • Add Android support via oboe-rs.
  • Add Android APK build an CI job.

Version 0.12.1 (2020-07-23)

  • Bugfix release to get the asio feature working again.

Version 0.12.0 (2020-07-09)

  • Large refactor removing the blocking EventLoop API.
  • Rename many Format types to StreamConfig:
    • Format type's data_type field renamed to sample_format.
    • Shape -> StreamConfig - The configuration input required to build a stream.
    • Format -> SupportedStreamConfig - Describes a single supported stream configuration.
    • SupportedFormat -> SupportedStreamConfigRange - Describes a range of supported configurations.
    • Device::default_input/output_format -> Device::default_input/output_config.
    • Device::supported_input/output_formats -> Device::supported_input/output_configs.
    • Device::SupportedInput/OutputFormats -> Device::SupportedInput/OutputConfigs.
    • SupportedFormatsError -> SupportedStreamConfigsError
    • DefaultFormatError -> DefaultStreamConfigError
    • BuildStreamError::FormatNotSupported -> BuildStreamError::StreamConfigNotSupported
  • Address deprecated use of mem::uninitialized in WASAPI.
  • Removed UnknownTypeBuffer in favour of specifying sample type.
  • Added build_input/output_stream_raw methods allowing for dynamically handling sample format type.
  • Added support for DragonFly platform.
  • Add InputCallbackInfo and OutputCallbackInfo types and update expected user data callback function signature to provide these.

Version 0.11.0 (2019-12-11)

  • Fix some underruns that could occur in ALSA.
  • Add name to HostId.
  • Use snd_pcm_hw_params_set_buffer_time_near rather than set_buffer_time_max in ALSA backend.
  • Remove many uses of std::mem::uninitialized.
  • Fix WASAPI capture logic.
  • Panic on stream ID overflow rather than returning an error.
  • Use ringbuffer crate in feedback example.
  • Move errors into a separate module.
  • Switch from failure to thiserror for error handling.
  • Add winbase winapi feature to solve windows compile error issues.
  • Lots of CI improvements.

Version 0.10.0 (2019-07-05)

  • core-foundation-sys and coreaudio-rs version bumps.
  • Add an ASIO host, available under Windows.
  • Introduce a new Host API, adding support for alternative audio APIs.
  • Remove sleep loop on macOS in favour of using a Condvar.
  • Allow users to handle stream callback errors with a new StreamEvent type.
  • Overhaul error handling throughout the crate.
  • Remove unnecessary Mutex from ALSA and WASAPI backends in favour of channels.
  • Remove panic! from OutputBuffer Deref impl as it is no longer necessary.

Version 0.9.0 (2019-06-06)

  • Better buffer handling
  • Fix logic error in frame/sample size
  • Added error handling for unknown ALSA device errors
  • Fix resuming a paused stream on Windows (wasapi).
  • Implement default_output_format for emscripten backend.

Version 0.8.1 (2018-03-18)

  • Fix the handling of non-default sample rates for coreaudio input streams.

Version 0.8.0 (2018-02-15)

  • Add record_wav.rs example. Records 3 seconds to $CARGO_MANIFEST_DIR/recorded.wav using default input device.
  • Update enumerate.rs example to display default input/output devices and formats.
  • Add input stream support to coreaudio, alsa and windows backends.
  • Introduce StreamData type for handling either input or output streams in EventLoop::run callback.
  • Add Device::supported_{input/output}_formats methods.
  • Add Device::default_{input/output}_format methods.
  • Add default_{input/output}_device functions.
  • Replace usage of Voice with Stream throughout the crate.
  • Remove Endpoint in favour of Device for supporting both input and output streams.

Version 0.7.0 (2018-02-04)

  • Rename ChannelsCount to ChannelCount.
  • Rename SamplesRate to SampleRate.
  • Rename the min_samples_rate field of SupportedFormat to min_sample_rate
  • Rename the with_max_samples_rate() method ofSupportedFormat to with_max_sample_rate()
  • Rename the samples_rate field of Format to sample_rate
  • Changed the type of the channels field of the SupportedFormat struct from Vec<ChannelPosition> to ChannelCount (an alias to u16)
  • Remove unused ChannelPosition API.
  • Implement Endpoint and Format Enumeration for macOS.
  • Implement format handling for macos build_voice method.

Version 0.6.0 (2017-12-11)

  • Changed the emscripten backend to consume less CPU.
  • Added improvements to the crate documentation.
  • Implement pause and play for ALSA backend.
  • Reduced the number of allocations in the CoreAudio backend.
  • Fixes for macOS build (#186, #189).

Version 0.5.1 (2017-10-21)

  • Added Sample::to_i16(), Sample::to_u16() and Sample::from.

Version 0.5.0 (2017-10-21)

  • Removed the dependency on the futures library.
  • Removed the Voice and SamplesStream types.
  • Added EventLoop::build_voice, EventLoop::destroy_voice, EventLoop::play, and EventLoop::pause that can be used to create, destroy, play and pause voices.
  • Added a VoiceId struct that is now used to identify a voice owned by an EventLoop.
  • Changed EventLoop::run() to take a callback that is called whenever a voice requires sound data.
  • Changed supported_formats() to produce a list of SupportedFormat instead of Format. A SupportedFormat must then be turned into a Format in order to build a voice.