diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index 60dbe0523f..6f480255e0 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -406,6 +406,8 @@ if (is_ios || is_mac) { "objc/Framework/Classes/PeerConnection/RTCDataChannel.mm", "objc/Framework/Classes/PeerConnection/RTCDataChannelConfiguration+Private.h", "objc/Framework/Classes/PeerConnection/RTCDataChannelConfiguration.mm", + "objc/Framework/Classes/PeerConnection/RTCDtmfSender+Private.h", + "objc/Framework/Classes/PeerConnection/RTCDtmfSender.mm", "objc/Framework/Classes/PeerConnection/RTCEncodedImage.mm", "objc/Framework/Classes/PeerConnection/RTCIceCandidate+Private.h", "objc/Framework/Classes/PeerConnection/RTCIceCandidate.mm", @@ -471,6 +473,7 @@ if (is_ios || is_mac) { "objc/Framework/Headers/WebRTC/RTCConfiguration.h", "objc/Framework/Headers/WebRTC/RTCDataChannel.h", "objc/Framework/Headers/WebRTC/RTCDataChannelConfiguration.h", + "objc/Framework/Headers/WebRTC/RTCDtmfSender.h", "objc/Framework/Headers/WebRTC/RTCIceCandidate.h", "objc/Framework/Headers/WebRTC/RTCIceServer.h", "objc/Framework/Headers/WebRTC/RTCIntervalRange.h", @@ -696,6 +699,7 @@ if (is_ios || is_mac) { "objc/Framework/Headers/WebRTC/RTCRtpParameters.h", "objc/Framework/Headers/WebRTC/RTCRtpReceiver.h", "objc/Framework/Headers/WebRTC/RTCRtpSender.h", + "objc/Framework/Headers/WebRTC/RTCDtmfSender.h", "objc/Framework/Headers/WebRTC/RTCSSLAdapter.h", "objc/Framework/Headers/WebRTC/RTCSessionDescription.h", "objc/Framework/Headers/WebRTC/RTCTracing.h", diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCDtmfSender+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCDtmfSender+Private.h new file mode 100644 index 0000000000..197aeb83a4 --- /dev/null +++ b/sdk/objc/Framework/Classes/PeerConnection/RTCDtmfSender+Private.h @@ -0,0 +1,29 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import "WebRTC/RTCDtmfSender.h" + +#include "api/dtmfsenderinterface.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RTCDtmfSender : NSObject + +@property(nonatomic, readonly) rtc::scoped_refptr nativeDtmfSender; + +- (instancetype)init NS_UNAVAILABLE; + +/** Initialize an RTCDtmfSender with a native DtmfSenderInterface. */ +- (instancetype)initWithNativeDtmfSender: + (rtc::scoped_refptr)nativeDtmfSender NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCDtmfSender.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCDtmfSender.mm new file mode 100644 index 0000000000..7a5c97faeb --- /dev/null +++ b/sdk/objc/Framework/Classes/PeerConnection/RTCDtmfSender.mm @@ -0,0 +1,74 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import "RTCDtmfSender+Private.h" + +#import "NSString+StdString.h" +#import "WebRTC/RTCLogging.h" + +#include "rtc_base/timeutils.h" + +@implementation RTCDtmfSender { + rtc::scoped_refptr _nativeDtmfSender; +} + +- (BOOL)canInsertDtmf { + return _nativeDtmfSender->CanInsertDtmf(); +} + +- (BOOL)insertDtmf:(nonnull NSString *)tones + duration:(NSTimeInterval)duration + interToneGap:(NSTimeInterval)interToneGap { + RTC_DCHECK(tones != nil); + + int durationMs = static_cast(duration * rtc::kNumMillisecsPerSec); + int interToneGapMs = static_cast(interToneGap * rtc::kNumMillisecsPerSec); + return _nativeDtmfSender->InsertDtmf( + [NSString stdStringForString:tones], durationMs, interToneGapMs); +} + +- (nonnull NSString *)remainingTones { + return [NSString stringForStdString:_nativeDtmfSender->tones()]; +} + +- (NSTimeInterval)duration { + return static_cast(_nativeDtmfSender->duration()) / rtc::kNumMillisecsPerSec; +} + +- (NSTimeInterval)interToneGap { + return static_cast(_nativeDtmfSender->inter_tone_gap()) / + rtc::kNumMillisecsPerSec; +} + +- (NSString *)description { + return [NSString + stringWithFormat: + @"RTCDtmfSender {\n remainingTones: %@\n duration: %f sec\n interToneGap: %f sec\n}", + [self remainingTones], + [self duration], + [self interToneGap]]; +} + +#pragma mark - Private + +- (rtc::scoped_refptr)nativeDtmfSender { + return _nativeDtmfSender; +} + +- (instancetype)initWithNativeDtmfSender: + (rtc::scoped_refptr)nativeDtmfSender { + NSParameterAssert(nativeDtmfSender); + if (self = [super init]) { + _nativeDtmfSender = nativeDtmfSender; + RTCLogInfo(@"RTCDtmfSender(%p): created DTMF sender: %@", self, self.description); + } + return self; +} +@end diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpSender.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpSender.mm index e2195def70..de3d69c958 100644 --- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpSender.mm +++ b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpSender.mm @@ -11,6 +11,7 @@ #import "RTCRtpSender+Private.h" #import "NSString+StdString.h" +#import "RTCDtmfSender+Private.h" #import "RTCMediaStreamTrack+Private.h" #import "RTCRtpParameters+Private.h" #import "WebRTC/RTCLogging.h" @@ -21,6 +22,8 @@ rtc::scoped_refptr _nativeRtpSender; } +@synthesize dtmfSender = _dtmfSender; + - (NSString *)senderId { return [NSString stringForStdString:_nativeRtpSender->id()]; } @@ -86,6 +89,11 @@ NSParameterAssert(nativeRtpSender); if (self = [super init]) { _nativeRtpSender = nativeRtpSender; + rtc::scoped_refptr nativeDtmfSender( + _nativeRtpSender->GetDtmfSender()); + if (nativeDtmfSender) { + _dtmfSender = [[RTCDtmfSender alloc] initWithNativeDtmfSender:nativeDtmfSender]; + } RTCLogInfo(@"RTCRtpSender(%p): created sender: %@", self, self.description); } return self; diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCDtmfSender.h b/sdk/objc/Framework/Headers/WebRTC/RTCDtmfSender.h new file mode 100644 index 0000000000..c69af026b7 --- /dev/null +++ b/sdk/objc/Framework/Headers/WebRTC/RTCDtmfSender.h @@ -0,0 +1,70 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@protocol RTCDtmfSender + +/** + * Returns true if this RTCDtmfSender is capable of sending DTMF. Otherwise + * returns false. To be able to send DTMF, the associated RTCRtpSender must be + * able to send packets, and a "telephone-event" codec must be negotiated. + */ +@property(nonatomic, readonly) BOOL canInsertDtmf; + +/** + * Queues a task that sends the DTMF tones. The tones parameter is treated + * as a series of characters. The characters 0 through 9, A through D, #, and * + * generate the associated DTMF tones. The characters a to d are equivalent + * to A to D. The character ',' indicates a delay of 2 seconds before + * processing the next character in the tones parameter. + * + * Unrecognized characters are ignored. + * + * @param duration The parameter indicates the duration to use for each + * character passed in the tones parameter. The duration cannot be more + * than 6000 or less than 70 ms. + * + * @param interToneGap The parameter indicates the gap between tones. + * This parameter must be at least 50 ms but should be as short as + * possible. + * + * If InsertDtmf is called on the same object while an existing task for this + * object to generate DTMF is still running, the previous task is canceled. + * Returns true on success and false on failure. + */ +- (BOOL)insertDtmf:(nonnull NSString *)tones + duration:(NSTimeInterval)duration + interToneGap:(NSTimeInterval)interToneGap; + +/** The tones remaining to be played out */ +- (nonnull NSString *)remainingTones; + +/** + * The current tone duration value. This value will be the value last set via the + * insertDtmf method, or the default value of 100 ms if insertDtmf was never called. + */ +- (NSTimeInterval)duration; + +/** + * The current value of the between-tone gap. This value will be the value last set + * via the insertDtmf() method, or the default value of 50 ms if insertDtmf() was never + * called. + */ +- (NSTimeInterval)interToneGap; + +@end + +NS_ASSUME_NONNULL_END diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCRtpSender.h b/sdk/objc/Framework/Headers/WebRTC/RTCRtpSender.h index d910c6ceb2..f6e9125026 100644 --- a/sdk/objc/Framework/Headers/WebRTC/RTCRtpSender.h +++ b/sdk/objc/Framework/Headers/WebRTC/RTCRtpSender.h @@ -10,6 +10,7 @@ #import +#import #import #import #import @@ -34,6 +35,9 @@ RTC_EXPORT */ @property(nonatomic, copy, nullable) RTCMediaStreamTrack *track; +/** The RTCDtmfSender accociated with the RTP sender. */ +@property(nonatomic, readonly, nullable) id dtmfSender; + @end RTC_EXPORT