xref: /aosp_15_r20/external/webrtc/api/dtmf_sender_interface.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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