Welcome to Stratos!
Te creas un buffer, almacenas el valor del sample que te viene y lo sueltas cuando pase un tiempo. Cuanto más grande el buffer, más tiempo. Código de ejemplo:http://www.musicdsp.org/archive.php?classid=4#153Me aspotaría algo a que direct sound (o como pijos se llame ahora) lo lleva implementado.
HRESULT CSampleGrabber::Receive( IMediaSample * pms ){ CheckPointer(pms,E_POINTER); HRESULT hr; AM_SAMPLE2_PROPERTIES * const pProps = m_pInput->SampleProps(); //BufferTime long ldatasize=pms->GetActualDataLength(); long ldatasize100=ldatasize * m_iDelay; long ldatasize99=ldatasize * (m_iDelay-1); REFERENCE_TIME ini,fin; pms->GetTime (&ini,&fin); if (!ini) { if (m_Buff) ZeroMemory (m_Buff,ldatasize100); } if (!m_Buff) { m_Buff=(BYTE *)VirtualAlloc(NULL,ldatasize100,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE); m_Buff2=(BYTE *)VirtualAlloc(NULL,ldatasize100,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE); ZeroMemory (m_Buff,ldatasize100); } BYTE *pmsBuff; pms->GetPointer(&pmsBuff); CopyMemory (m_Buff2, m_Buff, ldatasize99 ); CopyMemory (m_Buff + ldatasize, m_Buff2, ldatasize99 ); CopyMemory (m_Buff, pmsBuff, ldatasize ); CopyMemory (pmsBuff ,m_Buff + ldatasize99, ldatasize); ... <codigo por defecto del SampleGrabber>