OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights
reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 #include "core/loader/FrameLoader.h" | 64 #include "core/loader/FrameLoader.h" |
65 #include "core/loader/FrameLoaderClient.h" | 65 #include "core/loader/FrameLoaderClient.h" |
66 #include "core/page/ChromeClient.h" | 66 #include "core/page/ChromeClient.h" |
67 #include "core/page/NetworkStateNotifier.h" | 67 #include "core/page/NetworkStateNotifier.h" |
68 #include "platform/ContentType.h" | 68 #include "platform/ContentType.h" |
69 #include "platform/Logging.h" | 69 #include "platform/Logging.h" |
70 #include "platform/MIMETypeFromURL.h" | 70 #include "platform/MIMETypeFromURL.h" |
71 #include "platform/MIMETypeRegistry.h" | 71 #include "platform/MIMETypeRegistry.h" |
72 #include "platform/RuntimeEnabledFeatures.h" | 72 #include "platform/RuntimeEnabledFeatures.h" |
73 #include "platform/UserGestureIndicator.h" | 73 #include "platform/UserGestureIndicator.h" |
| 74 #include "platform/audio/AudioBus.h" |
| 75 #include "platform/audio/AudioSourceProviderClient.h" |
74 #include "platform/graphics/GraphicsLayer.h" | 76 #include "platform/graphics/GraphicsLayer.h" |
75 #include "platform/weborigin/SecurityOrigin.h" | 77 #include "platform/weborigin/SecurityOrigin.h" |
76 #include "public/platform/Platform.h" | 78 #include "public/platform/Platform.h" |
| 79 #include "public/platform/WebAudioSourceProvider.h" |
77 #include "public/platform/WebContentDecryptionModule.h" | 80 #include "public/platform/WebContentDecryptionModule.h" |
78 #include "public/platform/WebInbandTextTrack.h" | 81 #include "public/platform/WebInbandTextTrack.h" |
79 #include "wtf/CurrentTime.h" | 82 #include "wtf/CurrentTime.h" |
80 #include "wtf/MainThread.h" | 83 #include "wtf/MainThread.h" |
81 #include "wtf/MathExtras.h" | 84 #include "wtf/MathExtras.h" |
82 #include "wtf/text/CString.h" | 85 #include "wtf/text/CString.h" |
83 #include <limits> | 86 #include <limits> |
84 | 87 |
85 #if ENABLE(WEB_AUDIO) | |
86 #include "platform/audio/AudioBus.h" | |
87 #include "platform/audio/AudioSourceProviderClient.h" | |
88 #include "public/platform/WebAudioSourceProvider.h" | |
89 #endif | |
90 | 88 |
91 namespace blink { | 89 namespace blink { |
92 | 90 |
93 #if !LOG_DISABLED | 91 #if !LOG_DISABLED |
94 static String urlForLoggingMedia(const KURL& url) | 92 static String urlForLoggingMedia(const KURL& url) |
95 { | 93 { |
96 static const unsigned maximumURLLengthForLogging = 128; | 94 static const unsigned maximumURLLengthForLogging = 128; |
97 | 95 |
98 if (url.string().length() < maximumURLLengthForLogging) | 96 if (url.string().length() < maximumURLLengthForLogging) |
99 return url.string(); | 97 return url.string(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 DocumentElementSetMap& map = documentToElementSetMap(); | 142 DocumentElementSetMap& map = documentToElementSetMap(); |
145 WeakMediaElementSet set = map.take(document); | 143 WeakMediaElementSet set = map.take(document); |
146 set.remove(element); | 144 set.remove(element); |
147 if (!set.isEmpty()) | 145 if (!set.isEmpty()) |
148 map.add(document, set); | 146 map.add(document, set); |
149 } | 147 } |
150 | 148 |
151 class AudioSourceProviderClientLockScope { | 149 class AudioSourceProviderClientLockScope { |
152 STACK_ALLOCATED(); | 150 STACK_ALLOCATED(); |
153 public: | 151 public: |
154 #if ENABLE(WEB_AUDIO) | |
155 AudioSourceProviderClientLockScope(HTMLMediaElement& element) | 152 AudioSourceProviderClientLockScope(HTMLMediaElement& element) |
156 : m_client(element.audioSourceNode()) | 153 : m_client(element.audioSourceNode()) |
157 { | 154 { |
158 if (m_client) | 155 if (m_client) |
159 m_client->lock(); | 156 m_client->lock(); |
160 } | 157 } |
161 ~AudioSourceProviderClientLockScope() | 158 ~AudioSourceProviderClientLockScope() |
162 { | 159 { |
163 if (m_client) | 160 if (m_client) |
164 m_client->unlock(); | 161 m_client->unlock(); |
165 } | 162 } |
166 | 163 |
167 private: | 164 private: |
168 Member<AudioSourceProviderClient> m_client; | 165 Member<AudioSourceProviderClient> m_client; |
169 #else | |
170 explicit AudioSourceProviderClientLockScope(HTMLMediaElement&) { } | |
171 ~AudioSourceProviderClientLockScope() { } | |
172 #endif | |
173 }; | 166 }; |
174 | 167 |
175 static const AtomicString& AudioKindToString(WebMediaPlayerClient::AudioTrackKin
d kind) | 168 static const AtomicString& AudioKindToString(WebMediaPlayerClient::AudioTrackKin
d kind) |
176 { | 169 { |
177 switch (kind) { | 170 switch (kind) { |
178 case WebMediaPlayerClient::AudioTrackKindNone: | 171 case WebMediaPlayerClient::AudioTrackKindNone: |
179 return emptyAtom; | 172 return emptyAtom; |
180 case WebMediaPlayerClient::AudioTrackKindAlternative: | 173 case WebMediaPlayerClient::AudioTrackKindAlternative: |
181 return AudioTrack::alternativeKeyword(); | 174 return AudioTrack::alternativeKeyword(); |
182 case WebMediaPlayerClient::AudioTrackKindDescriptions: | 175 case WebMediaPlayerClient::AudioTrackKindDescriptions: |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 , m_processingPreferenceChange(false) | 328 , m_processingPreferenceChange(false) |
336 , m_remoteRoutesAvailable(false) | 329 , m_remoteRoutesAvailable(false) |
337 , m_playingRemotely(false) | 330 , m_playingRemotely(false) |
338 , m_isFinalizing(false) | 331 , m_isFinalizing(false) |
339 , m_initialPlayWithoutUserGesture(false) | 332 , m_initialPlayWithoutUserGesture(false) |
340 , m_autoplayMediaCounted(false) | 333 , m_autoplayMediaCounted(false) |
341 , m_inOverlayFullscreenVideo(false) | 334 , m_inOverlayFullscreenVideo(false) |
342 , m_audioTracks(AudioTrackList::create(*this)) | 335 , m_audioTracks(AudioTrackList::create(*this)) |
343 , m_videoTracks(VideoTrackList::create(*this)) | 336 , m_videoTracks(VideoTrackList::create(*this)) |
344 , m_textTracks(nullptr) | 337 , m_textTracks(nullptr) |
345 #if ENABLE(WEB_AUDIO) | |
346 , m_audioSourceNode(nullptr) | 338 , m_audioSourceNode(nullptr) |
347 #endif | |
348 , m_autoplayHelper(*this) | 339 , m_autoplayHelper(*this) |
349 { | 340 { |
350 #if ENABLE(OILPAN) | 341 #if ENABLE(OILPAN) |
351 ThreadState::current()->registerPreFinalizer(this); | 342 ThreadState::current()->registerPreFinalizer(this); |
352 #endif | 343 #endif |
353 ASSERT(RuntimeEnabledFeatures::mediaEnabled()); | 344 ASSERT(RuntimeEnabledFeatures::mediaEnabled()); |
354 | 345 |
355 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement(%p)", this); | 346 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement(%p)", this); |
356 | 347 |
357 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes
ture()) | 348 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes
ture()) |
(...skipping 30 matching lines...) Expand all Loading... |
388 // FrameLoader::checkCompleted(). To prevent load event dispatching during | 379 // FrameLoader::checkCompleted(). To prevent load event dispatching during |
389 // object destruction, we use Document::incrementLoadEventDelayCount(). | 380 // object destruction, we use Document::incrementLoadEventDelayCount(). |
390 // See http://crbug.com/275223 for more details. | 381 // See http://crbug.com/275223 for more details. |
391 document().incrementLoadEventDelayCount(); | 382 document().incrementLoadEventDelayCount(); |
392 | 383 |
393 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); | 384 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); |
394 | 385 |
395 document().decrementLoadEventDelayCount(); | 386 document().decrementLoadEventDelayCount(); |
396 #endif | 387 #endif |
397 | 388 |
398 #if ENABLE(WEB_AUDIO) | |
399 // m_audioSourceNode is explicitly cleared by AudioNode::dispose(). | 389 // m_audioSourceNode is explicitly cleared by AudioNode::dispose(). |
400 // Since AudioNode::dispose() is guaranteed to be always called before | 390 // Since AudioNode::dispose() is guaranteed to be always called before |
401 // the AudioNode is destructed, m_audioSourceNode is explicitly cleared | 391 // the AudioNode is destructed, m_audioSourceNode is explicitly cleared |
402 // even if the AudioNode and the HTMLMediaElement die together. | 392 // even if the AudioNode and the HTMLMediaElement die together. |
403 ASSERT(!m_audioSourceNode); | 393 ASSERT(!m_audioSourceNode); |
404 #endif | |
405 } | 394 } |
406 | 395 |
407 #if ENABLE(OILPAN) | 396 #if ENABLE(OILPAN) |
408 void HTMLMediaElement::dispose() | 397 void HTMLMediaElement::dispose() |
409 { | 398 { |
410 // If the HTMLMediaElement dies with the Document we are not | 399 // If the HTMLMediaElement dies with the Document we are not |
411 // allowed to touch the Document to adjust delay load event counts | 400 // allowed to touch the Document to adjust delay load event counts |
412 // from the destructor, as the Document could have been already | 401 // from the destructor, as the Document could have been already |
413 // destructed. | 402 // destructed. |
414 // | 403 // |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
926 return; | 915 return; |
927 } | 916 } |
928 | 917 |
929 // The resource fetch algorithm | 918 // The resource fetch algorithm |
930 setNetworkState(NETWORK_LOADING); | 919 setNetworkState(NETWORK_LOADING); |
931 | 920 |
932 // Set m_currentSrc *before* changing to the cache url, the fact that we are
loading from the app | 921 // Set m_currentSrc *before* changing to the cache url, the fact that we are
loading from the app |
933 // cache is an internal detail not exposed through the media element API. | 922 // cache is an internal detail not exposed through the media element API. |
934 m_currentSrc = url; | 923 m_currentSrc = url; |
935 | 924 |
936 #if ENABLE(WEB_AUDIO) | |
937 if (m_audioSourceNode) | 925 if (m_audioSourceNode) |
938 m_audioSourceNode->onCurrentSrcChanged(m_currentSrc); | 926 m_audioSourceNode->onCurrentSrcChanged(m_currentSrc); |
939 #endif | |
940 | 927 |
941 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) - m_currentSrc -> %s", th
is, urlForLoggingMedia(m_currentSrc).utf8().data()); | 928 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) - m_currentSrc -> %s", th
is, urlForLoggingMedia(m_currentSrc).utf8().data()); |
942 | 929 |
943 startProgressEventTimer(); | 930 startProgressEventTimer(); |
944 | 931 |
945 // Reset display mode to force a recalculation of what to show because we ar
e resetting the player. | 932 // Reset display mode to force a recalculation of what to show because we ar
e resetting the player. |
946 setDisplayMode(Unknown); | 933 setDisplayMode(Unknown); |
947 | 934 |
948 setPlayerPreload(); | 935 setPlayerPreload(); |
949 | 936 |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1025 | 1012 |
1026 KURL kurl(ParsedURLString, requestURL); | 1013 KURL kurl(ParsedURLString, requestURL); |
1027 m_webMediaPlayer = frame->loader().client()->createWebMediaPlayer(*this, kur
l, this); | 1014 m_webMediaPlayer = frame->loader().client()->createWebMediaPlayer(*this, kur
l, this); |
1028 if (!m_webMediaPlayer) { | 1015 if (!m_webMediaPlayer) { |
1029 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 1016 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
1030 return; | 1017 return; |
1031 } | 1018 } |
1032 | 1019 |
1033 if (layoutObject()) | 1020 if (layoutObject()) |
1034 layoutObject()->setShouldDoFullPaintInvalidation(); | 1021 layoutObject()->setShouldDoFullPaintInvalidation(); |
1035 #if ENABLE(WEB_AUDIO) | |
1036 // Make sure if we create/re-create the WebMediaPlayer that we update our wr
apper. | 1022 // Make sure if we create/re-create the WebMediaPlayer that we update our wr
apper. |
1037 m_audioSourceProvider.wrap(m_webMediaPlayer->audioSourceProvider()); | 1023 m_audioSourceProvider.wrap(m_webMediaPlayer->audioSourceProvider()); |
1038 #endif | |
1039 m_webMediaPlayer->setVolume(effectiveMediaVolume()); | 1024 m_webMediaPlayer->setVolume(effectiveMediaVolume()); |
1040 | 1025 |
1041 m_webMediaPlayer->setPoster(posterImageURL()); | 1026 m_webMediaPlayer->setPoster(posterImageURL()); |
1042 | 1027 |
1043 m_webMediaPlayer->setPreload(effectivePreloadType()); | 1028 m_webMediaPlayer->setPreload(effectivePreloadType()); |
1044 | 1029 |
1045 m_webMediaPlayer->load(loadType(), kurl, corsMode()); | 1030 m_webMediaPlayer->load(loadType(), kurl, corsMode()); |
1046 | 1031 |
1047 if (isFullscreen()) { | 1032 if (isFullscreen()) { |
1048 // This handles any transition to or from fullscreen overlay mode. | 1033 // This handles any transition to or from fullscreen overlay mode. |
(...skipping 1938 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2987 } | 2972 } |
2988 | 2973 |
2989 void HTMLMediaElement::stopPeriodicTimers() | 2974 void HTMLMediaElement::stopPeriodicTimers() |
2990 { | 2975 { |
2991 m_progressEventTimer.stop(); | 2976 m_progressEventTimer.stop(); |
2992 m_playbackProgressTimer.stop(); | 2977 m_playbackProgressTimer.stop(); |
2993 } | 2978 } |
2994 | 2979 |
2995 void HTMLMediaElement::clearMediaPlayerAndAudioSourceProviderClientWithoutLockin
g() | 2980 void HTMLMediaElement::clearMediaPlayerAndAudioSourceProviderClientWithoutLockin
g() |
2996 { | 2981 { |
2997 #if ENABLE(WEB_AUDIO) | |
2998 audioSourceProvider().setClient(nullptr); | 2982 audioSourceProvider().setClient(nullptr); |
2999 #endif | |
3000 if (m_webMediaPlayer) { | 2983 if (m_webMediaPlayer) { |
3001 #if ENABLE(WEB_AUDIO) | |
3002 m_audioSourceProvider.wrap(nullptr); | 2984 m_audioSourceProvider.wrap(nullptr); |
3003 #endif | |
3004 m_webMediaPlayer.clear(); | 2985 m_webMediaPlayer.clear(); |
3005 } | 2986 } |
3006 } | 2987 } |
3007 | 2988 |
3008 void HTMLMediaElement::clearMediaPlayer(int flags) | 2989 void HTMLMediaElement::clearMediaPlayer(int flags) |
3009 { | 2990 { |
3010 forgetResourceSpecificTracks(); | 2991 forgetResourceSpecificTracks(); |
3011 | 2992 |
3012 closeMediaSource(); | 2993 closeMediaSource(); |
3013 | 2994 |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3417 | 3398 |
3418 { | 3399 { |
3419 AudioSourceProviderClientLockScope scope(*this); | 3400 AudioSourceProviderClientLockScope scope(*this); |
3420 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); | 3401 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); |
3421 } | 3402 } |
3422 | 3403 |
3423 // We haven't yet found out if any remote routes are available. | 3404 // We haven't yet found out if any remote routes are available. |
3424 m_remoteRoutesAvailable = false; | 3405 m_remoteRoutesAvailable = false; |
3425 m_playingRemotely = false; | 3406 m_playingRemotely = false; |
3426 | 3407 |
3427 #if ENABLE(WEB_AUDIO) | |
3428 if (m_audioSourceNode) | 3408 if (m_audioSourceNode) |
3429 audioSourceProvider().setClient(m_audioSourceNode); | 3409 audioSourceProvider().setClient(m_audioSourceNode); |
3430 #endif | |
3431 } | 3410 } |
3432 | 3411 |
3433 #if ENABLE(WEB_AUDIO) | |
3434 void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode) | 3412 void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode) |
3435 { | 3413 { |
3436 ASSERT(isMainThread()); | 3414 ASSERT(isMainThread()); |
3437 m_audioSourceNode = sourceNode; | 3415 m_audioSourceNode = sourceNode; |
3438 | 3416 |
3439 AudioSourceProviderClientLockScope scope(*this); | 3417 AudioSourceProviderClientLockScope scope(*this); |
3440 audioSourceProvider().setClient(m_audioSourceNode); | 3418 audioSourceProvider().setClient(m_audioSourceNode); |
3441 } | 3419 } |
3442 #endif | |
3443 | 3420 |
3444 void HTMLMediaElement::setAllowHiddenVolumeControls(bool allow) | 3421 void HTMLMediaElement::setAllowHiddenVolumeControls(bool allow) |
3445 { | 3422 { |
3446 ensureMediaControls(); | 3423 ensureMediaControls(); |
3447 mediaControls()->setAllowHiddenVolumeControls(allow); | 3424 mediaControls()->setAllowHiddenVolumeControls(allow); |
3448 } | 3425 } |
3449 | 3426 |
3450 WebMediaPlayer::CORSMode HTMLMediaElement::corsMode() const | 3427 WebMediaPlayer::CORSMode HTMLMediaElement::corsMode() const |
3451 { | 3428 { |
3452 const AtomicString& crossOriginMode = fastGetAttribute(crossoriginAttr); | 3429 const AtomicString& crossOriginMode = fastGetAttribute(crossoriginAttr); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3503 visitor->trace(m_asyncEventQueue); | 3480 visitor->trace(m_asyncEventQueue); |
3504 visitor->trace(m_error); | 3481 visitor->trace(m_error); |
3505 visitor->trace(m_currentSourceNode); | 3482 visitor->trace(m_currentSourceNode); |
3506 visitor->trace(m_nextChildNodeToConsider); | 3483 visitor->trace(m_nextChildNodeToConsider); |
3507 visitor->trace(m_mediaSource); | 3484 visitor->trace(m_mediaSource); |
3508 visitor->trace(m_audioTracks); | 3485 visitor->trace(m_audioTracks); |
3509 visitor->trace(m_videoTracks); | 3486 visitor->trace(m_videoTracks); |
3510 visitor->trace(m_cueTimeline); | 3487 visitor->trace(m_cueTimeline); |
3511 visitor->trace(m_textTracks); | 3488 visitor->trace(m_textTracks); |
3512 visitor->trace(m_textTracksWhenResourceSelectionBegan); | 3489 visitor->trace(m_textTracksWhenResourceSelectionBegan); |
3513 #if ENABLE(WEB_AUDIO) | |
3514 visitor->trace(m_audioSourceProvider); | 3490 visitor->trace(m_audioSourceProvider); |
3515 visitor->template registerWeakMembers<HTMLMediaElement, &HTMLMediaElement::c
learWeakMembers>(this); | 3491 visitor->template registerWeakMembers<HTMLMediaElement, &HTMLMediaElement::c
learWeakMembers>(this); |
3516 #endif | |
3517 visitor->trace(m_autoplayHelper); | 3492 visitor->trace(m_autoplayHelper); |
3518 HeapSupplementable<HTMLMediaElement>::trace(visitor); | 3493 HeapSupplementable<HTMLMediaElement>::trace(visitor); |
3519 #endif | 3494 #endif |
3520 HTMLElement::trace(visitor); | 3495 HTMLElement::trace(visitor); |
3521 ActiveDOMObject::trace(visitor); | 3496 ActiveDOMObject::trace(visitor); |
3522 } | 3497 } |
3523 | 3498 |
3524 void HTMLMediaElement::createPlaceholderTracksIfNecessary() | 3499 void HTMLMediaElement::createPlaceholderTracksIfNecessary() |
3525 { | 3500 { |
3526 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | 3501 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3582 { | 3557 { |
3583 m_autoplayHelper.updatePositionNotificationRegistration(); | 3558 m_autoplayHelper.updatePositionNotificationRegistration(); |
3584 } | 3559 } |
3585 | 3560 |
3586 // TODO(liberato): remove once autoplay gesture override experiment concludes. | 3561 // TODO(liberato): remove once autoplay gesture override experiment concludes. |
3587 void HTMLMediaElement::triggerAutoplayViewportCheckForTesting() | 3562 void HTMLMediaElement::triggerAutoplayViewportCheckForTesting() |
3588 { | 3563 { |
3589 m_autoplayHelper.triggerAutoplayViewportCheckForTesting(); | 3564 m_autoplayHelper.triggerAutoplayViewportCheckForTesting(); |
3590 } | 3565 } |
3591 | 3566 |
3592 #if ENABLE(WEB_AUDIO) | |
3593 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) | 3567 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) |
3594 { | 3568 { |
3595 if (!Heap::isHeapObjectAlive(m_audioSourceNode)) | 3569 if (!Heap::isHeapObjectAlive(m_audioSourceNode)) |
3596 audioSourceProvider().setClient(nullptr); | 3570 audioSourceProvider().setClient(nullptr); |
3597 } | 3571 } |
3598 | 3572 |
3599 void HTMLMediaElement::AudioSourceProviderImpl::wrap(WebAudioSourceProvider* pro
vider) | 3573 void HTMLMediaElement::AudioSourceProviderImpl::wrap(WebAudioSourceProvider* pro
vider) |
3600 { | 3574 { |
3601 MutexLocker locker(provideInputLock); | 3575 MutexLocker locker(provideInputLock); |
3602 | 3576 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3648 | 3622 |
3649 DEFINE_TRACE(HTMLMediaElement::AudioClientImpl) | 3623 DEFINE_TRACE(HTMLMediaElement::AudioClientImpl) |
3650 { | 3624 { |
3651 visitor->trace(m_client); | 3625 visitor->trace(m_client); |
3652 } | 3626 } |
3653 | 3627 |
3654 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl) | 3628 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl) |
3655 { | 3629 { |
3656 visitor->trace(m_client); | 3630 visitor->trace(m_client); |
3657 } | 3631 } |
3658 #endif | |
3659 | 3632 |
3660 } | 3633 } |
OLD | NEW |