Search Results for

    Show / Hide Table of Contents

    LiveSwitch 1.25 Release

    We're excited to announce LiveSwitch 1.25, featuring:

    • Comprehensive enhancements to audio-video synchronization that deliver reliable lipsync across all major browsers and network conditions
    • Enhancements to bandwidth adaptation through implementation of Transport Wide Congestion Control Feedback for web-based upstream video connections
    • Enhanced media quality with Android video display fixes, improved audio processing, and Quality Limitation Stats for real-time performance monitoring
    • .NET MAUI 9.0 upgrade with Android 15 compliance and Unity 6000.1.8f1 support
    • Significantly improved connection diagnostics with detailed telemetry and structured logging

    What's New in Audio-Video Synchronization

    Enhanced Browser Interoperability

    LiveSwitch 1.25 significantly improves interoperability with browsers by providing all necessary synchronization information in the SDP through msid-semantic attributes and MediaStream identification. When media is sent from a browser or received on a browser (or both), browsers can now properly synchronize audio and video tracks for each participant on downstream connections, ensuring consistent lipsync for received media. This functionality is fully cross-compatible with native (non-browser) client SDKs, allowing seamless synchronization between web and native endpoints.

    Robust Local Media Synchronization

    Local audio and video are now generated in a way that ensures they remain synchronized using proper RTP timestamp management, even when tracks are muted and subsequently unmuted. This means:

    • Lipsync preserved during muting and unmuting – Audio and video stay in sync regardless of mute state transitions
    • Privacy-conscious video muting – Camera indicator lights turn off when video is muted, assuring users their camera is truly disabled
    • Bandwidth optimization – No video packets are sent when muted (not even black frame deltas), freeing bandwidth for adaptive bitrate algorithms
    • Near-instantaneous unmuting – Only camera reacquisition time is required; no additional negotiation needed

    Smart Microphone Handling

    The microphone remains active even when muted, with empty audio packets sent to maintain the RTP stream. This enables support for the "muted alert" functionality where applications can notify users when they attempt to speak while muted.

    Improved Device Switching

    Lip synchronization is particularly enhanced when switching video input devices (e.g., flipping from front to back camera), maintaining sync throughout the transition—a known challenge in WebRTC implementations.

    Reliable Performance in Challenging Conditions

    Lipsync remains stable even during poor network conditions, ensuring consistent user experience across varying connection quality.

    API Changes

    Simplified Local Media Acquisition

    In version 1.25.0, local media acquisition has been streamlined:

    • Supported: Acquiring local media using boolean flags for audio and video
    • Deprecated: Multiple local media objects for the same participant are no longer supported or necessary for proper synchronization
    • Coming in 1.26.0: Support for providing individual audio/video tracks and WebRTC MediaStreams (useful for external blur implementations and advanced use cases)

    Technical Implementation

    SDP messages now utilize msid-semantic attributes for standard browser compatibility (see RFC 8830), along with proper RTCP CNAME management to establish a single synchronization context for all tracks from an endpoint (RFC 8834). The implementation also includes:

    • LS Group attributes for forward-compatible synchronization (can be disabled for on-premises server customers)
    • RTCP Sender Reports with NTP and RTP timestamp correlation, enabling receivers to synchronize playback using absolute time references

    Browser Compatibility

    All improvements are fully compatible with major browsers (Chrome, Firefox, Safari, and Edge), ensuring consistent behavior across platforms.

    Who Benefits?

    The lip synchronization improvements in version 1.25.0 are specifically designed for scenarios involving browser platforms:

    • Browser senders → Any receiver: Proper SDP signaling ensures downstream synchronization
    • Any sender → Browser receivers: Browsers can now correctly interpret synchronization information
    • Browser → Browser: Both sending and receiving benefit from complete end-to-end improvements
    • Mixed sessions: Any multiparty session with one or more browser participants will see enhanced lip sync

    Note: Native-to-native connections continue to work with existing reliable synchronization mechanisms.

    What's New in Bandwidth Adaptation

    Transport-Wide Congestion Control (Transport-CC)

    LiveSwitch 1.25 introduces support for Transport-Wide Congestion Control (Transport-CC) feedback for video streams on upstream connections for browser-based clients. This brings modern bandwidth estimation and adaptive bitrate control to browser-based WebRTC video publishing.

    Transport-CC provides superior congestion detection compared to legacy REMB (Receiver Estimated Maximum Bitrate) by:

    • Packet-level feedback – The media server reports arrival times for each RTP packet from browser publishers, enabling precise delay and loss detection
    • Faster adaptation – Feedback sent approximately every 50ms (vs. REMB's ~1 second intervals) allows rapid response to changing network conditions
    • Real-time congestion detection – Per-packet timing information reveals network congestion early, minimizing packet loss

    This feature can be managed via a new Deployment Config object to enable the feature, define an interval (recommended value is 50ms), and define a min client version.

    "transportCCConfig": {
      "sendTransportCCReportsEnabled": true,
      "sendTransportCCReportsIntervalMs": 50,
      "sendTransportCCReportsMinRemoteVersion": "1.25.0"
    }
    

    In the 1.26.0 release it will enable it for all web clients.

    Technical Implementation

    Transport-CC is negotiated automatically during SDP exchange for upstream publishing connections using the standard RTP header extension:

    • Extension URI: https://datatracker.ietf.org/doc/html/draft-holmer-rmcat-transport-wide-cc-extensions-01
    • Browser publishers add transport-wide sequence numbers to all outgoing RTP video packets
    • The media server sends RTCP Transport-CC feedback packets (RTPFB format 15) containing arrival time deltas back to the browser
    • The browser's native WebRTC implementation uses this timing data to calculate available bandwidth and adjust encoding bitrates accordingly

    Benefits for Web Publishers

    • Improved upload quality – More accurate bandwidth estimation reduces video freezes and quality drops for published video streams from browsers
    • Better network utilization – Proactive congestion avoidance maximizes usable bandwidth without overloading the upstream connection
    • Reduced latency – Faster detection and response to congestion keeps end-to-end latency low

    What's New in .NET MAUI 9.0 Support

    LiveSwitch 1.25 introduces .NET MAUI 9.0 support with important platform-specific configuration changes. The updates below ensure stability and compatibility on iOS and Android platforms.

    iOS: Disable Unstable SSA Optimization

    To prevent crashes in Release builds, disable the Mono interpreter's unstable SSA optimization by adding the following to your project file:

    <PropertyGroup Condition="'$(TargetFramework.Contains('-ios'))'">
      <MtouchExtraArgs>--setenv=MONO_INTERPRETER_OPTIONS=-ssa</MtouchExtraArgs>
    </PropertyGroup>
    

    This configuration avoids interpreter crashes linked to static single-assignment (SSA) optimization in .NET 9.0. For more details on this known issue, see the .NET Runtime issue #115991 and the recommended workaround.

    iOS: Enable Interpreter for Dynamic Code

    Some MAUI applications use dynamic features that require the interpreter in Release builds. Enable it explicitly with:

    <PropertyGroup Condition="'$(TargetFramework.Contains('-ios'))' and '$(Configuration)' == 'Release'">
      <UseInterpreter>true</UseInterpreter>
    </PropertyGroup>
    

    This setting ensures compatibility with dynamic code execution in MAUI applications. For more information on the interpreter and when to use it, see Microsoft's MAUI Interpreter documentation.

    Android: 16KB Page Size Compliance

    All MAUI native libraries now support Android's 16KB memory page size requirement:

    • No additional configuration needed – Support is built into LiveSwitch 1.25
    • Dependency updates required – Ensure all native dependencies are updated to .NET 9.0 versions
    • Compliance timeline – Required for Android 15+ by November 2025

    This update ensures your LiveSwitch applications remain compliant with Google Play Store requirements for Android 15 and later.

    What's New in Connection Diagnostics

    Comprehensive Connection Telemetry

    LiveSwitch 1.25 introduces significantly enhanced diagnostic logging that provides deeper visibility into connection establishment and performance. Each connection now generates structured diagnostic information in JSON format, enabling operations teams to quickly identify and resolve connectivity issues.

    Detailed Connection State Tracking

    The diagnostic system captures a complete timeline of connection lifecycle events, including:

    • State transitions – Precise timestamps and elapsed times for each connection state (New → Initializing → Connecting → Connected → Closing → Closed)
    • ICE connectivity events – Timing for remote candidate signaling, candidate pair selection, and active route establishment
    • DTLS handshake metrics – Connection and authentication timing for secure transport establishment
    • Incremental timing – Both cumulative and per-state timing measurements to identify bottlenecks

    Rich Performance Metrics

    Real-time performance data is captured throughout the connection lifecycle:

    • Round-trip time (RTT) statistics – Average, maximum, and sample counts for network latency assessment
    • Early data processing – Visibility into RTP and DTLS packets received during connection establishment
    • Remote peer information – Browser type, version, OS platform, and LiveSwitch SDK version for compatibility troubleshooting

    DTLS Connectivity Diagnostics

    Enhanced logging specifically targets DTLS-related connectivity failures, a common pain point in WebRTC implementations. The system captures handshake failures, certificate issues, and timing anomalies to accelerate troubleshooting of secure connection establishment problems.

    Browser-Reported Connection Quality

    When available, LiveSwitch 1.25 ingests and analyzes connection quality metrics reported by browsers, providing additional insight into the end-user experience from the client perspective.

    JSON-Formatted Output

    All diagnostic data is structured in JSON format for easy integration with logging systems, monitoring tools, and automated analysis pipelines. The consistent schema enables:

    • Automated alerting – Trigger notifications based on connection failure patterns or performance thresholds
    • Troubleshooting workflows – Quick identification of failure points in complex multi-party sessions

    Example Diagnostic Output

    {
      "connectionId": "7092f548f9444e02902e6c5d35c95793",
      "clientId": "043142298adf4acbaa2c8ef851975659",
      "iceTransportId": "7870b7db7d1446c9924f85735d19ff51",
      "dtlsTransportId": "5be2cd1de5754941a335094626469a4a",
      "sctpTransportId": "fa300da472f84ab5857247ab6fa7c25e",
      "diagnostics": [
        {
          "description": "Round Trip Time (ms)",
          "severity": "Info",
          "details": {
            "average": 152.5,
            "maximum": 153.0,
            "count": 2
          }
        },
        {
          "description": "Remote Peer Info",
          "severity": "Info",
          "details": {
            "platform": "Chrome",
            "platformVersion": "142.0.0.0",
            "platformOs": "Unknown",
            "lsSdkVersion": "1.24.5.7391",
            "osVersion": "N/A",
            "uaString": "LiveSwitch-1.24.5.7391_Chrome-142.0.0.0"
          }
        }
      ],
      "stateTransitions": [
        {
          "state": "New",
          "timestamp": "2025-11-05T22:06:05.173Z",
          "events": []
        },
        {
          "state": "Initializing",
          "timestamp": "2025-11-05T22:06:05.179Z",
          "totalElapsedTime": 7,
          "incrementalTime": 7,
          "events": [
            {
              "type": "SDP_Offer_Received",
              "timestamp": "2025-11-05T22:06:05.182Z",
              "totalElapsedTime": 10,
              "incrementalTime": 3
            },
            {
              "type": "SDP_Answer_Sent",
              "timestamp": "2025-11-05T22:06:05.183Z",
              "totalElapsedTime": 10
            }
          ]
        },
        {
          "state": "Connecting",
          "timestamp": "2025-11-05T22:06:05.183Z",
          "totalElapsedTime": 11,
          "incrementalTime": 1,
          "events": [
            {
              "type": "DTLS_Connecting",
              "timestamp": "2025-11-05T22:06:05.183Z",
              "totalElapsedTime": 11
            },
            {
              "type": "First_Remote_Candidate_Signaled",
              "timestamp": "2025-11-05T22:06:05.451Z",
              "totalElapsedTime": 279,
              "incrementalTime": 268
            },
            {
              "type": "Active_Candidate_Pair_Set",
              "timestamp": "2025-11-05T22:06:05.789Z",
              "totalElapsedTime": 616,
              "incrementalTime": 337
            },
            {
              "type": "DTLS_Connected",
              "timestamp": "2025-11-05T22:06:06.133Z",
              "totalElapsedTime": 961,
              "incrementalTime": 328
            }
          ]
        },
        {
          "state": "Connected",
          "timestamp": "2025-11-05T22:06:06.433Z",
          "totalElapsedTime": 1260,
          "incrementalTime": 299,
          "events": []
        }
      ]
    }
    

    Benefits

    • Faster issue resolution – Detailed connection timelines pinpoint exactly where failures or delays occur
    • Proactive monitoring – Identify degraded connection quality before it impacts user experience
    • Enhanced support – Rich diagnostic data enables support teams to resolve customer issues more efficiently
    • Network optimization – RTT and route information helps optimize infrastructure and CDN configurations

    Additional Quality Improvements

    This release includes numerous media quality enhancements across platforms:

    • Android video stability – Resolved display issues on Samsung Galaxy A9+ and other devices that showed green horizontal lines in camera feeds
    • Superior audio quality – Enabled high-quality anti-aliasing by default during audio resampling to eliminate high-frequency artifacts and tones
    • Audio processing controls – Added DisableZeroPadding configuration option to prevent audible clicks and pops when audio sources provide buffers with irregular timing
    • Real-time quality monitoring – Quality Limitation Stats now available in MediaTrackStats to help developers identify and resolve video performance bottlenecks
    • Improved SCTP reliability – Fixed race conditions in SCTP transport that could cause crashes during connection cleanup
    • Better browser compatibility – Fixed multiple browser detection bugs affecting Opera, Safari, and desktop OS detection

    Release Notes for LiveSwitch Server v1.25

    1.25.0.12169

    Release date: November 07, 2025

    Client SDK

    Breaking Changes
    • [LS1-2988] Removed the previously deprecated Connection.CanonicalName and Stream.CanonicalName properties. Use MediaStream.LocalCanonicalName instead.
    • [LS1-3251] [Web] When executing LocalMedia.changeAudioMediaStream() and LocalMedia.changeVideoMediaStream() the local input device is now always stopped when no longer in use.
    Improvements
    • [LS1-2814] The LiveSwitch SDK version has been added to the main screens of the examples.
    • [LS1-2853] [MAUI Android] [MAUI iOS] Updated MAUI to support .NET 9.0. Temporarily removed support for AECContext. Both platforms support echo cancellation through OS-level voice processing: iOS enables this by default, while Android requires setting AudioRecordSource.EnableEchoCancellation = true (default is false).
    • [LS1-3019] [Android] Made setAudioCommunicationDeviceType and setAudioCommunicationDeviceId methods public in Android SDK's AudioManagerUtility.
    • [LS1-3031] [Web] Upgraded Web Example to .NET 4.8.1.
    • [LS1-3047] [Android] [iOS] [macOS] Users can now use alphanumeric channelId in iOS, Android, and macOS examples.
    • [LS1-3132] [Android] [iOS] [macOS] [.Net] Reduced the amount of redundant logging in ICE Transport.
    • [LS1-3137] [Web] Removed Legacy ActiveX code from TypeScript libraries and examples.
    • [LS1-3175] [Android] Upgraded Android Gradle Example to 8.13.0.
    • [LS1-3193] [Web] Quality Limitation Stats have been added to MediaTrackStats when available from the client.
    • [LS1-3195] [Web] Updated video mute functionality of the browser platforms such that muting now stops any RTP traffic flow for the muted stream and turns off camera access indicator if applicable. This is now a preferred way to mute video. Audio muting works differently: the microphone remains active (allowing apps to detect when users speak while muted), but the audio sent to remote participants is replaced with silence rather than stopping RTP traffic entirely.
    • [LS1-3216] [Web] Updated the Web example and added a local video mute button.
    • [LS1-3200] [Android] [iOS] [macOS] [.Net] Added availableOutgoingBitrate to CandidatePairStats in ClientSDK. This property is only populated for the active candidate pair.
    • [LS1-3202] [Web] Upgraded TypeScript Libraries to latest TypeScript 5.9.2 and EcmaScript to ES2021.
    • [LS1-3235] [.Net] ConsoleLogProvider now prepends log metadata to all lines when a log message contains line breaks.
    • [LS1-3241] [Android] [iOS] [macOS] [.Net] [Web] Updated connection diagnostic logging to be JSON-compatible. Diagnostics are now logged under “Connection Diagnostics“.
    • [LS1-3246] [Android] [iOS] [macOS] [.Net] [Web] Exposed Connection.AddIceServer(). Use this method to add IceServers manually without potentially overriding other servers that would have been sent by Gateway.
    • [LS1-2014] [Unity] Updated the Unity Example to support Unity 6000.1.8f1.
    • [LS1-3183] [MAUI Android] Libraries are updated to support 16Kb pages.
    Bug Fixes
    • [LS1-2814] [Web] Fixed an issue where media streams could incorrectly re-mute when bitrate changes were applied.
    • [LS1-2959] [Web] Fixed multiple browser detection bugs: Opera browsers were incorrectly detected as Chrome, Safari versions were incorrectly detected, and desktop OS browsers were not detected.
    • [LS1-3008] [Android] [iOS] [macOS] [.Net] [Web] Fixed a bug where connection diagnostics mistakenly indicated that MediaIntent responses were never received for audio-only connections.
    • [LS1-3078] [Android] [iOS] [macOS] [.Net] Fixed an intermittent null reference exception that occurred during connection shutdown in SCTP transport.
    • [LS1-3095] [Android] [iOS] [macOS] [.Net] Added DisableZeroPadding configuration option to AudioSource and SoundReframerContext. This prevents aggressive zero-padding that can cause audible clicks and pops when audio sources provide buffers with irregular timing.
    • [LS1-3129] [Android] [iOS] [macOS] [.Net] Fixed a race condition in SCTP transport that could cause crashes during connection cleanup when retransmission timers were active. Improved thread safety and reliability of SCTP connection shutdown.
    • [LS1-3164] [Android] [iOS] [macOS] [.Net] Enabled high-quality anti-aliasing by default during audio resampling to eliminate high-frequency artifacts and tones. Applications can disable this via SoundConverter.HighQuality = false if CPU performance is critical.
    • [LS1-3166] [Web] Fixed a race condition in web clients where remote connection closure was incorrectly interpreted as a connection failure. This caused the client to attempt reconnection on an already-closed remote connection, resulting in the error "Cannot set local description: connection is Closed."
    • [LS1-3191] [iOS] Updated the iOS example to improve AudioSession handling.
    • [LS1-3192] [Android] Fixed video display issue on Samsung Galaxy A9+ and some other devices where camera feed showed green horizontal lines.
    • [LS1-3215] [Web] Fixed a bug where audio and video were sometimes not synchronized, particularly when rendered on browser platforms. This issue was especially impactful when muting video.
    • [LS1-3224] [iOS] [macOS] Fixed a bug that was causing a crash in the WebSocket signalling stack during shutdown under certain conditions.
    • [LS1-3280] [Web] Fixed a bug preventing the local video or audio from being re-enabled after it was disabled. This issue was particularly pronounced when the participant was alone on a channel.
    • [LS1-3288] [Android] [iOS] [macOS] [.Net] Optimized DTLS, SCTP and STUN/TURN logging.
    • [LS1-3295] [Web] Fixed an issue causing a frozen video frame when client side simulcast was in use after video was disabled and re-enabled.
    • [LS1-3287] [MAUI iOS] MAUI Example App fixed to run in Release mode.
    • [LS1-3133] [Unity iOS] Fixed a crash when invalid frame rates were specified.

    Media Server

    Improvements
    • [LS1-3131] Enhanced logging for TURNS SSL authentication failures to provide better diagnostic information.
    • [LS1-3132] Reduced the amount of redundant logging in ICE Transport.
    • [LS1-3135] Media Server capacity calculation is now based on video frame rate and resolution for all connections. This was previously available only for server-side simulcast cases.
    • [LS1-3159] Started using internal data channels for client telemetry.
    • [LS1-3193] Quality Limitation Stats have been added to MediaTrackStats when available from the client.
    • [LS1-3235] ConsoleLogProvider now prepends log metadata to all lines when a log message contains line breaks.
    • [LS1-3241] Updated connection diagnostic logging to be JSON-compatible. Diagnostics are now logged under “Connection Diagnostics“.
    • [LS1-3288] Optimized DTLS, SCTP and STUN/TURN logging.
    • [LS1-3292] Made Media Server Connection Capacity Configuration logging more compact.
    • [LS1-3247] Media Server now logs a warning when DTLS may be blocked if no handshake response is received from a client in a timely manner, aiding in connection debugging.
    • [LS1-3250] Media Server now includes DTLS blocking status in Connection Diagnostic Info when no handshake response is received from a client in a timely manner.
    • [LS1-3275] Media Server now includes the last qualityLimitationReason received from 1.25+ clients in Connection Diagnostic Info to aid in evaluating connection quality.
    Bug Fixes
    • [LS1-1490] Fixed a bug in Media Server that caused CPU measurements to stop being collected. An automatic timer restart has been added to ensure continuous monitoring.
    • [LS1-2866] Fixed a dependency injection error in WebhookDispatchQueueDistributor that could prevent webhook processing.
    • [LS1-3008] Fixed a bug where connection diagnostics mistakenly indicated that MediaIntent responses were never received for audio-only connections.
    • [LS1-3078] Fixed an intermittent null reference exception that occurred during connection shutdown in SCTP transport.
    • [LS1-3129] Fixed a race condition in SCTP transport that could cause crashes during connection cleanup when retransmission timers were active. Improved thread safety and reliability of SCTP connection shutdown.

    Gateway

    Breaking Change
    • [LS1-2815] Removed the OData route api/v2.0/FM.LiveSwitch.Model.SipInboundMappingConfig, which was deprecated in version 1.23.0. Please migrate to api/v2.0/SipInboundMappingConfig.
    Improvements
    • [LS1-3146] Upgraded Swagger UI to .NET 8.
    Bug Fixes
    • [LS1-2968] Fixed an issue where a Gateway restart was required for DeploymentConfig.AllocationRateLimit updates made through the REST API to take effect.
    • [LS1-3128] Fixed an issue where SIP URI updates for existing configs were not reflected in Server Console after a page reload. The updated SIP URI now persists correctly.
    • [LS1-3266] Added a new featureLoggingConfig.threadPoolLoggingEnabled configuration option to DeploymentConfig for enabling or disabling ThreadPool Stats logging. This feature is disabled by default.

    1.25.0.12446

    Release date: November 21, 2025

    Gateway

    Improvements
    • [LS1-3350], [LS1-3346] Suppressed HttpClient request/response logs that were previously logged at DEBUG level. Removed redundant gateway logs "Updating idle signalling timestamp due to authorize request."
    In This Article
    Back to top Copyright © LiveSwitch Inc. All Rights Reserved.Documentation for LiveSwitch Version 1.25.0