⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 248282 in webkit


Ignore:
Timestamp:
Aug 5, 2019, 5:34:14 PM (7 years ago)
Author:
youenn@apple.com
Message:

Support RTCRtpSender.dtmf
https://bugs.webkit.org/show_bug.cgi?id=200431

Reviewed by Eric Carlson.

LayoutTests/imported/w3c:

  • web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https-expected.txt:
  • web-platform-tests/webrtc/RTCDTMFSender-ontonechange-long.https-expected.txt:
  • web-platform-tests/webrtc/RTCDTMFSender-ontonechange.https-expected.txt:

Source/WebCore:

Add a new backend interface to RTCDTMFSender and implementation of it using libwebrtc.
Update RTCDTMFSender to use that new backend and make RTCRtpSender return a RTCDTMFSender
conditionally on a newly added runtime flag.
Update RTCDTMFSender implementation based on https://w3c.github.io/webrtc-pc/#peer-to-peer-dtmf.

Covered by rebased tests.

  • Modules/mediastream/PeerConnectionBackend.cpp:

(WebCore::PeerConnectionBackend::context const):
(WebCore::PeerConnectionBackend::transceiverFromSender):

  • Modules/mediastream/PeerConnectionBackend.h:
  • Modules/mediastream/RTCDTMFSender.cpp:

(WebCore::RTCDTMFSender::RTCDTMFSender):
(WebCore::RTCDTMFSender::canInsertDTMF const):
(WebCore::RTCDTMFSender::toneBuffer const):
(WebCore::isToneCharacterInvalid):
(WebCore::RTCDTMFSender::insertDTMF):
(WebCore::RTCDTMFSender::playNextTone):
(WebCore::RTCDTMFSender::onTonePlayed):
(WebCore::RTCDTMFSender::toneTimerFired):
(WebCore::RTCDTMFSender::stop):
(WebCore::RTCDTMFSender::activeDOMObjectName const):
(WebCore::RTCDTMFSender::canSuspendForDocumentSuspension const):

  • Modules/mediastream/RTCDTMFSender.h:
  • Modules/mediastream/RTCDTMFSender.idl:
  • Modules/mediastream/RTCDTMFToneChangeEvent.cpp:
  • Modules/mediastream/RTCDTMFToneChangeEvent.h:
  • Modules/mediastream/RTCDTMFToneChangeEvent.idl:
  • Modules/mediastream/RTCRtpSender.cpp:

(WebCore::RTCRtpSender::dtmf):
(WebCore::RTCRtpSender::currentTransceiverDirection const):

  • Modules/mediastream/RTCRtpSender.h:
  • Modules/mediastream/RTCRtpSender.idl:
  • Modules/mediastream/RTCRtpSenderBackend.h:
  • Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp:

(WebCore::LibWebRTCRtpSenderBackend::createDTMFBackend):

  • Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h:
  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • dom/EventNames.in:
  • dom/EventTargetFactory.in:
  • page/RuntimeEnabledFeatures.h:

(WebCore::RuntimeEnabledFeatures::webRTCDTMFEnabled const):
(WebCore::RuntimeEnabledFeatures::setWebRTCDTMFEnabled):

  • platform/mediastream/RTCDTMFSenderBackend.h: Added.
  • platform/mediastream/RTCDTMFSenderHandler.h: Removed.
  • platform/mediastream/RTCDTMFSenderHandlerClient.h: Removed.
  • platform/mediastream/libwebrtc/LibWebRTCDTMFSenderBackend.cpp: Added.

(WebCore::toWTFString):
(WebCore::LibWebRTCDTMFSenderBackend::LibWebRTCDTMFSenderBackend):
(WebCore::LibWebRTCDTMFSenderBackend::~LibWebRTCDTMFSenderBackend):
(WebCore::LibWebRTCDTMFSenderBackend::canInsertDTMF):
(WebCore::LibWebRTCDTMFSenderBackend::playTone):
(WebCore::LibWebRTCDTMFSenderBackend::tones const):
(WebCore::LibWebRTCDTMFSenderBackend::duration const):
(WebCore::LibWebRTCDTMFSenderBackend::interToneGap const):
(WebCore::LibWebRTCDTMFSenderBackend::OnToneChange):
(WebCore::LibWebRTCDTMFSenderBackend::onTonePlayed):

  • platform/mediastream/libwebrtc/LibWebRTCDTMFSenderBackend.h: Added.

Source/WebKit:

  • Shared/WebPreferences.yaml:
Location:
trunk
Files:
1 added
2 deleted
26 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r247788 r248282  
     12019-08-05  Youenn Fablet  <youenn@apple.com>
     2
     3        Support RTCRtpSender.dtmf
     4        https://bugs.webkit.org/show_bug.cgi?id=200431
     5
     6        Reviewed by Eric Carlson.
     7
     8        * web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https-expected.txt:
     9        * web-platform-tests/webrtc/RTCDTMFSender-ontonechange-long.https-expected.txt:
     10        * web-platform-tests/webrtc/RTCDTMFSender-ontonechange.https-expected.txt:
     11
    1122019-07-24  Alicia Boya García  <aboya@igalia.com>
    213
  • trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https-expected.txt

    r237773 r248282  
    11
    2 FAIL insertDTMF() should succeed if tones contains valid DTMF characters promise_test: Unhandled rejection with value: object "ReferenceError: Can't find variable: RTCDTMFSender"
    3 FAIL insertDTMF() should throw InvalidCharacterError if tones contains invalid DTMF characters promise_test: Unhandled rejection with value: object "ReferenceError: Can't find variable: RTCDTMFSender"
    4 FAIL insertDTMF() should throw InvalidStateError if transceiver is stopped assert_throws: function "() => dtmfSender.insertDTMF('')" threw object "TypeError: undefined is not an object (evaluating 'dtmfSender.insertDTMF')" that is not a DOMException InvalidStateError: property "code" is equal to undefined, expected 11
    5 FAIL insertDTMF() should throw InvalidStateError if transceiver.currentDirection is recvonly assert_throws: function "() => dtmfSender.insertDTMF('')" threw object "TypeError: undefined is not an object (evaluating 'dtmfSender.insertDTMF')" that is not a DOMException InvalidStateError: property "code" is equal to undefined, expected 11
    6 FAIL insertDTMF() should throw InvalidStateError if transceiver.currentDirection is inactive assert_throws: function "() => dtmfSender.insertDTMF('')" threw object "TypeError: undefined is not an object (evaluating 'dtmfSender.insertDTMF')" that is not a DOMException InvalidStateError: property "code" is equal to undefined, expected 11
    7 FAIL insertDTMF() should set toneBuffer to provided tones normalized, with old tones overridden promise_test: Unhandled rejection with value: object "ReferenceError: Can't find variable: RTCDTMFSender"
    8 FAIL insertDTMF() after remove and close should reject assert_throws: function "() =>
    9                       dtmfSender.insertDTMF('123')" threw object "TypeError: undefined is not an object (evaluating 'dtmfSender.insertDTMF')" that is not a DOMException InvalidStateError: property "code" is equal to undefined, expected 11
     2PASS insertDTMF() should succeed if tones contains valid DTMF characters
     3PASS insertDTMF() should throw InvalidCharacterError if tones contains invalid DTMF characters
     4PASS insertDTMF() should throw InvalidStateError if transceiver is stopped
     5PASS insertDTMF() should throw InvalidStateError if transceiver.currentDirection is recvonly
     6PASS insertDTMF() should throw InvalidStateError if transceiver.currentDirection is inactive
     7PASS insertDTMF() should set toneBuffer to provided tones normalized, with old tones overridden
     8PASS insertDTMF() after remove and close should reject
    109
  • trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCDTMFSender-ontonechange-long.https-expected.txt

    r223327 r248282  
    11
    2 FAIL insertDTMF with duration greater than 6000 should be clamped to 6000 assert_unreached: Unexpected promise rejection: ReferenceError: Can't find variable: RTCDTMFSender Reached unreachable code
     2PASS insertDTMF with duration greater than 6000 should be clamped to 6000
    33
  • trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCDTMFSender-ontonechange.https-expected.txt

    r237773 r248282  
    11
    2 FAIL insertDTMF() with default duration and intertoneGap should fire tonechange events at the expected time assert_unreached: Unexpected promise rejection: ReferenceError: Can't find variable: RTCDTMFSender Reached unreachable code
    3 FAIL insertDTMF() with explicit duration and intertoneGap should fire tonechange events at the expected time assert_unreached: Unexpected promise rejection: ReferenceError: Can't find variable: RTCDTMFSender Reached unreachable code
    4 FAIL insertDTMF('') should not fire any tonechange event, including for '' tone assert_unreached: Unexpected promise rejection: ReferenceError: Can't find variable: RTCDTMFSender Reached unreachable code
    5 FAIL insertDTMF() with duration less than 40 should be clamped to 40 assert_unreached: Unexpected promise rejection: ReferenceError: Can't find variable: RTCDTMFSender Reached unreachable code
    6 FAIL insertDTMF() with interToneGap less than 30 should be clamped to 30 assert_unreached: Unexpected promise rejection: ReferenceError: Can't find variable: RTCDTMFSender Reached unreachable code
    7 FAIL insertDTMF with comma should delay next tonechange event for a constant 2000ms assert_unreached: Unexpected promise rejection: ReferenceError: Can't find variable: RTCDTMFSender Reached unreachable code
    8 FAIL insertDTMF() with transceiver stopped in the middle should stop future tonechange events from firing assert_unreached: Unexpected promise rejection: ReferenceError: Can't find variable: RTCDTMFSender Reached unreachable code
    9 FAIL Calling insertDTMF() in the middle of tonechange events should cause future tonechanges to be updated to new tones assert_unreached: Unexpected promise rejection: ReferenceError: Can't find variable: RTCDTMFSender Reached unreachable code
    10 FAIL Calling insertDTMF() multiple times in the middle of tonechange events should cause future tonechanges to be updated the last provided tones assert_unreached: Unexpected promise rejection: ReferenceError: Can't find variable: RTCDTMFSender Reached unreachable code
    11 FAIL Calling insertDTMF('') in the middle of tonechange events should stop future tonechange events from firing assert_unreached: Unexpected promise rejection: ReferenceError: Can't find variable: RTCDTMFSender Reached unreachable code
    12 FAIL Setting transceiver.currentDirection to recvonly in the middle of tonechange events should stop future tonechange events from firing undefined is not an object (evaluating 'dtmfSender.addEventListener')
    13 FAIL Tone change event constructor works Can't find variable: RTCDTMFToneChangeEvent
    14 FAIL Tone change event with unexpected name should not crash Can't find variable: RTCDTMFToneChangeEvent
     2PASS insertDTMF() with default duration and intertoneGap should fire tonechange events at the expected time
     3PASS insertDTMF() with explicit duration and intertoneGap should fire tonechange events at the expected time
     4PASS insertDTMF('') should not fire any tonechange event, including for '' tone
     5PASS insertDTMF() with duration less than 40 should be clamped to 40
     6PASS insertDTMF() with interToneGap less than 30 should be clamped to 30
     7PASS insertDTMF with comma should delay next tonechange event for a constant 2000ms
     8PASS insertDTMF() with transceiver stopped in the middle should stop future tonechange events from firing
     9PASS Calling insertDTMF() in the middle of tonechange events should cause future tonechanges to be updated to new tones
     10PASS Calling insertDTMF() multiple times in the middle of tonechange events should cause future tonechanges to be updated the last provided tones
     11PASS Calling insertDTMF('') in the middle of tonechange events should stop future tonechange events from firing
     12FAIL Setting transceiver.currentDirection to recvonly in the middle of tonechange events should stop future tonechange events from firing Cannot insert DTMF
     13PASS Tone change event constructor works
     14PASS Tone change event with unexpected name should not crash
    1515
  • trunk/Source/WebCore/ChangeLog

    r248280 r248282  
     12019-08-05  Youenn Fablet  <youenn@apple.com>
     2
     3        Support RTCRtpSender.dtmf
     4        https://bugs.webkit.org/show_bug.cgi?id=200431
     5
     6        Reviewed by Eric Carlson.
     7
     8        Add a new backend interface to RTCDTMFSender and implementation of it using libwebrtc.
     9        Update RTCDTMFSender to use that new backend and make RTCRtpSender return a RTCDTMFSender
     10        conditionally on a newly added runtime flag.
     11        Update RTCDTMFSender implementation based on https://w3c.github.io/webrtc-pc/#peer-to-peer-dtmf.
     12
     13        Covered by rebased tests.
     14
     15        * Modules/mediastream/PeerConnectionBackend.cpp:
     16        (WebCore::PeerConnectionBackend::context const):
     17        (WebCore::PeerConnectionBackend::transceiverFromSender):
     18        * Modules/mediastream/PeerConnectionBackend.h:
     19        * Modules/mediastream/RTCDTMFSender.cpp:
     20        (WebCore::RTCDTMFSender::RTCDTMFSender):
     21        (WebCore::RTCDTMFSender::canInsertDTMF const):
     22        (WebCore::RTCDTMFSender::toneBuffer const):
     23        (WebCore::isToneCharacterInvalid):
     24        (WebCore::RTCDTMFSender::insertDTMF):
     25        (WebCore::RTCDTMFSender::playNextTone):
     26        (WebCore::RTCDTMFSender::onTonePlayed):
     27        (WebCore::RTCDTMFSender::toneTimerFired):
     28        (WebCore::RTCDTMFSender::stop):
     29        (WebCore::RTCDTMFSender::activeDOMObjectName const):
     30        (WebCore::RTCDTMFSender::canSuspendForDocumentSuspension const):
     31        * Modules/mediastream/RTCDTMFSender.h:
     32        * Modules/mediastream/RTCDTMFSender.idl:
     33        * Modules/mediastream/RTCDTMFToneChangeEvent.cpp:
     34        * Modules/mediastream/RTCDTMFToneChangeEvent.h:
     35        * Modules/mediastream/RTCDTMFToneChangeEvent.idl:
     36        * Modules/mediastream/RTCRtpSender.cpp:
     37        (WebCore::RTCRtpSender::dtmf):
     38        (WebCore::RTCRtpSender::currentTransceiverDirection const):
     39        * Modules/mediastream/RTCRtpSender.h:
     40        * Modules/mediastream/RTCRtpSender.idl:
     41        * Modules/mediastream/RTCRtpSenderBackend.h:
     42        * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp:
     43        (WebCore::LibWebRTCRtpSenderBackend::createDTMFBackend):
     44        * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h:
     45        * Sources.txt:
     46        * WebCore.xcodeproj/project.pbxproj:
     47        * dom/EventNames.in:
     48        * dom/EventTargetFactory.in:
     49        * page/RuntimeEnabledFeatures.h:
     50        (WebCore::RuntimeEnabledFeatures::webRTCDTMFEnabled const):
     51        (WebCore::RuntimeEnabledFeatures::setWebRTCDTMFEnabled):
     52        * platform/mediastream/RTCDTMFSenderBackend.h: Added.
     53        * platform/mediastream/RTCDTMFSenderHandler.h: Removed.
     54        * platform/mediastream/RTCDTMFSenderHandlerClient.h: Removed.
     55        * platform/mediastream/libwebrtc/LibWebRTCDTMFSenderBackend.cpp: Added.
     56        (WebCore::toWTFString):
     57        (WebCore::LibWebRTCDTMFSenderBackend::LibWebRTCDTMFSenderBackend):
     58        (WebCore::LibWebRTCDTMFSenderBackend::~LibWebRTCDTMFSenderBackend):
     59        (WebCore::LibWebRTCDTMFSenderBackend::canInsertDTMF):
     60        (WebCore::LibWebRTCDTMFSenderBackend::playTone):
     61        (WebCore::LibWebRTCDTMFSenderBackend::tones const):
     62        (WebCore::LibWebRTCDTMFSenderBackend::duration const):
     63        (WebCore::LibWebRTCDTMFSenderBackend::interToneGap const):
     64        (WebCore::LibWebRTCDTMFSenderBackend::OnToneChange):
     65        (WebCore::LibWebRTCDTMFSenderBackend::onTonePlayed):
     66        * platform/mediastream/libwebrtc/LibWebRTCDTMFSenderBackend.h: Added.
     67
    1682019-08-05  Saam Barati  <sbarati@apple.com>
    269
  • trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp

    r247430 r248282  
    562562}
    563563
     564ScriptExecutionContext* PeerConnectionBackend::context() const
     565{
     566    return m_peerConnection.scriptExecutionContext();
     567}
     568
     569RTCRtpTransceiver* PeerConnectionBackend::transceiverFromSender(const RTCRtpSender& sender)
     570{
     571    for (auto& transceiver : m_peerConnection.currentTransceivers()) {
     572        if (&transceiver->sender() == &sender)
     573            return transceiver.get();
     574    }
     575    return nullptr;
     576}
     577
    564578#if !RELEASE_LOG_DISABLED
    565579WTFLogChannel& PeerConnectionBackend::logChannel() const
  • trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h

    r244736 r248282  
    170170    virtual void collectTransceivers() { };
    171171
     172    ScriptExecutionContext* context() const;
     173    RTCRtpTransceiver* transceiverFromSender(const RTCRtpSender&);
     174
    172175protected:
    173176    void fireICECandidateEvent(RefPtr<RTCIceCandidate>&&, String&& url);
  • trunk/Source/WebCore/Modules/mediastream/RTCDTMFSender.cpp

    r243887 r248282  
    2727#include "RTCDTMFSender.h"
    2828
    29 #if ENABLE(WEB_RTC_DTMF)
     29#if ENABLE(WEB_RTC)
    3030
    31 #include "MediaStreamTrack.h"
    32 #include "RTCDTMFSenderHandler.h"
     31#include "RTCDTMFSenderBackend.h"
    3332#include "RTCDTMFToneChangeEvent.h"
    3433#include "ScriptExecutionContext.h"
     
    3938WTF_MAKE_ISO_ALLOCATED_IMPL(RTCDTMFSender);
    4039
    41 static const long minToneDurationMs = 40;
    42 static const long defaultToneDurationMs = 100;
    43 static const long maxToneDurationMs = 6000;
    44 static const long minInterToneGapMs = 30;
    45 static const long defaultInterToneGapMs = 70;
     40static const unsigned long minToneDurationMs = 40;
     41static const unsigned long maxToneDurationMs = 6000;
     42static const unsigned long minInterToneGapMs = 30;
    4643
    47 RTCDTMFSender::RTCDTMFSender(ScriptExecutionContext& context, RefPtr<MediaStreamTrack>&& track)
     44RTCDTMFSender::RTCDTMFSender(ScriptExecutionContext& context, RTCRtpSender& sender, std::unique_ptr<RTCDTMFSenderBackend>&& backend)
    4845    : ActiveDOMObject(&context)
    49     , m_track(WTFMove(track))
    50     , m_duration(defaultToneDurationMs)
    51     , m_interToneGap(defaultInterToneGapMs)
    52     , m_stopped(false)
    53     , m_scheduledEventTimer(*this, &RTCDTMFSender::scheduledEventTimerFired)
     46    , m_toneTimer(*this, &RTCDTMFSender::toneTimerFired)
     47    , m_sender(makeWeakPtr(sender))
     48    , m_backend(WTFMove(backend))
    5449{
     50    m_backend->onTonePlayed([this](const String&) {
     51        onTonePlayed();
     52    });
     53    suspendIfNeeded();
    5554}
    5655
     
    5958bool RTCDTMFSender::canInsertDTMF() const
    6059{
    61     return false;
    62 }
     60    if (!m_sender || m_sender->isStopped())
     61        return false;
    6362
    64 MediaStreamTrack* RTCDTMFSender::track() const
    65 {
    66     return m_track.get();
     63    auto currentDirection = m_sender->currentTransceiverDirection();
     64    if (!currentDirection)
     65        return false;
     66    if (*currentDirection != RTCRtpTransceiverDirection::Sendrecv && *currentDirection != RTCRtpTransceiverDirection::Sendonly)
     67        return false;
     68
     69    return m_backend && m_backend->canInsertDTMF();
    6770}
    6871
    6972String RTCDTMFSender::toneBuffer() const
    7073{
     74    return m_tones;
     75}
     76
     77static inline bool isToneCharacterInvalid(UChar character)
     78{
     79    if (character >= '0' && character <= '9')
     80        return false;
     81    if (character >= 'A' && character <= 'D')
     82        return false;
     83    return character != '#' && character != '*' && character != ',';
     84}
     85
     86ExceptionOr<void> RTCDTMFSender::insertDTMF(const String& tones, size_t duration, size_t interToneGap)
     87{
     88    if (!canInsertDTMF())
     89        return Exception { InvalidStateError, "Cannot insert DTMF"_s };
     90
     91    auto normalizedTones = tones.convertToUppercaseWithoutLocale();
     92    if (normalizedTones.find(isToneCharacterInvalid) != notFound)
     93        return Exception { InvalidCharacterError, "Tones are not valid"_s };
     94
     95    m_tones = WTFMove(normalizedTones);
     96    m_duration = clampTo(duration, minToneDurationMs, maxToneDurationMs);
     97    m_interToneGap = std::max(interToneGap, minInterToneGapMs);
     98
     99    if (m_tones.isEmpty() || m_isPendingPlayoutTask)
     100        return { };
     101
     102    m_isPendingPlayoutTask = true;
     103    scriptExecutionContext()->postTask([this, protectedThis = makeRef(*this)](auto&) {
     104        playNextTone();
     105    });
    71106    return { };
    72107}
    73108
    74 ExceptionOr<void> RTCDTMFSender::insertDTMF(const String&, Optional<int> duration, Optional<int> interToneGap)
     109void RTCDTMFSender::playNextTone()
    75110{
    76     if (!canInsertDTMF())
    77         return Exception { NotSupportedError };
     111    if (m_tones.isEmpty()) {
     112        m_isPendingPlayoutTask = false;
     113        dispatchEvent(RTCDTMFToneChangeEvent::create({ }));
     114        return;
     115    }
    78116
    79     if (duration && (duration.value() > maxToneDurationMs || duration.value() < minToneDurationMs))
    80         return Exception { SyntaxError };
     117    if (!canInsertDTMF()) {
     118        m_isPendingPlayoutTask = false;
     119        return;
     120    }
    81121
    82     if (interToneGap && interToneGap.value() < minInterToneGapMs)
    83         return Exception { SyntaxError };
     122    auto currentTone = m_tones.substring(0, 1);
     123    m_tones.remove(0);
    84124
    85     m_duration = duration.valueOr(defaultToneDurationMs);
    86     m_interToneGap = interToneGap.valueOr(defaultInterToneGapMs);
    87 
    88     return Exception { SyntaxError };
     125    m_backend->playTone(currentTone, m_duration, m_interToneGap);
     126    dispatchEvent(RTCDTMFToneChangeEvent::create(currentTone));
    89127}
    90128
    91 void RTCDTMFSender::didPlayTone(const String& tone)
     129void RTCDTMFSender::onTonePlayed()
    92130{
    93     scheduleDispatchEvent(RTCDTMFToneChangeEvent::create(tone));
     131    m_toneTimer.startOneShot(1_ms * m_interToneGap);
     132}
     133
     134void RTCDTMFSender::toneTimerFired()
     135{
     136    playNextTone();
    94137}
    95138
    96139void RTCDTMFSender::stop()
    97140{
    98     m_stopped = true;
     141    m_backend = nullptr;
     142    m_toneTimer.stop();
    99143}
    100144
     
    106150bool RTCDTMFSender::canSuspendForDocumentSuspension() const
    107151{
    108     // FIXME: We should try and do better here.
    109     return false;
    110 }
    111 
    112 void RTCDTMFSender::scheduleDispatchEvent(Ref<Event>&& event)
    113 {
    114     m_scheduledEvents.append(WTFMove(event));
    115 
    116     if (!m_scheduledEventTimer.isActive())
    117         m_scheduledEventTimer.startOneShot(0_s);
    118 }
    119 
    120 void RTCDTMFSender::scheduledEventTimerFired()
    121 {
    122     if (m_stopped)
    123         return;
    124 
    125     Vector<Ref<Event>> events;
    126     events.swap(m_scheduledEvents);
    127 
    128     for (auto& event : events)
    129         dispatchEvent(event);
     152    return !m_sender || m_sender->isStopped();
    130153}
    131154
  • trunk/Source/WebCore/Modules/mediastream/RTCDTMFSender.h

    r243887 r248282  
    2626#pragma once
    2727
    28 #if ENABLE(WEB_RTC_DTMF)
     28#if ENABLE(WEB_RTC)
    2929
    3030#include "ActiveDOMObject.h"
     
    3737
    3838class MediaStreamTrack;
     39class RTCDTMFSenderBackend;
     40class RTCRtpSender;
    3941
    4042class RTCDTMFSender final : public RefCounted<RTCDTMFSender>, public EventTargetWithInlineData, public ActiveDOMObject {
    4143    WTF_MAKE_ISO_ALLOCATED(RTCDTMFSender);
    4244public:
     45    static Ref<RTCDTMFSender> create(ScriptExecutionContext& context, RTCRtpSender& sender, std::unique_ptr<RTCDTMFSenderBackend>&& backend) { return adoptRef(* new RTCDTMFSender(context, sender, WTFMove(backend))); }
    4346    virtual ~RTCDTMFSender();
    4447
    4548    bool canInsertDTMF() const;
    46     MediaStreamTrack* track() const;
    4749    String toneBuffer() const;
    48     int duration() const { return m_duration; }
    49     int interToneGap() const { return m_interToneGap; }
    5050
    51     ExceptionOr<void> insertDTMF(const String& tones, Optional<int> duration, Optional<int> interToneGap);
     51    ExceptionOr<void> insertDTMF(const String& tones, size_t duration, size_t interToneGap);
    5252
    5353    using RefCounted::ref;
     
    5555
    5656private:
    57     RTCDTMFSender(ScriptExecutionContext&, RefPtr<MediaStreamTrack>&&);
     57    RTCDTMFSender(ScriptExecutionContext&, RTCRtpSender&, std::unique_ptr<RTCDTMFSenderBackend>&&);
    5858
    5959    void stop() final;
     
    6767    void derefEventTarget() final { deref(); }
    6868
    69     void didPlayTone(const String&);
     69    bool isStopped() const { return !m_sender; }
    7070
    71     void scheduleDispatchEvent(Ref<Event>&&);
    72     void scheduledEventTimerFired();
     71    void playNextTone();
     72    void onTonePlayed();
     73    void toneTimerFired();
    7374
    74     RefPtr<MediaStreamTrack> m_track;
    75     int m_duration;
    76     int m_interToneGap;
    77 
    78     bool m_stopped;
    79 
    80     Timer m_scheduledEventTimer;
    81     Vector<Ref<Event>> m_scheduledEvents;
     75    Timer m_toneTimer;
     76    WeakPtr<RTCRtpSender> m_sender;
     77    std::unique_ptr<RTCDTMFSenderBackend> m_backend;
     78    String m_tones;
     79    size_t m_duration;
     80    size_t m_interToneGap;
     81    bool m_isPendingPlayoutTask { false };
    8282};
    8383
  • trunk/Source/WebCore/Modules/mediastream/RTCDTMFSender.idl

    r217194 r248282  
    2727[
    2828    ActiveDOMObject,
    29     Conditional=WEB_RTC_DTMF,
     29    Conditional=WEB_RTC,
    3030    EnabledAtRuntime=PeerConnection,
    3131] interface RTCDTMFSender : EventTarget {
    32     // FIXME 169662: change to unsigned long with defaults
    33     [MayThrowException] void insertDTMF(DOMString tones, optional long duration, optional long interToneGap);
     32    [MayThrowException] void insertDTMF(DOMString tones, optional unsigned long duration = 100, optional unsigned long interToneGap = 70);
    3433    attribute EventHandler ontonechange;
     34
     35    readonly attribute boolean canInsertDTMF;
    3536    readonly attribute DOMString toneBuffer;
    36 
    37     // Legacy
    38     // FIXME 169662: remove
    39     readonly attribute boolean canInsertDTMF;
    40     // FIXME 169662: remove
    41     readonly attribute MediaStreamTrack track;
    42     // FIXME 169662: remove
    43     readonly attribute long duration;
    44     // FIXME 169662: remove
    45     readonly attribute long interToneGap;
    4637};
  • trunk/Source/WebCore/Modules/mediastream/RTCDTMFToneChangeEvent.cpp

    r246490 r248282  
    2727#include "RTCDTMFToneChangeEvent.h"
    2828
    29 #if ENABLE(WEB_RTC_DTMF)
     29#if ENABLE(WEB_RTC)
    3030
    3131#include "EventNames.h"
  • trunk/Source/WebCore/Modules/mediastream/RTCDTMFToneChangeEvent.h

    r246490 r248282  
    2626#pragma once
    2727
    28 #if ENABLE(WEB_RTC_DTMF)
     28#if ENABLE(WEB_RTC)
    2929
    3030#include "Event.h"
  • trunk/Source/WebCore/Modules/mediastream/RTCDTMFToneChangeEvent.idl

    r214536 r248282  
    2626
    2727[
    28     Conditional=WEB_RTC_DTMF,
     28    Conditional=WEB_RTC,
    2929    Constructor(DOMString type, optional RTCDTMFToneChangeEventInit eventInitDict),
    3030    EnabledAtRuntime=PeerConnection,
     
    3434
    3535[
    36     Conditional=WEB_RTC_DTMF,
     36    Conditional=WEB_RTC,
    3737    EnabledAtRuntime=PeerConnection
    3838] dictionary RTCDTMFToneChangeEventInit : EventInit {
    39     required DOMString tone;
     39    DOMString tone;
    4040};
  • trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp

    r243887 r248282  
    3434#if ENABLE(WEB_RTC)
    3535
     36#include "RTCDTMFSender.h"
     37#include "RTCDTMFSenderBackend.h"
    3638#include "RTCRtpCapabilities.h"
    3739#include "RuntimeEnabledFeatures.h"
     
    6264    ASSERT(!RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled() || m_backend);
    6365}
     66
     67RTCRtpSender::~RTCRtpSender() = default;
    6468
    6569void RTCRtpSender::setTrackToNull()
     
    136140}
    137141
     142RTCDTMFSender* RTCRtpSender::dtmf()
     143{
     144    if (!m_dtmfSender && m_connection && m_connection->context() && m_backend)
     145        m_dtmfSender = RTCDTMFSender::create(*m_connection->context(), *this, m_backend->createDTMFBackend());
     146
     147    return m_dtmfSender.get();
     148}
     149
     150Optional<RTCRtpTransceiverDirection> RTCRtpSender::currentTransceiverDirection() const
     151{
     152    if (!m_connection)
     153        return { };
     154
     155    auto* transceiver = m_connection->transceiverFromSender(*this);
     156    if (!transceiver)
     157        return { };
     158
     159    return transceiver->currentDirection();
     160}
     161
    138162} // namespace WebCore
    139163
  • trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h

    r243887 r248282  
    3636#include "PeerConnectionBackend.h"
    3737#include "RTCRtpSenderBackend.h"
     38#include "RTCRtpTransceiverDirection.h"
    3839#include "ScriptWrappable.h"
     40#include <wtf/WeakPtr.h>
    3941
    4042namespace WebCore {
    4143
    4244class PeerConnectionBackend;
     45class RTCDTMFSender;
    4346struct RTCRtpCapabilities;
    4447
    45 class RTCRtpSender final : public RefCounted<RTCRtpSender>, public ScriptWrappable {
     48class RTCRtpSender final : public RefCounted<RTCRtpSender>, public ScriptWrappable, public CanMakeWeakPtr<RTCRtpSender> {
    4649    WTF_MAKE_ISO_ALLOCATED(RTCRtpSender);
    4750public:
    4851    static Ref<RTCRtpSender> create(PeerConnectionBackend&, Ref<MediaStreamTrack>&&, Vector<String>&& mediaStreamIds, std::unique_ptr<RTCRtpSenderBackend>&&);
    4952    static Ref<RTCRtpSender> create(PeerConnectionBackend&, String&& trackKind, Vector<String>&& mediaStreamIds, std::unique_ptr<RTCRtpSenderBackend>&&);
     53    ~RTCRtpSender();
    5054
    5155    static Optional<RTCRtpCapabilities> getCapabilities(ScriptExecutionContext&, const String& kind);
     
    7579    bool isCreatedBy(const PeerConnectionBackend&) const;
    7680
     81    RTCDTMFSender* dtmf();
     82    Optional<RTCRtpTransceiverDirection> currentTransceiverDirection() const;
     83
    7784private:
    7885    RTCRtpSender(PeerConnectionBackend&, String&& trackKind, Vector<String>&& mediaStreamIds, std::unique_ptr<RTCRtpSenderBackend>&&);
     
    8491    std::unique_ptr<RTCRtpSenderBackend> m_backend;
    8592    WeakPtr<PeerConnectionBackend> m_connection;
     93    RefPtr<RTCDTMFSender> m_dtmfSender;
    8694};
    8795
  • trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.idl

    r237911 r248282  
    4444    [CallWith=ScriptExecutionContext] Promise<void> replaceTrack(MediaStreamTrack? withTrack);
    4545    Promise<RTCStatsReport> getStats();
     46
     47    [Conditional=WEB_RTC, EnabledAtRuntime=WebRTCDTMF] readonly attribute RTCDTMFSender? dtmf;
    4648};
  • trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h

    r235973 r248282  
    3232
    3333class MediaStreamTrack;
     34class RTCDTMFSenderBackend;
    3435class RTCRtpSender;
    3536struct RTCRtpSendParameters;
     
    4142    virtual RTCRtpSendParameters getParameters() const = 0;
    4243    virtual void setParameters(const RTCRtpSendParameters&, DOMPromiseDeferred<void>&&) = 0;
     44    virtual std::unique_ptr<RTCDTMFSenderBackend> createDTMFBackend() = 0;
    4345    virtual ~RTCRtpSenderBackend() = default;
    4446};
  • trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp

    r239427 r248282  
    2828#if ENABLE(WEB_RTC) && USE(LIBWEBRTC)
    2929
     30#include "LibWebRTCDTMFSenderBackend.h"
    3031#include "LibWebRTCPeerConnectionBackend.h"
    3132#include "LibWebRTCUtils.h"
     
    146147}
    147148
     149std::unique_ptr<RTCDTMFSenderBackend> LibWebRTCRtpSenderBackend::createDTMFBackend()
     150{
     151    return std::make_unique<LibWebRTCDTMFSenderBackend>(m_rtcSender->GetDtmfSender());
     152}
     153
    148154} // namespace WebCore
    149155
  • trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h

    r241183 r248282  
    112112    RTCRtpSendParameters getParameters() const final;
    113113    void setParameters(const RTCRtpSendParameters&, DOMPromiseDeferred<void>&&) final;
     114    std::unique_ptr<RTCDTMFSenderBackend> createDTMFBackend() final;
    114115
    115116    WeakPtr<LibWebRTCPeerConnectionBackend> m_peerConnectionBackend;
  • trunk/Source/WebCore/Sources.txt

    r248200 r248282  
    19321932
    19331933platform/mediastream/libwebrtc/LibWebRTCProvider.cpp
     1934platform/mediastream/libwebrtc/LibWebRTCDTMFSenderBackend.cpp
    19341935
    19351936platform/mock/DeviceOrientationClientMock.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r248266 r248282  
    167167                078E093C17D16E1C00420AA1 /* RTCDataChannelHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 07221BA217CF0AD400848E51 /* RTCDataChannelHandler.h */; settings = {ATTRIBUTES = (Private, ); }; };
    168168                078E093D17D16E1C00420AA1 /* RTCDataChannelHandlerClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 07221BA317CF0AD400848E51 /* RTCDataChannelHandlerClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    169                 078E093E17D16E1C00420AA1 /* RTCDTMFSenderHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 07221BA417CF0AD400848E51 /* RTCDTMFSenderHandler.h */; settings = {ATTRIBUTES = (Private, ); }; };
    170                 078E093F17D16E1C00420AA1 /* RTCDTMFSenderHandlerClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 07221BA517CF0AD400848E51 /* RTCDTMFSenderHandlerClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    171169                078E094017D16E1C00420AA1 /* RTCIceCandidateDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 07221BA717CF0AD400848E51 /* RTCIceCandidateDescriptor.h */; settings = {ATTRIBUTES = (Private, ); }; };
    172170                078E094217D16E1C00420AA1 /* RTCPeerConnectionHandlerClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 07221BAA17CF0AD400848E51 /* RTCPeerConnectionHandlerClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    53155313                07221BA217CF0AD400848E51 /* RTCDataChannelHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCDataChannelHandler.h; sourceTree = "<group>"; };
    53165314                07221BA317CF0AD400848E51 /* RTCDataChannelHandlerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCDataChannelHandlerClient.h; sourceTree = "<group>"; };
    5317                 07221BA417CF0AD400848E51 /* RTCDTMFSenderHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCDTMFSenderHandler.h; sourceTree = "<group>"; };
    5318                 07221BA517CF0AD400848E51 /* RTCDTMFSenderHandlerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCDTMFSenderHandlerClient.h; sourceTree = "<group>"; };
    53195315                07221BA617CF0AD400848E51 /* RTCIceCandidateDescriptor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RTCIceCandidateDescriptor.cpp; sourceTree = "<group>"; };
    53205316                07221BA717CF0AD400848E51 /* RTCIceCandidateDescriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCIceCandidateDescriptor.h; sourceTree = "<group>"; };
     
    73937389                41F1D21D0EF35C2A00DA8753 /* ScriptCachedFrameData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptCachedFrameData.h; sourceTree = "<group>"; };
    73947390                41F1D21E0EF35C2A00DA8753 /* ScriptCachedFrameData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptCachedFrameData.cpp; sourceTree = "<group>"; };
     7391                41F2354422F5503300B4FCDB /* RTCDTMFSenderBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCDTMFSenderBackend.h; sourceTree = "<group>"; };
     7392                41F2354522F550BE00B4FCDB /* LibWebRTCDTMFSenderBackend.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCDTMFSenderBackend.cpp; path = libwebrtc/LibWebRTCDTMFSenderBackend.cpp; sourceTree = "<group>"; };
     7393                41F2354622F550BF00B4FCDB /* LibWebRTCDTMFSenderBackend.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LibWebRTCDTMFSenderBackend.h; path = libwebrtc/LibWebRTCDTMFSenderBackend.h; sourceTree = "<group>"; };
    73957394                41F54F7D1C50C4F600338488 /* FetchBody.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FetchBody.cpp; sourceTree = "<group>"; };
    73967395                41F54F7E1C50C4F600338488 /* FetchBody.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FetchBody.h; sourceTree = "<group>"; };
     
    1584615845                                07221BA317CF0AD400848E51 /* RTCDataChannelHandlerClient.h */,
    1584715846                                316DE7011E83AE1D0084C261 /* RTCDataChannelState.h */,
    15848                                 07221BA417CF0AD400848E51 /* RTCDTMFSenderHandler.h */,
    15849                                 07221BA517CF0AD400848E51 /* RTCDTMFSenderHandlerClient.h */,
     15847                                41F2354422F5503300B4FCDB /* RTCDTMFSenderBackend.h */,
    1585015848                                07221BA617CF0AD400848E51 /* RTCIceCandidateDescriptor.cpp */,
    1585115849                                07221BA717CF0AD400848E51 /* RTCIceCandidateDescriptor.h */,
     
    1765917657                                415080341E3F00AA0051D75D /* LibWebRTCAudioModule.cpp */,
    1766017658                                415080351E3F00AA0051D75D /* LibWebRTCAudioModule.h */,
     17659                                41F2354522F550BE00B4FCDB /* LibWebRTCDTMFSenderBackend.cpp */,
     17660                                41F2354622F550BF00B4FCDB /* LibWebRTCDTMFSenderBackend.h */,
    1766117661                                415747431E38699E00E914D8 /* LibWebRTCMacros.h */,
    1766217662                                41A1B00D1E52656E007F3769 /* LibWebRTCProvider.cpp */,
     
    3132631326                                316DE7021E83AE1D0084C261 /* RTCDataChannelState.h in Headers */,
    3132731327                                078E092017D14D1C00420AA1 /* RTCDTMFSender.h in Headers */,
    31328                                 078E093E17D16E1C00420AA1 /* RTCDTMFSenderHandler.h in Headers */,
    31329                                 078E093F17D16E1C00420AA1 /* RTCDTMFSenderHandlerClient.h in Headers */,
    3133031328                                078E092117D14D1C00420AA1 /* RTCDTMFToneChangeEvent.h in Headers */,
    3133131329                                078E092317D14D1C00420AA1 /* RTCIceCandidate.h in Headers */,
  • trunk/Source/WebCore/dom/EventNames.in

    r244582 r248282  
    5757RTCPeerConnectionIceEvent conditional=WEB_RTC
    5858RTCDataChannelEvent conditional=WEB_RTC
    59 RTCDTMFToneChangeEvent conditional=WEB_RTC_DTMF
     59RTCDTMFToneChangeEvent conditional=WEB_RTC
    6060RTCPeerConnectionIceEvent conditional=WEB_RTC
    6161RTCTrackEvent conditional=WEB_RTC
  • trunk/Source/WebCore/dom/EventTargetFactory.in

    r237766 r248282  
    3434Performance
    3535RTCDataChannel conditional=WEB_RTC
    36 RTCDTMFSender conditional=WEB_RTC_DTMF
     36RTCDTMFSender conditional=WEB_RTC
    3737RTCPeerConnection conditional=WEB_RTC
    3838ServiceWorker conditional=SERVICE_WORKER
  • trunk/Source/WebCore/page/RuntimeEnabledFeatures.h

    r247527 r248282  
    224224
    225225#if ENABLE(WEB_RTC)
     226    bool webRTCDTMFEnabled() const { return m_isWebRTCDTMFEnabled; }
     227    void setWebRTCDTMFEnabled(bool isEnabled) { m_isWebRTCDTMFEnabled = isEnabled; }
    226228    bool webRTCVP8CodecEnabled() const { return m_isWebRTCVP8CodecEnabled; }
    227229    void setWebRTCVP8CodecEnabled(bool isEnabled) { m_isWebRTCVP8CodecEnabled = isEnabled; }
     
    449451
    450452#if ENABLE(WEB_RTC)
     453    bool m_isWebRTCDTMFEnabled { true };
    451454    bool m_isWebRTCVP8CodecEnabled { true };
    452455    bool m_isWebRTCUnifiedPlanEnabled { true };
  • trunk/Source/WebCore/platform/mediastream/RTCDTMFSenderBackend.h

    r248281 r248282  
    11/*
    2  * Copyright (C) 2018 Apple Inc.
     2 * Copyright (C) 2019 Apple Inc.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2727#if ENABLE(WEB_RTC)
    2828
    29 #include "JSDOMPromiseDeferred.h"
     29#include "ExceptionOr.h"
     30#include <wtf/Function.h>
     31#include <wtf/text/WTFString.h>
    3032
    3133namespace WebCore {
    3234
    33 class MediaStreamTrack;
    34 class RTCRtpSender;
    35 struct RTCRtpSendParameters;
    36 class ScriptExecutionContext;
     35class RTCDTMFSenderBackend {
     36public:
     37    virtual bool canInsertDTMF() = 0;
     38    virtual void playTone(const String& tone, size_t duration, size_t interToneGap) = 0;
     39    virtual void onTonePlayed(Function<void(const String&)>&&) = 0;
    3740
    38 class RTCRtpSenderBackend {
    39 public:
    40     virtual void replaceTrack(ScriptExecutionContext&, RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) = 0;
    41     virtual RTCRtpSendParameters getParameters() const = 0;
    42     virtual void setParameters(const RTCRtpSendParameters&, DOMPromiseDeferred<void>&&) = 0;
    43     virtual ~RTCRtpSenderBackend() = default;
     41    virtual String tones() const = 0;
     42    virtual size_t duration() const = 0;
     43    virtual size_t interToneGap() const = 0;
     44
     45    virtual ~RTCDTMFSenderBackend() = default;
    4446};
    4547
  • trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCDTMFSenderBackend.h

    r248281 r248282  
    11/*
    2  * Copyright (C) 2018 Apple Inc.
     2 * Copyright (C) 2019 Apple Inc.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2727#if ENABLE(WEB_RTC)
    2828
    29 #include "JSDOMPromiseDeferred.h"
     29#include "LibWebRTCMacros.h"
     30#include "RTCDTMFSenderBackend.h"
     31#include <wtf/WeakPtr.h>
     32
     33ALLOW_UNUSED_PARAMETERS_BEGIN
     34
     35#include <webrtc/api/dtmfsenderinterface.h>
     36#include <webrtc/rtc_base/scoped_ref_ptr.h>
     37
     38ALLOW_UNUSED_PARAMETERS_END
    3039
    3140namespace WebCore {
    3241
    33 class MediaStreamTrack;
    34 class RTCRtpSender;
    35 struct RTCRtpSendParameters;
    36 class ScriptExecutionContext;
     42class LibWebRTCDTMFSenderBackend final : public RTCDTMFSenderBackend, private webrtc::DtmfSenderObserverInterface, public CanMakeWeakPtr<LibWebRTCDTMFSenderBackend> {
     43public:
     44    explicit LibWebRTCDTMFSenderBackend(rtc::scoped_refptr<webrtc::DtmfSenderInterface>&&);
     45    ~LibWebRTCDTMFSenderBackend();
    3746
    38 class RTCRtpSenderBackend {
    39 public:
    40     virtual void replaceTrack(ScriptExecutionContext&, RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) = 0;
    41     virtual RTCRtpSendParameters getParameters() const = 0;
    42     virtual void setParameters(const RTCRtpSendParameters&, DOMPromiseDeferred<void>&&) = 0;
    43     virtual ~RTCRtpSenderBackend() = default;
     47private:
     48    // RTCDTMFSenderBackend
     49    bool canInsertDTMF() final;
     50    void playTone(const String& tone, size_t duration, size_t interToneGap) final;
     51    void onTonePlayed(Function<void(const String&)>&&) final;
     52    String tones() const final;
     53    size_t duration() const final;
     54    size_t interToneGap() const final;
     55
     56    // DtmfSenderObserverInterface
     57    void OnToneChange(const std::string& tone, const std::string&) final;
     58
     59    rtc::scoped_refptr<webrtc::DtmfSenderInterface> m_sender;
     60    Function<void(const String&)> m_onTonePlayed;
     61    WeakPtr<LibWebRTCDTMFSenderBackend> m_weakThis;
    4462};
    4563
  • trunk/Source/WebKit/ChangeLog

    r248281 r248282  
     12019-08-05  Youenn Fablet  <youenn@apple.com>
     2
     3        Support RTCRtpSender.dtmf
     4        https://bugs.webkit.org/show_bug.cgi?id=200431
     5
     6        Reviewed by Eric Carlson.
     7
     8        * Shared/WebPreferences.yaml:
     9
    1102019-08-05  Simon Fraser  <simon.fraser@apple.com>
    211
  • trunk/Source/WebKit/Shared/WebPreferences.yaml

    r247527 r248282  
    573573  category: experimental
    574574
     575WebRTCDTMFEnabled:
     576  type: bool
     577  defaultValue: true
     578  webcoreBinding: RuntimeEnabledFeatures
     579  condition: ENABLE(WEB_RTC)
     580  humanReadableName: "WebRTC DTMF"
     581  humanReadableDescription: "Enable WebRTC DTMF"
     582  category: experimental
     583
    575584WebRTCH264SimulcastEnabled:
    576585  type: bool
Note: See TracChangeset for help on using the changeset viewer.