Skip to content

Releases: pocketstation-io/pocketstation

PocketStation 1.1.14

Choose a tag to compare

PocketStation 1.1.14 adds opt-in native startup observations and retains uncertain cleanup ownership.

SessionStartCancellation::observed() exposes up to 64 current native opens and the first 128 completed calls. Clones share cancellation and observations. Records contain operation tags, monotonic times and native status values; default tokens allocate no observation state.

Cancellation is checked between native operations, including after late registration returns. SessionStartError::rollback_failures_total() preserves cleanup failures alongside the primary error. These changes add diagnostics and ownership safeguards; they do not interrupt a pending operating-system call or promise a startup deadline.

Publication and recovery validate the exact selected tag in every job. AEC remains optional and excluded from default builds.

Source: a854e63. Linux, macOS and Windows main checks passed. The exact main archive and one isolated default consumer passed, including public observation/cancellation checks and AEC absence. The crates.io publication follows the protected release workflow.

PocketStation 1.1.13

Choose a tag to compare

Capture once and extract recent, source-aware audio context while recording and other destinations continue. Session::audio_history retains explicitly routed stems with shared defaults of 30 seconds, 16 MiB PCM and 4096 buffers. AudioHistory::read_clip and RecordedAudio::read_clip return original-channel WAV samples with exact source, session, stem, clock and sample provenance; gaps, expiry, pending context and failures have explicit outcomes. Recognition and wake-word models remain application-owned.

Portable AEC is explicitly enabled with the aec feature; default capture builds omit its engine. Reference selection and processing admission are explicit, and known repeated processing is rejected. Native Windows requests require an active effect on the opened capture client. Native macOS/Linux AEC routes are unavailable; physical double-talk, acoustic quality and route-change qualification remain in progress.

Linux component/documentation tests, CODE_PROTOCOL/hot-path checks, strict Clippy, quickstart and package validation passed. macOS and Windows compile/link CI also passed. The installed Python/Node Lab proof uses controlled PCM and is LOOPBACK-ONLY: independent stereo stems, concurrent recording/history, exact WAV/provenance, expiry/cancellation and zero recorder drops. It makes no physical or endurance claim. The publisher reruns the release checks before registry upload.

No additional package, repository or fork is part of this release.

Source: 9245abe40f8fd8b0f43432112e493d229a2a79cf.
Qualification: https://github.com/pocketstation-io/pocketstation/actions/runs/37399668878
Integration: #77

PocketStation 1.1.12

Choose a tag to compare

macOS microphone capture now keeps timestamps continuous when native packets differ from the Session frame size. The first frame stays anchored to capture time, and explicit capture gaps remain observable.

This repairs a 1.1.11 regression without changing public APIs, queue capacities, dependencies or realtime callback operations. Tests cover 10 ms and 20 ms framing plus reset behavior. Four physical capture cases delivered 2,700 observed frames with zero discontinuities or losses.

Install with cargo add pocketstation@1.1.12. Python and JavaScript packages must embed this Core version to receive the fix; their releases are separate.

Physical evidence covers the tested Mac and built-in microphone. This release makes no new HFP, Teams, WAN, endurance or 10 ms latency claim.

PocketStation 1.1.11

Choose a tag to compare

@Raphjacksun7 Raphjacksun7 released this 25 Sep 02:45
6481de1

Observe whether a microphone is usable

Starting a Session and opening a device no longer have to stand in for media
readiness. Each built-in Source now exposes three separate facts through
RunningSession::metrics_snapshot:

  • source_native_format reports the sample rate, channel count, and PCM
    representation actually opened by the native backend;
  • source_activity reports first-frame and latest-frame delivery; and
  • source_signal reports exact-zero, nonzero, non-finite, peak, and RMS
    measurements for the latest canonical PCM frame.

SessionSourceActivityPolicy distinguishes a Source awaiting its first frame,
an active Source, a first-frame timeout, and a later stall. A caller-supplied
SessionSourceSignalPolicy separately distinguishes no samples, pending or
sustained exact digital zero, signal below the caller's numeric thresholds,
signal meeting those thresholds, and non-finite samples. PocketStation does
not supply universal time or signal thresholds and does not treat numeric
signal as proof of speech or audibility.

Open native microphone formats on macOS

The macOS microphone backend now accepts the device's advertised PCM format,
including common 8, 16, 24, 32, 44.1, 48, and 96 kHz rates and supported
integer or floating-point representations. Conversion, channel reduction, and
rate conversion to PocketStation's canonical mono 48 kHz f32 signal happen
on the reader worker, not the Core Audio callback. Source timestamps and
streaming rate-conversion phase are preserved across native packets.

This expands valid acquisition formats. It does not claim that an operating
system or Bluetooth profile already delivering zero-valued samples has been
repaired.

Recover one microphone without stopping healthy stems

RunningSession::replace_microphone_source opens an exact host-selected
device before detaching the current microphone. If preparation or open fails,
the current microphone remains attached.

RunningSession::reopen_microphone_source is the explicit teardown-first operation
for routes that must close before the same device can be acquired again. If
reopening fails after detach, that microphone stem remains detached while
unrelated application or system-audio stems continue.

Both operations retain the logical stem and routes while advancing source
generation and discontinuity. Replacement metrics report attempts, completed
operations, pre-attach failures, response timeouts, current physical source,
and continuity. Success means the device was opened and attached; callers must
still apply their own first-frame and signal windows. PocketStation never
chooses a fallback device or retries automatically.

PocketStation 1.1.9

Choose a tag to compare

@Raphjacksun7 Raphjacksun7 released this 04 Sep 09:29
fa43523

Capture the complete desktop output mix through the same Session used for selected applications and microphones.

let desktop = session.capture(Source::system_audio())?;
desktop.send(session.polled_audio()?)?;

Source::system_audio() uses the existing CoreAudio, WASAPI, and PipeWire capture implementations. Use Source::application(...) when the user selected one application and unrelated desktop audio must remain private.

The release was checked at 10 ms and 20 ms on macOS, Linux, and Windows. The Windows and Linux virtual-machine runs establish platform correctness; they are not physical-device or latency qualifications.

PocketStation 1.1.8

Choose a tag to compare

@Raphjacksun7 Raphjacksun7 released this 04 Sep 01:34
965a076

Applications that only use desktop capture can now leave Opus out of their
build. This keeps the capture-only dependency set smaller and avoids linking an
unused native codec library.

The default features are unchanged and continue to include desktop capture and
Opus. To build a PCM capture application without Opus:

pocketstation = { version = "1.1.8", default-features = false, features = ["native-capture"] }

PocketStation checks this feature combination on Linux, macOS, and Windows
before publishing a release.

PocketStation 1.1.10

Choose a tag to compare

Windows applications can now use PocketStation’s default features in debug builds. The Opus dependency uses current libopus bindings and links the same Microsoft C runtime as the Rust application.

Applications that already own part of the host audio stack can select only the driver they need with coreaudio-capture, wasapi-capture, pipewire-capture, or alsa-fallback. The normal native-capture feature continues to choose the complete platform capture setup.

PocketStation Core 1.1.7

Choose a tag to compare

@Raphjacksun7 Raphjacksun7 released this 03 Sep 08:47
172e2f2

Route metrics now keep reported queue depth within the route’s configured capacity when producer and consumer counters are sampled concurrently. Audio delivery, queue storage, capture behavior, and the 10 ms and 20 ms profiles are unchanged.

PocketStation 1.1.6

Choose a tag to compare

@Raphjacksun7 Raphjacksun7 released this 03 Sep 06:37
90aba83

Configure route delivery with one consistent set of names.

Added

Advanced integrations can configure RouteSettings as accepted media plus a separate DeliveryPolicy. ExecutionSafety, RouteObservability, and RouteLatencyMeasurement name the related runtime decisions directly.

Session operator metrics expose aggregate input delivery through input_delivery, with per-port details in input_ports.

Changed

Connector, Endpoint, Operator, subscription, and observation APIs now use the same route-settings vocabulary.

cargo update -p pocketstation --precise 1.1.6

PocketStation 1.1.5

Choose a tag to compare

@Raphjacksun7 Raphjacksun7 released this 01 Sep 18:27

Send Session audio to an external system with one function or one focused Rust
type.

Create a Connector

Use Connector::from_audio_fn when a destination needs only one send
operation:

let destination = session.destination(Connector::from_audio_fn(|frame| {
    publish(frame.samples())?;
    Ok(())
})?)?;

application.send(destination)?;

Implement AudioConnector when the provider opens and closes a connection.
One Connector value can receive several source-aware stems through one
lifecycle. Separate values remain independent destinations with their own
queues, failures, and shutdown outcomes.

PocketStation keeps Connector work off realtime, bounds each route, preserves
frame lineage, and joins the provider during drain, abort, startup rollback, or
failure. The existing manifest and driver APIs remain available for
distributable integrations that need typed configuration, secrets, named
inputs, readiness, and provider observations.

Operate capture safely

The guides now show how to inspect permission without prompting, store a
discovered source only for its reported persistence scope, rediscover after a
process or device disappears, reject ambiguous application matches, and make
fallback and provider retry policy explicit.

Fixed

Repeated microphone permission checks now retain valid WinRT thread state for
the lifetime of the calling thread. This prevents a second non-prompting query
from terminating Python and other embedded hosts on Windows.

PocketStation still returns NotObservable when Windows cannot provide a safe
authorization result. Permission checks never display a system prompt.

cargo update -p pocketstation --precise 1.1.5