Какие пользовательские вводы требуются для выбора устройства цифрового телевидения?

В процессе построения графика цифрового телевидения мне нужно:

Network Provider -> Tuner -> Capture -> MPEG2-Demux -> MPEG2 TIF
                                                    -> MPEG2 Sections
                                                    -> Video Decoder -> VMR9
                                                    -> Audio Decoder -> DirectSound

Для меня очевидно, что я могу жестко кодировать от имени провайдера (Microsoft Network Provider), но нужно ли мне предлагать пользователю выбрать тюнер и устройство захвата из списка доступных устройств, или я могу как-то запросить тюнер, который соответствует устройству захвата, которое выбрал пользователь?

В основном я спрашиваю, существует ли вызов API, подобный следующему:

IMoniker *pTuner = GetTunerForCaptureDevice(pIMonikerSelectedCaptureDevice);

или является ли стандартным, чтобы пользователь выбирал и тюнер, и устройства захвата в их конфигурации.

1 ответ

Решение

Кажется, что большинство приложений решают эту проблему - это идти в обратном направлении. В целях конфигурации они предоставляют список всех устройств в категории KSCATEGORY_BDA_NETWORK_TUNER и позволить пользователю выбрать один из тюнеров.

После того, как это устройство было добавлено в граф, все устройства перечислены в категории KSCATEGORY_BDA_RECEIVER_COMPONENT, Для каждого возвращенного элемента элемент устройства захвата добавляется к графику, и вызывается соединение между выходным контактом тюнера и входным контактом захвата. Грубый код: (без необходимого Releases()"S)

for (fFound=FALSE; !fFound; )
{
     IMoniker *pIMoniker;
     IBaseFilter *ppIBaseFilter;
     hr = pIEnumMoniker->Next(1, &pIMoniker, NULL);
     if (hr!=S_OK)
           break;

     hr = pIMoniker->BindToObject(NULL, NULL, __uuidof(IBaseFilter), 
                  (void **)&ppIBaseFilter);
     hr = m_pIGraphBuilder->AddFilter(*ppIBaseFilter, L"Capture filter");
     hr = ConnectFilters(m_pIGraphBuilder, pITunerFilter, ppIBaseFilter)));
     if (hr != S_OK)
     {
          m_pIGraphBuilder->RemoveFilter(ppIBaseFilter);
          goto NextMoniker;
     }

     fFound = TRUE;
NextMoniker:
   // release things here.
}

Если какое-либо из устройств захвата успешно соединяет контакты, тогда цикл заканчивается, и этот фильтр захвата используется на графике.

Я пошел в этом направлении, начав с выбора пользователем тюнера, потому что я видел несколько продуктов, которые возвращали более одного устройства тюнера, и при попытке соединения в обратном порядке (захват, затем тюнер) я, казалось, всегда успешно подключал неправильный тюнер.

Другие вопросы по тегам