| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 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 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 #include "wtf/MathExtras.h" | 34 #include "wtf/MathExtras.h" |
| 35 | 35 |
| 36 namespace blink { | 36 namespace blink { |
| 37 | 37 |
| 38 const double AudioParamHandler::DefaultSmoothingConstant = 0.05; | 38 const double AudioParamHandler::DefaultSmoothingConstant = 0.05; |
| 39 const double AudioParamHandler::SnapThreshold = 0.001; | 39 const double AudioParamHandler::SnapThreshold = 0.001; |
| 40 | 40 |
| 41 float AudioParamHandler::value() | 41 float AudioParamHandler::value() |
| 42 { | 42 { |
| 43 // Update value for timeline. | 43 // Update value for timeline. |
| 44 if (context() && context()->isAudioThread()) { | 44 if (deferredTaskHandler().isAudioThread()) { |
| 45 bool hasValue; | 45 bool hasValue; |
| 46 float timelineValue = m_timeline.valueForContextTime(context(), narrowPr
ecisionToFloat(m_value), hasValue); | 46 float timelineValue = m_timeline.valueForContextTime(context(), narrowPr
ecisionToFloat(m_value), hasValue); |
| 47 | 47 |
| 48 if (hasValue) | 48 if (hasValue) |
| 49 m_value = timelineValue; | 49 m_value = timelineValue; |
| 50 } | 50 } |
| 51 | 51 |
| 52 return narrowPrecisionToFloat(m_value); | 52 return narrowPrecisionToFloat(m_value); |
| 53 } | 53 } |
| 54 | 54 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 | 93 |
| 94 float AudioParamHandler::finalValue() | 94 float AudioParamHandler::finalValue() |
| 95 { | 95 { |
| 96 float value = m_value; | 96 float value = m_value; |
| 97 calculateFinalValues(&value, 1, false); | 97 calculateFinalValues(&value, 1, false); |
| 98 return value; | 98 return value; |
| 99 } | 99 } |
| 100 | 100 |
| 101 void AudioParamHandler::calculateSampleAccurateValues(float* values, unsigned nu
mberOfValues) | 101 void AudioParamHandler::calculateSampleAccurateValues(float* values, unsigned nu
mberOfValues) |
| 102 { | 102 { |
| 103 bool isSafe = context() && context()->isAudioThread() && values && numberOfV
alues; | 103 bool isSafe = deferredTaskHandler().isAudioThread() && values && numberOfVal
ues; |
| 104 ASSERT(isSafe); | 104 ASSERT(isSafe); |
| 105 if (!isSafe) | 105 if (!isSafe) |
| 106 return; | 106 return; |
| 107 | 107 |
| 108 calculateFinalValues(values, numberOfValues, true); | 108 calculateFinalValues(values, numberOfValues, true); |
| 109 } | 109 } |
| 110 | 110 |
| 111 void AudioParamHandler::calculateFinalValues(float* values, unsigned numberOfVal
ues, bool sampleAccurate) | 111 void AudioParamHandler::calculateFinalValues(float* values, unsigned numberOfVal
ues, bool sampleAccurate) |
| 112 { | 112 { |
| 113 bool isGood = context() && context()->isAudioThread() && values && numberOfV
alues; | 113 bool isGood = deferredTaskHandler().isAudioThread() && values && numberOfVal
ues; |
| 114 ASSERT(isGood); | 114 ASSERT(isGood); |
| 115 if (!isGood) | 115 if (!isGood) |
| 116 return; | 116 return; |
| 117 | 117 |
| 118 // The calculated result will be the "intrinsic" value summed with all audio
-rate connections. | 118 // The calculated result will be the "intrinsic" value summed with all audio
-rate connections. |
| 119 | 119 |
| 120 if (sampleAccurate) { | 120 if (sampleAccurate) { |
| 121 // Calculate sample-accurate (a-rate) intrinsic values. | 121 // Calculate sample-accurate (a-rate) intrinsic values. |
| 122 calculateTimelineValues(values, numberOfValues); | 122 calculateTimelineValues(values, numberOfValues); |
| 123 } else { | 123 } else { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 double startTime = context()->currentTime(); | 156 double startTime = context()->currentTime(); |
| 157 double endTime = startTime + numberOfValues / sampleRate; | 157 double endTime = startTime + numberOfValues / sampleRate; |
| 158 | 158 |
| 159 // Note we're running control rate at the sample-rate. | 159 // Note we're running control rate at the sample-rate. |
| 160 // Pass in the current value as default value. | 160 // Pass in the current value as default value. |
| 161 m_value = m_timeline.valuesForTimeRange(startTime, endTime, narrowPrecisionT
oFloat(m_value), values, numberOfValues, sampleRate, sampleRate); | 161 m_value = m_timeline.valuesForTimeRange(startTime, endTime, narrowPrecisionT
oFloat(m_value), values, numberOfValues, sampleRate, sampleRate); |
| 162 } | 162 } |
| 163 | 163 |
| 164 void AudioParamHandler::connect(AudioNodeOutput& output) | 164 void AudioParamHandler::connect(AudioNodeOutput& output) |
| 165 { | 165 { |
| 166 ASSERT(context()->isGraphOwner()); | 166 ASSERT(deferredTaskHandler().isGraphOwner()); |
| 167 | 167 |
| 168 if (m_outputs.contains(&output)) | 168 if (m_outputs.contains(&output)) |
| 169 return; | 169 return; |
| 170 | 170 |
| 171 output.addParam(*this); | 171 output.addParam(*this); |
| 172 m_outputs.add(&output); | 172 m_outputs.add(&output); |
| 173 changedOutputs(); | 173 changedOutputs(); |
| 174 } | 174 } |
| 175 | 175 |
| 176 void AudioParamHandler::disconnect(AudioNodeOutput& output) | 176 void AudioParamHandler::disconnect(AudioNodeOutput& output) |
| 177 { | 177 { |
| 178 ASSERT(context()->isGraphOwner()); | 178 ASSERT(deferredTaskHandler().isGraphOwner()); |
| 179 | 179 |
| 180 if (m_outputs.contains(&output)) { | 180 if (m_outputs.contains(&output)) { |
| 181 m_outputs.remove(&output); | 181 m_outputs.remove(&output); |
| 182 changedOutputs(); | 182 changedOutputs(); |
| 183 output.removeParam(*this); | 183 output.removeParam(*this); |
| 184 } | 184 } |
| 185 } | 185 } |
| 186 | 186 |
| 187 DEFINE_TRACE(AudioParamHandler) |
| 188 { |
| 189 visitor->trace(m_context); |
| 190 // TODO(tkent): Oilpan: m_renderingOutputs should not be strong references. |
| 191 // This is a short-term workaround to avoid crashes, and causes AudioNode |
| 192 // leaks. |
| 193 AudioContext::AutoLocker locker(deferredTaskHandler()); |
| 194 for (size_t i = 0; i < m_renderingOutputs.size(); ++i) |
| 195 visitor->trace(m_renderingOutputs[i]); |
| 196 } |
| 197 |
| 187 } // namespace blink | 198 } // namespace blink |
| 188 | 199 |
| 189 #endif // ENABLE(WEB_AUDIO) | 200 #endif // ENABLE(WEB_AUDIO) |
| OLD | NEW |