[mythtv] [patch] firewire internal channel change for dct-6200

Jim Westfall jwestfall at surrealistic.net
Tue May 3 00:40:29 UTC 2005


could I get this applied.

thanks
jim

Jim Westfall <jwestfall at surrealistic.net> wrote [04.18.05]:
> Hi
> 
> patch adds support for internal channel changing via firewire for DCT-6200 
> and friends.
> 
> This adds a new library requirement of libavc1394 for firewire.
> 
> To enable you will need to set the firewire model in setup to DCT-6200 and 
> unset the external channel changer option.
> 
> jim

> Index: configure
> ===================================================================
> RCS file: /var/lib/mythcvs/mythtv/configure,v
> retrieving revision 1.54
> diff -u -r1.54 configure
> --- configure	18 Apr 2005 23:51:34 -0000	1.54
> +++ configure	19 Apr 2005 05:07:08 -0000
> @@ -1644,7 +1644,7 @@
>  
>  if test x"$firewire_cable_box" = x"yes" ; then
>      firewire_cable_box="no"
> -    if has_library libiec61883 ; then
> +    if has_library libiec61883 -a has_library libavc1394 ; then
>              firewire_cable_box="yes"
>      fi
>  fi
> @@ -2280,7 +2280,7 @@
>  if test x"$firewire_cable_box" = x"yes" ; then
>    CCONFIG="$CCONFIG using_firewire"
>    CONFIG_DEFINES="$CONFIG_DEFINES USING_FIREWIRE"
> -  echo "CONFIG_FIREWIRE_LIBS=-lraw1394 -liec61883" >> config.mak
> +  echo "CONFIG_FIREWIRE_LIBS=-lraw1394 -liec61883 -lavc1394" >> config.mak
>  fi
>  
>  if test x"$lirc" = x"yes" ; then
> Index: libs/libmythtv/firewirechannel.cpp
> ===================================================================
> RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/firewirechannel.cpp,v
> retrieving revision 1.1
> diff -u -r1.1 firewirechannel.cpp
> --- libs/libmythtv/firewirechannel.cpp	2 Feb 2005 07:11:10 -0000	1.1
> +++ libs/libmythtv/firewirechannel.cpp	19 Apr 2005 05:07:09 -0000
> @@ -12,23 +12,69 @@
>  class TVRec;
>  
>  
> -FirewireChannel::FirewireChannel(TVRec *parent): ChannelBase(parent) {
> +FirewireChannel::FirewireChannel(firewire_options_t firewire_opts, TVRec *parent): 
> +    ChannelBase(parent),fw_opts(firewire_opts) {
> +	
> +    isopen = false;
>      capchannels = 1;
> +    fwhandle = NULL;
>      channelnames[0] = "MPEG2TS";
> +
> +    if(externalChanger[currentcapchannel].isEmpty()) {
> +
> +       if(fw_opts.model == "DCT-6200") {
> +          if((fwhandle = raw1394_new_handle_on_port(fw_opts.port)) == NULL) {
> +              VERBOSE(VB_IMPORTANT,QString("FireWireChannel: unable to get handle for port: %1").arg(fw_opts.port));
> +              return;
> +          }
> +
> +          VERBOSE(VB_GENERAL,QString("FireWireChannel: allocated raw1394 handle for port %1").arg(fw_opts.port));
> +          isopen = true;
> +       } else {
> +          VERBOSE(VB_IMPORTANT,QString("FireWireChannel: internal channel changer only supported by DCT-6200 models"));
> +       }
> +    }
>  }
>  
>  FirewireChannel::~FirewireChannel(void)
> -{   
> +{
> +
> +    if(isopen) {
> +        VERBOSE(VB_GENERAL,QString("FireWireChannel: releasing raw1394 handle"));
> +        raw1394_destroy_handle(fwhandle);
> +    }
> +
>  }
>  
>  bool FirewireChannel::SetChannelByString(const QString &chan) {
>  
> +     int dig[3];
> +     int channel = chan.toInt();
> +     quadlet_t cmd[2];
>  
>       inputChannel[currentcapchannel] = chan;
>       curchannelname = chan;
>  
>       if (externalChanger[currentcapchannel].isEmpty()) {
> -         VERBOSE(VB_IMPORTANT,QString("FireWire: external channel changer only supported at this time.")); 
> +         dig[2] = channel % 10;
> +         dig[1] = (channel % 100) / 10;
> +         dig[0] = (channel % 1000) / 100;
> +
> +         if(isopen && fw_opts.model == "DCT-6200") {
> +            VERBOSE(VB_GENERAL,QString("FireWireChannel: channel:%1%2%3 cmds: 0x%4, 0x%5, 0x%6").
> +              arg(dig[0]).arg(dig[1]).arg(dig[2]).arg(DCT6200_CMD0 | dig[0], 0, 16).
> +              arg(DCT6200_CMD0 | dig[1], 0, 16).
> +              arg(DCT6200_CMD0 | dig[2], 0, 16));
> +            for(int i = 0;i < 3 ;i++) {
> +                cmd[0] = DCT6200_CMD0 | dig[i];
> +                cmd[1] = 0x0;
> +     
> +                avc1394_transaction_block(fwhandle, fw_opts.node, cmd, 2, 1);
> +                usleep(500000);
> +            }
> +         } else {
> +            VERBOSE(VB_IMPORTANT,QString("FireWireChannel: internal channel changer only supported by DCT-6200 models"));
> +         }
>       } else if(!ChangeExternalChannel(chan)) {
>           return false;
>       }
> Index: libs/libmythtv/firewirechannel.h
> ===================================================================
> RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/firewirechannel.h,v
> retrieving revision 1.1
> diff -u -r1.1 firewirechannel.h
> --- libs/libmythtv/firewirechannel.h	2 Feb 2005 07:11:10 -0000	1.1
> +++ libs/libmythtv/firewirechannel.h	19 Apr 2005 05:07:09 -0000
> @@ -11,13 +11,24 @@
>  #include <qstring.h>
>  #include "tv_rec.h"
>  #include "channelbase.h"
> +#include <libavc1394/avc1394.h>
>  
>  using namespace std;
>  
> +// 6200 defines for channel changes, taken from contrib/6200ch.c
> +#define AVC1394_SUBUNIT_TYPE_6200 	(9 << 19)  /* uses a reserved subunit type */ 
> +#define AVC1394_6200_COMMAND_CHANNEL 	0x00007C00 /* 6200 subunit command */
> +#define AVC1394_6200_OPERAND_SET 	0x00000020 /* 6200 subunit command operand */
> +
> +#define DCT6200_CMD0 AVC1394_CTYPE_CONTROL | AVC1394_SUBUNIT_TYPE_6200 | \
> +        AVC1394_SUBUNIT_ID_0 | AVC1394_6200_COMMAND_CHANNEL | \
> +        AVC1394_6200_OPERAND_SET
> +
> +
>  class FirewireChannel : public ChannelBase
>  {
>   public:
> -    FirewireChannel(TVRec *parent);
> +    FirewireChannel(firewire_options_t firewire_opts, TVRec *parent);
>      ~FirewireChannel(void);
>  
>      bool SetChannelByString(const QString &chan);
> @@ -27,7 +38,11 @@
>      void SwitchToInput(int newcapchannel, bool setstarting)
>                        { (void)newcapchannel; (void)setstarting; }
>      void SetExternalChanger(void);
> -
> +private:
> +    firewire_options_t fw_opts;
> +    nodeid_t fwnode;
> +    raw1394handle_t fwhandle;
> +    bool isopen;
>  };
>  
>  #endif
> Index: libs/libmythtv/tv_rec.cpp
> ===================================================================
> RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/tv_rec.cpp,v
> retrieving revision 1.180
> diff -u -r1.180 tv_rec.cpp
> --- libs/libmythtv/tv_rec.cpp	3 Apr 2005 16:42:10 -0000	1.180
> +++ libs/libmythtv/tv_rec.cpp	19 Apr 2005 05:07:09 -0000
> @@ -126,7 +126,7 @@
>      else if (cardtype == "FIREWIRE")
>      {
>  #ifdef USING_FIREWIRE
> -        channel = new FirewireChannel(this);
> +        channel = new FirewireChannel(firewire_options, this);
>          channel->Open();
>          if (inputname.isEmpty())
>              channel->SetChannelByString(startchannel);
> Index: libs/libmythtv/videosource.cpp
> ===================================================================
> RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/videosource.cpp,v
> retrieving revision 1.76
> diff -u -r1.76 videosource.cpp
> --- libs/libmythtv/videosource.cpp	13 Apr 2005 22:58:08 -0000	1.76
> +++ libs/libmythtv/videosource.cpp	19 Apr 2005 05:07:10 -0000
> @@ -856,6 +856,7 @@
>   	CCSetting(parent, "firewire_model") {
>              setLabel(QObject::tr("Firewire Model"));
>              addSelection(QObject::tr("Other"));
> +            addSelection(QObject::tr("DCT-6200"));
>              setHelpText(QObject::tr("Firewire Model is for future use in case "
>                                      "there is a need to model specific "
>                                      "workarounds.")); 

> _______________________________________________
> mythtv-dev mailing list
> mythtv-dev at mythtv.org
> http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-dev



More information about the mythtv-dev mailing list