voxa_rtc_engine 0.6.4 copy "voxa_rtc_engine: ^0.6.4" to clipboard
voxa_rtc_engine: ^0.6.4 copied to clipboard

Drop-in Agora-compatible RTC SDK for Flutter on your own servers: same classes, signatures, error codes and callback order as agora_rtc_engine 6.x.

0.6.4 #

Fixes a broadcast coming back from a network drop with no audio or video.

Once the network returned the session was live again but carrying nothing: the host saw a frozen picture, the audience saw black, and it stayed that way until the host happened to toggle a control. Reported as "the video goes black after a while", and it needed no more than a tunnel, a lift, or a few seconds of bad signal.

Audio and video now come back on their own, about a second after the network does, with nothing left over from the interrupted session.

onRejoinChannelSuccess now arrives whenever a session recovers. It could previously be missed altogether, which left an app with no way to tell a live call from a dead one. onConnectionStateChanged reports reconnecting while a reconnect is under way.

Expect a brief camera restart as the picture returns.

Verified on a handset against a live service, not only in tests.

0.6.3 #

Fixes a dropped connection ending the call for good.

When the network went away for longer than about a minute — a tunnel, a lift, a handover between cells — the session ended and never came back. Nothing restored it, so an app that had not written its own reconnect handling was left showing a call that looked live and carried no audio or video, with no event to tell it otherwise.

The engine now keeps trying to restore the channel for twenty minutes, with backoff between attempts, matching how long Agora persists. Recovery arrives as onRejoinChannelSuccess, and onConnectionStateChanged reports reconnecting while it works — so an app that displays connection state gets one to display, and an app that displays none simply keeps working.

Retrying stops at once when the app leaves the channel or releases the engine, and is not attempted when a moderator removed the user: that is a decision rather than a fault, and it still reports banned-by-server exactly as before.

A long session now recovers even when it has run past the lifetime of the token it started with.

Participants who left while the connection was down are reported with onUserOffline on recovery, rather than remaining in the app's list indefinitely.

0.6.2 #

Documentation only, no code change.

The changelog and the exported doc comments explained how the package works inside rather than what it does — the media stack it sits on, the shape of its internals, and in places the reasoning behind a dependency constraint. None of that is useful to an app depending on this package, and all of it was public. Rewritten to describe behaviour: what changed, what to expect, and where the package deliberately differs from Agora.

Nothing was removed that an integrator needs. The deliberate deviations, the error codes, the platform notes and the breaking-change entries are all still here, and the wording of every fix still names the symptom you would have hit.

The iOS/macOS podspec version had been left at 0.5.1 through three releases, and is back in step.

0.6.1 #

Fixes publish options being ignored when an app previews before joining.

enableDualStreamMode (simulcast) and VoxaRtc.adaptiveStream were applied at joinChannel, but both take effect earlier than that — and startPreview happens earlier still. So on the ordinary "go live" flow, where a preview runs before joining, both settings were silently dropped.

Any app calling enableDualStreamMode or setting VoxaRtc.adaptiveStream before joinChannel was not getting what it asked for. Both now apply whatever order they are called in.

0.6.0 #

Data streams. createDataStream, sendStreamMessage, onStreamMessage and the RtcEngineEx forms. ordered: true is reliable delivery, false is lossy.

Behaviour follows a transcript recorded from real Agora 6.6.3 rather than a reading of the docs, which was wrong twice: createDataStream succeeds before joining (and that id counts against the five-stream limit), and a send after leaveChannel reports −2 for an unknown id rather than −3 for no channel. Sending as an audience member is −9, which nobody had considered.

Deliberate differences, all documented: syncWithAudio is accepted and ignored, sentTs is always 0, and Agora's 1 KB / 30 KB-s caps are not enforced. Stream ids are plain 1…5 rather than Agora's ordered ? n | 0xC000 : n — the id is opaque in the API contract, and reproducing a bit pattern inferred from five samples would be guessing at a format.

Verified device to device: 40 of 40 messages delivered, the ordered stream complete and in sequence.

Audio profile and scenario. setAudioProfile and setAudioScenario. Max bitrate maps exactly to Agora's documented numbers and is device-verified — a speech profile measures 17–19 kbps and high-quality stereo 127–130, against Agora's 18 and 128. Sample rate and channel count are left to the codec rather than faked. Scenario maps onto DTX, with the music-first scenarios forcing it off even on a speech profile, because silence gating damages music.

Set it before joining — the documented usage — and it matches Agora exactly. A change made mid-session applies from the next publish.

Signal volume. adjustRecordingSignalVolume and adjustPlaybackSignalVolume, on Agora's 0–400 scale, clamping out of range as the native SDK does. Measured on two devices: a gain of 0 genuinely silences the far end, 400 raises it, 100 restores the baseline.

Audio statistics. onLocalAudioStats and onRemoteAudioStats, on Agora's 2s cadence. Bitrate, sample rate, channels, packet loss and jitter-buffer delay are real measurements. Fields nothing on the device actually measures — MOS, ear-monitor and AEC delays, freeze totals — stay null rather than being invented, so null means nothing measured it.

Bandwidth. Video layers nobody is watching are no longer encoded or sent, returning uplink bandwidth and encoder CPU to the sending device.

VoxaRtc.adaptiveStream is new and off by default. It picks each remote's video quality from how large it is on screen — which is the decision Agora hands to the app through setRemoteVideoStreamType, so enabling it globally would silently override an API apps rely on. Turn it on if your app does not call that; a grid of small tiles is where it pays.

Dependency. flutter_webrtc is now declared directly at ^1.6.0. It was already present transitively, so nothing about what resolves changes.

Breaking, for anyone implementing VoxaTransport (exported from voxa.dart): audioStats, setAdaptiveStream, setAudioEncoding, setLocalAudioGainsetRemoteAudioGain changed. Apps using the Agora surface are unaffected — this only touches custom transports, realistically test doubles.

0.5.2 #

  • switchCamera() now works on a pre-join preview. It previously threw on a camera that had never been published, and because apps reasonably wrap that call in a catch-and-ignore, the button silently did nothing on a "go live" screen.

0.5.1 #

  • Docs and metadata now point at voxartc.com; the old zamansheikh.com hostnames are gone.

0.5.0 #

  • Camera effects. enableExtension and setExtensionProperty now drive real camera filters, matching Agora's extension API. An app already using those calls to run a beauty or AR filter needs no code changes.

    The effect is applied to the published stream, not painted over the local preview — what the streamer sees is what the room receives.

    Effect SDKs plug in natively and register themselves:

    • Android — implement io.voxa.voxa_rtc_engine.VoxaVideoFilter and register with VoxaVideoFilter.Registry.register(filter, provider, extension).
    • iOS / macOS — conform to VoxaVideoFilter and register with +[VoxaVideoFilters registerFilter:provider:extension:].

    VoxaVideoFilter.sharedEglContext() (Android) hands a filter the EGL context the camera and hardware encoder already share. Render into that context to keep output on the GPU; rendering into your own costs a round trip through system memory on every frame.

    Enabling a name nothing registered fails loudly rather than silently doing nothing — an app that thinks its filter is running is the worst outcome.

    For DeepAR specifically, see the voxa_deepar package: it carries the whole native integration, so an app adds a dependency and writes no platform code.

0.4.0 #

  • Face detection. enableFaceDetection(true) now works, reporting through onFacePositionChanged(imageWidth, imageHeight, vecRectangle, vecDistance, numFaces) several times a second — including when no face is present, which is what most callers are actually watching for. An app that already uses Agora's needs no code changes.

    It runs on the device and never touches the network, and the published video is identical whether detection is on or off. ML Kit does the detection on Android, the system Vision framework on iOS/macOS.

    Two things worth knowing. The Android model is bundled rather than fetched from Play services — the fetched variant fails until Play services has downloaded the face module and never works without Play services at all, which is not how Agora's behaves; the cost is about 16 MB of APK, paid by every app whether or not it calls this. And vecDistance is an estimate derived from how wide the face lands in the frame, as Agora's is: good for "closer or further", not a measurement.

    Verified on macOS and on an Android device, attach through to callback.

0.3.4 #

  • Documentation only. 0.3.3 shipped with a README still telling readers to depend on 0.3.0, and the podspec had been left at 0.2.8 through three releases. Version references are now part of the release rather than an afterthought.

0.3.3 #

  • Fixed: video did not fill its widget. AgoraVideoView letterboxed the stream inside black bars instead of filling the space, so a migrated app's preview and seat tiles looked wrong at any aspect ratio that did not match the camera. Agora's VideoCanvas.renderMode defaults to renderModeHidden — scale to fill, crop the overflow — and the setting was not being applied. renderMode now works: renderModeHidden and renderModeAdaptive fill and crop, renderModeFit letterboxes.

0.3.2 #

  • Fixed: on Android, audio mixing reached nobody in apps that run a foreground service — the music played on the host's own device while the room heard silence. Apps with a single engine always worked, which is why 0.3.0 and 0.3.1 claimed Android support that did not hold in practice. Apps that keep the microphone alive in a background service are the case that failed, and they now work.

  • Diagnostics for the same area: failures in this path now log a cause worth reading rather than a generic error.

0.3.1 #

  • Fixed: on Android the room could not hear the mixed music — it played on the host's own device only. Starting music very early in the call's life could miss the audio path entirely, leaving the music local with no indication anything was wrong. It now waits for the path to be ready, and logs the real reason if it never is.

0.3.0 #

  • Audio mixing — play music into a call, as Agora does. startAudioMixing and the rest of the family now work on Android, iOS and macOS: the file is mixed into the outgoing microphone audio, so remote participants hear it as part of the publisher's audio rather than as a separate track. Local playout, volume (combined, playout-only and publish-only), duration, position, seek, looping, and onAudioMixingStateChanged / onAudioMixingFinished are all supported.

    Verified from the receiving side on both platforms, not just locally: with loopback: false the remote audio level rises far above the mic-only baseline, and with loopback: true — same file, same volume — it returns to zero.

    setAudioMixingPitch, setAudioMixingPlaybackSpeed and setAudioMixingDualMonoMode remain unimplemented and throw AgoraRtcException(-4).

  • The audio-mixing callbacks now fire whether or not you are in a channel, as Agora's do. Starting music before joining previously reported nothing.

  • iOS and macOS now ship native code (a Swift Package, with a podspec for apps still on CocoaPods). Nothing to configure: no new permissions beyond the microphone usage description Agora already required.

0.2.8 #

  • Documentation only, no code change: the README now points at https://voxartc.com/docs/. The production-readiness note reflects that the implemented surface is carrying real traffic, and the wakelock_plus section explains why win32 must not be pinned directly.

0.2.7 #

  • Packaging polish only, no behavior change: shorter package description, a reachable homepage, pristine MIT LICENSE (the third-party attribution moved to THIRD_PARTY_LICENSES, where it no longer breaks license detection), dart format applied, and doc-comment lint headers on the files derived from agora_rtc_engine.

0.2.6 #

  • Fixed: after switchCamera, the view kept showing the previous camera until the widget was recreated (for example by leaving and re-entering the screen). A flip now updates the view immediately.

0.2.5 #

  • Fixed: onAudioVolumeIndication reported volumes far too low, so speaking indicators and mic-wave UIs never lit up. Ordinary speech landed near 8 on Agora's 0–255 scale, while apps typically treat "> 30" as speaking and Agora itself reports ~100–200. Speech now lands in Agora's usual range, and silence at 0.
  • Fixed: switchCamera did nothing on a pre-join preview. Flipping the camera on a "go live" screen was a silent no-op. It now works there, and never flips a screen share.

0.2.4 #

  • Fixed: apps whose token server mints legacy 006 tokens could not connect (404 page not found, errJoinChannelRejected). Whether to exchange the token at the Compat Gateway was decided from the token's own format, so 006 tokens took the wrong path. It now keys on the configured server URL — http(s):// is a gateway, ws(s):// is a media server reached directly — which is token-format agnostic.

0.2.3 #

  • Fixed: AgoraVideoView could stay black forever. Views built before joinChannel — preview tiles, seat widgets — never learned their track had arrived, so apps that cache their VideoViewControllers (the documented Agora pattern) stayed on the black placeholder. Views built at any point now pick up their track, and refresh on remote track subscribe and participant join/leave.

0.2.2 #

  • Android module is Java-only with no Kotlin plugin on the Gradle classpath. 0.2.1 pinned a kotlin-gradle-plugin version, which overrode the host app's Kotlin version and broke other plugins (for example wakelock_plus) at compile time.

0.2.1 #

  • Fixed: camera/mic permission dialogs never appeared on Android. The package now ships an Android module whose manifest declares the RTC permissions (CAMERA, RECORD_AUDIO, MODIFY_AUDIO_SETTINGS, INTERNET, ACCESS_NETWORK_STATE, Bluetooth), mirroring what agora_rtc_engine contributes. Apps migrating from Agora often relied on that manifest merge and had no CAMERA entry of their own; Android denies undeclared permissions silently, so no dialog was shown. Deliberately not declared: READ_PHONE_STATE and ACCESS_WIFI_STATE (Agora declares both; neither is needed here, and READ_PHONE_STATE requires a Play Store declaration form).

0.2.0 #

  • updateChannelMediaOptions — change role and publish state mid-session (the modern 6.x alternative to setClientRole). Behavior golden-recorded from the live Agora service: a role change fires onClientRoleChanged; publish-flag-only updates are silent.
  • muteAllRemoteAudioStreams / muteAllRemoteVideoStreams — apply to current participants and to peers who join later.
  • autoSubscribeAudio / autoSubscribeVideo in ChannelMediaOptions now drive remote subscriptions.
  • Behavioral parity: 8/8 golden transcript scenarios.

0.1.1 #

  • Rewrote the package README for pub.dev: migration guide, quickstart, implemented-surface overview, platform matrix, backend requirements.
  • Clarified the package description.

0.1.0 #

Initial development release.

  • Complete agora_rtc_engine 6.6.3 public API surface (import-only migration).
  • Tier-1 + Tier-2 implemented: channel lifecycle, mute/roles/camera/routing, rendering, reconnection, token lifecycle, volume indication, encoder configuration, dual-stream, screen share, pre-join preview, in-call stats.
  • Behavioral parity verified against recordings from production Agora (7/7 golden transcript scenarios).
  • Unsupported APIs fail gracefully with AgoraRtcException(-4).
3
likes
160
points
1.03k
downloads

Documentation

API reference

Publisher

verified publishervoxartc.com

Weekly Downloads

Drop-in Agora-compatible RTC SDK for Flutter on your own servers: same classes, signatures, error codes and callback order as agora_rtc_engine 6.x.

Homepage

License

MIT (license)

Dependencies

async, flutter, flutter_webrtc, http, json_annotation, livekit_client, meta

More

Packages that depend on voxa_rtc_engine

Packages that implement voxa_rtc_engine