Esempio n. 1
0
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();
}
Esempio n. 2
0
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));
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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));
}
Esempio n. 6
0
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();
}
Esempio n. 7
0
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);

}
Esempio n. 8
0
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();
}
Esempio n. 9
0
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();
}
Esempio n. 10
0
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();
        }
    }
}
Esempio n. 11
0
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);
}