OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011, Google Inc. All rights reserved. | 2 * Copyright (C) 2011, Google 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 26 matching lines...) Expand all Loading... |
37 | 37 |
38 MediaElementAudioSourceHandler::MediaElementAudioSourceHandler(AudioNode& node,
HTMLMediaElement& mediaElement) | 38 MediaElementAudioSourceHandler::MediaElementAudioSourceHandler(AudioNode& node,
HTMLMediaElement& mediaElement) |
39 : AudioHandler(NodeTypeMediaElementAudioSource, node, node.context()->sample
Rate()) | 39 : AudioHandler(NodeTypeMediaElementAudioSource, node, node.context()->sample
Rate()) |
40 , m_mediaElement(mediaElement) | 40 , m_mediaElement(mediaElement) |
41 , m_sourceNumberOfChannels(0) | 41 , m_sourceNumberOfChannels(0) |
42 , m_sourceSampleRate(0) | 42 , m_sourceSampleRate(0) |
43 , m_passesCurrentSrcCORSAccessCheck(passesCurrentSrcCORSAccessCheck(mediaEle
ment.currentSrc())) | 43 , m_passesCurrentSrcCORSAccessCheck(passesCurrentSrcCORSAccessCheck(mediaEle
ment.currentSrc())) |
44 , m_maybePrintCORSMessage(!m_passesCurrentSrcCORSAccessCheck) | 44 , m_maybePrintCORSMessage(!m_passesCurrentSrcCORSAccessCheck) |
45 , m_currentSrcString(mediaElement.currentSrc().getString()) | 45 , m_currentSrcString(mediaElement.currentSrc().getString()) |
46 { | 46 { |
47 ASSERT(isMainThread()); | 47 DCHECK(isMainThread()); |
48 // Default to stereo. This could change depending on what the media element | 48 // Default to stereo. This could change depending on what the media element |
49 // .src is set to. | 49 // .src is set to. |
50 addOutput(2); | 50 addOutput(2); |
51 | 51 |
52 initialize(); | 52 initialize(); |
53 } | 53 } |
54 | 54 |
55 PassRefPtr<MediaElementAudioSourceHandler> MediaElementAudioSourceHandler::creat
e(AudioNode& node, HTMLMediaElement& mediaElement) | 55 PassRefPtr<MediaElementAudioSourceHandler> MediaElementAudioSourceHandler::creat
e(AudioNode& node, HTMLMediaElement& mediaElement) |
56 { | 56 { |
57 return adoptRef(new MediaElementAudioSourceHandler(node, mediaElement)); | 57 return adoptRef(new MediaElementAudioSourceHandler(node, mediaElement)); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 BaseAudioContext::AutoLocker contextLocker(context()); | 101 BaseAudioContext::AutoLocker contextLocker(context()); |
102 | 102 |
103 // Do any necesssary re-configuration to the output's number of chan
nels. | 103 // Do any necesssary re-configuration to the output's number of chan
nels. |
104 output(0).setNumberOfChannels(numberOfChannels); | 104 output(0).setNumberOfChannels(numberOfChannels); |
105 } | 105 } |
106 } | 106 } |
107 } | 107 } |
108 | 108 |
109 bool MediaElementAudioSourceHandler::passesCORSAccessCheck() | 109 bool MediaElementAudioSourceHandler::passesCORSAccessCheck() |
110 { | 110 { |
111 ASSERT(mediaElement()); | 111 DCHECK(mediaElement()); |
112 | 112 |
113 return (mediaElement()->webMediaPlayer() && mediaElement()->webMediaPlayer()
->didPassCORSAccessCheck()) | 113 return (mediaElement()->webMediaPlayer() && mediaElement()->webMediaPlayer()
->didPassCORSAccessCheck()) |
114 || m_passesCurrentSrcCORSAccessCheck; | 114 || m_passesCurrentSrcCORSAccessCheck; |
115 } | 115 } |
116 | 116 |
117 void MediaElementAudioSourceHandler::onCurrentSrcChanged(const KURL& currentSrc) | 117 void MediaElementAudioSourceHandler::onCurrentSrcChanged(const KURL& currentSrc) |
118 { | 118 { |
119 ASSERT(isMainThread()); | 119 DCHECK(isMainThread()); |
120 | 120 |
121 // Synchronize with process(). | 121 // Synchronize with process(). |
122 Locker<MediaElementAudioSourceHandler> locker(*this); | 122 Locker<MediaElementAudioSourceHandler> locker(*this); |
123 | 123 |
124 m_passesCurrentSrcCORSAccessCheck = passesCurrentSrcCORSAccessCheck(currentS
rc); | 124 m_passesCurrentSrcCORSAccessCheck = passesCurrentSrcCORSAccessCheck(currentS
rc); |
125 | 125 |
126 // Make a note if we need to print a console message and save the |curentSrc
| for use in the | 126 // Make a note if we need to print a console message and save the |curentSrc
| for use in the |
127 // message. Need to wait until later to print the message in case HTMLMedia
Element allows | 127 // message. Need to wait until later to print the message in case HTMLMedia
Element allows |
128 // access. | 128 // access. |
129 m_maybePrintCORSMessage = !m_passesCurrentSrcCORSAccessCheck; | 129 m_maybePrintCORSMessage = !m_passesCurrentSrcCORSAccessCheck; |
130 m_currentSrcString = currentSrc.getString(); | 130 m_currentSrcString = currentSrc.getString(); |
131 } | 131 } |
132 | 132 |
133 bool MediaElementAudioSourceHandler::passesCurrentSrcCORSAccessCheck(const KURL&
currentSrc) | 133 bool MediaElementAudioSourceHandler::passesCurrentSrcCORSAccessCheck(const KURL&
currentSrc) |
134 { | 134 { |
135 ASSERT(isMainThread()); | 135 DCHECK(isMainThread()); |
136 return context()->getSecurityOrigin() && context()->getSecurityOrigin()->can
Request(currentSrc); | 136 return context()->getSecurityOrigin() && context()->getSecurityOrigin()->can
Request(currentSrc); |
137 } | 137 } |
138 | 138 |
139 void MediaElementAudioSourceHandler::printCORSMessage(const String& message) | 139 void MediaElementAudioSourceHandler::printCORSMessage(const String& message) |
140 { | 140 { |
141 if (context()->getExecutionContext()) { | 141 if (context()->getExecutionContext()) { |
142 context()->getExecutionContext()->addConsoleMessage( | 142 context()->getExecutionContext()->addConsoleMessage( |
143 ConsoleMessage::create(SecurityMessageSource, InfoMessageLevel, | 143 ConsoleMessage::create(SecurityMessageSource, InfoMessageLevel, |
144 "MediaElementAudioSource outputs zeroes due to CORS access restr
ictions for " + message)); | 144 "MediaElementAudioSource outputs zeroes due to CORS access restr
ictions for " + message)); |
145 } | 145 } |
146 } | 146 } |
147 | 147 |
148 void MediaElementAudioSourceHandler::process(size_t numberOfFrames) | 148 void MediaElementAudioSourceHandler::process(size_t numberOfFrames) |
149 { | 149 { |
150 AudioBus* outputBus = output(0).bus(); | 150 AudioBus* outputBus = output(0).bus(); |
151 | 151 |
152 // Use a tryLock() to avoid contention in the real-time audio thread. | 152 // Use a tryLock() to avoid contention in the real-time audio thread. |
153 // If we fail to acquire the lock then the HTMLMediaElement must be in the m
iddle of | 153 // If we fail to acquire the lock then the HTMLMediaElement must be in the m
iddle of |
154 // reconfiguring its playback engine, so we output silence in this case. | 154 // reconfiguring its playback engine, so we output silence in this case. |
155 MutexTryLocker tryLocker(m_processLock); | 155 MutexTryLocker tryLocker(m_processLock); |
156 if (tryLocker.locked()) { | 156 if (tryLocker.locked()) { |
157 if (!mediaElement() || !m_sourceNumberOfChannels || !m_sourceSampleRate)
{ | 157 if (!mediaElement() || !m_sourceNumberOfChannels || !m_sourceSampleRate)
{ |
158 outputBus->zero(); | 158 outputBus->zero(); |
159 return; | 159 return; |
160 } | 160 } |
161 AudioSourceProvider& provider = mediaElement()->getAudioSourceProvider()
; | 161 AudioSourceProvider& provider = mediaElement()->getAudioSourceProvider()
; |
162 // Grab data from the provider so that the element continues to make pro
gress, even if | 162 // Grab data from the provider so that the element continues to make pro
gress, even if |
163 // we're going to output silence anyway. | 163 // we're going to output silence anyway. |
164 if (m_multiChannelResampler.get()) { | 164 if (m_multiChannelResampler.get()) { |
165 ASSERT(m_sourceSampleRate != sampleRate()); | 165 DCHECK_NE(m_sourceSampleRate, sampleRate()); |
166 m_multiChannelResampler->process(&provider, outputBus, numberOfFrame
s); | 166 m_multiChannelResampler->process(&provider, outputBus, numberOfFrame
s); |
167 } else { | 167 } else { |
168 // Bypass the resampler completely if the source is at the context's
sample-rate. | 168 // Bypass the resampler completely if the source is at the context's
sample-rate. |
169 ASSERT(m_sourceSampleRate == sampleRate()); | 169 DCHECK_EQ(m_sourceSampleRate, sampleRate()); |
170 provider.provideInput(outputBus, numberOfFrames); | 170 provider.provideInput(outputBus, numberOfFrames); |
171 } | 171 } |
172 // Output silence if we don't have access to the element. | 172 // Output silence if we don't have access to the element. |
173 if (!passesCORSAccessCheck()) { | 173 if (!passesCORSAccessCheck()) { |
174 if (m_maybePrintCORSMessage) { | 174 if (m_maybePrintCORSMessage) { |
175 // Print a CORS message, but just once for each change in the cu
rrent media | 175 // Print a CORS message, but just once for each change in the cu
rrent media |
176 // element source, and only if we have a document to print to. | 176 // element source, and only if we have a document to print to. |
177 m_maybePrintCORSMessage = false; | 177 m_maybePrintCORSMessage = false; |
178 if (context()->getExecutionContext()) { | 178 if (context()->getExecutionContext()) { |
179 context()->getExecutionContext()->postTask(BLINK_FROM_HERE, | 179 context()->getExecutionContext()->postTask(BLINK_FROM_HERE, |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 mediaElementAudioSourceHandler().lock(); | 265 mediaElementAudioSourceHandler().lock(); |
266 } | 266 } |
267 | 267 |
268 void MediaElementAudioSourceNode::unlock() | 268 void MediaElementAudioSourceNode::unlock() |
269 { | 269 { |
270 mediaElementAudioSourceHandler().unlock(); | 270 mediaElementAudioSourceHandler().unlock(); |
271 } | 271 } |
272 | 272 |
273 } // namespace blink | 273 } // namespace blink |
274 | 274 |
OLD | NEW |