1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2012 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef API_DTMF_SENDER_INTERFACE_H_ 12*d9f75844SAndroid Build Coastguard Worker #define API_DTMF_SENDER_INTERFACE_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <string> 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker #include "api/media_stream_interface.h" 17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ref_count.h" 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 20*d9f75844SAndroid Build Coastguard Worker 21*d9f75844SAndroid Build Coastguard Worker // DtmfSender callback interface, used to implement RTCDtmfSender events. 22*d9f75844SAndroid Build Coastguard Worker // Applications should implement this interface to get notifications from the 23*d9f75844SAndroid Build Coastguard Worker // DtmfSender. 24*d9f75844SAndroid Build Coastguard Worker class DtmfSenderObserverInterface { 25*d9f75844SAndroid Build Coastguard Worker public: 26*d9f75844SAndroid Build Coastguard Worker // Triggered when DTMF `tone` is sent. 27*d9f75844SAndroid Build Coastguard Worker // If `tone` is empty that means the DtmfSender has sent out all the given 28*d9f75844SAndroid Build Coastguard Worker // tones. 29*d9f75844SAndroid Build Coastguard Worker // The callback includes the state of the tone buffer at the time when 30*d9f75844SAndroid Build Coastguard Worker // the tone finished playing. OnToneChange(const std::string & tone,const std::string & tone_buffer)31*d9f75844SAndroid Build Coastguard Worker virtual void OnToneChange(const std::string& tone, 32*d9f75844SAndroid Build Coastguard Worker const std::string& tone_buffer) {} 33*d9f75844SAndroid Build Coastguard Worker // DEPRECATED: Older API without tone buffer. 34*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/9725): Remove old API and default implementation 35*d9f75844SAndroid Build Coastguard Worker // when old callers are gone. OnToneChange(const std::string & tone)36*d9f75844SAndroid Build Coastguard Worker virtual void OnToneChange(const std::string& tone) {} 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker protected: 39*d9f75844SAndroid Build Coastguard Worker virtual ~DtmfSenderObserverInterface() = default; 40*d9f75844SAndroid Build Coastguard Worker }; 41*d9f75844SAndroid Build Coastguard Worker 42*d9f75844SAndroid Build Coastguard Worker // The interface of native implementation of the RTCDTMFSender defined by the 43*d9f75844SAndroid Build Coastguard Worker // WebRTC W3C Editor's Draft. 44*d9f75844SAndroid Build Coastguard Worker // See: https://www.w3.org/TR/webrtc/#peer-to-peer-dtmf 45*d9f75844SAndroid Build Coastguard Worker class DtmfSenderInterface : public rtc::RefCountInterface { 46*d9f75844SAndroid Build Coastguard Worker public: 47*d9f75844SAndroid Build Coastguard Worker // Provides the spec compliant default 2 second delay for the ',' character. 48*d9f75844SAndroid Build Coastguard Worker static const int kDtmfDefaultCommaDelayMs = 2000; 49*d9f75844SAndroid Build Coastguard Worker 50*d9f75844SAndroid Build Coastguard Worker // Used to receive events from the DTMF sender. Only one observer can be 51*d9f75844SAndroid Build Coastguard Worker // registered at a time. UnregisterObserver should be called before the 52*d9f75844SAndroid Build Coastguard Worker // observer object is destroyed. 53*d9f75844SAndroid Build Coastguard Worker virtual void RegisterObserver(DtmfSenderObserverInterface* observer) = 0; 54*d9f75844SAndroid Build Coastguard Worker virtual void UnregisterObserver() = 0; 55*d9f75844SAndroid Build Coastguard Worker 56*d9f75844SAndroid Build Coastguard Worker // Returns true if this DtmfSender is capable of sending DTMF. Otherwise 57*d9f75844SAndroid Build Coastguard Worker // returns false. To be able to send DTMF, the associated RtpSender must be 58*d9f75844SAndroid Build Coastguard Worker // able to send packets, and a "telephone-event" codec must be negotiated. 59*d9f75844SAndroid Build Coastguard Worker virtual bool CanInsertDtmf() = 0; 60*d9f75844SAndroid Build Coastguard Worker 61*d9f75844SAndroid Build Coastguard Worker // Queues a task that sends the DTMF `tones`. The `tones` parameter is treated 62*d9f75844SAndroid Build Coastguard Worker // as a series of characters. The characters 0 through 9, A through D, #, and 63*d9f75844SAndroid Build Coastguard Worker // * generate the associated DTMF tones. The characters a to d are equivalent 64*d9f75844SAndroid Build Coastguard Worker // to A to D. The character ',' indicates a delay of 2 seconds before 65*d9f75844SAndroid Build Coastguard Worker // processing the next character in the tones parameter. 66*d9f75844SAndroid Build Coastguard Worker // 67*d9f75844SAndroid Build Coastguard Worker // Unrecognized characters are ignored. 68*d9f75844SAndroid Build Coastguard Worker // 69*d9f75844SAndroid Build Coastguard Worker // The `duration` parameter indicates the duration in ms to use for each 70*d9f75844SAndroid Build Coastguard Worker // character passed in the `tones` parameter. The duration cannot be more 71*d9f75844SAndroid Build Coastguard Worker // than 6000 or less than 70. 72*d9f75844SAndroid Build Coastguard Worker // 73*d9f75844SAndroid Build Coastguard Worker // The `inter_tone_gap` parameter indicates the gap between tones in ms. The 74*d9f75844SAndroid Build Coastguard Worker // `inter_tone_gap` must be at least 50 ms but should be as short as 75*d9f75844SAndroid Build Coastguard Worker // possible. 76*d9f75844SAndroid Build Coastguard Worker // 77*d9f75844SAndroid Build Coastguard Worker // The `comma_delay` parameter indicates the delay after the ',' 78*d9f75844SAndroid Build Coastguard Worker // character. InsertDtmf specifies `comma_delay` as an argument 79*d9f75844SAndroid Build Coastguard Worker // with a default value of 2 seconds as per the WebRTC spec. This parameter 80*d9f75844SAndroid Build Coastguard Worker // allows users to comply with legacy WebRTC clients. The `comma_delay` 81*d9f75844SAndroid Build Coastguard Worker // must be at least 50 ms. 82*d9f75844SAndroid Build Coastguard Worker // 83*d9f75844SAndroid Build Coastguard Worker // If InsertDtmf is called on the same object while an existing task for this 84*d9f75844SAndroid Build Coastguard Worker // object to generate DTMF is still running, the previous task is canceled. 85*d9f75844SAndroid Build Coastguard Worker // Returns true on success and false on failure. InsertDtmf(const std::string & tones,int duration,int inter_tone_gap)86*d9f75844SAndroid Build Coastguard Worker virtual bool InsertDtmf(const std::string& tones, 87*d9f75844SAndroid Build Coastguard Worker int duration, 88*d9f75844SAndroid Build Coastguard Worker int inter_tone_gap) { 89*d9f75844SAndroid Build Coastguard Worker return InsertDtmf(tones, duration, inter_tone_gap, 90*d9f75844SAndroid Build Coastguard Worker kDtmfDefaultCommaDelayMs); 91*d9f75844SAndroid Build Coastguard Worker } InsertDtmf(const std::string & tones,int duration,int inter_tone_gap,int comma_delay)92*d9f75844SAndroid Build Coastguard Worker virtual bool InsertDtmf(const std::string& tones, 93*d9f75844SAndroid Build Coastguard Worker int duration, 94*d9f75844SAndroid Build Coastguard Worker int inter_tone_gap, 95*d9f75844SAndroid Build Coastguard Worker int comma_delay) { 96*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/165700): Remove once downstream implementations 97*d9f75844SAndroid Build Coastguard Worker // override this signature rather than the 3-parameter one. 98*d9f75844SAndroid Build Coastguard Worker return InsertDtmf(tones, duration, inter_tone_gap); 99*d9f75844SAndroid Build Coastguard Worker } 100*d9f75844SAndroid Build Coastguard Worker 101*d9f75844SAndroid Build Coastguard Worker // Returns the tones remaining to be played out. 102*d9f75844SAndroid Build Coastguard Worker virtual std::string tones() const = 0; 103*d9f75844SAndroid Build Coastguard Worker 104*d9f75844SAndroid Build Coastguard Worker // Returns the current tone duration value in ms. 105*d9f75844SAndroid Build Coastguard Worker // This value will be the value last set via the InsertDtmf() method, or the 106*d9f75844SAndroid Build Coastguard Worker // default value of 100 ms if InsertDtmf() was never called. 107*d9f75844SAndroid Build Coastguard Worker virtual int duration() const = 0; 108*d9f75844SAndroid Build Coastguard Worker 109*d9f75844SAndroid Build Coastguard Worker // Returns the current value of the between-tone gap in ms. 110*d9f75844SAndroid Build Coastguard Worker // This value will be the value last set via the InsertDtmf() method, or the 111*d9f75844SAndroid Build Coastguard Worker // default value of 50 ms if InsertDtmf() was never called. 112*d9f75844SAndroid Build Coastguard Worker virtual int inter_tone_gap() const = 0; 113*d9f75844SAndroid Build Coastguard Worker 114*d9f75844SAndroid Build Coastguard Worker // Returns the current value of the "," character delay in ms. 115*d9f75844SAndroid Build Coastguard Worker // This value will be the value last set via the InsertDtmf() method, or the 116*d9f75844SAndroid Build Coastguard Worker // default value of 2000 ms if InsertDtmf() was never called. comma_delay()117*d9f75844SAndroid Build Coastguard Worker virtual int comma_delay() const { return kDtmfDefaultCommaDelayMs; } 118*d9f75844SAndroid Build Coastguard Worker 119*d9f75844SAndroid Build Coastguard Worker protected: 120*d9f75844SAndroid Build Coastguard Worker ~DtmfSenderInterface() override = default; 121*d9f75844SAndroid Build Coastguard Worker }; 122*d9f75844SAndroid Build Coastguard Worker 123*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 124*d9f75844SAndroid Build Coastguard Worker 125*d9f75844SAndroid Build Coastguard Worker #endif // API_DTMF_SENDER_INTERFACE_H_ 126