diff options
Diffstat (limited to 'Source/WebCore/Modules/mediastream/RTCDTMFSender.cpp')
-rw-r--r-- | Source/WebCore/Modules/mediastream/RTCDTMFSender.cpp | 105 |
1 files changed, 39 insertions, 66 deletions
diff --git a/Source/WebCore/Modules/mediastream/RTCDTMFSender.cpp b/Source/WebCore/Modules/mediastream/RTCDTMFSender.cpp index 3167d9275..08eae7b70 100644 --- a/Source/WebCore/Modules/mediastream/RTCDTMFSender.cpp +++ b/Source/WebCore/Modules/mediastream/RTCDTMFSender.cpp @@ -24,50 +24,31 @@ */ #include "config.h" - -#if ENABLE(MEDIA_STREAM) - #include "RTCDTMFSender.h" -#include "ExceptionCode.h" +#if ENABLE(WEB_RTC) + #include "MediaStreamTrack.h" #include "RTCDTMFSenderHandler.h" #include "RTCDTMFToneChangeEvent.h" -#include "RTCPeerConnectionHandler.h" #include "ScriptExecutionContext.h" namespace WebCore { -static const long minToneDurationMs = 70; +static const long minToneDurationMs = 40; static const long defaultToneDurationMs = 100; static const long maxToneDurationMs = 6000; -static const long minInterToneGapMs = 50; -static const long defaultInterToneGapMs = 50; - -PassRefPtr<RTCDTMFSender> RTCDTMFSender::create(ScriptExecutionContext* context, RTCPeerConnectionHandler* peerConnectionHandler, PassRefPtr<MediaStreamTrack> prpTrack, ExceptionCode& ec) -{ - RefPtr<MediaStreamTrack> track = prpTrack; - std::unique_ptr<RTCDTMFSenderHandler> handler = peerConnectionHandler->createDTMFSender(track->source()); - if (!handler) { - ec = NOT_SUPPORTED_ERR; - return nullptr; - } - - RefPtr<RTCDTMFSender> dtmfSender = adoptRef(new RTCDTMFSender(context, track, std::move(handler))); - dtmfSender->suspendIfNeeded(); - return dtmfSender.release(); -} +static const long minInterToneGapMs = 30; +static const long defaultInterToneGapMs = 70; -RTCDTMFSender::RTCDTMFSender(ScriptExecutionContext* context, PassRefPtr<MediaStreamTrack> track, std::unique_ptr<RTCDTMFSenderHandler> handler) - : ActiveDOMObject(context) - , m_track(track) +RTCDTMFSender::RTCDTMFSender(ScriptExecutionContext& context, RefPtr<MediaStreamTrack>&& track) + : ActiveDOMObject(&context) + , m_track(WTFMove(track)) , m_duration(defaultToneDurationMs) , m_interToneGap(defaultInterToneGapMs) - , m_handler(std::move(handler)) , m_stopped(false) - , m_scheduledEventTimer(this, &RTCDTMFSender::scheduledEventTimerFired) + , m_scheduledEventTimer(*this, &RTCDTMFSender::scheduledEventTimerFired) { - m_handler->setClient(this); } RTCDTMFSender::~RTCDTMFSender() @@ -76,7 +57,7 @@ RTCDTMFSender::~RTCDTMFSender() bool RTCDTMFSender::canInsertDTMF() const { - return m_handler->canInsertDTMF(); + return false; } MediaStreamTrack* RTCDTMFSender::track() const @@ -86,41 +67,24 @@ MediaStreamTrack* RTCDTMFSender::track() const String RTCDTMFSender::toneBuffer() const { - return m_handler->currentToneBuffer(); + return { }; } -void RTCDTMFSender::insertDTMF(const String& tones, ExceptionCode& ec) +ExceptionOr<void> RTCDTMFSender::insertDTMF(const String&, std::optional<int> duration, std::optional<int> interToneGap) { - insertDTMF(tones, defaultToneDurationMs, defaultInterToneGapMs, ec); -} + if (!canInsertDTMF()) + return Exception { NOT_SUPPORTED_ERR }; -void RTCDTMFSender::insertDTMF(const String& tones, long duration, ExceptionCode& ec) -{ - insertDTMF(tones, duration, defaultInterToneGapMs, ec); -} + if (duration && (duration.value() > maxToneDurationMs || duration.value() < minToneDurationMs)) + return Exception { SYNTAX_ERR }; -void RTCDTMFSender::insertDTMF(const String& tones, long duration, long interToneGap, ExceptionCode& ec) -{ - if (!canInsertDTMF()) { - ec = NOT_SUPPORTED_ERR; - return; - } + if (interToneGap && interToneGap.value() < minInterToneGapMs) + return Exception { SYNTAX_ERR }; - if (duration > maxToneDurationMs || duration < minToneDurationMs) { - ec = SYNTAX_ERR; - return; - } - - if (interToneGap < minInterToneGapMs) { - ec = SYNTAX_ERR; - return; - } + m_duration = duration.value_or(defaultToneDurationMs); + m_interToneGap = interToneGap.value_or(defaultInterToneGapMs); - m_duration = duration; - m_interToneGap = interToneGap; - - if (!m_handler->insertDTMF(tones, m_duration, m_interToneGap)) - ec = SYNTAX_ERR; + return Exception { SYNTAX_ERR }; } void RTCDTMFSender::didPlayTone(const String& tone) @@ -131,30 +95,39 @@ void RTCDTMFSender::didPlayTone(const String& tone) void RTCDTMFSender::stop() { m_stopped = true; - m_handler->setClient(0); } -void RTCDTMFSender::scheduleDispatchEvent(PassRefPtr<Event> event) +const char* RTCDTMFSender::activeDOMObjectName() const +{ + return "RTCDTMFSender"; +} + +bool RTCDTMFSender::canSuspendForDocumentSuspension() const +{ + // FIXME: We should try and do better here. + return false; +} + +void RTCDTMFSender::scheduleDispatchEvent(Ref<Event>&& event) { - m_scheduledEvents.append(event); + m_scheduledEvents.append(WTFMove(event)); if (!m_scheduledEventTimer.isActive()) m_scheduledEventTimer.startOneShot(0); } -void RTCDTMFSender::scheduledEventTimerFired(Timer<RTCDTMFSender>*) +void RTCDTMFSender::scheduledEventTimerFired() { if (m_stopped) return; - Vector<RefPtr<Event>> events; + Vector<Ref<Event>> events; events.swap(m_scheduledEvents); - Vector<RefPtr<Event>>::iterator it = events.begin(); - for (; it != events.end(); ++it) - dispatchEvent((*it).release()); + for (auto& event : events) + dispatchEvent(event); } } // namespace WebCore -#endif // ENABLE(MEDIA_STREAM) +#endif // ENABLE(WEB_RTC) |