xref: /aosp_15_r20/external/webrtc/pc/dtmf_sender.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 PC_DTMF_SENDER_H_
12*d9f75844SAndroid Build Coastguard Worker #define PC_DTMF_SENDER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <stdint.h>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include <string>
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker #include "api/dtmf_sender_interface.h"
19*d9f75844SAndroid Build Coastguard Worker #include "api/scoped_refptr.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/sequence_checker.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/pending_task_safety_flag.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_base.h"
23*d9f75844SAndroid Build Coastguard Worker #include "pc/proxy.h"
24*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ref_count.h"
25*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread_annotations.h"
26*d9f75844SAndroid Build Coastguard Worker 
27*d9f75844SAndroid Build Coastguard Worker // DtmfSender is the native implementation of the RTCDTMFSender defined by
28*d9f75844SAndroid Build Coastguard Worker // the WebRTC W3C Editor's Draft.
29*d9f75844SAndroid Build Coastguard Worker // https://w3c.github.io/webrtc-pc/#rtcdtmfsender
30*d9f75844SAndroid Build Coastguard Worker 
31*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
32*d9f75844SAndroid Build Coastguard Worker 
33*d9f75844SAndroid Build Coastguard Worker // This interface is called by DtmfSender to talk to the actual audio channel
34*d9f75844SAndroid Build Coastguard Worker // to send DTMF.
35*d9f75844SAndroid Build Coastguard Worker class DtmfProviderInterface {
36*d9f75844SAndroid Build Coastguard Worker  public:
37*d9f75844SAndroid Build Coastguard Worker   // Returns true if the audio sender is capable of sending DTMF. Otherwise
38*d9f75844SAndroid Build Coastguard Worker   // returns false.
39*d9f75844SAndroid Build Coastguard Worker   virtual bool CanInsertDtmf() = 0;
40*d9f75844SAndroid Build Coastguard Worker   // Sends DTMF `code`.
41*d9f75844SAndroid Build Coastguard Worker   // The `duration` indicates the length of the DTMF tone in ms.
42*d9f75844SAndroid Build Coastguard Worker   // Returns true on success and false on failure.
43*d9f75844SAndroid Build Coastguard Worker   virtual bool InsertDtmf(int code, int duration) = 0;
44*d9f75844SAndroid Build Coastguard Worker 
45*d9f75844SAndroid Build Coastguard Worker  protected:
~DtmfProviderInterface()46*d9f75844SAndroid Build Coastguard Worker   virtual ~DtmfProviderInterface() {}
47*d9f75844SAndroid Build Coastguard Worker };
48*d9f75844SAndroid Build Coastguard Worker 
49*d9f75844SAndroid Build Coastguard Worker class DtmfSender : public DtmfSenderInterface {
50*d9f75844SAndroid Build Coastguard Worker  public:
51*d9f75844SAndroid Build Coastguard Worker   static rtc::scoped_refptr<DtmfSender> Create(TaskQueueBase* signaling_thread,
52*d9f75844SAndroid Build Coastguard Worker                                                DtmfProviderInterface* provider);
53*d9f75844SAndroid Build Coastguard Worker 
54*d9f75844SAndroid Build Coastguard Worker   void OnDtmfProviderDestroyed();
55*d9f75844SAndroid Build Coastguard Worker 
56*d9f75844SAndroid Build Coastguard Worker   // Implements DtmfSenderInterface.
57*d9f75844SAndroid Build Coastguard Worker   void RegisterObserver(DtmfSenderObserverInterface* observer) override;
58*d9f75844SAndroid Build Coastguard Worker   void UnregisterObserver() override;
59*d9f75844SAndroid Build Coastguard Worker   bool CanInsertDtmf() override;
60*d9f75844SAndroid Build Coastguard Worker   bool InsertDtmf(const std::string& tones,
61*d9f75844SAndroid Build Coastguard Worker                   int duration,
62*d9f75844SAndroid Build Coastguard Worker                   int inter_tone_gap,
63*d9f75844SAndroid Build Coastguard Worker                   int comma_delay = kDtmfDefaultCommaDelayMs) override;
64*d9f75844SAndroid Build Coastguard Worker   std::string tones() const override;
65*d9f75844SAndroid Build Coastguard Worker   int duration() const override;
66*d9f75844SAndroid Build Coastguard Worker   int inter_tone_gap() const override;
67*d9f75844SAndroid Build Coastguard Worker   int comma_delay() const override;
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker  protected:
70*d9f75844SAndroid Build Coastguard Worker   DtmfSender(TaskQueueBase* signaling_thread, DtmfProviderInterface* provider);
71*d9f75844SAndroid Build Coastguard Worker   virtual ~DtmfSender();
72*d9f75844SAndroid Build Coastguard Worker 
73*d9f75844SAndroid Build Coastguard Worker   DtmfSender(const DtmfSender&) = delete;
74*d9f75844SAndroid Build Coastguard Worker   DtmfSender& operator=(const DtmfSender&) = delete;
75*d9f75844SAndroid Build Coastguard Worker 
76*d9f75844SAndroid Build Coastguard Worker  private:
77*d9f75844SAndroid Build Coastguard Worker   DtmfSender();
78*d9f75844SAndroid Build Coastguard Worker 
79*d9f75844SAndroid Build Coastguard Worker   void QueueInsertDtmf(uint32_t delay_ms) RTC_RUN_ON(signaling_thread_);
80*d9f75844SAndroid Build Coastguard Worker 
81*d9f75844SAndroid Build Coastguard Worker   // The DTMF sending task.
82*d9f75844SAndroid Build Coastguard Worker   void DoInsertDtmf() RTC_RUN_ON(signaling_thread_);
83*d9f75844SAndroid Build Coastguard Worker 
84*d9f75844SAndroid Build Coastguard Worker   void StopSending() RTC_RUN_ON(signaling_thread_);
85*d9f75844SAndroid Build Coastguard Worker 
86*d9f75844SAndroid Build Coastguard Worker   DtmfSenderObserverInterface* observer_ RTC_GUARDED_BY(signaling_thread_);
87*d9f75844SAndroid Build Coastguard Worker   TaskQueueBase* const signaling_thread_;
88*d9f75844SAndroid Build Coastguard Worker   DtmfProviderInterface* provider_ RTC_GUARDED_BY(signaling_thread_);
89*d9f75844SAndroid Build Coastguard Worker   std::string tones_ RTC_GUARDED_BY(signaling_thread_);
90*d9f75844SAndroid Build Coastguard Worker   int duration_ RTC_GUARDED_BY(signaling_thread_);
91*d9f75844SAndroid Build Coastguard Worker   int inter_tone_gap_ RTC_GUARDED_BY(signaling_thread_);
92*d9f75844SAndroid Build Coastguard Worker   int comma_delay_ RTC_GUARDED_BY(signaling_thread_);
93*d9f75844SAndroid Build Coastguard Worker 
94*d9f75844SAndroid Build Coastguard Worker   // For cancelling the tasks which feed the DTMF provider one tone at a time.
95*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<PendingTaskSafetyFlag> safety_flag_ RTC_GUARDED_BY(
96*d9f75844SAndroid Build Coastguard Worker       signaling_thread_) RTC_PT_GUARDED_BY(signaling_thread_) = nullptr;
97*d9f75844SAndroid Build Coastguard Worker };
98*d9f75844SAndroid Build Coastguard Worker 
99*d9f75844SAndroid Build Coastguard Worker // Define proxy for DtmfSenderInterface.
100*d9f75844SAndroid Build Coastguard Worker BEGIN_PRIMARY_PROXY_MAP(DtmfSender)
101*d9f75844SAndroid Build Coastguard Worker 
102*d9f75844SAndroid Build Coastguard Worker PROXY_PRIMARY_THREAD_DESTRUCTOR()
103*d9f75844SAndroid Build Coastguard Worker PROXY_METHOD1(void, RegisterObserver, DtmfSenderObserverInterface*)
104*d9f75844SAndroid Build Coastguard Worker PROXY_METHOD0(void, UnregisterObserver)
105*d9f75844SAndroid Build Coastguard Worker PROXY_METHOD0(bool, CanInsertDtmf)
106*d9f75844SAndroid Build Coastguard Worker PROXY_METHOD4(bool, InsertDtmf, const std::string&, int, int, int)
107*d9f75844SAndroid Build Coastguard Worker PROXY_CONSTMETHOD0(std::string, tones)
108*d9f75844SAndroid Build Coastguard Worker PROXY_CONSTMETHOD0(int, duration)
109*d9f75844SAndroid Build Coastguard Worker PROXY_CONSTMETHOD0(int, inter_tone_gap)
110*d9f75844SAndroid Build Coastguard Worker PROXY_CONSTMETHOD0(int, comma_delay)
111*d9f75844SAndroid Build Coastguard Worker END_PROXY_MAP(DtmfSender)
112*d9f75844SAndroid Build Coastguard Worker 
113*d9f75844SAndroid Build Coastguard Worker // Get DTMF code from the DTMF event character.
114*d9f75844SAndroid Build Coastguard Worker bool GetDtmfCode(char tone, int* code);
115*d9f75844SAndroid Build Coastguard Worker 
116*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
117*d9f75844SAndroid Build Coastguard Worker 
118*d9f75844SAndroid Build Coastguard Worker #endif  // PC_DTMF_SENDER_H_
119