| 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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 size_t bufferSize = 1 << static_cast<unsigned>(log2(4 * hardwareBufferSize)
+ 0.5); | 49 size_t bufferSize = 1 << static_cast<unsigned>(log2(4 * hardwareBufferSize)
+ 0.5); |
| 50 | 50 |
| 51 if (bufferSize < 256) | 51 if (bufferSize < 256) |
| 52 return 256; | 52 return 256; |
| 53 if (bufferSize > 16384) | 53 if (bufferSize > 16384) |
| 54 return 16384; | 54 return 16384; |
| 55 | 55 |
| 56 return bufferSize; | 56 return bufferSize; |
| 57 } | 57 } |
| 58 | 58 |
| 59 PassRefPtr<ScriptProcessorNode> ScriptProcessorNode::create(AudioContext* contex
t, float sampleRate, size_t bufferSize, unsigned numberOfInputChannels, unsigned
numberOfOutputChannels) | 59 PassRefPtrWillBeRawPtr<ScriptProcessorNode> ScriptProcessorNode::create(AudioCon
text* context, float sampleRate, size_t bufferSize, unsigned numberOfInputChanne
ls, unsigned numberOfOutputChannels) |
| 60 { | 60 { |
| 61 // Check for valid buffer size. | 61 // Check for valid buffer size. |
| 62 switch (bufferSize) { | 62 switch (bufferSize) { |
| 63 case 0: | 63 case 0: |
| 64 bufferSize = chooseBufferSize(); | 64 bufferSize = chooseBufferSize(); |
| 65 break; | 65 break; |
| 66 case 256: | 66 case 256: |
| 67 case 512: | 67 case 512: |
| 68 case 1024: | 68 case 1024: |
| 69 case 2048: | 69 case 2048: |
| 70 case 4096: | 70 case 4096: |
| 71 case 8192: | 71 case 8192: |
| 72 case 16384: | 72 case 16384: |
| 73 break; | 73 break; |
| 74 default: | 74 default: |
| 75 return nullptr; | 75 return nullptr; |
| 76 } | 76 } |
| 77 | 77 |
| 78 if (!numberOfInputChannels && !numberOfOutputChannels) | 78 if (!numberOfInputChannels && !numberOfOutputChannels) |
| 79 return nullptr; | 79 return nullptr; |
| 80 | 80 |
| 81 if (numberOfInputChannels > AudioContext::maxNumberOfChannels()) | 81 if (numberOfInputChannels > AudioContext::maxNumberOfChannels()) |
| 82 return nullptr; | 82 return nullptr; |
| 83 | 83 |
| 84 if (numberOfOutputChannels > AudioContext::maxNumberOfChannels()) | 84 if (numberOfOutputChannels > AudioContext::maxNumberOfChannels()) |
| 85 return nullptr; | 85 return nullptr; |
| 86 | 86 |
| 87 return adoptRef(new ScriptProcessorNode(context, sampleRate, bufferSize, num
berOfInputChannels, numberOfOutputChannels)); | 87 return adoptRefWillBeNoop(new ScriptProcessorNode(context, sampleRate, buffe
rSize, numberOfInputChannels, numberOfOutputChannels)); |
| 88 } | 88 } |
| 89 | 89 |
| 90 ScriptProcessorNode::ScriptProcessorNode(AudioContext* context, float sampleRate
, size_t bufferSize, unsigned numberOfInputChannels, unsigned numberOfOutputChan
nels) | 90 ScriptProcessorNode::ScriptProcessorNode(AudioContext* context, float sampleRate
, size_t bufferSize, unsigned numberOfInputChannels, unsigned numberOfOutputChan
nels) |
| 91 : AudioNode(context, sampleRate) | 91 : AudioNode(context, sampleRate) |
| 92 , m_doubleBufferIndex(0) | 92 , m_doubleBufferIndex(0) |
| 93 , m_doubleBufferIndexForEvent(0) | 93 , m_doubleBufferIndexForEvent(0) |
| 94 , m_bufferSize(bufferSize) | 94 , m_bufferSize(bufferSize) |
| 95 , m_bufferReadWriteIndex(0) | 95 , m_bufferReadWriteIndex(0) |
| 96 , m_numberOfInputChannels(numberOfInputChannels) | 96 , m_numberOfInputChannels(numberOfInputChannels) |
| 97 , m_numberOfOutputChannels(numberOfOutputChannels) | 97 , m_numberOfOutputChannels(numberOfOutputChannels) |
| 98 , m_internalInputBus(AudioBus::create(numberOfInputChannels, AudioNode::Proc
essingSizeInFrames, false)) | 98 , m_internalInputBus(AudioBus::create(numberOfInputChannels, AudioNode::Proc
essingSizeInFrames, false)) |
| 99 { | 99 { |
| 100 ScriptWrappable::init(this); | 100 ScriptWrappable::init(this); |
| 101 // Regardless of the allowed buffer sizes, we still need to process at the g
ranularity of the AudioNode. | 101 // Regardless of the allowed buffer sizes, we still need to process at the g
ranularity of the AudioNode. |
| 102 if (m_bufferSize < AudioNode::ProcessingSizeInFrames) | 102 if (m_bufferSize < AudioNode::ProcessingSizeInFrames) |
| 103 m_bufferSize = AudioNode::ProcessingSizeInFrames; | 103 m_bufferSize = AudioNode::ProcessingSizeInFrames; |
| 104 | 104 |
| 105 ASSERT(numberOfInputChannels <= AudioContext::maxNumberOfChannels()); | 105 ASSERT(numberOfInputChannels <= AudioContext::maxNumberOfChannels()); |
| 106 | 106 |
| 107 addInput(adoptPtr(new AudioNodeInput(this))); | 107 addInput(adoptPtrWillBeNoop(new AudioNodeInput(this))); |
| 108 addOutput(adoptPtr(new AudioNodeOutput(this, numberOfOutputChannels))); | 108 addOutput(adoptPtr(new AudioNodeOutput(this, numberOfOutputChannels))); |
| 109 | 109 |
| 110 setNodeType(NodeTypeJavaScript); | 110 setNodeType(NodeTypeJavaScript); |
| 111 | 111 |
| 112 initialize(); | 112 initialize(); |
| 113 } | 113 } |
| 114 | 114 |
| 115 ScriptProcessorNode::~ScriptProcessorNode() | 115 ScriptProcessorNode::~ScriptProcessorNode() |
| 116 { | 116 { |
| 117 uninitialize(); | 117 uninitialize(); |
| 118 } | 118 } |
| 119 | 119 |
| 120 void ScriptProcessorNode::initialize() | 120 void ScriptProcessorNode::initialize() |
| 121 { | 121 { |
| 122 if (isInitialized()) | 122 if (isInitialized()) |
| 123 return; | 123 return; |
| 124 | 124 |
| 125 float sampleRate = context()->sampleRate(); | 125 float sampleRate = context()->sampleRate(); |
| 126 | 126 |
| 127 // Create double buffers on both the input and output sides. | 127 // Create double buffers on both the input and output sides. |
| 128 // These AudioBuffers will be directly accessed in the main thread by JavaSc
ript. | 128 // These AudioBuffers will be directly accessed in the main thread by JavaSc
ript. |
| 129 for (unsigned i = 0; i < 2; ++i) { | 129 for (unsigned i = 0; i < 2; ++i) { |
| 130 RefPtr<AudioBuffer> inputBuffer = m_numberOfInputChannels ? AudioBuffer:
:create(m_numberOfInputChannels, bufferSize(), sampleRate) : nullptr; | 130 RefPtrWillBeRawPtr<AudioBuffer> inputBuffer = m_numberOfInputChannels ?
AudioBuffer::create(m_numberOfInputChannels, bufferSize(), sampleRate) : nullptr
; |
| 131 RefPtr<AudioBuffer> outputBuffer = m_numberOfOutputChannels ? AudioBuffe
r::create(m_numberOfOutputChannels, bufferSize(), sampleRate) : nullptr; | 131 RefPtrWillBeRawPtr<AudioBuffer> outputBuffer = m_numberOfOutputChannels
? AudioBuffer::create(m_numberOfOutputChannels, bufferSize(), sampleRate) : null
ptr; |
| 132 | 132 |
| 133 m_inputBuffers.append(inputBuffer); | 133 m_inputBuffers.append(inputBuffer); |
| 134 m_outputBuffers.append(outputBuffer); | 134 m_outputBuffers.append(outputBuffer); |
| 135 } | 135 } |
| 136 | 136 |
| 137 AudioNode::initialize(); | 137 AudioNode::initialize(); |
| 138 } | 138 } |
| 139 | 139 |
| 140 void ScriptProcessorNode::uninitialize() | 140 void ScriptProcessorNode::uninitialize() |
| 141 { | 141 { |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 double ScriptProcessorNode::tailTime() const | 277 double ScriptProcessorNode::tailTime() const |
| 278 { | 278 { |
| 279 return std::numeric_limits<double>::infinity(); | 279 return std::numeric_limits<double>::infinity(); |
| 280 } | 280 } |
| 281 | 281 |
| 282 double ScriptProcessorNode::latencyTime() const | 282 double ScriptProcessorNode::latencyTime() const |
| 283 { | 283 { |
| 284 return std::numeric_limits<double>::infinity(); | 284 return std::numeric_limits<double>::infinity(); |
| 285 } | 285 } |
| 286 | 286 |
| 287 void ScriptProcessorNode::trace(Visitor* visitor) |
| 288 { |
| 289 visitor->trace(m_inputBuffers); |
| 290 visitor->trace(m_outputBuffers); |
| 291 AudioNode::trace(visitor); |
| 292 } |
| 293 |
| 287 } // namespace WebCore | 294 } // namespace WebCore |
| 288 | 295 |
| 289 #endif // ENABLE(WEB_AUDIO) | 296 #endif // ENABLE(WEB_AUDIO) |
| OLD | NEW |