Skip to content

Combined PR: Intel Mac support, Windows console fix, sound on recording end, recording indicator settings, audio timeout fix#54

Merged
moinulmoin merged 22 commits intomoinulmoin:mainfrom
tomchapin:combined-fixes-2026-01-11
Jan 29, 2026
Merged

Combined PR: Intel Mac support, Windows console fix, sound on recording end, recording indicator settings, audio timeout fix#54
moinulmoin merged 22 commits intomoinulmoin:mainfrom
tomchapin:combined-fixes-2026-01-11

Conversation

@tomchapin
Copy link
Copy Markdown
Contributor

@tomchapin tomchapin commented Jan 11, 2026

Summary

This PR combines and resolves merge conflicts between the following open/closed pull requests:

All features work together without conflicts. This combined PR can be merged in place of the individual PRs.

Features Included

From #56 - Audio Device Timeout Fix (NEW)

  • Fixes app freeze when stopping recordings with USB/wireless audio devices (e.g., Astro A50)
  • Wraps audio stream cleanup in 1-second timeout to prevent indefinite hangs
  • Enhanced error callback triggers graceful stop on device errors
  • Added detailed logging for debugging audio device issues

From #53 - Intel Mac (x86_64) Support

  • FFmpeg sidecar downloads x86_64 binaries for Intel Macs
  • Whisper uses CPU-only mode on Intel (Metal GPU not supported)
  • Parakeet V2 filtered out on Intel (CoreML crashes with SIGFPE)
  • pnpm workspace config fixed for Intel compatibility

From #49 - Windows Console Flash Fix

Hides the console window flash that briefly appears when starting a recording on Windows.

From #50 - Sound on Recording End

  • Adds a toggle option to play a sound when recording stops
  • Bluetooth headset fix: Adds 300ms delay after start sound to allow playback before mic mode switch (fixes AirPods cutting off the sound)

From #51 - Recording Indicator Settings

  • Visibility modes: Never / Always / When Recording
  • Position options: Top / Center / Bottom of screen

Test plan

Tested and working on all three platforms:

  • ARM Mac (Apple Silicon) - Full functionality including Metal GPU acceleration
  • Intel Mac (x86_64) - Whisper CPU mode, Parakeet V3 working
  • Windows 11 PC - All features working, no console flash

Feature tests:

  • All Whisper models work on Intel (CPU mode)
  • Parakeet V3 works on Intel
  • Parakeet V2 hidden on Intel (prevents crash)
  • All frontend tests pass (137 tests)
  • All backend tests pass (164 tests)
  • Recording indicator visibility modes work
  • Recording indicator position settings work
  • Start/end sounds work with Bluetooth headsets (AirPods)
  • Audio timeout fix tested with Astro A50 in frozen state
  • App recovers gracefully after 1-second timeout
  • Recording pill disappears properly after timeout
  • User can immediately start new recording after timeout

Notes

Parakeet V2's CoreML model causes a SIGFPE (floating point exception) on Intel Macs due to ARM64-specific model compilation. V3 works on both architectures, so V2 is simply hidden on Intel.

🤖 Generated with Claude Code

tomchapin and others added 17 commits January 10, 2026 14:22
Add CREATE_NO_WINDOW flag to PowerShell process that plays the
recording start sound on Windows. This prevents a brief black
console window from appearing each time recording begins.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Plays a distinct lower-pitched beep (600Hz) when recording stops,
separate from the recording start sound (800Hz). Includes a toggle
in Settings > General to enable/disable.

Also includes Windows console flash fix for sound playback.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…ng options

Replace boolean show_pill_indicator toggle with a dropdown that provides three modes:
- Never: pill is always hidden
- Always: pill is shown on startup and stays visible
- When Recording: pill only appears during recording (default)

Windows 11 fixes:
- Move pill position above the taskbar to prevent overlay issues where the pill
  would lose focus when clicking the taskbar or system tray icon
- Add subtle outline (ring-1 ring-white/30) to improve pill visibility

Also fixes window management to properly handle orphaned/stale webview windows
by closing them before creating new ones and ensuring mutex guards are dropped
before async await points.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add a new dropdown setting to configure where the recording indicator
appears on screen: top, center, or bottom. Position dropdown is hidden
when indicator visibility is set to "never".

Implementation details:
- Add PillIndicatorPosition type and setting field
- Recreate pill window when position changes for immediate visual feedback
- Make settings updates truly optimistic to fix dropdown responsiveness
- Add fallback in get_pill_window for reliable window access
- Add unit tests for position calculation and mode migration logic
- Add frontend tests for RecordingPill and GeneralSettings indicator options

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Includes:
- fix(windows): hide console window flash when starting recording
- feat: add sound on recording end with toggle option
- feat: add recording indicator visibility settings (Never/Always/When Recording)
- feat: add recording indicator position setting (Top/Center/Bottom)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…ility

The pnpm-workspace.yaml was missing the required `packages` field, causing
pnpm commands to fail with "packages field missing or empty" error. This
fix adds the root package to the workspace configuration.

Also includes Cargo.lock sync for version 1.11.2.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- FFmpeg sidecar: Download x86_64 binaries from evermeet.cx alongside ARM64
- Whisper: Force CPU-only mode on Intel Macs (Metal GPU causes error -6)
- Parakeet: Filter out V2 model on Intel (CoreML crashes with SIGFPE)
- Parakeet sidecar: Add architecture logging for debugging

Intel Macs now work with all Whisper models and Parakeet V3.
Parakeet V2 is hidden on Intel due to incompatible CoreML compilation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds 300ms delay after playing the recording start sound before
initializing the microphone. This allows the sound to complete
before Bluetooth headsets (e.g., AirPods) switch audio modes,
which would otherwise cut off the sound.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add comprehensive logging throughout the pill visibility flow to help
diagnose issues with the recording indicator appearing/hiding:

- Log pill_indicator_mode resolution (stored vs legacy vs default)
- Log should_hide_pill decisions with caller location
- Log RecordingConfig pill settings when loaded
- Log start_recording pill visibility decisions
- Log mode changes in save_settings
- Log startup pill mode resolution

Also makes resolve_pill_indicator_mode pub(crate) for reuse.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…release build

- Fix Parakeet models.rs: Return empty list on Intel Macs since FluidAudio
  throws ASRError.unsupportedPlatform (requires Apple Neural Engine)
- Update release-separate.sh: Add x86_64-apple-darwin build target
- Update latest.json generation to include darwin-x86_64 for auto-updater
- Add notarization verification for x86_64 builds
- Intel Mac users can only use Whisper (CPU-only mode)

Note: Parakeet V3 was incorrectly marked as Intel-compatible. FluidAudio
explicitly requires Apple Silicon for ALL ASR models.
…anup

Some audio devices (especially USB/wireless headsets like Astro A50) can
hang indefinitely during stream cleanup on Windows. This causes the app
to freeze when stopping a recording.

Changes:
- Wrap drop(stream) in a separate thread with 1-second timeout
- If timeout fires, abandon the hung thread and continue gracefully
- Enhanced error callback to trigger stop on device errors (e.g., disconnection)
- Added detailed logging for debugging audio device issues

When the timeout fires:
- App recovers instead of freezing
- User sees "no audio recorded" feedback
- Recording state properly resets to idle
- User can immediately start a new recording

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@tomchapin tomchapin changed the title Combined PR: Intel Mac support, Windows console fix, sound on recording end, recording indicator settings Combined PR: Intel Mac support, Windows console fix, sound on recording end, recording indicator settings, audio timeout fix Jan 14, 2026
@nickwang0808
Copy link
Copy Markdown

Hello, is there a way to install a preview version of this?

…osition

- Remove duplicate #[cfg(test)] attribute in tests/mod.rs
- Simplify get_available_models() filter (was always returning true)
- Fix ESLint no-unused-expressions in RecordingPill.tsx
- Add missing pill_indicator_mode/position to test mock
- Revert pill edge_offset from 60.0 to original 10.0
- Update unit test expected values for edge_offset change
@moinulmoin
Copy link
Copy Markdown
Owner

Hello, is there a way to install a preview version of this?

sorry, atm no

The previous approach tried to drop cpal::Stream in a separate thread,
but cpal::Stream is not Send (contains Box<dyn FnMut()> callback).

New approach:
- Pause stream first (stops audio capture immediately)
- On Windows: use mem::forget to prevent potential driver hang
  (some USB/wireless devices like Astro A50 hang indefinitely during drop)
- On macOS/Linux: normal drop() which is reliable

Resources are reclaimed by OS when process exits on Windows.
This prevents app freeze while maintaining proper cleanup on macOS.
Reverts the ring-1 ring-white/30 class that was added to the pill,
restoring the original clean black pill appearance without border.
…window shadow

- Add ring-1 ring-white/30 to RecordingPill for subtle border definition
- Add matching ring styling to FeedbackToast for visual consistency
- Add .shadow(false) to toast window to prevent macOS window outline
Replace 3 positions (top/center/bottom) with 6 positions:
- top-left, top-center, top-right
- bottom-left, bottom-center, bottom-right

Changes:
- Update PillIndicatorPosition type with 6 options
- Update calculate_pill_position() with horizontal + vertical logic
- Update GeneralSettings dropdown with 6 options
- Default: bottom-center (maintains expected behavior)
- Add 7 unit tests for all positions + fallback
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants