[mythtv] [patch] setup improvements

Daniel Thor Kristjansson danielk at mrl.nyu.edu
Tue Jan 18 10:25:44 EST 2005


There are three features added in this patch
   * The keys 'D' and 'E' are bound to the signals editButtonPressed()
     and deleteButtonPressed(), which are bound to the edit() and delete()
     functions in CaptureCardGroup and CaptureCardEditor, this allows
     you to edit these by pressing 'E' and delete these by pressing 'D'

   * VideoDevice has now accepts an optional minimum and maximum
     videodevice minor number. This lets you filter out videodevices
     we know are not valid for a particular capture card, such as
     PVR and pcHDTV cards which always accept a card with a minor number
     greater than or equal to 32. I've also removed duplicate card
     entries, by minor number, so that if you have a device at
     /dev/v4l/video32, /dev/video32, /dev/dtv0, and /dev/dtv1 all
     referring to the same device only /dev/v4l/video32 will be
     added to the list.

   * Two new configuration groups are added. MPEGConfigurationGroup
     and pcHDTVConfigurationGroup, these remove configration entries
     which have no meaning for these cards, such as the VBI and audio
     capture devices. These confuse new users, and are not needed.
     NOTE: I've put the pcHDTV entries in a "ATSC (Digital Television)"
     VerticalConfiguration group, which will disambiguate it from
     the Analog device configration later on. Also: these two
     configuration groups ask VideoDevice for video devices with
     minor numbers greater than or equal to 32.

The breakdown by file is
libs/libmyth/settings.cpp:
   actions DELETE & EDIT added to
   ConfigurationDialogWidget::keyPressEvent(QKeyEvent* e)
libs/libmyth/settings.h:
   adds signals editButtonPressed(), deleteButtonPressed()
setup/main.cpp:
   'D' & 'E' keys bound to DELETE & EDIT, resp
libs/libmythtv/videosource.cpp:
    * VideoDevice changes: minor number range, and duplicate removal
    * New configuration groups for MPEG and pcHDTV
    * Binding of editButtonPressed(), deleteButtonPressed()
      to edit() and delete(), resp.

-- Daniel
-------------- next part --------------
Index: libs/libmyth/settings.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmyth/settings.cpp,v
retrieving revision 1.84
diff -u -r1.84 settings.cpp
--- libs/libmyth/settings.cpp	29 May 2004 18:30:43 -0000	1.84
+++ libs/libmyth/settings.cpp	18 Jan 2005 15:23:03 -0000
@@ -630,6 +630,10 @@
                 accept();
             else if (action == "ESCAPE")
                 reject();
+            else if (action == "EDIT")
+                emit editButtonPressed();
+            else if (action == "DELETE")
+                emit deleteButtonPressed();
             else
                 handled = false;
         }
Index: libs/libmyth/settings.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmyth/settings.h,v
retrieving revision 1.55
diff -u -r1.55 settings.h
--- libs/libmyth/settings.h	29 May 2004 18:30:44 -0000	1.55
+++ libs/libmyth/settings.h	18 Jan 2005 15:23:04 -0000
@@ -169,12 +169,17 @@
 };
 
 class ConfigurationDialogWidget: public MythDialog {
+    Q_OBJECT
 public:
     ConfigurationDialogWidget(MythMainWindow *parent, 
                               const char* widgetName = 0):
         MythDialog(parent, widgetName) {};
 
     virtual void keyPressEvent(QKeyEvent* e);
+
+signals:
+    void editButtonPressed();
+    void deleteButtonPressed();
 };
 
 class ConfigurationDialog: virtual public Configurable {
Index: libs/libmythtv/videosource.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/videosource.cpp,v
retrieving revision 1.53
diff -u -r1.53 videosource.cpp
--- libs/libmythtv/videosource.cpp	30 Dec 2004 02:40:16 -0000	1.53
+++ libs/libmythtv/videosource.cpp	18 Jan 2005 15:23:04 -0000
@@ -8,6 +8,7 @@
 #include <qcursor.h>
 #include <qlayout.h>
 #include <qfile.h>
+#include <qmap.h>
 #include <iostream>
 
 #ifdef USING_DVB
@@ -476,19 +477,67 @@
 
 class VideoDevice: public PathSetting, public CCSetting {
 public:
-    VideoDevice(const CaptureCard& parent):
-        PathSetting(true),
-        CCSetting(parent, "videodevice") {
+    VideoDevice(const CaptureCard& parent,
+                uint minor_min=0, uint minor_max=UINT_MAX):
+        PathSetting(true), CCSetting(parent, "videodevice") {
         setLabel(QObject::tr("Video device"));
-        QDir dev("/dev", "video*", QDir::Name, QDir::System);
-        fillSelectionsFromDir(dev);
-        dev.setPath("/dev/v4l");
-        fillSelectionsFromDir(dev);
+
+        // /dev/v4l/video*
+        QDir dev("/dev/v4l", "video*", QDir::Name, QDir::System);
+        fillSelectionsFromDir(dev, minor_min, minor_max, false);
+
+        // /dev/video*
+        dev.setPath("/dev");
+        fillSelectionsFromDir(dev, minor_min, minor_max, false);
+
+        // /dev/dtv/video*
         dev.setPath("/dev/dtv");
-        fillSelectionsFromDir(dev);
+        fillSelectionsFromDir(dev, minor_min, minor_max, false);
+
+        // /dev/dtv*
+        dev.setPath("/dev");
+        dev.setNameFilter("dtv*");
+        fillSelectionsFromDir(dev, minor_min, minor_max, false);
+
+        VERBOSE(VB_IMPORTANT, "");
     };
 
+    void fillSelectionsFromDir(const QDir& dir,
+                               uint minor_min, uint minor_max,
+                               bool allow_duplicates) {
+        const QFileInfoList *il = dir.entryInfoList();
+        if (!il)
+            return;
+        
+        QFileInfoListIterator it( *il );
+        QFileInfo *fi;
+        
+        for(; (fi = it.current()) != 0; ++it) {
+            struct stat st;
+            QString filepath = fi->absFilePath();
+            int err = lstat(filepath, &st);
+            if (0==err) {
+                if (S_ISCHR(st.st_mode)) {
+                    uint minor_num = minor(st.st_rdev);
+                    // this is a character device, if it is in range add it to list
+                    if (minor_min<=minor_num && 
+                        minor_max>=minor_num &&
+                        (allow_duplicates ||
+                         (minor_list.find(minor_num)==minor_list.end())))
+                    {
+                        addSelection(filepath);
+                        minor_list[minor_num]=1;
+                    }
+                }
+            }
+            else
+                VERBOSE(VB_IMPORTANT, QString("could not stat file: %1").arg(filepath));
+        }
+    }
+
     static QStringList probeInputs(QString device);
+private:
+    QMap<uint, uint> minor_list;
 };
 
 class VbiDevice: public PathSetting, public CCSetting {
@@ -736,6 +785,48 @@
     CaptureCard& parent;
 };
 
+class MPEGConfigurationGroup: public VerticalConfigurationGroup {
+public:
+    MPEGConfigurationGroup(CaptureCard& a_parent):
+        parent(a_parent) {
+        setUseLabel(false);
+
+        VideoDevice* device;
+        TunerCardInput* input;
+
+        addChild(device = new VideoDevice(parent, 0, 15));
+        addChild(input = new TunerCardInput(parent));
+        connect(device, SIGNAL(valueChanged(const QString&)),
+                input, SLOT(fillSelections(const QString&)));
+        input->fillSelections(device->getValue());
+    };
+private:
+    CaptureCard& parent;
+};
+
+class pcHDTVConfigurationGroup: public VerticalConfigurationGroup {
+public:
+    pcHDTVConfigurationGroup(CaptureCard& a_parent): 
+        parent(a_parent) {
+
+        setUseLabel(false);
+
+        VerticalConfigurationGroup *atsc = 
+            new VerticalConfigurationGroup(true, true);
+        atsc->setLabel(tr("ATSC (Digital Television)"));
+        VideoDevice *atsc_device = new VideoDevice(parent, 32);
+        TunerCardInput *atsc_input = new TunerCardInput(parent);
+        atsc->addChild(atsc_device);
+        atsc->addChild(atsc_input);
+        addChild(atsc);
+        connect(atsc_device, SIGNAL(valueChanged(const QString&)),
+                atsc_input, SLOT(fillSelections(const QString&)));
+        atsc_input->fillSelections(atsc_device->getValue());
+    };
+private:
+    CaptureCard& parent;
+};
+
 CaptureCardGroup::CaptureCardGroup(CaptureCard& parent)
 {
     setLabel(QObject::tr("Capture Card Setup"));
@@ -747,13 +838,13 @@
 
     addTarget("V4L", new V4LConfigurationGroup(parent));
     addTarget("DVB", new DVBConfigurationGroup(parent));
+    addTarget("HDTV", new pcHDTVConfigurationGroup(parent));
+    addTarget("MPEG", new MPEGConfigurationGroup(parent));
 }
 
 void CaptureCardGroup::triggerChanged(const QString& value) 
 {
-    QString own = value;
-    if (own == "HDTV" || own == "MPEG" || own == "MJPEG")
-        own = "V4L";
+    QString own = (value == "MJPEG") ? "V4L" : value;
     TriggeredConfigurationGroup::triggerChanged(own);
 }
 
@@ -1026,6 +1117,8 @@
 {
     dialog = ConfigurationDialog::dialogWidget(parent, widgetName);
     connect(dialog, SIGNAL(menuButtonPressed()), this, SLOT(menu()));
+    connect(dialog, SIGNAL(editButtonPressed()), this, SLOT(edit()));
+    connect(dialog, SIGNAL(deleteButtonPressed()), this, SLOT(del()));
     return dialog;
 }
 
@@ -1087,6 +1180,8 @@
 {
     dialog = ConfigurationDialog::dialogWidget(parent, widgetName);
     connect(dialog, SIGNAL(menuButtonPressed()), this, SLOT(menu()));
+    connect(dialog, SIGNAL(editButtonPressed()), this, SLOT(edit()));
+    connect(dialog, SIGNAL(deleteButtonPressed()), this, SLOT(del()));
     return dialog;
 }
 
Index: setup/main.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/setup/main.cpp,v
retrieving revision 1.50
diff -u -r1.50 main.cpp
--- setup/main.cpp	1 Jan 2005 22:46:53 -0000	1.50
+++ setup/main.cpp	18 Jan 2005 15:23:05 -0000
@@ -161,6 +161,9 @@
     if (dboxProg.exec() == 2)
         clearAllDB();
 
+    REG_KEY("qt", "DELETE", "Delete", "D");
+    REG_KEY("qt", "EDIT", "Edit", "E");
+
     SetupMenu();
 
     cout << "If this is the master backend server:\n";


More information about the mythtv-dev mailing list