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);
}
Exemplo n.º 2
0
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;
}