Ray-Ban Meta: a failed audio start is swallowed and capture shows recording with no audio

Closed Beginner friendly
#20,782 1 comment 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

@Git-on-my-level is already working on this.

Since Oct 24, 2026.

  • #20819 by @Aj2280 — open
  • #23386 by @ocakciomursel-pixel — closed without merging
  • #23459 by @Git-on-my-level — open
  • #23510 by @Dimank92 — open
  • #23688 by @hardik4love-lang — open

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
84/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
dart

Research direction

Start at app/lib/services/devices/connectors/rayban_meta_connection.dart (performGetBleAudioBytesListener, ~L71-89): today it swallows the startAudioCapture() failure and returns a subscription anyway. Read the transport's rethrow at rayban_meta_transport.dart:265-272, then how capture_controller.dart:1927 treats a non-null subscription as ready. Make the failed start fail the attach, and add Ray-Ban to isCaptureSourceInScope in app/lib/services/capture/capture_wedge_monitor.dart:145. Done when the integration test from the issue reports callerError non-null (or a null subscription) instead of subscriptionReturned=true with zero frames.

Written by the indexing model from the issue text.

Description

bug capture flutter p1

TL;DR: When capture attaches to Ray-Ban Meta glasses, the connector creates the audio subscription, then starts the native HFP capture inside a try/catch that only logs. If the start fails (the selected microphone disappeared, the audio session is busy), the caller still gets a subscription, capture enters device recording ("Listening"), and no audio ever arrives. The wedge monitor ignores Ray-Ban, so nothing recovers it. Reproduced on the iOS Simulator with the real RayBanMetaDeviceConnection.

Product impact (see PRODUCT.md and ISSUE_TRIAGE_GUIDE.MD)

  • Primary loop layer: Capture
  • Involves data loss, failed capture, or broken sync/trust. Failed capture that looks like it is working: the user thinks Omi is listening and nothing is recorded.

Describe the bug

The transport rethrows correctly; the connector is where the error is lost.

To Reproduce

  1. Connect Ray-Ban Meta glasses.
  2. Start capture while the native audio start fails (for example the selected audio-only mic is no longer available).
  3. Home shows the glasses recording; no transcript and no audio arrive.

Current behavior

The listener call returns a subscription and does not throw; zero frames; no error reaches the caller.

Expected behavior

A failed start fails the attach (throw or return null) so capture shows an error and can retry, and Ray-Ban sources are covered by the wedge monitor.

Screenshots

No screenshot. Evidence below.

user ID (can we access the user info to validate the bug?):

Not needed: found in the code and reproduced without a user account (local fixture backend).

Smartphone + device (please complete the following information):

  • Device: iOS Simulator, iPhone 16 (reproduction); the bug is in shared code, so physical iPhones are affected too
  • OS: iOS 18.0 (Simulator)
  • App Version: main at cf8201c2f5 (dev flavor)
  • Device version: Ray-Ban Meta

Additional context

Root cause. RayBanMetaDeviceConnection.performGetBleAudioBytesListener listens first, then try { await _metaTransport.startAudioCapture(); } catch (e) { Logger.debug(...) } and returns the subscription. The transport rethrows. Capture treats a non-null subscription as ready (capture_controller.dart:1927) and publishes device recording without requiring a frame (:2127). isCaptureSourceInScope only covers omi and friend_com.

Reproduction. Reproduced on the iOS Simulator (iPhone 16, iOS 18.0) with a temporary integration test on main at cf8201c2f5. The test drives the real production classes; only the platform boundary is faked (the RayBanMetaTransport: empty audio stream, startAudioCapture() throws PlatformException(hfp_start_failed)):

OMI_FACT:c15-rayban-start-failure-swallowed:startAudioCaptureCalls=1
OMI_FACT:c15-rayban-start-failure-swallowed:subscriptionReturned=true
OMI_FACT:c15-rayban-start-failure-swallowed:callerError=null
OMI_FACT:c15-rayban-start-failure-swallowed:framesReceived=0
OMI_FACT:c15-rayban-start-failure-swallowed:streamErrors=0
OMI_REPRO:c15-rayban-start-failure-swallowed:REPRODUCED
Dominant language
Python
Stars
13.9k
Forks
2.7k
Avg merge
6h 8m
Merged PRs (30d)
667

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from BasedHardware/omi

All issues in BasedHardware/omi

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.