REFERENCE_TIME CTimeStretchFilter::DrainBuffers(IMediaSample* pSample, REFERENCE_TIME rtNewStart) { Log("TS - DrainBuffers - rtNewStart: %6.3f", rtNewStart / 10000000.0); uint unprocessedSamplesBefore = numUnprocessedSamples(); uint zeros = flushEx() - 32; // Magic 32 to keep the SoundTouch's output in sync uint unprocessedSamplesAfter = numUnprocessedSamples(); UINT32 outFramesAfter = numSamples(); UINT32 totalSamples = zeros + unprocessedSamplesBefore; UINT32 totalProcessedSamples = totalSamples - unprocessedSamplesAfter; Log("TS - DrainBuffers - unprocessedSamplesBefore: %u zeros: %u unprocessedSamplesAfter: %u outFramesAfter: %u duration %6.3f", unprocessedSamplesBefore, zeros, unprocessedSamplesAfter, outFramesAfter, (double)unprocessedSamplesBefore * (double) UNITS / (double) m_pOutputFormat->Format.nSamplesPerSec); REFERENCE_TIME rtAHwTime = 0; REFERENCE_TIME rtRCTime = 0; REFERENCE_TIME estimatedExtraSampleDuration = (((int)zeros - (int)unprocessedSamplesAfter) * UNITS) / m_pOutputFormat->Format.nSamplesPerSec; double bias = m_pClock->GetBias(); double adjustment = m_pClock->Adjustment(); m_pClock->GetHWTime(&rtRCTime, &rtAHwTime); double AVMult = m_pClock->SuggestedAudioMultiplier(rtAHwTime, rtRCTime, bias, adjustment); setTempoInternal(AVMult, 1.0); CreateOutput(totalProcessedSamples, outFramesAfter, bias, adjustment, AVMult, true); // Empty SoundTouch's buffers clear(); pSample->SetDiscontinuity(false); return estimatedExtraSampleDuration; }
HRESULT CTimeStretchFilter::CheckSample(IMediaSample* pSample) { if (!pSample) return S_OK; AM_MEDIA_TYPE *pmt = NULL; bool bFormatChanged = false; HRESULT hr = S_OK; if (SUCCEEDED(pSample->GetMediaType(&pmt)) && pmt) bFormatChanged = !FormatsEqual((WAVEFORMATEXTENSIBLE*)pmt->pbFormat, m_pInputFormat); if (bFormatChanged) { uint unprocessedSamplesBefore = numUnprocessedSamples(); uint zeros = flushEx(); uint unprocessedSamplesAfter = numUnprocessedSamples(); UINT32 outFramesAfter = numSamples(); UINT32 totalSamples = zeros + unprocessedSamplesBefore; UINT32 totalProcessedSamples = totalSamples - unprocessedSamplesAfter; //double bias = (double)totalProcessedSamples / (double)outFramesAfter; REFERENCE_TIME estimatedSampleDuration = totalProcessedSamples * UNITS / m_pOutputFormat->Format.nSamplesPerSec; double bias = m_pClock->GetBias(); double adjustment = m_pClock->Adjustment(); double AVMult = m_pClock->SuggestedAudioMultiplier(estimatedSampleDuration, bias, adjustment); setTempoInternal(AVMult, 1.0); CreateOutput(totalProcessedSamples, outFramesAfter, bias, adjustment, AVMult, true); // Empty SoundTouch's buffers clear(); // Apply format change ChannelOrder chOrder; hr = NegotiateFormat((WAVEFORMATEXTENSIBLE*)pmt->pbFormat, 1, &chOrder); pSample->SetDiscontinuity(false); if (FAILED(hr)) { DeleteMediaType(pmt); Log("CTimeStretchFilter::CheckFormat failed to change format: 0x%08x", hr); return hr; } else { m_chOrder = chOrder; return S_FALSE; // format changed } } return S_OK; }