Пример использует
DirectShow для проигрывания мультимедиа файлов с визуализацией аудиоданных посредством фильтра
Sample Grabber. Для IDE и скомпилированного варианта используются 2 разных подхода. Поскольку колбек метод
ISampleGrabberCB::BufferCB может вызываться из произвольных потоков то отладка в IDE такого способа напрямую опасна. Для этого в IDE используется метод
ISampleGrabber::GetCurrentBuffer который вызывается из основного потока, но имеет ограничения связанные с невозможностью узнать время буфера и получение только последнего буфера. Для компенсации задержки в IDE используется константа
IDE_DELAY_TIME которая задает время опережения курсора записи в буфер перед курсором считывания. В скомпилированном варианте используется пользовательский объект
CSampleGrabberBuffer с интерфейсом
ISampleGrabberBuffer который может обслуживать вызовы из разных потоков. Поскольку этот объект принимает вызовы из разных потоков то его реализация затруднена с использованием
Implements, поэтому используется "ручное" создание и реализация объекта в стандартном модуле.
Данный объект использует круговой буфер (когда курсор доходит до конца буфера он опять начинает запись сначала) для текущей позиции записи также привязывается метка времени проигрывания буфера. Согласно этой метки вычисляется позиция для курсора воспроизведения. Для сброса метки используется метод
ISampleGrabberBuffer::Reset пользовательского объекта (к примеру при первом включении или изменении позиции воспроизведения).
![Изображение](https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExZDl5cWJrazhsaXVvejl3a2I1ZHQ0cmVhY3lxZTN1NDM2eXo3bDZvOSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/AAuqxKWoix5Uv4XoZy/giphy.gif)
У вас нет доступа для просмотра вложений в этом сообщении.