ScriptProcessorNode* ScriptProcessorNode::create(AbstractAudioContext& context, float sampleRate, size_t bufferSize, unsigned numberOfInputChannels, unsigned numberOfOutputChannels) { // Check for valid buffer size. switch (bufferSize) { case 0: bufferSize = chooseBufferSize(); break; case 256: case 512: case 1024: case 2048: case 4096: case 8192: case 16384: break; default: return nullptr; } if (!numberOfInputChannels && !numberOfOutputChannels) return nullptr; if (numberOfInputChannels > AbstractAudioContext::maxNumberOfChannels()) return nullptr; if (numberOfOutputChannels > AbstractAudioContext::maxNumberOfChannels()) return nullptr; return new ScriptProcessorNode(context, sampleRate, bufferSize, numberOfInputChannels, numberOfOutputChannels); }
ScriptProcessorNode* ScriptProcessorNode::create( BaseAudioContext& context, size_t bufferSize, unsigned numberOfInputChannels, unsigned numberOfOutputChannels, ExceptionState& exceptionState) { DCHECK(isMainThread()); if (context.isContextClosed()) { context.throwExceptionForClosedState(exceptionState); return nullptr; } if (numberOfInputChannels == 0 && numberOfOutputChannels == 0) { exceptionState.throwDOMException( IndexSizeError, "number of input channels and output channels cannot both be zero."); return nullptr; } if (numberOfInputChannels > BaseAudioContext::maxNumberOfChannels()) { exceptionState.throwDOMException( IndexSizeError, "number of input channels (" + String::number(numberOfInputChannels) + ") exceeds maximum (" + String::number(BaseAudioContext::maxNumberOfChannels()) + ")."); return nullptr; } if (numberOfOutputChannels > BaseAudioContext::maxNumberOfChannels()) { exceptionState.throwDOMException( IndexSizeError, "number of output channels (" + String::number(numberOfOutputChannels) + ") exceeds maximum (" + String::number(BaseAudioContext::maxNumberOfChannels()) + ")."); return nullptr; } // Check for valid buffer size. switch (bufferSize) { case 0: bufferSize = chooseBufferSize(); break; case 256: case 512: case 1024: case 2048: case 4096: case 8192: case 16384: break; default: exceptionState.throwDOMException( IndexSizeError, "buffer size (" + String::number(bufferSize) + ") must be 0 or a power of two between 256 and 16384."); return nullptr; } ScriptProcessorNode* node = new ScriptProcessorNode(context, context.sampleRate(), bufferSize, numberOfInputChannels, numberOfOutputChannels); if (!node) return nullptr; // context keeps reference until we stop making javascript rendering callbacks context.notifySourceNodeStartedProcessing(node); return node; }