NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #2107 most downloaded on crates.io
Low-level cross-platform audio I/O library.
Last release 1 months ago
16 Aug 2026
Release timing varies
gaps range from 9 days to 1.3 years
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
12 years old
80 releases · first in 2014
AAudio : Xruns are now reported as ErrorKind::Xrun .
ErrorKind::Xrun.ErrorKind::Xrun.ErrorKind::Xrun.ErrorKind::Xrun.realtime-dbus has no effect there.objc2-core-foundation dependency lower bound to 0.3.1.realtime alone is a no-op without realtime-dbus.windows and windows-core dependencies are now both pinned to 0.62.Device handles.Stream operations to work when called from any thread.Device::id no longer embeds the process ID, so DeviceId is now stable across application restarts.play() is called./Internal media class are now enumerated as devices.NoData errors are no longer misreported as buffer xruns.Stream::drop, play, and pause no longer panic when the device is lost.DeviceChanged, which wrongly implied the stream had rerouted automatically.Send + Sync on Stream when compiled with +atomics.Host::is_available() always returning true, even in non-window contexts.14 people contributed to this release, 9 of them for the first time: Andreas (@sandreas), Benoît Rouleau (@benface), @dheijl, Edwin Löffler (@edwloef), Erwan Legrand (@ErwanLegrand), @Jaxx497, Kpqi5858 (@kpqi5858), LastExceed (@LastExceed), Mat Silverstein (@silverstein), @MordechaiHadad, Nicola Vitale (@nivit), Nicolas Franco Gomez (@nico-franco-gomez), SkeletonGamer (@SkeletonGamer), and @the-drunk-coder. Welcome aboard, and thank you all!
One column per quarter.
A quick follow-up to 0.18.0 primarily to fix the docs.rs build failure.
A quick follow-up to 0.18.0 primarily to fix the docs.rs build failure.
docs.rs: Excluded pipewire, whose system dependency isn't available in that sandboxed build environment.audioworklet feature failing to compile on wasm32-wasip1 and other non-browser wasm32 targets.No API or behavioral changes.
pipewire from the docs.rs build; system dependency not available in its environment.wasm-bindgen causing compile errors on non-browser wasm32 targets such as wasm32-wasip1.Hey everyone! cpal 0.18.0 is out, bringing two long-requested native Linux backends, a unified error API, and accurate timestamps across every platfor
Hey everyone! cpal 0.18.0 is out, bringing two long-requested native Linux backends, a unified error API, and accurate timestamps across every platform.
Two new first-class backends join the Linux and BSD lineup:
Enable them with the pipewire and pulseaudio Cargo features. When multiple backends are compiled in, cpal selects the best available one at runtime: PipeWire > PulseAudio > ALSA.
All per-operation error enums (DevicesError, BuildStreamError, StreamError, etc.) are replaced by a single cpal::Error with a kind() getter:
match device.default_output_config() {
Err(e) => match e.kind() {
cpal::ErrorKind::DeviceNotAvailable => { /* ... */ }
cpal::ErrorKind::DeviceBusy => { /* retry */ }
_ => { /* ... */ }
}
}Two new error kinds make previously indistinguishable cases actionable: DeviceBusy (EBUSY/EAGAIN is retryable) and PermissionDenied for OS-level access denials. See the upgrading guide for the mapping table.
Timestamps previously reflected when the callback fired rather than when audio would actually reach hardware. This release corrects that across every backend:
LinkSynchronized hardware cross-timestamps for reduced jitter on supported deviceskAsioLatenciesChangedA new StreamTrait::now() method lets you query the stream's clock from outside the callback for A/V sync: read the audio clock at any point and correlate it with your video timeline.
default_input_config() and default_output_config() now prefer 48 kHz, then 44.1 kHz, on all backends. Defaulting to 44.1 kHz meant cpal's chosen rate often didn't match the hardware's preferred rate. Pin it explicitly if you need 44.1 kHz.
StreamTrait::buffer_size() queries the stream's current buffer sizeSupportedStreamConfigRange::try_with_standard_sample_rate() / with_standard_sample_rate() snaps to 48 kHz or 44.1 kHz from a supported rangeALSA: device_by_id() now accepts PCM shorthand names like hw:0,0 and plughw:foo; streams attempt to recover after system suspend; capture streams no longer hang on overruns; backward-stepping timestamps during startup and xrun recovery are fixed.
ASIO: collect() on the device iterator no longer stops after the first device; device enumeration and stream creation now work correctly when called from spawned threads; distortion from drivers that fire the buffer callback multiple times per cycle is fixed.
CoreAudio: the physical stream format is now set directly on the hardware device rather than relying on the HAL mixer; user-specified timeouts are now respected when building a stream.
JACK: buffer size changes no longer fire an error callback but resizes internal buffers, avoiding unnecessary stream rebuilds; server shutdown now surfaces as ErrorKind::DeviceNotAvailable.
WASAPI: device names now prefer FriendlyName over DeviceDesc, so you see the readable name from system settings; default streams automatically reroute when the system default device changes.
...and a lot more. The changelog has the full picture.
play() call: ALSA, CoreAudio, and JACK previously auto-started streams on creation. If you never called play(), your callback will never fire after upgrading.Error types unified: match on e.kind() instead of per-operation error enums.StreamConfig passed by value: StreamConfig now implements Copy; drop the & at build_*_stream call sites.StreamInstant API overhauled: aligns with std::time::Instant. Change add/sub to checked_add/checked_sub (or +/-); duration_since returns Duration (saturating), secs/nanos are now u64.F32 explicitly if you were relying on it as the default.wasm32-unknown-unknown with the wasm-bindgen feature.Full details and migration examples in the upgrading guide.
The design goals are tracked in #1220. Highlights:
play/pause to start/pause/stop with a draining stopBufferSize refactor with range supportThe feature set may change.
25 people contributed to this release, 19 of them for the first time: Access (@Decodetalkers), atlv (@atlv24), Chandler Newman (@csnewman), Colin Marc (@colinmarc), @DanielHabenicht, @dheijl, Edwin Löffler (@edwloef), GorTech (@gortech), Jerry.Wang (@wangjia184), kibaa (@d3d9), Louis Beaumont (@louis030195), Marin (@marin-m), Mat Silverstein (@silverstein), Mike Hilgendorf (@m-hilgendorf), Mikey (@ahdinosaur), Nicolas Franco Gomez (@nico-franco-gomez), osoftware (@osoftware), Raphael Poss (@knz), Seto Elkahfi (@setoelkahfi), Sintel (@Sin-tel), thewh1teagle (@thewh1teagle), Umer Haider (@umerhd), Worik Stanton (@worikgh), and 时光回忆 (@mikai233). Welcome aboard, and thank you all!
A handful of longstanding reports, some dating back to 2019, also got closed out along the way as fixes elsewhere in this release happened to resolve them too. Thanks to the original reporters for filing them and sticking around: @bspot, @JustAnotherCodemonkey, @knappador, Marc-Antoine ARNAUD (@MarcAntoine-Arnaud), @mitchmindtree, MOZGIII (@MOZGIII), Philippe GASSMANN (@zenria), Przemysław Węgrzyn (@codepainters), TG (@tGrothmannFluffy), @the-drunk-coder, and Will (@will3942).
If you find value in cpal, sponsorships are a heartfelt token of appreciation and help cover the costs of building it: music service subscriptions, hardware for cross-platform compatibility, and tooling. Every contribution helps: sponsor me at GitHub.
Huge thanks to everyone who contributed to this release!
ErrorKind variants for the unified error type: BackendError (platform error without a
specific mapping); DeviceBusy (retryable device access, e.g. EBUSY/EAGAIN); DeviceChanged
(audio route changed to another device); InvalidInput (invalid caller-supplied values);
PermissionDenied (OS-level access denial); RealtimeDenied (real-time scheduling refused —
previously only printed to stderr); ResourceExhausted (OS thread/memory limits);
UnsupportedOperation (backend or device does not implement the operation).Device now implements PartialEq, Eq, Hash, Display, and Debug on all backends.realtime feature for real-time audio thread scheduling without a D-Bus build dependency.StreamTrait::now() to query the current instant on the stream's clock.StreamTrait::buffer_size() to query the stream's current buffer size in frames per callback.SAMPLE_RATE_CD (44100 Hz) and SAMPLE_RATE_48K (48000 Hz) constants.SupportedStreamConfigRange::try_with_standard_sample_rate() and with_standard_sample_rate()
to select 48 kHz or 44.1 kHz from a range.SupportedStreamConfigRange::contains_rate() to test whether a sample rate falls within a range.StreamConfig and SupportedStreamConfig now implement Copy.BufferSize now implements Default (returns BufferSize::Default).SupportedBufferSize now implements Default (returns SupportedBufferSize::Unknown).HostTrait::device_by_id() is now backend-dispatched, allowing each host to override the
default implementation.PERFORMANCE_MODE_LOW_LATENCY with the realtime feature;
reports ErrorKind::RealtimeDenied if not granted.device_by_id() now accepts PCM shorthand names such as hw:0,0 and plughw:foo.F64 sample format support.DevicesError, SupportedStreamConfigsError, etc.) and
HostUnavailable into a unified Error/ErrorKind. See UPGRADING.md.DeviceTrait now requires PartialEq + Eq + Hash + Debug + Display with a stable device ID.DeviceTrait::build_*_stream() now takes StreamConfig by value instead of &StreamConfig.StreamInstant API changed and extended to mirror std::time::Instant/Duration. See
UPGRADING.md for migration details.build_*_stream(); call play() explicitly.
Previously ALSA, CoreAudio, and JACK auto-started streams on creation.SupportedStreamConfigRange::cmp_default_heuristics now ranks all SampleFormat variants;
F32 > F64 > descending integer widths. Default configs may now return I32 or I24 on
high-precision hardware. See UPGRADING.md.DeviceId fields are now private; construct with DeviceId::new(host, id) and access with
.host() / .id(). See UPGRADING.md.audio_thread_priority feature renamed to realtime-dbus.DeviceDescription::extended() now returns impl Iterator<Item = &str> instead of &[String].
See UPGRADING.md.HostId::name() now returns a more human-friendly name.DeviceDescriptionBuilder setters now accept impl AsRef<str> instead of impl Into<String>.SupportedBufferSize in enumeration is now Unknown.Speaker (Builtin Speaker)).supported_input_configs() and supported_output_configs() now return an error for
direction-mismatched devices instead of silently returning an empty list.ErrorKind::DeviceNotAvailable on device
disconnection.LinkSynchronized hardware cross-timestamps for lower jitter
on supported devices.realtime feature now skips RT promotion for ineligible PCM types (null,
I/O plugins, wrapper types).ErrorKind::StreamInvalidated on
kAsioResyncRequest or a sample rate change of 1 Hz or more from the configured rate.kAsioLatenciesChanged.Device::driver, asio_streams, and current_callback_flag are no longer pub.BufferSize::Fixed now sets renderSizeHint on the AudioContext.ErrorKind::StreamInvalidated on any sample
rate change on macOS, and on iOS on route changes that require a stream rebuild.ErrorKind::DeviceNotAvailable on iOS
when media services are lost.ErrorKind::DeviceChanged when the system
default output device changes, or on iOS when headphones are unplugged.default_output_config() now prefers stereo over the maximum channel count.ErrorKind::DeviceNotAvailable on server shutdown.ErrorKind::RealtimeDenied once if the process
callback is not running at real-time scheduling priority.Stream::connect_to_system_outputs() and connect_to_system_inputs() now return
Result<(), Error> and roll back the port graph on failure.ErrorKind::DeviceChanged.FriendlyName is now preferred as device name over DeviceDesc.Device::immdevice() now returns Option<Audio::IMMDevice>.windows dependency lower bound to 0.61.StreamInstant::add() and sub() replaced by checked_add()/+ and checked_sub()/-.DeviceTrait::name().Default implementation for Device.AlsaHost is no longer re-exported from cpal::platform.U24 incorrectly listed as a supported sample format.channels: 0, sample_rate: 0, or BufferSize::Fixed(0) now return ErrorKind::InvalidInput
consistently across all backends (previously UnsupportedConfig or a panic).ErrorKind::StreamInvalidated instead of panicking (AAudio,
ASIO, CoreAudio, JACK, WASAPI).build_*_stream returns the Stream handle (ALSA, ASIO, WASAPI).buffer_capacity_in_frames integer overflow for large fixed buffer sizes (AAudio, ALSA).StreamInstant (ASIO, CoreAudio, JACK).sample_rate values above i32::MAX panicking.error_callback.ErrorKind::BackendError instead of panicking on sample count overflow in
the data callback.supported_configs() reporting buffer size instead of period size, using the same
buffer range for all formats/channels, and dropping sample rates outside COMMON_SAMPLE_RATES.BufferSize::Fixed validation opening the PCM device a second time.build_*_stream_raw returning UnsupportedConfig instead of UnsupportedOperation
for direction-mismatched devices.collect().kAsioBufferSizeChange.kAsioLatenciesChanged.driver.sample_rate() failures at stream creation silently ignored.kAsioOverload.BufferSize::Fixed with a size not aligned to the driver's step constraint not
returning ErrorKind::UnsupportedConfig.default_output_device() returning non-None when AudioWorklet is
unavailable.destination.maxChannelCount.supported_output_configs() reporting FrameCount::MAX as the buffer
size upper bound (correct: floor(6 * sample_rate) per spec).supported_output_configs() reporting 128 as the minimum render quantum
when renderQuantumSize is supported (spec minimum is 1).ErrorKind::DeviceNotAvailable.supported_output/input_configs() collapsing non-continuous hardware rates
into a continuous range (regression since v0.17.0).BufferSize::Fixed producing cryptic backend errors when not validated
against the hardware buffer range.BufferSize::Fixed not validated against the supported range before
stream creation.activate_async() failure panicking instead of returning an error.supported_input/output_configs() reporting a hardcoded sparse channel list
instead of enumerating all counts up to physical system ports.channels: 0 or sample_rate: 0 silently using PipeWire-negotiated values
instead of returning ErrorKind::InvalidInput.supported_output_configs() and default_output_config() not accounting
for PulseAudio's double-buffer.supported_input_configs() advertising unsupported sample rates on input
devices.sample_rate: 0 with BufferSize::Fixed causing a divide-by-zero panic.supported_input/output_configs() and default_input/output_config() reporting
an unconstrained buffer range on software audio stacks.I24 not enumerated and 24-bit devices misidentified as I32.play() calls.default_output_device() returning Some when WebAudio is unavailable.destination.maxChannelCount.Reverted SemVer-breaking DeviceBusy error variant addition.
DeviceBusy error variant addition.DeviceBusy error variant for retriable device access errors ( EBUSY , EAGAIN ).
This release was yanked.
DeviceBusy error variant for retriable device access errors (EBUSY, EAGAIN).Debug implementations for Host, Device, Stream, and internal types.alsa dependency to 0.11.core-audio-rs dependency to 0.14.ALSA : Default implementation for Device (returns the ALSA "default" device).
Default implementation for Device (returns the ALSA "default" device).DeviceTrait::id method that returns a stable audio device ID.
DeviceTrait::id method that returns a stable audio device ID.HostTrait::device_by_id to select a device by its stable ID.Display and FromStr implementations for HostId.Hosts, Devices, and Streams.Sample::bits_per_sample method.Copy implementation to InputCallbackInfo and OutputCallbackInfo.StreamError::StreamInvalidated variant for when stream must be rebuilt.StreamError::BufferUnderrun variant for buffer underrun/overrun notifications.Hash implementation to Device for all backends.Send and Sync implementations to Stream.I24 and U24 sample format support (24-bit samples stored in 4 bytes).Eq and PartialEq implementations to Device.i8, i32 and I24 sample format support (24-bit samples stored in 4 bytes).Send implementation to Stream.BufferSize::Fixed validation against supported range.BufferSize::Fixed validation to reject requests that don't match server buffer size.IMMDevice from WASAPI host Device.I24 and U24 sample format support (24-bit samples stored in 4 bytes).Send and Sync implementations to Stream.Send and Sync implementations to Stream.BufferSize::Fixed validation against supported range.SampleRate from struct to u32 type alias.audio_thread_priority to 0.34.BufferSize::Fixed precision and audio callback performance.BufferSize::Default to use the device defaults.aplay -L does.alsa to 0.10.silent=true to PCM.try_recover, so it doesn't write to stderr.StreamError::BufferUnderrun.sys::Asio instance across all Host instances.cargo update syntax for compatibility with Cargo 1.70 (use -p flag instead of positional argument).Device::supported_configs to return a single element containing the available sample rate range when all elements have the same mMinimum and mMaximum values.Clone implementation from Stream.StreamError::StreamInvalidated for JACK server sample rate changes.StreamError::BufferUnderrun.windows to >= 0.59, <= 0.62.kAsioResetRequest message to prevent driver UI becoming unresponsive.wee-alloc feature for security reasons.Optional supports_input/output methods to DeviceTrait.
supports_input/output methods to DeviceTrait.COMMON_SAMPLE_RATES.InputCallbackInfo, OutputCallbackInfo and StreamInstant.Default impl for Host.PartialOrd, Ord and Hash implementations for SampleFormat.Clone, PartialEq, Eq and Hash implementations for all error enums.oboe to ndk::audio. NOTE: This raises the minimum Android API version to 26 (Android 8/Oreo).coreaudio-rs dependency to 0.13.jack dependency to 0.13.eval.try_with_sample_rate, a non-panicking variant of with_sample_rate.
try_with_sample_rate, a non-panicking variant of with_sample_rate.#[must_use] attribute to struct platform::Stream.Copy implementation to enum SupportedBufferSize and struct SupportedStreamConfigRange.Clone implementation to platform::Device.jni dependency to 0.21.oboe dependency to 0.6.ndk dependency to 0.8 and disable default-features.alsa dependency to 0.9.asmjs-unknown-emscripten target.trunk, improve syth-thones example.windows dependency to v0.54.wasm-bindgen to 0.2.89.atomics flag is enabled.parking_lot dependency in favor of the std library.WebAudio: Support for multichannel output streams.
windows dependency.AAudio: Feature oboe-shared-stdcxx to enable shared-stdcxx on oboe for Android support.
oboe-shared-stdcxx to enable shared-stdcxx on oboe for Android support.mach dependency to mach2.thiserror dependency.CoreAudio: Disconnection detection on Mac OS.
dasp_sample crate for the sample trait.oboe dependency.alsa dependency.coreaudio-sys dependency.web-sys on the emscripten target.jack dependency.windows-rs dependency.### Removed - nix dependency.
nix dependency.ALSA: Support for the 0.6.1 release of alsa-rs.
alsa-rs.Update parking_lot and once_cell dependencies.
parking_lot and once_cell dependencies.ndk-glue into a dev-dependency and use ndk-context instead.ndk and ndk-glue dependencies.jack dependency.windows-rs crate.Faster sample format conversion.
ndk, oboe, and ndk-glue dependencies.alsa and nix dependencies.jack dependency.ALSA: Improve stream setup parameters.
jni dependency.core-foundation-sys dependency.rust-jack dependency.Give each thread a unique name.
AAudio: Update ndk, nix, oboe, and jni dependencies.
ndk, nix, oboe, and jni dependencies.WASAPI: Don't panic when device is plugged out on Windows.
parking_lot dependency.AAudio: Android support via oboe-rs.
oboe-rs.ASIO: Bugfix release to get the asio feature working again.
WASAPI: Address deprecated use of mem::uninitialized.
build_input/output_stream_raw methods allowing for dynamically handling sample format type.InputCallbackInfo and OutputCallbackInfo types and update expected user data callback function signature to provide these.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.mem::uninitialized.UnknownTypeBuffer in favour of specifying sample type.WASAPI: winbase winapi feature to solve windows compile error issues.
HostId.winbase winapi feature to solve windows compile error issues.std::mem::uninitialized.failure to thiserror for error handling.snd_pcm_hw_params_set_buffer_time_near rather than set_buffer_time_max.ringbuffer crate in feedback example.New Host API, adding support for alternative audio APIs.
StreamEvent type to allow users to handle stream callback errors.Condvar.panic! from OutputBuffer Deref impl as it is no longer necessary.core-foundation-sys and coreaudio-rs dependencies.ALSA: Error handling for unknown device errors.
default_output_format implementation.Display and Error implementations for DefaultFormatError.
Display and Error implementations for DefaultFormatError.lazy_static dependency.CoreAudio: Handling of non-default sample rates for input streams.
Device::supported_{input/output}_formats methods.
Device::supported_{input/output}_formats methods.Device::default_{input/output}_format methods.default_{input/output}_device functions.StreamData type for handling either input or output streams in EventLoop::run callback.record_wav.rs example that records 3 seconds to $CARGO_MANIFEST_DIR/recorded.wav using default input device.Voice with Stream throughout the crate.enumerate.rs example to display default input/output devices and formats.Endpoint in favour of Device for supporting both input and output streams.CoreAudio: Endpoint and Format enumeration for macOS.
Endpoint and Format enumeration for macOS.build_voice method.ChannelsCount to ChannelCount.SamplesRate to SampleRate.min_samples_rate field of SupportedFormat to min_sample_rate.with_max_samples_rate() method of SupportedFormat to with_max_sample_rate().samples_rate field of Format to sample_rate.channels field of the SupportedFormat struct from Vec<ChannelPosition> to ChannelCount (an alias to u16).Improvements to the crate documentation.
pause and play support.Sample::to_i16(), Sample::to_u16() and Sample::from methods.
Sample::to_i16(), Sample::to_u16() and Sample::from methods.EventLoop::build_voice, EventLoop::destroy_voice, EventLoop::play, and EventLoop::pause methods.
EventLoop::build_voice, EventLoop::destroy_voice, EventLoop::play, and EventLoop::pause methods.VoiceId struct that is now used to identify a voice owned by an EventLoop.EventLoop::run() to take a callback that is called whenever a voice requires sound data.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.futures library.Voice and SamplesStream types.### Added - iOS: Minimal support. ### Changed - Run rustfmt on the code. ### Fixed - BSD: Fixes for *BSDs. ### Removed - get_ prefix of methods.
get_ prefix of methods.ALSA: Bump alsa-sys version number.
ALSA: Pass period instead of buffer to snd_pcm_sw_params_set_avail_min.
ALSA: Set sw_params_set_avail_min based on get_params buffer size.
Mark deprecated functions as deprecated.
ALSA: Implement play and pause.
Added Driver::streams() to access a driver's shared input/output buffer state
Driver::streams() to access a driver's shared input/output buffer stateDebug on AsioStreams and AsioStreamThanks to MordechaiHadad (@MordechaiHadad), who reported the duplex-stream bug (#1287) that Driver::streams() fixes in this release.
WASAPI: Some documentation to the winapi implementation.
Added Driver::latencies() to query input and output stream latencies
Driver::latencies() to query input and output stream latenciesBufferPreference enum with the driver's preferred buffer size and valid-size constraintsDriver::add_message_callback and Driver::remove_message_callback replaced by Driver::add_event_callback and Driver::remove_event_callbackMessageCallback renamed to DriverEventCallback, and MessageCallbackId renamed to DriverEventCallbackId. DriverEventCallback wraps Fn(AsioDriverEvent) -> bool whereAsioDriverEvent is a new enum covering both asioMessage selector events and sampleRateDidChange notificationsCallbackId renamed to BufferCallbackIdc_long fields and return types replaced with i32c_double parameters and return types replaced with f64CallbackInfo::system_time is now u64 nanosecondsAsioError::ASE_NoMemory renamed to AsioError::NoMemoryBufferSizeRange with a preferred: BufferPreference fieldAsioTime::reserved, AsioTimeInfo::reserved, AsioTimeCode::future fields made private.asio_import module is now pub(crate); raw bindgen types are no longer public APIasio_message now dispatches kAsioResyncRequest and kAsioLatenciesChanged to callbacksasio_message delegates kAsioSelectorSupported for unknown selectors to registered callbacks, so each host decides which capabilities it opts intosample_rate_did_change now dispatches AsioDriverEvent::SampleRateChanged to registered callbacks when the reported rate differs from the last known ratechannels, latencies, sample_rate, and related query methods could call ASIO concurrently during set_sample_rate's teardown/reloadAsio::load_driver to return LoadDriverError::LoadDriverFailed instead of panicking when the driver name contains a null byteDriver::set_sample_rate to perform a dummy buffer cycle and driver reload when the driver does not apply the rate change immediately, as required by some drivers (e.g. Steinberg)asio_message not advertising kAsioSelectorSupported itself as a supported selectorSampleRate structDriverState from the public APIThanks to Jerry.Wang (@wangjia184), who fixed the rust-analyzer build on non-Windows targets (#1140).
CoreAudio: Add get_period to Voice.
### Fixed - Be more relaxed with c_void.
Android: Fix the android build.
CoreAudio: Add support for U16/I16 PCM formats.
WASAPI: Catch another 'device not found' error code.
### Added - Voice::get_period() method.
Voice::get_period() method.Link advapi32 to resolve Windows Registry API symbols.
advapi32 to resolve Windows Registry API symbols.Fixed ASIO SDK discovery on case sensitive filesystems.
Examples: An enumerate example.
endpoint::get_name() method.Store the format in the public Voice struct.
#[inline] attributes.underflow() method to Voice.Voice struct.UnknownBufferType::len() method.
UnknownBufferType::len() method.Update Cargo.toml after the previous changes.
WASAPI: Better error handling in format detection.
endpoint::get_name() method.ALSA: Correct reported sample format.
### Fixed - Fix the version in the README. - WASAPI: Fix the win32 build.
### Added - Bump to 0.1.0.
WASAPI: Fix platform-specific dependencies with MSVC.
ALSA: Calls to a single ALSA channel are not thread safe.
Your coding agent can read these notes before it upgrades. Set up the MCP server →