void FlangerNode::Connect( status_t status, const media_source& source, const media_destination& destination, const media_format& format, char* pioName) { PRINT(("FlangerNode::Connect()\n")); status_t err; // connection failed? if(status < B_OK) { PRINT(("\tStatus: %s\n", strerror(status))); // 'unreserve' the output m_output.destination = media_destination::null; return; } // connection established: strncpy(pioName, m_output.name, B_MEDIA_NAME_LENGTH); m_output.destination = destination; m_format = format; // figure downstream latency media_node_id timeSource; err = FindLatencyFor(m_output.destination, &m_downstreamLatency, &timeSource); if(err < B_OK) { PRINT(("\t!!! FindLatencyFor(): %s\n", strerror(err))); } PRINT(("\tdownstream latency = %Ld\n", m_downstreamLatency)); // prepare the filter initFilter(); // figure processing time m_processingLatency = calcProcessingLatency(); PRINT(("\tprocessing latency = %Ld\n", m_processingLatency)); // store summed latency SetEventLatency(m_downstreamLatency + m_processingLatency); if(m_input.source != media_source::null) { // pass new latency upstream err = SendLatencyChange( m_input.source, m_input.destination, EventLatency() + SchedulingLatency()); if(err < B_OK) PRINT(("\t!!! SendLatencyChange(): %s\n", strerror(err))); } // cache buffer duration SetBufferDuration( buffer_duration( m_format.u.raw_audio)); }
// [re-]initialize operation if necessary void AudioFilterNode::updateOperation() { if(m_input.source == media_source::null || m_output.destination == media_destination::null) // not fully connected; nothing to do return; // ask the factory for an operation ASSERT(m_opFactory); IAudioOp* op = m_opFactory->createOp( this, m_input.format.u.raw_audio, m_output.format.u.raw_audio); if(!op) { PRINT(( "!!! AudioFilterNode::updateOperation(): no operation created!\n")); // clean up existing operation delete m_op; m_op = 0; return; } // install new operation op->replace(m_op); m_op = op; // do performance tests (what if I'm running? +++++) m_processingLatency = calcProcessingLatency(); PRINT(("\tprocessing latency = %Ld\n", m_processingLatency)); // store summed latency SetEventLatency(m_downstreamLatency + m_processingLatency); // pass new latency upstream status_t err = SendLatencyChange( m_input.source, m_input.destination, EventLatency() + SchedulingLatency()); if(err < B_OK) PRINT(("\t!!! SendLatencyChange(): %s\n", strerror(err))); }