haikuwebkit/LayoutTests/webrtc/audio-peer-connection-webau...

61 lines
2.1 KiB
HTML
Raw Permalink Normal View History

[WebRTC] Fix remote audio rendering https://bugs.webkit.org/show_bug.cgi?id=168898 Reviewed by Eric Carlson. Source/WebCore: Test: webrtc/audio-peer-connection-webaudio.html Fix MediaStreamAudioSourceNode by not bailing out early if the input sample rate doesn't match the AudioContext's sample rate; there's code in setFormat() to do the sample rate conversion correctly. * Modules/webaudio/MediaStreamAudioSourceNode.cpp: (WebCore::MediaStreamAudioSourceNode::setFormat): Fix AudioSampleBufferList by making the AudioConverter input proc a free function, and passing its refCon a struct containing only the information it needs to perform its task. Because the conversion may result in a different number of output samples than input ones, just ask to generate the entire capacity of the scratch buffer, and signal that the input buffer was fully converted with a special return value. * platform/audio/mac/AudioSampleBufferList.cpp: (WebCore::audioConverterFromABLCallback): (WebCore::AudioSampleBufferList::copyFrom): (WebCore::AudioSampleBufferList::convertInput): Deleted. (WebCore::AudioSampleBufferList::audioConverterCallback): Deleted. * platform/audio/mac/AudioSampleBufferList.h: Fix AudioSampleDataSource by updating both the sampleCount and the sampleTime after doing a sample rate conversion to take into account that both the number of samples may have changed, as well as the timeScale of the sampleTime. This may result in small off-by-one rounding errors due to the sample rate conversion of sampleTime, so remember what the next expected sampleTime should be, and correct sampleTime if it is indeed off-by-one. If the pull operation has gotten ahead of the push operation, delay the next pull by the empty amount by rolling back the m_outputSampleOffset. Introduce the same offset behavior during pull operations. * platform/audio/mac/AudioSampleDataSource.h: * platform/audio/mac/AudioSampleDataSource.mm: (WebCore::AudioSampleDataSource::pushSamplesInternal): (WebCore::AudioSampleDataSource::pullSamplesInternal): (WebCore::AudioSampleDataSource::pullAvalaibleSamplesAsChunks): Fix MediaPlayerPrivateMediaStreamAVFObjC by obeying the m_muted property. * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVolume): (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setMuted): Fix LibWebRTCAudioModule by sleeping for the correct amount after emitting frames. Previously, LibWebRTCAudioModule would sleep for a fixed amount of time, which meant it would get slowly out of sync when emitting frames took a non-zero amount of time. Now, the amount of time before the next cycle starts is correctly calculated, and then LibWebRTCAudioModule sleeps for a dynamic amount of time in order to wake up correctly at the beginning of the next cycle. * platform/mediastream/libwebrtc/LibWebRTCAudioModule.cpp: (WebCore::LibWebRTCAudioModule::StartPlayoutOnAudioThread): Fix AudioTrackPrivateMediaStreamCocoa by just using the output unit's preferred format description (with the current system sample rate), rather than whatever is the current input description. * platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp: (WebCore::AudioTrackPrivateMediaStreamCocoa::createAudioUnit): (WebCore::AudioTrackPrivateMediaStreamCocoa::audioSamplesAvailable): * platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.h: Fix RealtimeIncomingAudioSource by actually creating an AudioSourceProvider when asked. * platform/mediastream/mac/RealtimeIncomingAudioSource.cpp: (WebCore::RealtimeIncomingAudioSource::OnData): (WebCore::RealtimeIncomingAudioSource::audioSourceProvider): * platform/mediastream/mac/RealtimeIncomingAudioSource.h: Fix RealtimeOutgoingAudioSource by using the outgoing format description rather than the incoming one to determine the sample rate, channel count, sample byte size, etc., to use when delivering data upstream to libWebRTC. * platform/mediastream/mac/RealtimeOutgoingAudioSource.cpp: (WebCore::RealtimeOutgoingAudioSource::audioSamplesAvailable): (WebCore::RealtimeOutgoingAudioSource::pullAudioData): * platform/mediastream/mac/RealtimeOutgoingAudioSource.h: Fix WebAudioSourceProviderAVFObjC by using a AudioSampleDataSource to do format and sample rate conversion rather than trying to duplicate all that code and use a CARingBuffer and AudioConverter directly. * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h: * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm: (WebCore::WebAudioSourceProviderAVFObjC::~WebAudioSourceProviderAVFObjC): (WebCore::WebAudioSourceProviderAVFObjC::provideInput): (WebCore::WebAudioSourceProviderAVFObjC::prepare): (WebCore::WebAudioSourceProviderAVFObjC::unprepare): (WebCore::WebAudioSourceProviderAVFObjC::audioSamplesAvailable): Fix the MockLibWebRTCAudioTrack by passing along the AddSink() sink to its AudioSourceInterface, allowing the RealtimeOutgoingAudioSource to push data into the libWebRTC network stack. Also, make sure m_enabled is initialized to a good value. * testing/MockLibWebRTCPeerConnection.h: LayoutTests: * webrtc/audio-peer-connection-webaudio-expected.txt: Added. * webrtc/audio-peer-connection-webaudio.html: Added. Canonical link: https://commits.webkit.org/185912@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@213080 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-02-27 18:22:49 +00:00
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Testing local audio capture playback causes "playing" event to fire</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src ="routines.js"></script>
<script>
Turn off the legacy prefixed WebAudio API https://bugs.webkit.org/show_bug.cgi?id=216886 Reviewed by Sam Weinig. LayoutTests/imported/w3c: * web-platform-tests/webaudio/historical-expected.txt: Rebaseline test that is now passing. Source/WebCore: Turn off the legacy prefixed WebAudio API, now that the modern unprefixed API has been enabled in r267488. No new tests, rebaselined existing tests. * Modules/webaudio/AudioBufferSourceNode.idl: Make sure legacy constants get unexposed if the PrefixedWebAudio setting is disabled. * bindings/scripts/CodeGeneratorJS.pm: (GenerateImplementation): (GetRuntimeEnabledStaticProperties): * bindings/scripts/test/JS/JSTestConditionalIncludes.cpp: (WebCore::JSTestConditionalIncludesConstructor::initializeProperties): (WebCore::JSTestConditionalIncludesPrototype::finishCreation): * bindings/scripts/test/JS/JSTestEnabledBySetting.cpp: (WebCore::JSTestEnabledBySettingConstructor::prototypeForStructure): (WebCore::JSTestEnabledBySettingConstructor::initializeProperties): (WebCore::JSTestEnabledBySettingPrototype::finishCreation): * bindings/scripts/test/TestEnabledBySetting.idl: Add support for using [EnabledBySetting=X] on constants. Source/WebKit: Turn off the legacy prefixed WebAudio API, now that the modern unprefixed API has been enabled in r267488. * Shared/WebPreferencesInternal.yaml: Source/WebKitLegacy/mac: Turn off the legacy prefixed WebAudio API, now that the modern unprefixed API has been enabled in r267488. * WebView/WebView.mm: (-[WebView _preferencesChanged:]): LayoutTests: Port existing layout tests from the prefixed WebAudio API to the new unprefixed version. * fast/history/page-cache-closed-audiocontext.html: * fast/history/page-cache-running-audiocontext.html: * fast/history/page-cache-suspended-audiocontext.html: * fast/mediastream/getUserMedia-webaudio.html: * fast/mediastream/media-devices-enumerate-devices.html: * fast/mediastream/mediastreamtrack-audio-clone.html: * fast/mediastream/mock-media-source-webaudio.html: * http/tests/security/webaudio-render-remote-audio-allowed-crossorigin.html: * http/tests/security/webaudio-render-remote-audio-blocked-no-crossorigin.html: * http/wpt/mediarecorder/MediaRecorder-onremovetrack.html: * http/wpt/webaudio/resources/audiocontext-stopped-iframe.html: * platform/ios/webaudio/realtimeanalyser-fft-sizing-expected.txt: * resources/testharnessreport.js: * webaudio/analyser-exception.html: * webaudio/audiobuffer-crash-expected.txt: * webaudio/audiobuffer-crash.html: * webaudio/audiobuffer-expected.txt: * webaudio/audiobuffer-neuter.html: * webaudio/audiobuffer.html: * webaudio/audiobuffersource-channels-expected.txt: * webaudio/audiobuffersource-channels.html: * webaudio/audiobuffersource-ended.html: * webaudio/audiobuffersource-multi-channels.html: * webaudio/audiobuffersource-negative-playbackrate-interpolated-loop.html: * webaudio/audiobuffersource-negative-playbackrate-interpolated.html: * webaudio/audiobuffersource-negative-playbackrate-loop.html: * webaudio/audiobuffersource-negative-playbackrate.html: * webaudio/audiobuffersource-not-gced-until-ended.html: * webaudio/audiobuffersource-playbackState-expected.txt: Removed. * webaudio/audiobuffersource-playbackState.html: Removed. * webaudio/audiobuffersource-playbackrate.html: * webaudio/audiobuffersource-start.html: * webaudio/audiobuffersource.html: * webaudio/audiobuffersourcenode-legacy-api-expected.txt: * webaudio/audiobuffersourcenode-legacy-api.html: * webaudio/audiochannelmerger-basic.html: * webaudio/audiochannelmerger-stereo.html: * webaudio/audiochannelsplitter.html: * webaudio/audiocontext-promise-throwing-expected.txt: * webaudio/audiocontext-promise-throwing.html: * webaudio/audiocontext-promise.html: * webaudio/audiocontext-restriction-audiobuffersourcenode-start.html: * webaudio/audiocontext-restriction.html: * webaudio/audiocontext-state-interrupted.html: * webaudio/audiocontext-state.html: * webaudio/audionode-connect-order.html: * webaudio/audionode.html: * webaudio/audioparam-connect-audioratesignal.html: * webaudio/audioparam-summingjunction.html: * webaudio/audioprocessingevent.html: * webaudio/automatic-pull-node.html: * webaudio/convolution-mono-mono.html: * webaudio/convolver-channels.html: * webaudio/convolver-setBuffer-different-samplerate.html: * webaudio/convolver-setBuffer-null.html: * webaudio/createMediaStreamSource-null-expected.txt: * webaudio/createMediaStreamSource-null.html: * webaudio/decode-audio-data-basic-expected.txt: * webaudio/decode-audio-data-basic.html: * webaudio/decode-audio-data-too-short.html: * webaudio/delaynode-max-default-delay.html: * webaudio/delaynode-max-nondefault-delay.html: * webaudio/delaynode-maxdelay.html: * webaudio/delaynode-maxdelaylimit.html: * webaudio/delaynode-scheduling.html: * webaudio/delaynode.html: * webaudio/distance-exponential.html: * webaudio/distance-inverse.html: * webaudio/distance-linear.html: * webaudio/dynamicscompressor-basic.html: * webaudio/finished-audio-buffer-source-nodes-should-be-collectable.html: * webaudio/gain-basic.html: * webaudio/gain.html: * webaudio/mediaelementaudiosourcenode-expected.txt: * webaudio/mediaelementaudiosourcenode-gc.html: * webaudio/mediaelementaudiosourcenode.html: * webaudio/mixing.html: * webaudio/offlineaudiocontext-gc.html: * webaudio/offlineaudiocontext-restriction.html: * webaudio/oscillatornode-legacy-api-expected.txt: * webaudio/oscillatornode-legacy-api.html: * webaudio/page-canstartmedia.html: * webaudio/panner-equalpower-stereo.html: * webaudio/panner-equalpower.html: * webaudio/prefixed-pannernode-basic-expected.txt: Removed. * webaudio/prefixed-pannernode-basic.html: Removed. * webaudio/realtimeanalyser-fft-sizing-expected.txt: * webaudio/realtimeanalyser-fft-sizing.html: * webaudio/resources/audio-codec-test.js: (runDecodingTest): * webaudio/resources/audiobuffersource-ended-detached-frame-iframe.html: * webaudio/resources/audioparam-testing-legacy.js: (createAudioGraphAndTest): * webaudio/resources/compatibility.js: Removed. * webaudio/resources/javascriptaudionode-testing.js: (runJSNodeTest): * webaudio/resources/oscillator-testing-legacy.js: (generateExponentialOscillatorSweep): * webaudio/sample-accurate-scheduling.html: * webaudio/silence-after-playback.html: * webaudio/silent-audio-interrupted-in-background.html: * webaudio/stereo2mono-down-mixing.html: * webaudio/test-basic.html: * webaudio/up-mixing-mono-51.html: * webaudio/up-mixing-mono-stereo.html: * webaudio/up-mixing-stereo-51.html: * webaudio/waveshaper.html: * webaudio/web-audio-is-playing.html: * webaudio/webaudio-gc.html: * webaudio/webkitofflineaudiocontext-startRendering-crash-expected.txt: * webaudio/webkitofflineaudiocontext-startRendering-crash.html: * webrtc/audio-peer-connection-g722.html: * webrtc/audio-peer-connection-webaudio.html: * webrtc/clone-audio-track.html: * webrtc/getUserMedia-webaudio-autoplay.html: * webrtc/peer-connection-audio-mute.html: * webrtc/peer-connection-audio-mute2.html: * webrtc/peer-connection-createMediaStreamDestination.html: * webrtc/peer-connection-remote-audio-mute.html: * webrtc/peer-connection-remote-audio-mute2.html: * webrtc/routines.js: Canonical link: https://commits.webkit.org/229688@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@267504 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-09-23 22:48:05 +00:00
var context = new AudioContext();
Remove use of mock webrtc backend factory at injected bundle reset time https://bugs.webkit.org/show_bug.cgi?id=173817 Patch by Youenn Fablet <youenn@apple.com> on 2017-06-25 Reviewed by Darin Adler. Source/WebCore: * testing/Internals.cpp: (WebCore::Internals::resetToConsistentState): Resetting the peer connection backend. * testing/MockLibWebRTCPeerConnection.cpp: Doing some clean-up (WebCore::useRealRTCPeerConnectionFactory): (WebCore::MockLibWebRTCPeerConnectionFactory::MockLibWebRTCPeerConnectionFactory): (WebCore::MockLibWebRTCPeerConnectionFactory::CreatePeerConnection): (WebCore::MockLibWebRTCPeerConnectionFactory::CreateVideoTrack): (WebCore::MockLibWebRTCPeerConnectionFactory::CreateAudioTrack): * testing/MockLibWebRTCPeerConnection.h: LayoutTests: Making some tests less flaky. * TestExpectations: * fast/mediastream/RTCPeerConnection-media-setup-two-dialogs-expected.txt: * platform/mac/webrtc/captureCanvas-webrtc-software-encoder.html: * webrtc/audio-peer-connection-webaudio.html: * webrtc/captureCanvas-webrtc.html: * webrtc/datachannel/bufferedAmountLowThreshold-default-expected.txt: Added. * webrtc/datachannel/bufferedAmountLowThreshold-default.html: Added. * webrtc/datachannel/bufferedAmountLowThreshold-expected.txt: * webrtc/datachannel/bufferedAmountLowThreshold.html: * webrtc/routines.js: * webrtc/video-replace-muted-track.html: * webrtc/video-unmute.html: Canonical link: https://commits.webkit.org/190676@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@218795 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-06-25 18:06:06 +00:00
var remoteStream;
async function checkForHumBipBop(stream, previousResults, counter)
{
if (!previousResults)
previousResults = {
heardHum : false,
heardBip : false,
heardBop : false
};
if (!counter)
counter = 1;
else if (++counter > 4)
return Promise.resolve(false);
results = await analyseAudio(stream, 1000, context);
previousResults.heardHum |= results.heardHum;
previousResults.heardBip |= results.heardBip;
previousResults.heardBop |= results.heardBop;
if (previousResults.heardHum && previousResults.heardBip && previousResults.heardBop)
return Promise.resolve(true);
var results = await checkForHumBipBop(stream, previousResults, counter);
return results;
}
promise_test((test) => {
[WebRTC] Fix remote audio rendering https://bugs.webkit.org/show_bug.cgi?id=168898 Reviewed by Eric Carlson. Source/WebCore: Test: webrtc/audio-peer-connection-webaudio.html Fix MediaStreamAudioSourceNode by not bailing out early if the input sample rate doesn't match the AudioContext's sample rate; there's code in setFormat() to do the sample rate conversion correctly. * Modules/webaudio/MediaStreamAudioSourceNode.cpp: (WebCore::MediaStreamAudioSourceNode::setFormat): Fix AudioSampleBufferList by making the AudioConverter input proc a free function, and passing its refCon a struct containing only the information it needs to perform its task. Because the conversion may result in a different number of output samples than input ones, just ask to generate the entire capacity of the scratch buffer, and signal that the input buffer was fully converted with a special return value. * platform/audio/mac/AudioSampleBufferList.cpp: (WebCore::audioConverterFromABLCallback): (WebCore::AudioSampleBufferList::copyFrom): (WebCore::AudioSampleBufferList::convertInput): Deleted. (WebCore::AudioSampleBufferList::audioConverterCallback): Deleted. * platform/audio/mac/AudioSampleBufferList.h: Fix AudioSampleDataSource by updating both the sampleCount and the sampleTime after doing a sample rate conversion to take into account that both the number of samples may have changed, as well as the timeScale of the sampleTime. This may result in small off-by-one rounding errors due to the sample rate conversion of sampleTime, so remember what the next expected sampleTime should be, and correct sampleTime if it is indeed off-by-one. If the pull operation has gotten ahead of the push operation, delay the next pull by the empty amount by rolling back the m_outputSampleOffset. Introduce the same offset behavior during pull operations. * platform/audio/mac/AudioSampleDataSource.h: * platform/audio/mac/AudioSampleDataSource.mm: (WebCore::AudioSampleDataSource::pushSamplesInternal): (WebCore::AudioSampleDataSource::pullSamplesInternal): (WebCore::AudioSampleDataSource::pullAvalaibleSamplesAsChunks): Fix MediaPlayerPrivateMediaStreamAVFObjC by obeying the m_muted property. * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVolume): (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setMuted): Fix LibWebRTCAudioModule by sleeping for the correct amount after emitting frames. Previously, LibWebRTCAudioModule would sleep for a fixed amount of time, which meant it would get slowly out of sync when emitting frames took a non-zero amount of time. Now, the amount of time before the next cycle starts is correctly calculated, and then LibWebRTCAudioModule sleeps for a dynamic amount of time in order to wake up correctly at the beginning of the next cycle. * platform/mediastream/libwebrtc/LibWebRTCAudioModule.cpp: (WebCore::LibWebRTCAudioModule::StartPlayoutOnAudioThread): Fix AudioTrackPrivateMediaStreamCocoa by just using the output unit's preferred format description (with the current system sample rate), rather than whatever is the current input description. * platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp: (WebCore::AudioTrackPrivateMediaStreamCocoa::createAudioUnit): (WebCore::AudioTrackPrivateMediaStreamCocoa::audioSamplesAvailable): * platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.h: Fix RealtimeIncomingAudioSource by actually creating an AudioSourceProvider when asked. * platform/mediastream/mac/RealtimeIncomingAudioSource.cpp: (WebCore::RealtimeIncomingAudioSource::OnData): (WebCore::RealtimeIncomingAudioSource::audioSourceProvider): * platform/mediastream/mac/RealtimeIncomingAudioSource.h: Fix RealtimeOutgoingAudioSource by using the outgoing format description rather than the incoming one to determine the sample rate, channel count, sample byte size, etc., to use when delivering data upstream to libWebRTC. * platform/mediastream/mac/RealtimeOutgoingAudioSource.cpp: (WebCore::RealtimeOutgoingAudioSource::audioSamplesAvailable): (WebCore::RealtimeOutgoingAudioSource::pullAudioData): * platform/mediastream/mac/RealtimeOutgoingAudioSource.h: Fix WebAudioSourceProviderAVFObjC by using a AudioSampleDataSource to do format and sample rate conversion rather than trying to duplicate all that code and use a CARingBuffer and AudioConverter directly. * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h: * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm: (WebCore::WebAudioSourceProviderAVFObjC::~WebAudioSourceProviderAVFObjC): (WebCore::WebAudioSourceProviderAVFObjC::provideInput): (WebCore::WebAudioSourceProviderAVFObjC::prepare): (WebCore::WebAudioSourceProviderAVFObjC::unprepare): (WebCore::WebAudioSourceProviderAVFObjC::audioSamplesAvailable): Fix the MockLibWebRTCAudioTrack by passing along the AddSink() sink to its AudioSourceInterface, allowing the RealtimeOutgoingAudioSource to push data into the libWebRTC network stack. Also, make sure m_enabled is initialized to a good value. * testing/MockLibWebRTCPeerConnection.h: LayoutTests: * webrtc/audio-peer-connection-webaudio-expected.txt: Added. * webrtc/audio-peer-connection-webaudio.html: Added. Canonical link: https://commits.webkit.org/185912@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@213080 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-02-27 18:22:49 +00:00
if (window.testRunner)
testRunner.setUserMediaPermission(true);
Improve WebRTC track enabled support https://bugs.webkit.org/show_bug.cgi?id=169727 Patch by Youenn Fablet <youenn@apple.com> on 2017-03-16 Reviewed by Alex Christensen. Source/WebCore: Tests: webrtc/peer-connection-audio-mute2.html webrtc/peer-connection-remote-audio-mute.html webrtc/video-remote-mute.html Making sure muted/disabled sources produce silence/black frames. For outgoing audio/video sources, this should be done by the actual a/v providers. We keep this filtering here until we are sure they implement that. * platform/audio/mac/AudioSampleDataSource.mm: (WebCore::AudioSampleDataSource::pullAvalaibleSamplesAsChunks): Ensuring disabled audio tracks send silence. Used for outgoing webrtc tracks. * platform/mediastream/mac/MockRealtimeAudioSourceMac.mm: (WebCore::MockRealtimeAudioSourceMac::render): Ditto. * platform/mediastream/mac/RealtimeIncomingAudioSource.cpp: (WebCore::RealtimeIncomingAudioSource::OnData): Ditto. * platform/mediastream/mac/RealtimeIncomingVideoSource.cpp: (WebCore::RealtimeIncomingVideoSource::pixelBufferFromVideoFrame): Generating black frames if muted. (WebCore::RealtimeIncomingVideoSource::OnFrame): * platform/mediastream/mac/RealtimeIncomingVideoSource.h: * platform/mediastream/mac/RealtimeOutgoingVideoSource.cpp: (WebCore::RealtimeOutgoingVideoSource::videoSampleAvailable): Ensuring we quit after sending black frame. LayoutTests: * TestExpectations: * webrtc/audio-peer-connection-webaudio.html: * webrtc/peer-connection-audio-mute-expected.txt: * webrtc/peer-connection-audio-mute.html: * webrtc/peer-connection-audio-mute2-expected.txt: Added. * webrtc/peer-connection-audio-mute2.html: Added. * webrtc/peer-connection-remote-audio-mute-expected.txt: Added. * webrtc/peer-connection-remote-audio-mute.html: Added. * webrtc/video-mute-expected.txt: * webrtc/video-mute.html: * webrtc/video-remote-mute-expected.txt: Added. * webrtc/video-remote-mute.html: Added. Canonical link: https://commits.webkit.org/186716@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@214044 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-03-16 16:09:50 +00:00
return navigator.mediaDevices.getUserMedia({audio: true}).then((stream) => {
return new Promise((resolve, reject) => {
createConnections((firstConnection) => {
firstConnection.addTrack(stream.getAudioTracks()[0], stream);
}, (secondConnection) => {
secondConnection.ontrack = (event) => { resolve(event.streams[0]); };
});
setTimeout(() => reject("Test timed out"), 5000);
[WebRTC] Fix remote audio rendering https://bugs.webkit.org/show_bug.cgi?id=168898 Reviewed by Eric Carlson. Source/WebCore: Test: webrtc/audio-peer-connection-webaudio.html Fix MediaStreamAudioSourceNode by not bailing out early if the input sample rate doesn't match the AudioContext's sample rate; there's code in setFormat() to do the sample rate conversion correctly. * Modules/webaudio/MediaStreamAudioSourceNode.cpp: (WebCore::MediaStreamAudioSourceNode::setFormat): Fix AudioSampleBufferList by making the AudioConverter input proc a free function, and passing its refCon a struct containing only the information it needs to perform its task. Because the conversion may result in a different number of output samples than input ones, just ask to generate the entire capacity of the scratch buffer, and signal that the input buffer was fully converted with a special return value. * platform/audio/mac/AudioSampleBufferList.cpp: (WebCore::audioConverterFromABLCallback): (WebCore::AudioSampleBufferList::copyFrom): (WebCore::AudioSampleBufferList::convertInput): Deleted. (WebCore::AudioSampleBufferList::audioConverterCallback): Deleted. * platform/audio/mac/AudioSampleBufferList.h: Fix AudioSampleDataSource by updating both the sampleCount and the sampleTime after doing a sample rate conversion to take into account that both the number of samples may have changed, as well as the timeScale of the sampleTime. This may result in small off-by-one rounding errors due to the sample rate conversion of sampleTime, so remember what the next expected sampleTime should be, and correct sampleTime if it is indeed off-by-one. If the pull operation has gotten ahead of the push operation, delay the next pull by the empty amount by rolling back the m_outputSampleOffset. Introduce the same offset behavior during pull operations. * platform/audio/mac/AudioSampleDataSource.h: * platform/audio/mac/AudioSampleDataSource.mm: (WebCore::AudioSampleDataSource::pushSamplesInternal): (WebCore::AudioSampleDataSource::pullSamplesInternal): (WebCore::AudioSampleDataSource::pullAvalaibleSamplesAsChunks): Fix MediaPlayerPrivateMediaStreamAVFObjC by obeying the m_muted property. * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVolume): (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setMuted): Fix LibWebRTCAudioModule by sleeping for the correct amount after emitting frames. Previously, LibWebRTCAudioModule would sleep for a fixed amount of time, which meant it would get slowly out of sync when emitting frames took a non-zero amount of time. Now, the amount of time before the next cycle starts is correctly calculated, and then LibWebRTCAudioModule sleeps for a dynamic amount of time in order to wake up correctly at the beginning of the next cycle. * platform/mediastream/libwebrtc/LibWebRTCAudioModule.cpp: (WebCore::LibWebRTCAudioModule::StartPlayoutOnAudioThread): Fix AudioTrackPrivateMediaStreamCocoa by just using the output unit's preferred format description (with the current system sample rate), rather than whatever is the current input description. * platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp: (WebCore::AudioTrackPrivateMediaStreamCocoa::createAudioUnit): (WebCore::AudioTrackPrivateMediaStreamCocoa::audioSamplesAvailable): * platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.h: Fix RealtimeIncomingAudioSource by actually creating an AudioSourceProvider when asked. * platform/mediastream/mac/RealtimeIncomingAudioSource.cpp: (WebCore::RealtimeIncomingAudioSource::OnData): (WebCore::RealtimeIncomingAudioSource::audioSourceProvider): * platform/mediastream/mac/RealtimeIncomingAudioSource.h: Fix RealtimeOutgoingAudioSource by using the outgoing format description rather than the incoming one to determine the sample rate, channel count, sample byte size, etc., to use when delivering data upstream to libWebRTC. * platform/mediastream/mac/RealtimeOutgoingAudioSource.cpp: (WebCore::RealtimeOutgoingAudioSource::audioSamplesAvailable): (WebCore::RealtimeOutgoingAudioSource::pullAudioData): * platform/mediastream/mac/RealtimeOutgoingAudioSource.h: Fix WebAudioSourceProviderAVFObjC by using a AudioSampleDataSource to do format and sample rate conversion rather than trying to duplicate all that code and use a CARingBuffer and AudioConverter directly. * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h: * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm: (WebCore::WebAudioSourceProviderAVFObjC::~WebAudioSourceProviderAVFObjC): (WebCore::WebAudioSourceProviderAVFObjC::provideInput): (WebCore::WebAudioSourceProviderAVFObjC::prepare): (WebCore::WebAudioSourceProviderAVFObjC::unprepare): (WebCore::WebAudioSourceProviderAVFObjC::audioSamplesAvailable): Fix the MockLibWebRTCAudioTrack by passing along the AddSink() sink to its AudioSourceInterface, allowing the RealtimeOutgoingAudioSource to push data into the libWebRTC network stack. Also, make sure m_enabled is initialized to a good value. * testing/MockLibWebRTCPeerConnection.h: LayoutTests: * webrtc/audio-peer-connection-webaudio-expected.txt: Added. * webrtc/audio-peer-connection-webaudio.html: Added. Canonical link: https://commits.webkit.org/185912@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@213080 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-02-27 18:22:49 +00:00
});
Remove use of mock webrtc backend factory at injected bundle reset time https://bugs.webkit.org/show_bug.cgi?id=173817 Patch by Youenn Fablet <youenn@apple.com> on 2017-06-25 Reviewed by Darin Adler. Source/WebCore: * testing/Internals.cpp: (WebCore::Internals::resetToConsistentState): Resetting the peer connection backend. * testing/MockLibWebRTCPeerConnection.cpp: Doing some clean-up (WebCore::useRealRTCPeerConnectionFactory): (WebCore::MockLibWebRTCPeerConnectionFactory::MockLibWebRTCPeerConnectionFactory): (WebCore::MockLibWebRTCPeerConnectionFactory::CreatePeerConnection): (WebCore::MockLibWebRTCPeerConnectionFactory::CreateVideoTrack): (WebCore::MockLibWebRTCPeerConnectionFactory::CreateAudioTrack): * testing/MockLibWebRTCPeerConnection.h: LayoutTests: Making some tests less flaky. * TestExpectations: * fast/mediastream/RTCPeerConnection-media-setup-two-dialogs-expected.txt: * platform/mac/webrtc/captureCanvas-webrtc-software-encoder.html: * webrtc/audio-peer-connection-webaudio.html: * webrtc/captureCanvas-webrtc.html: * webrtc/datachannel/bufferedAmountLowThreshold-default-expected.txt: Added. * webrtc/datachannel/bufferedAmountLowThreshold-default.html: Added. * webrtc/datachannel/bufferedAmountLowThreshold-expected.txt: * webrtc/datachannel/bufferedAmountLowThreshold.html: * webrtc/routines.js: * webrtc/video-replace-muted-track.html: * webrtc/video-unmute.html: Canonical link: https://commits.webkit.org/190676@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@218795 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-06-25 18:06:06 +00:00
}).then((stream) => {
return checkForHumBipBop(stream);
Improve WebRTC track enabled support https://bugs.webkit.org/show_bug.cgi?id=169727 Patch by Youenn Fablet <youenn@apple.com> on 2017-03-16 Reviewed by Alex Christensen. Source/WebCore: Tests: webrtc/peer-connection-audio-mute2.html webrtc/peer-connection-remote-audio-mute.html webrtc/video-remote-mute.html Making sure muted/disabled sources produce silence/black frames. For outgoing audio/video sources, this should be done by the actual a/v providers. We keep this filtering here until we are sure they implement that. * platform/audio/mac/AudioSampleDataSource.mm: (WebCore::AudioSampleDataSource::pullAvalaibleSamplesAsChunks): Ensuring disabled audio tracks send silence. Used for outgoing webrtc tracks. * platform/mediastream/mac/MockRealtimeAudioSourceMac.mm: (WebCore::MockRealtimeAudioSourceMac::render): Ditto. * platform/mediastream/mac/RealtimeIncomingAudioSource.cpp: (WebCore::RealtimeIncomingAudioSource::OnData): Ditto. * platform/mediastream/mac/RealtimeIncomingVideoSource.cpp: (WebCore::RealtimeIncomingVideoSource::pixelBufferFromVideoFrame): Generating black frames if muted. (WebCore::RealtimeIncomingVideoSource::OnFrame): * platform/mediastream/mac/RealtimeIncomingVideoSource.h: * platform/mediastream/mac/RealtimeOutgoingVideoSource.cpp: (WebCore::RealtimeOutgoingVideoSource::videoSampleAvailable): Ensuring we quit after sending black frame. LayoutTests: * TestExpectations: * webrtc/audio-peer-connection-webaudio.html: * webrtc/peer-connection-audio-mute-expected.txt: * webrtc/peer-connection-audio-mute.html: * webrtc/peer-connection-audio-mute2-expected.txt: Added. * webrtc/peer-connection-audio-mute2.html: Added. * webrtc/peer-connection-remote-audio-mute-expected.txt: Added. * webrtc/peer-connection-remote-audio-mute.html: Added. * webrtc/video-mute-expected.txt: * webrtc/video-mute.html: * webrtc/video-remote-mute-expected.txt: Added. * webrtc/video-remote-mute.html: Added. Canonical link: https://commits.webkit.org/186716@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@214044 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-03-16 16:09:50 +00:00
}).then((results) => {
Remove use of mock webrtc backend factory at injected bundle reset time https://bugs.webkit.org/show_bug.cgi?id=173817 Patch by Youenn Fablet <youenn@apple.com> on 2017-06-25 Reviewed by Darin Adler. Source/WebCore: * testing/Internals.cpp: (WebCore::Internals::resetToConsistentState): Resetting the peer connection backend. * testing/MockLibWebRTCPeerConnection.cpp: Doing some clean-up (WebCore::useRealRTCPeerConnectionFactory): (WebCore::MockLibWebRTCPeerConnectionFactory::MockLibWebRTCPeerConnectionFactory): (WebCore::MockLibWebRTCPeerConnectionFactory::CreatePeerConnection): (WebCore::MockLibWebRTCPeerConnectionFactory::CreateVideoTrack): (WebCore::MockLibWebRTCPeerConnectionFactory::CreateAudioTrack): * testing/MockLibWebRTCPeerConnection.h: LayoutTests: Making some tests less flaky. * TestExpectations: * fast/mediastream/RTCPeerConnection-media-setup-two-dialogs-expected.txt: * platform/mac/webrtc/captureCanvas-webrtc-software-encoder.html: * webrtc/audio-peer-connection-webaudio.html: * webrtc/captureCanvas-webrtc.html: * webrtc/datachannel/bufferedAmountLowThreshold-default-expected.txt: Added. * webrtc/datachannel/bufferedAmountLowThreshold-default.html: Added. * webrtc/datachannel/bufferedAmountLowThreshold-expected.txt: * webrtc/datachannel/bufferedAmountLowThreshold.html: * webrtc/routines.js: * webrtc/video-replace-muted-track.html: * webrtc/video-unmute.html: Canonical link: https://commits.webkit.org/190676@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@218795 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-06-25 18:06:06 +00:00
assert_true(results, "heard hum bip bop");
[iOS] Unset active media capture source when stopped capturing https://bugs.webkit.org/show_bug.cgi?id=171815 <rdar://problem/32117885> Patch by Youenn Fablet <youenn@apple.com> on 2017-05-11 Reviewed by Eric Carlson. Source/WebCore: Test: platform/ios/mediastream/getUserMedia-single-capture.html Introducing SingleSourceFactory template class to be used by capture factories for iOS. This class ensures that only one source is active at a time. Update all capture sources accordingly. Ensure sources are no longer considered as active sources when being destroyed. Add support for mock sources and introducing m_isProducingData for them as well. Update WebRTC outgoing source classes to handle the case of replaced track and resetting the enabled/mute state according the new source. Update the way we handle timestamps for audio data. We now consider that we read/write as a flow. This allows smooth audio track replacing. * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/mac/AVAudioCaptureSource.mm: (WebCore::AVAudioCaptureSource::~AVAudioCaptureSource): (WebCore::AVAudioCaptureSourceFactory::setActiveSource): Deleted. * platform/mediastream/mac/AVVideoCaptureSource.mm: (WebCore::AVVideoCaptureSource::~AVVideoCaptureSource): (WebCore::AVVideoCaptureSourceFactory::setActiveSource): Deleted. * platform/mediastream/mac/CoreAudioCaptureSource.cpp: (WebCore::CoreAudioCaptureSource::~CoreAudioCaptureSource): (WebCore::CoreAudioCaptureSource::stopProducingData): (WebCore::CoreAudioCaptureSourceFactory::setActiveSource): Deleted. * platform/mediastream/mac/RealtimeOutgoingAudioSource.cpp: (WebCore::RealtimeOutgoingAudioSource::setSource): (WebCore::RealtimeOutgoingAudioSource::audioSamplesAvailable): (WebCore::RealtimeOutgoingAudioSource::pullAudioData): * platform/mediastream/mac/RealtimeOutgoingAudioSource.h: * platform/mediastream/mac/RealtimeOutgoingVideoSource.cpp: (WebCore::RealtimeOutgoingVideoSource::setSource): (WebCore::RealtimeOutgoingVideoSource::sourceMutedChanged): (WebCore::RealtimeOutgoingVideoSource::sourceEnabledChanged): * platform/mock/MockRealtimeAudioSource.cpp: (WebCore::mockAudioCaptureSourceFactory): (WebCore::MockRealtimeAudioSource::factory): (WebCore::MockRealtimeAudioSource::~MockRealtimeAudioSource): (WebCore::MockRealtimeAudioSource::startProducingData): (WebCore::MockRealtimeAudioSource::stopProducingData): * platform/mock/MockRealtimeAudioSource.h: * platform/mock/MockRealtimeVideoSource.cpp: (WebCore::mockVideoCaptureSourceFactory): (WebCore::MockRealtimeVideoSource::factory): (WebCore::MockRealtimeVideoSource::~MockRealtimeVideoSource): (WebCore::MockRealtimeVideoSource::startProducingData): (WebCore::MockRealtimeVideoSource::stopProducingData): * platform/mock/MockRealtimeVideoSource.h: (WebCore::MockRealtimeVideoSource::~MockRealtimeVideoSource): Deleted. LayoutTests: Improving the existing tests for better reliability and debugability. Updating tests to use less webkitAudioContext. * platform/ios/mediastream/getUserMedia-single-capture-expected.txt: Added. * platform/ios/mediastream/getUserMedia-single-capture.html: Added. * webrtc/audio-peer-connection-webaudio.html: * webrtc/audio-replace-track-expected.txt: * webrtc/audio-replace-track.html: * webrtc/peer-connection-audio-mute.html: * webrtc/peer-connection-audio-mute2.html: * webrtc/peer-connection-remote-audio-mute.html: * webrtc/peer-connection-remote-audio-mute2.html: * webrtc/routines.js: * webrtc/video-replace-track-expected.txt: * webrtc/video-replace-track.html: Canonical link: https://commits.webkit.org/188932@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216712 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-05-12 00:52:45 +00:00
}).then(() => {
return context.close();
Improve WebRTC track enabled support https://bugs.webkit.org/show_bug.cgi?id=169727 Patch by Youenn Fablet <youenn@apple.com> on 2017-03-16 Reviewed by Alex Christensen. Source/WebCore: Tests: webrtc/peer-connection-audio-mute2.html webrtc/peer-connection-remote-audio-mute.html webrtc/video-remote-mute.html Making sure muted/disabled sources produce silence/black frames. For outgoing audio/video sources, this should be done by the actual a/v providers. We keep this filtering here until we are sure they implement that. * platform/audio/mac/AudioSampleDataSource.mm: (WebCore::AudioSampleDataSource::pullAvalaibleSamplesAsChunks): Ensuring disabled audio tracks send silence. Used for outgoing webrtc tracks. * platform/mediastream/mac/MockRealtimeAudioSourceMac.mm: (WebCore::MockRealtimeAudioSourceMac::render): Ditto. * platform/mediastream/mac/RealtimeIncomingAudioSource.cpp: (WebCore::RealtimeIncomingAudioSource::OnData): Ditto. * platform/mediastream/mac/RealtimeIncomingVideoSource.cpp: (WebCore::RealtimeIncomingVideoSource::pixelBufferFromVideoFrame): Generating black frames if muted. (WebCore::RealtimeIncomingVideoSource::OnFrame): * platform/mediastream/mac/RealtimeIncomingVideoSource.h: * platform/mediastream/mac/RealtimeOutgoingVideoSource.cpp: (WebCore::RealtimeOutgoingVideoSource::videoSampleAvailable): Ensuring we quit after sending black frame. LayoutTests: * TestExpectations: * webrtc/audio-peer-connection-webaudio.html: * webrtc/peer-connection-audio-mute-expected.txt: * webrtc/peer-connection-audio-mute.html: * webrtc/peer-connection-audio-mute2-expected.txt: Added. * webrtc/peer-connection-audio-mute2.html: Added. * webrtc/peer-connection-remote-audio-mute-expected.txt: Added. * webrtc/peer-connection-remote-audio-mute.html: Added. * webrtc/video-mute-expected.txt: * webrtc/video-mute.html: * webrtc/video-remote-mute-expected.txt: Added. * webrtc/video-remote-mute.html: Added. Canonical link: https://commits.webkit.org/186716@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@214044 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-03-16 16:09:50 +00:00
});
[WebRTC] Fix remote audio rendering https://bugs.webkit.org/show_bug.cgi?id=168898 Reviewed by Eric Carlson. Source/WebCore: Test: webrtc/audio-peer-connection-webaudio.html Fix MediaStreamAudioSourceNode by not bailing out early if the input sample rate doesn't match the AudioContext's sample rate; there's code in setFormat() to do the sample rate conversion correctly. * Modules/webaudio/MediaStreamAudioSourceNode.cpp: (WebCore::MediaStreamAudioSourceNode::setFormat): Fix AudioSampleBufferList by making the AudioConverter input proc a free function, and passing its refCon a struct containing only the information it needs to perform its task. Because the conversion may result in a different number of output samples than input ones, just ask to generate the entire capacity of the scratch buffer, and signal that the input buffer was fully converted with a special return value. * platform/audio/mac/AudioSampleBufferList.cpp: (WebCore::audioConverterFromABLCallback): (WebCore::AudioSampleBufferList::copyFrom): (WebCore::AudioSampleBufferList::convertInput): Deleted. (WebCore::AudioSampleBufferList::audioConverterCallback): Deleted. * platform/audio/mac/AudioSampleBufferList.h: Fix AudioSampleDataSource by updating both the sampleCount and the sampleTime after doing a sample rate conversion to take into account that both the number of samples may have changed, as well as the timeScale of the sampleTime. This may result in small off-by-one rounding errors due to the sample rate conversion of sampleTime, so remember what the next expected sampleTime should be, and correct sampleTime if it is indeed off-by-one. If the pull operation has gotten ahead of the push operation, delay the next pull by the empty amount by rolling back the m_outputSampleOffset. Introduce the same offset behavior during pull operations. * platform/audio/mac/AudioSampleDataSource.h: * platform/audio/mac/AudioSampleDataSource.mm: (WebCore::AudioSampleDataSource::pushSamplesInternal): (WebCore::AudioSampleDataSource::pullSamplesInternal): (WebCore::AudioSampleDataSource::pullAvalaibleSamplesAsChunks): Fix MediaPlayerPrivateMediaStreamAVFObjC by obeying the m_muted property. * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVolume): (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setMuted): Fix LibWebRTCAudioModule by sleeping for the correct amount after emitting frames. Previously, LibWebRTCAudioModule would sleep for a fixed amount of time, which meant it would get slowly out of sync when emitting frames took a non-zero amount of time. Now, the amount of time before the next cycle starts is correctly calculated, and then LibWebRTCAudioModule sleeps for a dynamic amount of time in order to wake up correctly at the beginning of the next cycle. * platform/mediastream/libwebrtc/LibWebRTCAudioModule.cpp: (WebCore::LibWebRTCAudioModule::StartPlayoutOnAudioThread): Fix AudioTrackPrivateMediaStreamCocoa by just using the output unit's preferred format description (with the current system sample rate), rather than whatever is the current input description. * platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp: (WebCore::AudioTrackPrivateMediaStreamCocoa::createAudioUnit): (WebCore::AudioTrackPrivateMediaStreamCocoa::audioSamplesAvailable): * platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.h: Fix RealtimeIncomingAudioSource by actually creating an AudioSourceProvider when asked. * platform/mediastream/mac/RealtimeIncomingAudioSource.cpp: (WebCore::RealtimeIncomingAudioSource::OnData): (WebCore::RealtimeIncomingAudioSource::audioSourceProvider): * platform/mediastream/mac/RealtimeIncomingAudioSource.h: Fix RealtimeOutgoingAudioSource by using the outgoing format description rather than the incoming one to determine the sample rate, channel count, sample byte size, etc., to use when delivering data upstream to libWebRTC. * platform/mediastream/mac/RealtimeOutgoingAudioSource.cpp: (WebCore::RealtimeOutgoingAudioSource::audioSamplesAvailable): (WebCore::RealtimeOutgoingAudioSource::pullAudioData): * platform/mediastream/mac/RealtimeOutgoingAudioSource.h: Fix WebAudioSourceProviderAVFObjC by using a AudioSampleDataSource to do format and sample rate conversion rather than trying to duplicate all that code and use a CARingBuffer and AudioConverter directly. * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h: * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm: (WebCore::WebAudioSourceProviderAVFObjC::~WebAudioSourceProviderAVFObjC): (WebCore::WebAudioSourceProviderAVFObjC::provideInput): (WebCore::WebAudioSourceProviderAVFObjC::prepare): (WebCore::WebAudioSourceProviderAVFObjC::unprepare): (WebCore::WebAudioSourceProviderAVFObjC::audioSamplesAvailable): Fix the MockLibWebRTCAudioTrack by passing along the AddSink() sink to its AudioSourceInterface, allowing the RealtimeOutgoingAudioSource to push data into the libWebRTC network stack. Also, make sure m_enabled is initialized to a good value. * testing/MockLibWebRTCPeerConnection.h: LayoutTests: * webrtc/audio-peer-connection-webaudio-expected.txt: Added. * webrtc/audio-peer-connection-webaudio.html: Added. Canonical link: https://commits.webkit.org/185912@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@213080 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-02-27 18:22:49 +00:00
}, "Basic audio playback through a peer connection");
</script>
</head>
<body>
</body>
</html>