0 Members and 1 Guest are viewing this topic.
m_pRenderClient->GetBuffer(numFramesAvailable, &pData);
Данные, приходящие от нижестоящего фильтра, в моем случае от Аудио-декодера, в случае Exclusive, перерабатываются Микшером, т.к. преобразуются в нужный формат.Использую EVENT. Примерно происходит так - в одной функции(стандартной) получаются данные из IMediaSample. Обрабатываются, если это надо, и складываются в буфер. В отдельном потоке, причем я ему выставил приоритет высокий, по событию берутся данныеCode: [Select]m_pRenderClient->GetBuffer(numFramesAvailable, &pData);копирую в pData из своего буфера и все.В отладчике смотрю, данных хватает, т.к. мой буфер всегда заполнен, не происходит его опустошение. Но видимо, по какой-то причине, сам механизм не успевает чтоли пережевывать данные или что-то в этом роде.Что можеш посоветовать. Самое что интересное - что на одних системах все ок, на других наблюдаются периодические щелчки, искажения и т.д.
Дамп буфера делали? Резких скачков / падений нигде нет?
GetDevicePeriod(NULL, &hnsPeriod);
if (AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED == hr) ...
мы пересчитываем размер, чтобы получить выравненный буфер. Так вот я столкнулся с такой ситуацией, что Initialize() возвращает S_OK, но размер буфера не выровненный, и далее у нас посторонние шумы и помехи во время проигрывания. Опытным путем я выяснил что размер должен быть кратен 128, и мне пришлось еще дополнительно вручную проверять это, и если, исправлять(увеличивать размер). После этого проигрывание идет нормально. Причем, что самое интересное, такое происходит на некоторых системах, в то же время на других все правильно, размер буфера нужный и т.д.
ASize := Max(AMinPeriod, SecondsToRefTime(SOUNDOUT_DEVICE_BUFFER_DURATION)); AError := Client.Initialize(acsmExclusive, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, ASize, ASize, @AFormat, nil); if AError = AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED then ...
На сколько у вас при этом большой размер буфера?Code: [Select] ASize := Max(AMinPeriod, SecondsToRefTime(SOUNDOUT_DEVICE_BUFFER_DURATION)); AError := Client.Initialize(acsmExclusive, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, ASize, ASize, @AFormat, nil); if AError = AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED then ...Единственное, что я делаю - ограничиваю минимальный размер буфера 0.1 секундой
Еще один вопрос - вы время паузы, перемотки "паузите" рабочий поток или дальше обрабатываете Event , но только с флагом AUDCLNT_BUFFERFLAGS_SILENT ??
При паузе в интерфейс идут нулевые данные, такой подход решил использовать потому, что не во всех интерфейсах есть возможность ставить устройство на паузу.