BeholdNN писал(а):
1. Действительно ли SignalPresent выдает только 0 и 100 (возможно -1, 0, 100).
Согласно
http://msdn.microsoft.com/en-us/library ... 85%29.aspx он должен бы выдавать -1, 0, 1.
До этого работал с тюнером AverMedia и выяснилось, что он выдает значения в диапазоне от -1 до 5, т.е. дает некую оценку уровня/качества сигнала. Когда стал пробовать тюнер Behold получил результат, который описал ранее (сделал для себя вывод, что оценить уровень сигнала таким же способом не получится и, что реализация методов зависит от производителя).
У каждого вендора есть отклонения в реализации. В конкретном случае у AverMedia добавлен "костыль", вероятно для удобства работы с собственным ПО. В нашем случае SignalPresent=100 это наследие от логики Philips. В случае, когда драйвер рапортует в KSPROPERTY_TUNER_MODE_CAPS_S::Strategy значение KS_TUNER_STRATEGY_PLL, это означает что hardware не поддерживает выдачу уровня сигнала. Вменяемый уроверь сигнала в dBuV на аппаратном уровне выдают только тюнеры TDA18273HN. Поэтому драйвер у нас возвращает всегда KS_TUNER_STRATEGY_PLL, что означает, что он поддерживает выдачу отклонения до несущей (KSPROPERTY_TUNER_STATUS_S::PLLOffset). В этом случае поле SignalPresent лишь выдает наличие несущей. Любое положительное число > 0 говорит о наличие несущей и далее нужно искать отклонение через PLLOffset. Все Microsoft надстройки над IKsPropertySet корректно обрабатывают KSPROPERTY_TUNER_STATUS_S::SignalStrength=100, поэтому в случае стратегии KS_TUNER_STRATEGY_PLL данное число не имеет значения.
BeholdNN писал(а):
Из темы, которую вы мне предоставили я понял, что нужно использовать IKsPropertySet.
Понял, что могу получать наличие/отсутсвие несущей и оффсет до нее и таким образом оценивать качество.
Да. Для этого получаете указатель на интерфейс IKsPropertySet через IBaseFilter::QueryInterface, используя IID_IKsPropertySet. Указатель на IBaseFilter должен быть фильтром устройства тюнера, либо его наследуемый интерфейс, например IAMTVTuner. Для работы с тюнером используются ID KSPROPERTY_TUNER_XXX. Поработая с IKsPropertySet вы удивитесь, что перестройка частоты работает на порядок быстрее, чем через IAMTVTuner, поскольку IAMTVTuner это надстройка Microsoft, она довольно грубая и не умеет переключать частоту напрямую, использует переключение каналов с ожиданием (крутит внутренние циклы).
Логика поиска очень проста. Можно переключать каналы как через IAMTVTuner, так и напрямую частоту через IKsPropertySet. Если переключаете каналы через IAMTVTuner, проверяете SignalStrength, если >0, проверяете PLLOffset. Если PLLOffset показал отклонение 0 или +/-1, значит канал найден, иначе это ложная несущая. Если переключаете частоту напрямую, то логика проверки та же самая, только шагать нужно дискретно по 0.250 МГц.
ПО Beholder использует собственные раcширения IKsPropertySet в драйвере, которые более удобны и функциональны, чем "дубовые" универсальные IAMTVTuner и KSPROPERTY_TUNER_XXX, но одновременно драйвер поддерживает и все стандартные методы, позволяя работать сторонним приложениям.