| 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 * 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 size_t bufferLength = buffer->length(); | 112 size_t bufferLength = buffer->length(); |
| 113 | 113 |
| 114 // The current implementation supports only 1-, 2-, or 4-channel impulse | 114 // The current implementation supports only 1-, 2-, or 4-channel impulse |
| 115 // responses, with the 4-channel response being interpreted as true-stereo | 115 // responses, with the 4-channel response being interpreted as true-stereo |
| 116 // (see Reverb class). | 116 // (see Reverb class). |
| 117 bool isChannelCountGood = | 117 bool isChannelCountGood = |
| 118 numberOfChannels == 1 || numberOfChannels == 2 || numberOfChannels == 4; | 118 numberOfChannels == 1 || numberOfChannels == 2 || numberOfChannels == 4; |
| 119 | 119 |
| 120 if (!isChannelCountGood) { | 120 if (!isChannelCountGood) { |
| 121 exceptionState.throwDOMException( | 121 exceptionState.throwDOMException( |
| 122 NotSupportedError, "The buffer must have 1, 2, or 4 channels, not " + | 122 NotSupportedError, |
| 123 String::number(numberOfChannels)); | 123 "The buffer must have 1, 2, or 4 channels, not " + |
| 124 String::number(numberOfChannels)); |
| 124 return; | 125 return; |
| 125 } | 126 } |
| 126 | 127 |
| 127 // Wrap the AudioBuffer by an AudioBus. It's an efficient pointer set and not | 128 // Wrap the AudioBuffer by an AudioBus. It's an efficient pointer set and not |
| 128 // a memcpy(). This memory is simply used in the Reverb constructor and no | 129 // a memcpy(). This memory is simply used in the Reverb constructor and no |
| 129 // reference to it is kept for later use in that class. | 130 // reference to it is kept for later use in that class. |
| 130 RefPtr<AudioBus> bufferBus = | 131 RefPtr<AudioBus> bufferBus = |
| 131 AudioBus::create(numberOfChannels, bufferLength, false); | 132 AudioBus::create(numberOfChannels, bufferLength, false); |
| 132 for (unsigned i = 0; i < numberOfChannels; ++i) | 133 for (unsigned i = 0; i < numberOfChannels; ++i) |
| 133 bufferBus->setChannelMemory(i, buffer->getChannelData(i)->data(), | 134 bufferBus->setChannelMemory(i, buffer->getChannelData(i)->data(), |
| (...skipping 15 matching lines...) Expand all Loading... |
| 149 } | 150 } |
| 150 | 151 |
| 151 AudioBuffer* ConvolverHandler::buffer() { | 152 AudioBuffer* ConvolverHandler::buffer() { |
| 152 DCHECK(isMainThread()); | 153 DCHECK(isMainThread()); |
| 153 return m_buffer.get(); | 154 return m_buffer.get(); |
| 154 } | 155 } |
| 155 | 156 |
| 156 double ConvolverHandler::tailTime() const { | 157 double ConvolverHandler::tailTime() const { |
| 157 MutexTryLocker tryLocker(m_processLock); | 158 MutexTryLocker tryLocker(m_processLock); |
| 158 if (tryLocker.locked()) | 159 if (tryLocker.locked()) |
| 159 return m_reverb | 160 return m_reverb ? m_reverb->impulseResponseLength() / |
| 160 ? m_reverb->impulseResponseLength() / | 161 static_cast<double>(context()->sampleRate()) |
| 161 static_cast<double>(context()->sampleRate()) | 162 : 0; |
| 162 : 0; | |
| 163 // Since we don't want to block the Audio Device thread, we return a large | 163 // Since we don't want to block the Audio Device thread, we return a large |
| 164 // value instead of trying to acquire the lock. | 164 // value instead of trying to acquire the lock. |
| 165 return std::numeric_limits<double>::infinity(); | 165 return std::numeric_limits<double>::infinity(); |
| 166 } | 166 } |
| 167 | 167 |
| 168 double ConvolverHandler::latencyTime() const { | 168 double ConvolverHandler::latencyTime() const { |
| 169 MutexTryLocker tryLocker(m_processLock); | 169 MutexTryLocker tryLocker(m_processLock); |
| 170 if (tryLocker.locked()) | 170 if (tryLocker.locked()) |
| 171 return m_reverb | 171 return m_reverb ? m_reverb->latencyFrames() / |
| 172 ? m_reverb->latencyFrames() / | 172 static_cast<double>(context()->sampleRate()) |
| 173 static_cast<double>(context()->sampleRate()) | 173 : 0; |
| 174 : 0; | |
| 175 // Since we don't want to block the Audio Device thread, we return a large | 174 // Since we don't want to block the Audio Device thread, we return a large |
| 176 // value instead of trying to acquire the lock. | 175 // value instead of trying to acquire the lock. |
| 177 return std::numeric_limits<double>::infinity(); | 176 return std::numeric_limits<double>::infinity(); |
| 178 } | 177 } |
| 179 | 178 |
| 180 // ---------------------------------------------------------------- | 179 // ---------------------------------------------------------------- |
| 181 | 180 |
| 182 ConvolverNode::ConvolverNode(BaseAudioContext& context) : AudioNode(context) { | 181 ConvolverNode::ConvolverNode(BaseAudioContext& context) : AudioNode(context) { |
| 183 setHandler(ConvolverHandler::create(*this, context.sampleRate())); | 182 setHandler(ConvolverHandler::create(*this, context.sampleRate())); |
| 184 } | 183 } |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 | 227 |
| 229 bool ConvolverNode::normalize() const { | 228 bool ConvolverNode::normalize() const { |
| 230 return convolverHandler().normalize(); | 229 return convolverHandler().normalize(); |
| 231 } | 230 } |
| 232 | 231 |
| 233 void ConvolverNode::setNormalize(bool normalize) { | 232 void ConvolverNode::setNormalize(bool normalize) { |
| 234 convolverHandler().setNormalize(normalize); | 233 convolverHandler().setNormalize(normalize); |
| 235 } | 234 } |
| 236 | 235 |
| 237 } // namespace blink | 236 } // namespace blink |
| OLD | NEW |