void AudioNode::connect(AudioNode* destination, unsigned outputIndex, unsigned inputIndex, ExceptionCode& ec) { ASSERT(isMainThread()); AudioContext::AutoLocker locker(context()); if (!destination) { ec = SYNTAX_ERR; return; } // Sanity check input and output indices. if (outputIndex >= numberOfOutputs()) { ec = INDEX_SIZE_ERR; return; } if (destination && inputIndex >= destination->numberOfInputs()) { ec = INDEX_SIZE_ERR; return; } if (context() != destination->context()) { ec = SYNTAX_ERR; return; } AudioNodeInput* input = destination->input(inputIndex); AudioNodeOutput* output = this->output(outputIndex); input->connect(output); // Let context know that a connection has been made. context()->incrementConnectionCount(); }
void AudioNode::connect(ContextGraphLock& g, std::shared_ptr<AudioParam> param, unsigned outputIndex) { if (!param) throw std::invalid_argument("No parameter specified"); if (outputIndex >= numberOfOutputs()) throw std::out_of_range("Output index greater than available outputs"); AudioParam::connect(g, param, this->output(outputIndex)); }
void AudioNode::connect(AudioParam* param, unsigned outputIndex, ExceptionState& exceptionState) { ASSERT(isMainThread()); AudioContext::AutoLocker locker(context()); if (!param) { exceptionState.throwDOMException( SyntaxError, "invalid AudioParam."); return; } if (outputIndex >= numberOfOutputs()) { exceptionState.throwDOMException( IndexSizeError, "output index (" + String::number(outputIndex) + ") exceeds number of outputs (" + String::number(numberOfOutputs()) + ")."); return; } if (context() != param->context()) { exceptionState.throwDOMException( SyntaxError, "cannot connect to an AudioParam belonging to a different audio context."); return; } AudioNodeOutput* output = this->output(outputIndex); param->connect(output); }
bool AudioNode::connect(AudioNode* destination, unsigned outputIndex, unsigned inputIndex) { ASSERT(isMainThread()); AudioContext::AutoLocker locker(context()); // Sanity check input and output indices. if (outputIndex >= numberOfOutputs()) return false; if (destination && inputIndex >= destination->numberOfInputs()) return false; AudioNodeOutput* output = this->output(outputIndex); if (!destination) { // Disconnect output from any inputs it may be currently connected to. output->disconnectAllInputs(); return true; } if (context() != destination->context()) return false; AudioNodeInput* input = destination->input(inputIndex); input->connect(output); // Let context know that a connection has been made. context()->incrementConnectionCount(); return true; }
void AudioNode::disconnect(unsigned outputIndex) { if (outputIndex >= numberOfOutputs()) throw std::out_of_range("Output index greater than available outputs"); /// @TODO FIXME // &&& can't do this, it's recursive // &&& context->disconnect(this->output(outputIndex)); }
void AudioNode::disconnect(unsigned outputIndex, ExceptionCode& ec) { ASSERT(isMainThread()); AudioContext::AutoLocker locker(context()); // Sanity check input and output indices. if (outputIndex >= numberOfOutputs()) { ec = INDEX_SIZE_ERR; return; } AudioNodeOutput* output = this->output(outputIndex); output->disconnectAllInputs(); }
void AudioNode::connect(AudioContext* context, AudioNode* destination, unsigned outputIndex, unsigned inputIndex) { if (!context) throw std::invalid_argument("No context specified"); if (!destination) throw std::invalid_argument("No destination specified"); if (outputIndex >= numberOfOutputs()) throw std::out_of_range("Output index greater than available outputs"); if (inputIndex >= destination->numberOfInputs()) throw std::out_of_range("Input index greater than available inputs"); auto input = destination->input(inputIndex); auto output = this->output(outputIndex); // &&& no need to defer this any more? If so remove connect from context and context from connect param list context->connect(input, output); }
void AudioNode::disconnect(unsigned outputIndex, ExceptionState& exceptionState) { ASSERT(isMainThread()); AudioContext::AutoLocker locker(context()); // Sanity check input and output indices. if (outputIndex >= numberOfOutputs()) { exceptionState.throwDOMException( IndexSizeError, "output index (" + String::number(outputIndex) + ") exceeds number of outputs (" + String::number(numberOfOutputs()) + ")."); return; } AudioNodeOutput* output = this->output(outputIndex); output->disconnectAll(); }
void AudioNode::connect(AudioNode* destination, unsigned outputIndex, unsigned inputIndex, ExceptionState& exceptionState) { ASSERT(isMainThread()); AudioContext::AutoLocker locker(context()); if (!destination) { exceptionState.throwDOMException( SyntaxError, "invalid destination node."); return; } // Sanity check input and output indices. if (outputIndex >= numberOfOutputs()) { exceptionState.throwDOMException( IndexSizeError, "output index (" + String::number(outputIndex) + ") exceeds number of outputs (" + String::number(numberOfOutputs()) + ")."); return; } if (destination && inputIndex >= destination->numberOfInputs()) { exceptionState.throwDOMException( IndexSizeError, "input index (" + String::number(inputIndex) + ") exceeds number of inputs (" + String::number(destination->numberOfInputs()) + ")."); return; } if (context() != destination->context()) { exceptionState.throwDOMException( SyntaxError, "cannot connect to a destination belonging to a different audio context."); return; } AudioNodeInput* input = destination->input(inputIndex); AudioNodeOutput* output = this->output(outputIndex); input->connect(output); // Let context know that a connection has been made. context()->incrementConnectionCount(); }
void ChannelSplitterNode::process(size_t framesToProcess) { AudioBus* source = input(0)->bus(); ASSERT(source); ASSERT_UNUSED(framesToProcess, framesToProcess == source->length()); unsigned numberOfSourceChannels = source->numberOfChannels(); for (unsigned i = 0; i < numberOfOutputs(); ++i) { AudioBus* destination = output(i)->bus(); ASSERT(destination); if (i < numberOfSourceChannels) { // Split the channel out if it exists in the source. // It would be nice to avoid the copy and simply pass along pointers, but this becomes extremely difficult with fanout and fanin. destination->channel(0)->copyFrom(source->channel(i)); } else if (output(i)->renderingFanOutCount() > 0) { // Only bother zeroing out the destination if it's connected to anything destination->zero(); } } }
void AudioNode::connect(AudioParam* param, unsigned outputIndex, ExceptionCode& ec) { ASSERT(isMainThread()); AudioContext::AutoLocker locker(context()); if (!param) { ec = SYNTAX_ERR; return; } if (outputIndex >= numberOfOutputs()) { ec = INDEX_SIZE_ERR; return; } if (context() != param->context()) { ec = SYNTAX_ERR; return; } AudioNodeOutput* output = this->output(outputIndex); param->connect(output); }