From f8b5761b72162ba0a54d2f83f156db3b046eb39c Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Sun, 23 Mar 2025 21:36:05 +0800 Subject: [PATCH] fix: bug for rfc2833. --- lib/src/rtc_session.dart | 20 ++++++++++++++------ lib/src/rtc_session/dtmf.dart | 4 ++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/src/rtc_session.dart b/lib/src/rtc_session.dart index 1c55cc5d..615b935a 100644 --- a/lib/src/rtc_session.dart +++ b/lib/src/rtc_session.dart @@ -2,6 +2,7 @@ import 'dart:async'; // Package imports: +import 'package:collection/collection.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; import 'package:sdp_transform/sdp_transform.dart' as sdp_transform; @@ -95,6 +96,9 @@ class RTCSession extends EventManager implements Owner { // The RTCPeerConnection instance (public attribute). RTCPeerConnection? _connection; + // RTPSender List + final List _senders = []; + // Incoming/Outgoing request being currently processed. dynamic _request; @@ -168,8 +172,10 @@ class RTCSession extends EventManager implements Owner { @override int get TerminatedCode => RtcSessionState.terminated.index; - RTCDTMFSender get dtmfSender => - _connection!.createDtmfSender(_localMediaStream!.getAudioTracks()[0]); + RTCDTMFSender? get dtmfSender => _senders + .firstWhereOrNull((RTCRtpSender item) => + item.track != null && item.track!.kind == 'audio') + ?.dtmfSender; String? get contact => _contact; @@ -628,8 +634,9 @@ class RTCSession extends EventManager implements Owner { if (stream != null) { switch (sdpSemantics) { case 'unified-plan': - stream.getTracks().forEach((MediaStreamTrack track) { - _connection!.addTrack(track, stream!); + stream.getTracks().forEach((MediaStreamTrack track) async { + RTCRtpSender sender = await _connection!.addTrack(track, stream!); + _senders.add(sender); }); break; case 'plan-b': @@ -2395,8 +2402,9 @@ class RTCSession extends EventManager implements Owner { if (stream != null) { switch (sdpSemantics) { case 'unified-plan': - stream.getTracks().forEach((MediaStreamTrack track) { - _connection!.addTrack(track, stream!); + stream.getTracks().forEach((MediaStreamTrack track) async { + RTCRtpSender sender = await _connection!.addTrack(track, stream!); + _senders.add(sender); }); break; case 'plan-b': diff --git a/lib/src/rtc_session/dtmf.dart b/lib/src/rtc_session/dtmf.dart index c75967e2..92a1f80d 100644 --- a/lib/src/rtc_session/dtmf.dart +++ b/lib/src/rtc_session/dtmf.dart @@ -70,8 +70,8 @@ class DTMF extends EventManager { _interToneGap = options['interToneGap']; if (_mode == DtmfMode.RFC2833) { - RTCDTMFSender dtmfSender = _session.dtmfSender; - dtmfSender.insertDTMF(_tone!, + RTCDTMFSender? dtmfSender = _session.dtmfSender; + dtmfSender?.insertDTMF(_tone!, duration: _duration!, interToneGap: _interToneGap!); } else if (_mode == DtmfMode.INFO) { extraHeaders.add('Content-Type: application/dtmf-relay');