status_t ConnectionIO::instantiate( NodeManager* manager, const NodeSetIOContext* context, Connection* outCon) { // sanity checks ASSERT(manager); if(!m_inputNodeIO || !m_outputNodeIO) return B_NOT_ALLOWED; status_t err; media_node_id node; // find output node NodeRef* outputRef; err = m_outputNodeIO->getNode(manager, context, &node); if(err < B_OK) return err; err = manager->getNodeRef( node, &outputRef); if(err < B_OK) return err; // find output +++++ currently matches by name only const int32 outputBufferSize = 16; media_output outputs[outputBufferSize]; int32 count = outputBufferSize; //vector<media_output> outputs; // err = outputRef->getFreeOutputs( // outputs/*, // m_outputFormat.type*/); err = outputRef->getFreeOutputs( outputs, outputBufferSize, &count); if(err < B_OK) return err; media_output output; bool found = false; for(int n = 0; n < count; ++n) { if(m_outputName == outputs[n].name) { output = outputs[n]; found = true; break; } } if(!found) { PRINT(("!!! output '%s' of node '%s' not found\n", m_outputName.String(), outputRef->name())); return B_NAME_NOT_FOUND; } // find input node NodeRef* inputRef; err = m_inputNodeIO->getNode(manager, context, &node); if(err < B_OK) return err; err = manager->getNodeRef( node, &inputRef); if(err < B_OK) return err; // find input +++++ currently matches by name only vector<media_input> inputs; err = inputRef->getFreeInputs( inputs /*, m_inputFormat.type*/); if(err < B_OK) return err; media_input input; found = false; for(unsigned int n = 0; n < inputs.size(); ++n) { if(m_inputName == inputs[n].name) { input = inputs[n]; found = true; break; } } if(!found) { PRINT(("!!! input '%s' of node '%s' not found\n", m_inputName.String(), inputRef->name())); return B_NAME_NOT_FOUND; } // connect Connection con; if(m_requestedFormat.type != B_MEDIA_NO_TYPE) err = manager->connect( output, input, m_requestedFormat, &con); else err = manager->connect( output, input, &con); if(err < B_OK) return err; if(outCon) *outCon = con; return B_OK; }