HA! To znowu ja, ale w wersji zarejestrowanej :-P
Chcę podzielić się doświadczeniami z innymi userami w kwestii powyższego sample - aby poszerzać wiedzę ;)
Siedzę na Delphi 2009, w związku z czym DSPack należy zdobyć stąd: http://www.songbeamer.com/delphi/
Ma on zmienioną nazwę jednego unitu - DSUtil na DSUtils. To bardzo ważne, bo w samplu wyżej w uses jest DSUtil - bez zmiany na DSUtils się pod D2009/2010 nie skompiluje.
Siedzę na Windows 7, od Vista SP1 zaszły zmiany w MPEG-2 Demultiplexerze, w efekcie ma on inny układ PIN-ów i nie będzie obrazu/dźwięku. Póki co ja zrobiłem tak:
- dorobiłem sobie rozpoznanie wersji OS, dla ułatwienia póki co olałem Vistę i jeśli jest wersja inna niż 6.1 (czyli nie Windows 7), to robię po staremu, na XP działa, chociaż coś o tym napiszę dalej, a na Windows 7 dokonałem zmian.
Zamiast:
put_NetworkType(GUIDToString(CLSID_DVBSNetworkProvider));
Wywołuję:
put_NetworkType('B2F3A67C-29DA-4c78-8831-091ED509A475');
Wyjaśnienie: DVBSNetworkProvider został porzucony przez MS, niby działa, ale więcej problemów z MPEG-2 Demultiplexerem jest później, dla ułatwienia więc stosuję CLSID Microsoft Network Provider, wpisany ręcznie (pewnie można go dodać do DSUtils, ale po co się męczyć :-P )
Zamiast:
Log('Render Video', fGraph.Render(GetOutPin(fDemultiplexer, 1)));
Log('Render Audio', fGraph.Render(GetOutPin(fDemultiplexer, 2)));
Wywołuję:
Log('Render Video', fGraph.Render(GetOutPin(fDemultiplexer, 2)));
Log('Render Audio', fGraph.Render(GetOutPin(fDemultiplexer, 3)));
Wyjaśnienie: Z tego co dokopałem się w sieci za obraz i dźwięk odpowiadają w nowym MPEG-2 Demultiplexerze PIN-y 3 i 4 (czyli 2 i 3 licząc od zera). W sumie nie wnikałem w to, na pierwszym ustawieniu nie miałem nic, a na drugim ruszyło, więc zakładam, że trafiłem dobrze :-P
Zamiast:
_UnmapPIDs(1); // video
_UnmapPIDs(2); // audio
Wywołuję:
_UnmapPIDs(2); // video
_UnmapPIDs(3); // audio
Wyjaśnienie: bo to powoduje, że cokolwiek się Unmapuje przy zmianie kanału i nie sypie błędem, co znaczy, że pewnie trafiłem :-P Możliwe, że ma być po prostu to samo, co wyżej.
Zamiast:
_MapPID(1, VideoPID); // video
_MapPID(2, AudioPID); // audio
Wywołuję:
_MapPID(2, VideoPID); // video
_MapPID(3, AudioPID); // audio
Wyjaśnienie: działa, widać tak ma być :-P
Uwaga dodatkowa: w zależności od modelu karty może być wymagane przesyłanie dodatkowych danych, póki co przy wysyłaniu Tune Request do karty leci: częstotliwość, SR, modulacja i polaryzacja, ale idę o browara, że przykładowo produkty Hauppauge będą chcieć też FEC, w zależności od potrzeb można więc dorzucić:
Log('Put Inner FEC', IDVBSLocator(fLocator).put_InnerFEC(BDA_BCC_RATE_3_4));
Log('Put Inner FEC Rate', IDVBSLocator(fLocator).put_InnerFECRate(BDA_BCC_RATE_3_4));
Log('Put Outer FEC', IDVBSLocator(fLocator).put_OuterFEC(BDA_BCC_RATE_3_4));
Log('Put Outer FEC Rate', IDVBSLocator(fLocator).put_OuterFECRate(BDA_BCC_RATE_3_4));
(tu ustawia siłowo na FEC = 3/4, aby to było po bożemu - należałoby zrobić combobox z FEC, mi w każdym razie to potrzebne nie było - tylko rzucam jak to miałoby wyglądać, możliwe też dodanie innych parametrów, nie tylko FEC)
Póki co mam drobne problemy - obserwuję, że mapuje u mnie dodatkowo jakieś PID-y hugon wie skąd wytrzaśnięte. O ile na Windows 7 to się nie objawia niczym, poza dodatkowym wpisem w UnmapPIDs w logu (dodatkowy Video i Audio, od innego kanału z tej częstotliwości), o tyle w Windows XP demultiplexer działa wyraźnie wolniej i w efekcie przy pierwszym mapowaniu po starcie na chwilę wyświetla to co trzeba, ale później przerzuca się na inny kanał z tej samej częstotliwości i trzeba jeszcze raz go wywołać. Nie wiem skąd te PID-y dla starcie się biorą, możliwe, że wprowadzone przeze mnie zmiany to spowodowały, szukam rozwiązania we własnym zakresie (ale jakby ktoś przypuszczał co zwaliłem, to podpowiedź mile widziana :-) ).
Przy poszukiwaniach w sieci natrafiłem na sporo narzekań na MPEG-2 Demultiplexer i TIF (BDA MPEG2 Transport Information Filter) od Microsoftu - że słabo opisane i wolne. Działanie TIF sprowadza się do parsowania danych z karty DVB jak rozumiem. Mam skromne doświadczenie w parsowaniu danych binarnych z pliku i dobrze znam normę DVB. Być może powinienem najpierw sam próbować "pogadać" z tunerem w komputerze? Rozważam to, bo trzeba przyznać, że AltDVB posiada bardzo dobry, ale własny parser i widać, że jest on napisany bardzo profesjonalnie, bo jest odporny na sytuację, gdy jest przykładowo bardzo słaby sygnał. Większość aplikacji (jak DVB Dream) w takiej sytuacji olewa strumień danych, a AltDVB mieli go do timeoutu, wyciągając maksymalnie tyle danych, ile da się odczytać z uszkodzonego strumienia. Obawiam się, że Microsoftowy TIF jest napisany "olewczo", unikając problematycznych sytuacji, a wolałbym jednak, żeby "mój" TIF umiał sobie z tym poradzić, dlatego rozważam samodzielną analizę tematu na początku - myślę, że to sensowna droga ;-) Jak sobie nie poradzę - zawsze jest Microsoftowy TIF :)
Zerkałem też sporo na sample z C# i chyba w tamtym dziale założę podobny temat - zbierający dostępne kody źródłowe i komentujący znaleziska. Może to się komuś przydać przy okazji oprócz mnie ;)