Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / Modules / mediastream / RTCDTMFSender.cpp
1 /*
2  * Copyright (C) 2013 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "RTCDTMFSender.h"
28
29 #if ENABLE(WEB_RTC_DTMF)
30
31 #include "MediaStreamTrack.h"
32 #include "RTCDTMFSenderHandler.h"
33 #include "RTCDTMFToneChangeEvent.h"
34 #include "ScriptExecutionContext.h"
35
36 namespace WebCore {
37
38 static const long minToneDurationMs = 40;
39 static const long defaultToneDurationMs = 100;
40 static const long maxToneDurationMs = 6000;
41 static const long minInterToneGapMs = 30;
42 static const long defaultInterToneGapMs = 70;
43
44 RTCDTMFSender::RTCDTMFSender(ScriptExecutionContext& context, RefPtr<MediaStreamTrack>&& track)
45     : ActiveDOMObject(&context)
46     , m_track(WTFMove(track))
47     , m_duration(defaultToneDurationMs)
48     , m_interToneGap(defaultInterToneGapMs)
49     , m_stopped(false)
50     , m_scheduledEventTimer(*this, &RTCDTMFSender::scheduledEventTimerFired)
51 {
52 }
53
54 RTCDTMFSender::~RTCDTMFSender() = default;
55
56 bool RTCDTMFSender::canInsertDTMF() const
57 {
58     return false;
59 }
60
61 MediaStreamTrack* RTCDTMFSender::track() const
62 {
63     return m_track.get();
64 }
65
66 String RTCDTMFSender::toneBuffer() const
67 {
68     return { };
69 }
70
71 ExceptionOr<void> RTCDTMFSender::insertDTMF(const String&, std::optional<int> duration, std::optional<int> interToneGap)
72 {
73     if (!canInsertDTMF())
74         return Exception { NotSupportedError };
75
76     if (duration && (duration.value() > maxToneDurationMs || duration.value() < minToneDurationMs))
77         return Exception { SyntaxError };
78
79     if (interToneGap && interToneGap.value() < minInterToneGapMs)
80         return Exception { SyntaxError };
81
82     m_duration = duration.value_or(defaultToneDurationMs);
83     m_interToneGap = interToneGap.value_or(defaultInterToneGapMs);
84
85     return Exception { SyntaxError };
86 }
87
88 void RTCDTMFSender::didPlayTone(const String& tone)
89 {
90     scheduleDispatchEvent(RTCDTMFToneChangeEvent::create(tone));
91 }
92
93 void RTCDTMFSender::stop()
94 {
95     m_stopped = true;
96 }
97
98 const char* RTCDTMFSender::activeDOMObjectName() const
99 {
100     return "RTCDTMFSender";
101 }
102
103 bool RTCDTMFSender::canSuspendForDocumentSuspension() const
104 {
105     // FIXME: We should try and do better here.
106     return false;
107 }
108
109 void RTCDTMFSender::scheduleDispatchEvent(Ref<Event>&& event)
110 {
111     m_scheduledEvents.append(WTFMove(event));
112
113     if (!m_scheduledEventTimer.isActive())
114         m_scheduledEventTimer.startOneShot(0_s);
115 }
116
117 void RTCDTMFSender::scheduledEventTimerFired()
118 {
119     if (m_stopped)
120         return;
121
122     Vector<Ref<Event>> events;
123     events.swap(m_scheduledEvents);
124
125     for (auto& event : events)
126         dispatchEvent(event);
127 }
128
129 } // namespace WebCore
130
131 #endif // ENABLE(WEB_RTC)