void CTimeStretchFilter::CreateOutput(UINT32 nInFrames, UINT32 nOutFrames, double dBias, double dAdjustment, double dAVMult, bool bFlushPartialSample) { HRESULT hr = S_OK; UINT32 maxBufferFrames = DEFAULT_OUT_BUFFER_SIZE / m_pOutputFormat->Format.nBlockAlign; UINT32 nOutFramesTotal = 0; while (nOutFrames > 0) { // try to get an output buffer if none available if (!m_pNextOutSample && FAILED(hr = RequestNextOutBuffer(m_rtInSampleTime))) { Log("CTimeStretchFilter::timestretch thread - Failed to get next output sample!"); break; } BYTE* pOutData = NULL; m_pNextOutSample->GetPointer(&pOutData); if (pOutData) { UINT32 nOffset = m_pNextOutSample->GetActualDataLength(); UINT32 nOffsetInFrames = nOffset / m_pOutputFormat->Format.nBlockAlign; if (nOutFrames > maxBufferFrames - nOffsetInFrames) nOutFrames = maxBufferFrames - nOffsetInFrames; m_pNextOutSample->SetActualDataLength(nOffset + nOutFrames * m_pOutputFormat->Format.nBlockAlign); pOutData += nOffset; receiveSamplesInternal((short*)pOutData, nOutFrames); nOutFramesTotal += nOutFrames; if (m_pMediaType) m_pNextOutSample->SetMediaType(m_pMediaType); OutputSample(bFlushPartialSample); nOutFrames = numSamples(); } } if (nOutFramesTotal > 0) { double rtSampleDuration = (double)nInFrames * (double)UNITS / (double)m_pOutputFormat->Format.nSamplesPerSec; double rtProcessedSampleDuration = (double)(nOutFramesTotal) * (double)UNITS / (double)m_pOutputFormat->Format.nSamplesPerSec; m_pClock->AudioResampled(rtProcessedSampleDuration, rtSampleDuration, dBias, dAdjustment, dAVMult); //Log(m_pClock->DebugData()); } }
void CTimeStretchFilter::CreateOutput(UINT32 nInFrames, UINT32 nOutFrames, double dBias, double dAdjustment, double dAVMult, bool bFlushPartialSample) { HRESULT hr = S_OK; UINT32 maxBufferFrames = m_nOutBufferSize / m_pOutputFormat->Format.nBlockAlign; UINT32 nOutFramesTotal = 0; while (nOutFrames > 0) { // try to get an output buffer if none available if (!m_pNextOutSample && FAILED(hr = RequestNextOutBuffer(m_rtInSampleTime))) { Log("CTimeStretchFilter::timestretch thread - Failed to get next output sample!"); break; } BYTE* pOutData = NULL; m_pNextOutSample->GetPointer(&pOutData); if (pOutData) { UINT32 nOffset = m_pNextOutSample->GetActualDataLength(); UINT32 nOffsetInFrames = nOffset / m_pOutputFormat->Format.nBlockAlign; if (nOutFrames > maxBufferFrames - nOffsetInFrames) nOutFrames = maxBufferFrames - nOffsetInFrames; m_pNextOutSample->SetActualDataLength(nOffset + nOutFrames * m_pOutputFormat->Format.nBlockAlign); pOutData += nOffset; receiveSamplesInternal((short*)pOutData, nOutFrames); nOutFramesTotal += nOutFrames; if (m_pMediaType) m_pNextOutSample->SetMediaType(m_pMediaType); OutputSample(bFlushPartialSample); nOutFrames = numSamples(); } } }