Changelog

Release notes and version history for the Kallo SDK.

Stable releases

v0.1.19

LatestAndroidiOS
  • •Call setup fix: the SDK now binds a system-assigned local port for SIP instead of a fixed one, so starting a call no longer fails with "Address already in use" — most visibly for apps that set up the SDK once per call, or when another app on the device is already using the standard SIP port. Device-confirmed on Android (3CX).
  • •New optional KalloConfig.localPort for apps that need a fixed local port (e.g. a PBX configured to send incoming calls to a fixed address:port rather than to the registered contact). If that port is already taken, setup now reports a clear port-in-use error instead of a generic failure.
  • •Adds always-on audio diagnostics (negotiated codec, audio stream parameters, active route, playback underrun counts) to make call-audio issues diagnosable from a log.
  • •Supersedes 0.1.18 as the default download. No breaking API changes — existing code keeps working unchanged.
  • •Note: this release does NOT resolve the Android Bluetooth audio-quality report. Calls still negotiate narrowband G.711, and the audio tuning options added in 0.1.19-dev.1 remain off by default, so audio is unchanged from 0.1.18. That investigation is ongoing.

v0.1.18

AndroidiOS
  • •Outbound caller name: the caller display name is now sent in the call, so the person you call sees your name (e.g. "Full Name (client id)") instead of just the extension number. Device-confirmed on Android and iOS (3CX).
  • •Includes the 0.1.17 Android audio-routing fix (earpiece/speaker while a Bluetooth headset is connected).
  • •Supersedes 0.1.17 as the default download. No breaking API changes — fully backward-compatible.

v0.1.17

AndroidiOS
  • •Android fix: selecting Earpiece or Speaker during a call while a Bluetooth headset is connected now moves the audible audio to the receiver/loudspeaker — previously the indicator changed but sound stayed in the buds. Switching back to Bluetooth still works. Device-verified on Android 16.
  • •iOS is unchanged (same binary as 0.1.16); this release only fixes Android audio routing.
  • •Supersedes 0.1.16 as the default download. No breaking API changes — fully backward-compatible.

v0.1.16

AndroidiOS
  • •Adds audio output device selection (Android + iOS): list, select, and observe the live call audio route — earpiece, speakerphone, wired headset, and Bluetooth — with route-change events. The existing setSpeaker(bool) toggle keeps working and now maps onto the new API.
  • •One package for both platforms — add it as a single dependency; Flutter builds the right half per target.
  • •Supersedes 0.1.14 as the default download. No breaking API changes — fully backward-compatible.

v0.1.14

AndroidiOS
  • •First dual-platform release — one package for Android and iOS. Add it as a single dependency; Flutter builds the right half per target.
  • •Android: the production-confirmed 0.1.13 incoming-audio (downlink) fix.
  • •iOS: first iOS release (native AudioUnit audio backend) — registration, two-way audio, and DTMF confirmed on a physical iPhone. iOS apps only need NSMicrophoneUsageDescription in Info.plist; the SDK requests the mic at call time (do not pre-request it in the host app).

v0.1.13

Android
  • •Fixes incoming-call audio (downlink) being silent or stalled from the start of the call on affected setups (notably some 3CX deployments) — incoming audio now plays from call start, and keeps working through DTMF and hold/resume.
  • •Root cause was an internal receive-audio buffer being initialised with a corrupted threshold, so it filled up but never started playing; that is now fixed.
  • •Confirmed on-device. Recommended upgrade for everyone — supersedes 0.1.11 as the default download. No public API changes; fully backward-compatible.

Dev / test builds

Latest first — scroll for older builds

These builds are under active development — for testing & feedback only. They may be unstable; please report any issues you run into.

  • v0.1.20-dev.2

    dev / testingAndroidiOS
    • •Test build — for testing & feedback, NOT for production use. Includes everything in 0.1.20-dev.1 (license app-identity binding).
    • •SIP account details are no longer printed in plain text in the logs: the SIP username and authentication username are masked (e.g. "10***(4)"), on both Android and iOS. Passwords and license keys were never logged.
    • •dispose() after the other side hangs up now finishes immediately, instead of taking up to several seconds. A new log line reports how long dispose took.
    • •Please test: start → dispose → start again, and dispose right after a remote hang-up, on each platform you use.
    • •Some library log lines still show the SIP account address (user@host) during registration and call setup; these will be masked in a later build.
  • v0.1.20-dev.1

    dev / testingAndroidiOS
    • •Test build for license app-identity binding — for testing & feedback, NOT for production use.
    • •The license check now also reports which app is using the key: the package name and signing certificate on Android, and the bundle identifier on iOS. This lets a license key be tied to the app it was issued for, so a key copied out of your app stops working in someone else's.
    • •Nothing changes for your app today: binding is switched off for every license until it is enabled together with you. Calling, registration and audio are unchanged from 0.1.19.
    • •If the app identity cannot be read for any reason, the license check simply continues as before — it never causes init() to fail.
    • •iOS binding is weaker than Android: iOS offers no way for an app to read its own signing certificate at runtime, so only the bundle identifier is checked.
  • v0.1.19-dev.1

    dev / testingAndroidiOS
    • •Diagnostic build for the Android Bluetooth call-quality report — for testing & feedback, NOT for production use.
    • •Call setup fix: the SDK now binds a system-assigned local SIP port instead of a fixed one, so starting a call no longer fails with "Address already in use" when a previous session or another app still holds the port. Apps that need a fixed port can set the new KalloConfig.localPort; if that port is taken, init() now reports a clear port-in-use error instead of a generic failure.
    • •Adds always-on audio diagnostics (negotiated codec, audio stream parameters, active route, and playback underrun counts) so a call log shows exactly what the audio path is doing.
    • •Adds three switchable audio settings for A/B testing on Bluetooth. All of them default to the existing 0.1.18 behaviour, so this build sounds identical until a setting is changed.
    • •Please follow the six-pass test plan in docs/bluetooth-audio-debug.md, starting with pass 1 (all settings off) to capture the baseline — the later passes are meaningless without it. Capture the log lines listed there for each pass.
  • v0.1.18-dev.1

    dev / testingAndroidiOS
    • •Test build of the outbound caller-name fix (Android + iOS) — for testing & feedback, NOT for production use.
    • •The caller display name is now sent in the outgoing call so the person you call sees your name (e.g. "Full Name (client id)") instead of just the extension number. Previously the name was dropped and only the extension showed.
    • •Please place an outbound call with a display name set and confirm the callee handset shows the name; if you can, capture a SIP trace and check the From header carries the quoted display name.
  • v0.1.15-dev.4

    dev / testingAndroidiOS
    • •Test build of audio output device selection (Android + iOS) — for testing & feedback, NOT for production use.
    • •Android: the current-output change stream now emits when the OS auto-routes a new call to a connected Bluetooth headset (previously only the polled list reflected it), and selecting the earpiece while Bluetooth is connected now moves audio to the receiver instead of doing nothing.
    • •iOS: a connected Bluetooth headset now stays listed after switching to the earpiece, so Bluetooth → Earpiece → Bluetooth works (previously Bluetooth disappeared from the list once the earpiece was selected).
    • •Please re-test on a physical Android phone and iPhone with a Bluetooth headset connected: (1) the current-route indicator updates to Bluetooth on its own at call start, (2) tapping Earpiece moves audio to the receiver, and (3) you can switch back to the Bluetooth headset afterward.
  • v0.1.15-dev.3

    dev / testingAndroidiOS
    • •Test build of audio output device selection (Android + iOS) — for testing & feedback, NOT for production use.
    • •Android: the reported current output now self-corrects to a connected Bluetooth device at call start. Previously it briefly showed the earpiece as current (a display-only issue) until the route settled; the SDK now re-reads and re-emits the real route once the OS finishes auto-routing, no manual selection needed.
    • •iOS: selecting the earpiece now forces the built-in receiver even while a Bluetooth headset (e.g. AirPods) is connected, instead of being a no-op. Re-selecting Bluetooth returns audio to the headset.
    • •Please re-test, with a Bluetooth headset connected on a physical Android phone and iPhone: (1) the current-route indicator shows Bluetooth from call start, and (2) tapping Earpiece moves audio to the receiver.
  • v0.1.15-dev.2

    dev / testingAndroidiOS
    • •Test build of audio output device selection (Android + iOS) — for testing & feedback, NOT for production use.
    • •Fixes current-route accuracy: the SDK now reports the actual active output from call start (including when the OS auto-routes to a connected Bluetooth device) and re-syncs to the real route on every new call instead of carrying over the previous selection.
    • •iOS: selecting the earpiece now works even while a Bluetooth device is connected. Please re-test route switching and the current-route indicator on a physical Android phone and iPhone with a Bluetooth headset connected.
  • v0.1.15-dev.1

    dev / testingAndroidiOS
    • •Test build of audio output device selection (Android + iOS) — for testing & feedback, NOT for production use.
    • •Adds an API to list, select, and observe the call audio output — earpiece, speakerphone, wired headset, and Bluetooth — with live device/route-change events. The existing speaker toggle keeps working.
    • •Please test on a physical Android phone and iPhone with a Bluetooth headset and a wired headset connected, and confirm each route works by ear. (On iOS, choosing between multiple Bluetooth devices uses the system route picker.)
  • v0.1.14-dev.2

    dev / testingAndroidiOS
    • •Combined Android + iOS test build — one package for both platforms, for testing & feedback, NOT for production use.
    • •Android: the production-confirmed 0.1.13 build (the incoming-audio fix). iOS: integrates, builds, and connects (registration + call setup/teardown); two-way audio is not yet confirmed on a physical iPhone.
    • •Add it as a single dependency — Flutter builds the right half per target. Please run it on a physical iPhone against your SIP/PBX and share the audio result.
  • v0.1.14-dev.1

    dev / testingiOS
    • •First iOS (Apple / iPhone) test build — for testing & feedback, NOT for production use.
    • •Brings iOS up to the Android line: native iOS audio backend (AudioUnit) + Opus, DTMF, hold/resume, and the incoming-audio (downlink) fixes that shipped through 0.1.13.
    • •iOS only for now — please run it on an iPhone against your SIP/PBX and share the result. The Android build of this version ships with the stable 0.1.14 release.
  • v0.1.13-dev.2

    dev / testingAndroid
    • •Test build of the incoming-audio (downlink) silence fix — for testing & feedback, NOT for production use.
    • •Fixes the remaining silent-incoming-audio on affected devices (e.g. some 3CX setups): the receive audio buffer was being initialised with a corrupted internal threshold, so it filled up but never started playing. Incoming audio now plays from call start.
    • •Still includes the `aubuf: GATE` diagnostic logging so you can confirm the fix on-device — please run it on an affected device and share the logs (look for incoming audio working throughout the call, including after hold/resume).
  • v0.1.13-dev.1

    dev / testingAndroid
    • •Diagnostics / test build — for testing & feedback, NOT for production use.
    • •Adds the `aubuf: GATE` downlink-silence instrumentation: extra logging around the receive audio buffer to help pin down the remaining incoming-audio silence on affected devices.
    • •No behavior change to calling versus 0.1.11 — this build only adds diagnostic logging. Please run it on an affected device and share the logs.