[mythtv] [patch] firewire broadcast connection

Jim Westfall jwestfall at surrealistic.net
Wed Feb 16 02:38:59 UTC 2005


Hi

With the help of ddennedy over at linux1394 it was determined that not all 
STB's are stable or dont even work when making a peer to peer connection. 

This patch adds a new option that lets you pick the connection type to 
make with the STB, p2p or broadcast.  Its been tested with a couple 
problematic DCT-6200 boxes. 

jim
-------------- next part --------------
diff -ur mythtv.orig/libs/libmythtv/dbcheck.cpp mythtv/libs/libmythtv/dbcheck.cpp
--- mythtv.orig/libs/libmythtv/dbcheck.cpp	2005-02-12 10:33:43.000000000 -0800
+++ mythtv/libs/libmythtv/dbcheck.cpp	2005-02-12 10:36:54.000000000 -0800
@@ -9,7 +9,7 @@
 #include "mythcontext.h"
 #include "mythdbcon.h"
 
-const QString currentDatabaseVersion = "1071";
+const QString currentDatabaseVersion = "1072";
 
 static bool UpdateDBVersionNumber(const QString &newnumber);
 static bool performActualUpdate(const QString updates[], QString version,
@@ -1399,6 +1399,16 @@
             return false;
     }
 
+    if (dbver == "1071")
+    {
+        const QString updates[] = {
+"ALTER TABLE capturecard ADD COLUMN firewire_connection INT UNSIGNED NOT NULL DEFAULT 0;",
+""
+};
+        if (!performActualUpdate(updates, "1072", dbver))
+            return false;
+    }
+
     return true;
 }
 
diff -ur mythtv.orig/libs/libmythtv/firewirerecorder.cpp mythtv/libs/libmythtv/firewirerecorder.cpp
--- mythtv.orig/libs/libmythtv/firewirerecorder.cpp	2005-02-12 10:33:43.000000000 -0800
+++ mythtv/libs/libmythtv/firewirerecorder.cpp	2005-02-12 11:47:31.515478918 -0800
@@ -21,7 +21,7 @@
      if(!fw) return 0;
 
      if(dropped) {
-         VERBOSE(VB_GENERAL,QString("FireWire: %1 packet(s) dropped.").arg(dropped));
+         VERBOSE(VB_GENERAL,QString("Firewire: %1 packet(s) dropped.").arg(dropped));
      }
      fw->ProcessTSPacket(tspacket,len);
      return 1;
@@ -39,20 +39,20 @@
     fwhandle = NULL;
     fwmpeg = NULL;
     fwfd = -1;
-           
+    fwconnection = FIREWIRE_CONNECTION_P2P;
 }
 
 FirewireRecorder::~FirewireRecorder() {
 
     if(isopen) {
-        VERBOSE(VB_GENERAL,QString("FireWire: releasing iec61883_mpeg2 object"));
+        VERBOSE(VB_GENERAL,QString("Firewire: releasing iec61883_mpeg2 object"));
         iec61883_mpeg2_close(fwmpeg);
-        if(fwchannel > -1) {
-              VERBOSE(VB_GENERAL,QString("FireWire: disconnecting channel %1").arg(fwchannel));
+        if(fwconnection == FIREWIRE_CONNECTION_P2P && fwchannel > -1) {
+              VERBOSE(VB_GENERAL,QString("Firewire: disconnecting channel %1").arg(fwchannel));
 	      iec61883_cmp_disconnect (fwhandle, fwnode | 0xffc0,
                    raw1394_get_local_id (fwhandle), fwchannel, fwbandwidth);
         }
-        VERBOSE(VB_GENERAL,QString("FireWire: releasing raw1394 handle"));
+        VERBOSE(VB_GENERAL,QString("Firewire: releasing raw1394 handle"));
         raw1394_destroy_handle(fwhandle);
     }    
     isopen = false;
@@ -63,7 +63,7 @@
      if(isopen)
          return true;
     
-     VERBOSE(VB_GENERAL,QString("FireWire: Initializing Port: %1, Node: %2, Speed: %3")
+     VERBOSE(VB_GENERAL,QString("Firewire: Initializing Port: %1, Node: %2, Speed: %3")
                                .arg(fwport)
                                .arg(fwnode)
                                .arg(FirewireSpeedString(fwspeed)));
@@ -74,13 +74,26 @@
          return false;
      }
 
-     fwchannel = iec61883_cmp_connect (fwhandle, fwnode | 0xffc0,
+     if(fwconnection == FIREWIRE_CONNECTION_P2P) {
+          VERBOSE(VB_GENERAL,QString("Firewire: Creating P2P Connection with Node: %1").arg(fwnode));
+          fwchannel = iec61883_cmp_connect (fwhandle, fwnode | 0xffc0,
                         raw1394_get_local_id (fwhandle), &fwbandwidth);
-
-     if(fwchannel > -1) {
-	VERBOSE(VB_GENERAL,QString("FireWire: Created Channel: %1, Bandwidth Allocation: %2").arg(fwchannel).arg(fwbandwidth));
+          if(fwchannel > -1) {
+	      VERBOSE(VB_GENERAL,QString("Firewire: Created Channel: %1, Bandwidth Allocation: %2").arg(fwchannel).arg(fwbandwidth));
+          }
+     } else {
+          VERBOSE(VB_GENERAL,QString("Firewire: Creating Broadcast Connection with Node: %1").arg(fwnode));
+          if(iec61883_cmp_create_bcast_output(fwhandle, fwnode | 0xffc0, 0, FIREWIRE_CHANNEL_BROADCAST, fwspeed) != 0) {
+	      VERBOSE(VB_IMPORTANT, QString("Firewire: Failed to create connection"));
+	      // release raw1394 object;
+              raw1394_destroy_handle(fwhandle);
+              return false;
+          }
+          fwchannel = FIREWIRE_CHANNEL_BROADCAST;
+          fwbandwidth = 0;
      }
 
+
      if((fwmpeg = iec61883_mpeg2_recv_init (fwhandle, read_tspacket, this)) == NULL) {
          VERBOSE(VB_IMPORTANT, QString("Firewire: unable to init iec61883_mpeg2 object, bailing"));
          perror("iec61883_mpeg2 object");
@@ -94,7 +107,7 @@
      // probably shouldnt even allow user to set, 100Mbps should be more the enough
      int curspeed = iec61883_mpeg2_get_speed(fwmpeg);
      if(curspeed != fwspeed) {
-         VERBOSE(VB_GENERAL,QString("FireWire: Changing Speed %1 -> %2")
+         VERBOSE(VB_GENERAL,QString("Firewire: Changing Speed %1 -> %2")
                                     .arg(FirewireSpeedString(curspeed))
                                     .arg(FirewireSpeedString(fwspeed)));
          iec61883_mpeg2_set_speed(fwmpeg, fwspeed);
@@ -214,6 +227,12 @@
             VERBOSE(VB_IMPORTANT, QString("Firewire: Invalid speed '%1', assuming 0 (100Mbps)").arg(fwspeed));
             fwspeed = 0;
         }
+    } else if(name == "connection") {
+	fwconnection = value;
+	if(fwconnection != FIREWIRE_CONNECTION_P2P && fwconnection != FIREWIRE_CONNECTION_BROADCAST) {
+	    VERBOSE(VB_IMPORTANT, QString("Firewire: Invalid Connection type '%1', assuming P2P").arg(fwconnection));
+            fwconnection = FIREWIRE_CONNECTION_P2P;
+        }
     }
 }
 
diff -ur mythtv.orig/libs/libmythtv/firewirerecorder.h mythtv/libs/libmythtv/firewirerecorder.h
--- mythtv.orig/libs/libmythtv/firewirerecorder.h	2005-02-01 23:11:10.000000000 -0800
+++ mythtv/libs/libmythtv/firewirerecorder.h	2005-02-12 10:36:54.000000000 -0800
@@ -16,6 +16,11 @@
 
 #define FIREWIRE_TIMEOUT 15
 
+#define FIREWIRE_CONNECTION_P2P		0
+#define FIREWIRE_CONNECTION_BROADCAST	1
+
+#define FIREWIRE_CHANNEL_BROADCAST	63
+
 class FirewireRecorder : public DTVRecorder
 {
   public:
@@ -36,7 +41,7 @@
     QString FirewireSpeedString(int speed);
 
   private:
-    int fwport, fwchannel, fwspeed, fwbandwidth, fwfd;
+    int fwport, fwchannel, fwspeed, fwbandwidth, fwfd, fwconnection;
     QString fwmodel;
     nodeid_t fwnode;
     raw1394handle_t fwhandle;
diff -ur mythtv.orig/libs/libmythtv/tv_rec.cpp mythtv/libs/libmythtv/tv_rec.cpp
--- mythtv.orig/libs/libmythtv/tv_rec.cpp	2005-02-02 09:17:24.000000000 -0800
+++ mythtv/libs/libmythtv/tv_rec.cpp	2005-02-12 10:36:54.000000000 -0800
@@ -678,6 +678,7 @@
         nvr->SetOption("node", firewire_options.node);
         nvr->SetOption("speed", firewire_options.speed);
         nvr->SetOption("model", firewire_options.model);
+        nvr->SetOption("connection", firewire_options.connection);
         nvr->Initialize();
 #endif
         return;
@@ -1153,7 +1154,7 @@
                                "dvb_wait_for_seqstart,dvb_dmx_buf_size,"
                                "dvb_pkt_buf_size, skipbtaudio, dvb_on_demand,"
                                "firewire_port, firewire_node, firewire_speed,"
-                               "firewire_model "
+                               "firewire_model, firewire_connection "
                                "FROM capturecard WHERE cardid = %1;")
                               .arg(cardnum);
 
@@ -1204,6 +1205,7 @@
         test = query.value(16).toString();
         if (test != QString::null)
 	   firewire_opts.model = QString::fromUtf8(test);
+        firewire_opts.connection = query.value(17).toInt();
     }
 
     thequery = QString("SELECT if(startchan!='', startchan, '3') "
diff -ur mythtv.orig/libs/libmythtv/tv_rec.h mythtv/libs/libmythtv/tv_rec.h
--- mythtv.orig/libs/libmythtv/tv_rec.h	2005-02-01 23:11:10.000000000 -0800
+++ mythtv/libs/libmythtv/tv_rec.h	2005-02-12 10:36:54.000000000 -0800
@@ -46,6 +46,7 @@
     int port;
     int node;
     int speed;
+    int connection;
     QString model;
 } firewire_options_t;
 
diff -ur mythtv.orig/libs/libmythtv/videosource.cpp mythtv/libs/libmythtv/videosource.cpp
--- mythtv.orig/libs/libmythtv/videosource.cpp	2005-02-12 10:33:44.000000000 -0800
+++ mythtv/libs/libmythtv/videosource.cpp	2005-02-12 10:36:54.000000000 -0800
@@ -857,6 +857,16 @@
         }
 };
 
+class FirewireConnection: public ComboBoxSetting, public CCSetting {
+    public:
+	FirewireConnection(const CaptureCard& parent):
+ 	CCSetting(parent, "firewire_connection") {
+            setLabel(QObject::tr("Firewire Connection Type"));
+            addSelection(QObject::tr("Point to Point"),"0");
+            addSelection(QObject::tr("Broadcast"),"1");
+        }
+};
+
 class FirewirePort: public LineEditSetting, public CCSetting {
     public:
 	FirewirePort(const CaptureCard& parent):
@@ -904,6 +914,7 @@
         parent(a_parent) {
         setUseLabel(false);
         addChild(new FirewireModel(parent));
+        addChild(new FirewireConnection(parent));
         addChild(new FirewirePort(parent));
         addChild(new FirewireNode(parent));
         addChild(new FirewireSpeed(parent));


More information about the mythtv-dev mailing list