DVB.NET und .NET 3.5

Ich plane locker, DVB.NET 3.5 auch auf Visual Studio 2008 und .NET 3.5 umzustellen – die Koinzidenz der Versionsnummern ist zufällig. Ich werde dazu noch eine Umfrage im Forum machen, evtl. auch .NET 2.0, aber auf jeden Fall Visual Studio 2008.

Vorab habe ich schon mal geprüft, ob ich auch die BDAWindow Klasse auf WPF umstelle, werde davon aber absehen. Der Lernaufwand um es wenigstens etwas ordentlich zu machen ist mir im Moment zu hoch und ich habe eine ganze Liste anderer kleinerer Wünsche, die ich angehen möchte.

Was ich aber gemacht habe, ist mal zu schauen, wie schwierig es ist, eine WPF Anwendung zu machen, die mit DVB.NET ein Signal anzeigt. Hier der kurze Bericht, vielleicht reizt das ja den einen oder anderen, auch einmal herum zu spielen. DVB.NET 3.2 ist Installationsvoraussetzung, dito Visual C# 2008 – ich weiß nicht, ob die Express Edition reicht, kann aber gut sein.

Als erstes legen wir eine neue WPF Anwendung namens DVBNETSample an. Als zusätzliche Referenzen werden JMS.DVB.DLL und JMS.DVB.Provider.BDA.DLL benötigt – TechnoTrend Premium Anwender sollten der Einfachheit halber auch noch JMS.DVB.Provider.TTPremium.DLL hinzufügen und die TTDVBACC.DLL dorthin kopieren, wo später die DVBNETSample.EXE ausgeführt wird.

Auf dem Fenster Window1 wird nun ein WindowsFormsHost Control angelegt und zum Beispiel so ausgerichtet, dass es das ganze Window1 ausfüllt. Vermutlich geht das Folgende auch einfacher, aber da ich VS2008 erst seit einer knappen Stunde nutze hier mein Weg: in der XAML Ansicht habe ich auf dem Window Root Tag die Eigenschaft xmlns:dvbnet=”clr-namespace:JMS.DVB.BDA;assembly=JMS.DVB.Provider.BDA” ergänzt. Nun kann man im WindowsFormsHost Tag als Kindknoten <dvbnet:BDAWindow/> einfügen. Startet man die Anwendung jetzt, dann gibt es ein blaues Fenster. Ein gutes Zeichen, denn das WinForms BDAWindow läuft nun in der WPF Anwendung – das war eigentlich auch nicht anders zu erwarten.

Nun sind noch zwei Schritte zu erledigen. In der Anwendungsdatei App.xml.cs wird DVB.NET initialisiert und sauber terminiert.

public partial class App : Application
{
    private JMS.DVB.IDeviceProvider m_Device;

    protected override void OnStartup(StartupEventArgs e)
    {
        m_Device = JMS.DVB.Tools.CreateProvider();

        if (null == m_Device)
            Environment.Exit(1);
        else            
            base.OnStartup(e);
    }

    protected override void OnExit(ExitEventArgs e)
    {
        if (null != m_Device)
            m_Device.Dispose();

        base.OnExit(e);
    }

    public JMS.DVB.IDeviceProvider DVBDevice
    {
        get
        {
            return m_Device;
        }
    }
}

Und dann noch ein bisschen Code, um beim Starten der Anwendung den Sender ZDF auszuwählen, den Datenempfang zu aktivieren und Video sowie erste Tonspur an das BDAWindow zu schicken. Durch Doppelklick auf Window1 wird eine Methode angelegt und wie folgt gefüllt.

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    JMS.DVB.IDeviceProvider device = ((App)App.Current).DVBDevice;

    JMS.DVB.Station station = device.ResolveStation("ZDF", null)[0];

    device.Tune(station.Transponder);
    device.SetVideoAudio(0, 0, 0);

    JMS.DVB.AudioInfo[] audios = station.AudioMap;

    JMS.DVB.BDA.BDAWindow wnd = (JMS.DVB.BDA.BDAWindow)windowsFormsHost1.Child;
    JMS.DVB.BDA.AccessModules.AudioVideoAccessor accessor = new AudioVideoAccessor();

    wnd.SetAccessor(accessor);

    accessor.StartGraph(2 != station.VideoType, audios[0].AC3);

    device.RegisterPipingFilter(station.VideoPID, true, false, accessor.AddVideo);
    device.RegisterPipingFilter(audios[0].PID, false, false, accessor.AddAudio);

    device.StartFilter(station.VideoPID);
    device.StartFilter(audios[0].PID);
}

Und das war’s schon

Geht auch mit HDTV

Viel Spass

Jochen