Repository navigation
feat(dart): add idiomatic voice runtime interfaces - #50
Merged
harshsaver merged 1 commit intoSep 25, 2026
Merged
harshsaver merged 1 commit into
harshsaver merged 1 commit into
Conversation
This was referenced Sep 25, 2026
Member
|
Thanks @Pushkraj-Space. The typed models map 1:1 to Optional nits (fine as follow-ups):
Merging; please rebase #51 afterwards. |
nikhilcrypto0
added a commit
to nikhilcrypto0/murmur
that referenced
this pull request
Sep 25, 2026
Rewrite the lifecycle around VoiceConnector/VoiceSession from october-dev#50: connect returns an idle session, stop and close share one terminal cleanup, and muting and finalization belong to the capture coordinator. Use snake_case error codes, describe backpressure as the bounded frames contract, and replace the TypeScript example with a tested Dart SyntheticToneConnector.
harshsaver
pushed a commit
that referenced
this pull request
Sep 30, 2026
* docs(connectors): complete the voice connector authoring guide Adds docs/connector-authoring.md, covering connector ownership, the manifest, lifecycle and capability behavior, discovery and permissions, audio format and framing, timestamps, backpressure, interruption and cleanup, errors, automated/conformance/physical validation, and a protocol provenance and license checklist. connectors/examples/synthetic-tone is a minimal example connector at the murmur.v1 message level. It takes SessionControl and emits VoiceSource, AudioFrame and RuntimeEvent via the TypeScript SDK models, with pull-based frames, sample-derived timestamps, idempotent stop/disconnect and stable error codes. Its tests run under make check-typescript and round-trip every emitted message through the SDK parser. check_conformance.py now validates every connectors/**/connector.json, not only Omi's. A connector proposal issue form and links from CONTRIBUTING, the README and connectors/README.md complete the checklist. Closes #35 * docs: align connector guide with the Dart runtime interfaces Rewrite the lifecycle around VoiceConnector/VoiceSession from #50: connect returns an idle session, stop and close share one terminal cleanup, and muting and finalization belong to the capture coordinator. Use snake_case error codes, describe backpressure as the bounded frames contract, and replace the TypeScript example with a tested Dart SyntheticToneConnector. * fix: deliver example session states asynchronously A stateChanges listener that called stop() ran inside the synchronous transition, so the nested add threw before cleanup started and the frame clock leaked. Deliver state changes asynchronously, as the VoiceSession contract allows, and test stop() from a listener on starting and listening.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Issue #34 needs one idiomatic Dart runtime surface that wearables, phone microphones, headsets, fixtures, and future connectors can implement without coupling host code to Flutter, hardware, providers, storage, or generated protobuf classes.
This change:
SessionControlbody and audio-format map with typedmurmur.v1modelsopen: false,frameDurationMs: 0, and empty command objectsVoiceConnectorandVoiceSessioninterfaces plusSessionStateand typedVoiceErrorWire compatibility
AudioEncoding,AudioFormat, andCaptureModemap directly to the existingmurmur.v1schema.StartSession,StopSession,SetInputGate, andFinalizeSessionmodel the four existing control oneof variants, with nullable fields representing absence.AudioFrame.payloadBase64remains verbatim, while its format is now validated and typed. Session-scoped sequence and producing-host monotonic timestamp semantics are documented on the model.This PR does not change protobuf definitions, shared fixtures,
events.dart,source.dart, or other language SDKs.Runtime lifecycle
connectreturns an idle session and capture begins only throughstartstop/closecalls share one cleanup futureVoiceError(code: "cancelled")Validation
make check-dart— format, analyzer, shared conformance tests, and 19 total Dart tests passmake check-flutter— analyzer and both Omi application tests passgit diff --checkCloses #34