bool listenerStartStream(tl_state_t *pTLState) { AVB_TRACE_ENTRY(AVB_TRACE_TL); if (!pTLState) { AVB_LOG_ERROR("Invalid TLState"); AVB_TRACE_EXIT(AVB_TRACE_TL); return FALSE; } assert(!pTLState->bStreaming); openavb_tl_cfg_t *pCfg = &pTLState->cfg; listener_data_t *pListenerData = pTLState->pPvtListenerData; openavbRC rc = openavbAvtpRxInit(pTLState->pMediaQ, &pCfg->map_cb, &pCfg->intf_cb, pListenerData->ifname, &pListenerData->streamID, pListenerData->destAddr, pCfg->raw_rx_buffers, pCfg->rx_signal_mode, &pListenerData->avtpHandle); if (IS_OPENAVB_FAILURE(rc)) { AVB_LOG_ERROR("Failed to create AVTP stream"); AVB_TRACE_EXIT(AVB_TRACE_TL); return FALSE; } // Setup timers U64 nowNS; CLOCK_GETTIME64(OPENAVB_TIMER_CLOCK, &nowNS); pListenerData->nextReportNS = nowNS + (pCfg->report_seconds * NANOSECONDS_PER_SECOND); pListenerData->lastReportFrames = 0; pListenerData->nextSecondNS = nowNS + NANOSECONDS_PER_SECOND; // Clear counters pListenerData->nReportCalls = 0; pListenerData->nReportFrames = 0; // Clear stats openavbListenerClearStats(pTLState); // we're good to go! pTLState->bStreaming = TRUE; AVB_TRACE_EXIT(AVB_TRACE_TL); return TRUE; }
bool talkerStartStream(tl_state_t *pTLState) { AVB_TRACE_ENTRY(AVB_TRACE_TL); if (!pTLState) { AVB_LOG_ERROR("Invalid TLState"); AVB_TRACE_EXIT(AVB_TRACE_TL); return FALSE; } openavb_tl_cfg_t *pCfg = &pTLState->cfg; talker_data_t *pTalkerData = pTLState->pPvtTalkerData; assert(!pTLState->bStreaming); pTalkerData->wakeFrames = pCfg->max_interval_frames * pCfg->batch_factor; // Set a max_transmit_deficit_usec default if (pCfg->max_transmit_deficit_usec == 0) pCfg->max_transmit_deficit_usec = 50000; openavbRC rc = openavbAvtpTxInit(pTLState->pMediaQ, &pCfg->map_cb, &pCfg->intf_cb, pTalkerData->ifname, &pTalkerData->streamID, pTalkerData->destAddr, pCfg->max_transit_usec, pTalkerData->fwmark, pTalkerData->vlanID, pTalkerData->vlanPCP, pTalkerData->wakeFrames * pCfg->raw_tx_buffers, &pTalkerData->avtpHandle); if (IS_OPENAVB_FAILURE(rc)) { AVB_LOG_ERROR("Failed to create AVTP stream"); AVB_TRACE_EXIT(AVB_TRACE_TL); return FALSE; } avtp_stream_t *pStream = (avtp_stream_t *)(pTalkerData->avtpHandle); if (!pStream->pMapCB->map_transmit_interval_cb(pTLState->pMediaQ)) { pTalkerData->wakeRate = pTalkerData->classRate / pCfg->batch_factor; } else { // Override the class observation interval with the one provided by the mapping module. pTalkerData->wakeRate = pStream->pMapCB->map_transmit_interval_cb(pTLState->pMediaQ) / pCfg->batch_factor; } pTalkerData->sleepUsec = MICROSECONDS_PER_SECOND / pTalkerData->wakeRate; pTalkerData->intervalNS = NANOSECONDS_PER_SECOND / pTalkerData->wakeRate; U32 SRKbps = ((unsigned long)pTalkerData->classRate * (unsigned long)pCfg->max_interval_frames * (unsigned long)pStream->frameLen * 8L) / 1000; U32 DataKbps = ((unsigned long)pTalkerData->wakeRate * (unsigned long)pCfg->max_interval_frames * (unsigned long)pStream->frameLen * 8L) / 1000; AVB_LOGF_INFO(STREAMID_FORMAT", sr-rate=%" PRIu32 ", data-rate=%lu, frames=%" PRIu16 ", size=%" PRIu16 ", batch=%" PRIu32 ", sleep=%" PRIu64 "us, sr-Kbps=%d, data-Kbps=%d", STREAMID_ARGS(&pTalkerData->streamID), pTalkerData->classRate, pTalkerData->wakeRate, pTalkerData->tSpec.maxIntervalFrames, pTalkerData->tSpec.maxFrameSize, pCfg->batch_factor, pTalkerData->intervalNS / 1000, SRKbps, DataKbps); // number of intervals per report pTalkerData->wakesPerReport = pCfg->report_seconds * NANOSECONDS_PER_SECOND / pTalkerData->intervalNS; // counts of intervals and frames between reports pTalkerData->cntFrames = 0; pTalkerData->cntWakes = 0; // setup the initial times U64 nowNS; CLOCK_GETTIME64(OPENAVB_TIMER_CLOCK, &nowNS); // Align clock : allows for some performance gain nowNS = ((nowNS + (pTalkerData->intervalNS)) / pTalkerData->intervalNS) * pTalkerData->intervalNS; pTalkerData->nextReportNS = nowNS + (pCfg->report_seconds * NANOSECONDS_PER_SECOND); pTalkerData->nextSecondNS = nowNS + NANOSECONDS_PER_SECOND; pTalkerData->nextCycleNS = nowNS + pTalkerData->intervalNS; // Clear stats openavbTalkerClearStats(pTLState); // we're good to go! pTLState->bStreaming = TRUE; AVB_TRACE_EXIT(AVB_TRACE_TL); return TRUE; }