Ticket #1458: patch.freebox.v1.01.diff

File patch.freebox.v1.01.diff, 51.6 KB (added by anonymous, 14 years ago)
  • mythtv/configure

    diff -ru --new-file --exclude=.svn myth-org/mythtv/configure myth-patch/mythtv/configure
    old new  
    22#
    33# ffmpeg configure script (c) 2000, 2001, 2002 Fabrice Bellard
    44#
    5 
     5 
    66x86_mmx_cpus="pentium-mmx,pentium2,pentium3,pentium3m,pentium-m"
    77x86_mmx_cpus="$x86_mmx_cpus,pentium4,pentium4m,prescott"
    88x86_mmx_cpus="$x86_mmx_cpus,athlon,athlon-xp,athlon-tbird,athlon-4,athlon-mp,"
     
    5555lirc="yes"
    5656joystick_menu="yes"
    5757firewire_cable_box="yes"
     58freebox_box="yes"
    5859dbox2_dvb_box="yes"
    5960x11_include_path="/usr/X11R6/include"
    6061x11="yes"
     
    173174echo "  --disable-lirc           disable lirc support (Infrared Remotes)"
    174175echo "  --disable-joystick-menu  disable joystick menu"
    175176echo "  --disable-firewire       disable support for FireWire cable boxes"
     177echo "  --disable-freebox        disable support for Freebox"
    176178echo "  --disable-dbox2          disable support for Nokia DBOX2 DVB boxes (or compatibles)"
    177179echo "  --disable-v4l            disable Video4Linux support"
    178180echo "  --disable-ivtv           disable ivtv support (PVR-x50) req. v4l support"
     
    792794  ;;
    793795  --disable-dbox2) dbox2_dvb_box="no"
    794796  ;;
     797  --enable-freebox) freebox_box="yes"
     798  ;;
     799  --disable-freebox) freebox_box="no"
     800  ;;
    795801  --enable-dvb) dvb="yes"
    796802  ;;
    797803  --disable-dvb) dvb="no"
     
    20522058    fi
    20532059fi
    20542060
     2061if test x"$dvd" = x"yes" ; then
     2062    if has_library libdvdnav ; then
     2063        if has_header dvdnav/dvdnav.h ; then
     2064            dvd="yes"
     2065        fi
     2066    fi
     2067fi
     2068
     2069
    20552070VENDOR_XVMC_LIBS=""
    20562071if test x"$xvmc" = x"yes"; then
    20572072    xvmc="no"
     
    22012216  echo "FireWire support $firewire_cable_box"
    22022217  echo "DVB support      $dvb [$dvb_path]"
    22032218  echo "DBox2 support    $dbox2_dvb_box"
     2219  echo "freebox support    $freebox_box"
     2220
    22042221fi
    22052222
    22062223if test x"$frontend" = x"yes" ; then
     
    28332850  CONFIG_DEFINES="$CONFIG_DEFINES USING_DBOX2"
    28342851fi
    28352852
     2853if test x"$freebox_box" = x"yes" ; then
     2854  CCONFIG="$CCONFIG using_freebox"
     2855  CONFIG_DEFINES="$CONFIG_DEFINES USING_FREEBOX"
     2856fi
     2857
     2858
    28362859if test x"$lirc" = x"yes" ; then
    28372860  CCONFIG="$CCONFIG using_lirc"
    28382861  echo "CONFIG_LIRC_LIBS=-llirc_client" >> $MYTH_CONFIG_MAK
  • mythtv/libs/libmythtv/cardutil.cpp

    diff -ru --new-file --exclude=.svn myth-org/mythtv/libs/libmythtv/cardutil.cpp myth-patch/mythtv/libs/libmythtv/cardutil.cpp
    old new  
    505505{
    506506    QStringList ret;
    507507
    508     if (("FIREWIRE" == cardtype) || ("DBOX2" == cardtype))
     508        VERBOSE(VB_IMPORTANT,QString("cardtype:%1").arg(cardtype));
     509    if (("FIREWIRE" == cardtype) || ("DBOX2" == cardtype) || ("FREEBOX" == cardtype))
    509510        ret += "MPEG2TS";
    510511    else if ("DVB" == cardtype)
    511512        ret += probeDVBInputs(device, diseqctype);
     
    695696                .arg(query.value(1).toString())
    696697                .arg(query.value(2).toString());
    697698    }
     699    else if (cardtype == "FREEBOX")
     700    {
     701        MSqlQuery query(MSqlQuery::InitCon());
     702        query.prepare(
     703            "SELECT freebox_host "
     704            "FROM capturecard "
     705            "WHERE cardid = :CARDID");
     706        query.bindValue(":CARDID", cardid);
     707
     708        if (!query.exec() || !query.isActive() || !query.size())
     709            label = "[ DB ERROR ]";
     710        else
     711            label = QString("[ FREEBOX : HOST %1  ]")
     712                .arg(query.value(0).toString());
     713    }
    698714    else
    699715    {
    700716        label = QString("[ %1 : %2 ]").arg(cardtype).arg(videodevice);
     
    714730    int rcardid = (parentid) ? parentid : cardid;
    715731    QStringList inputs;
    716732
    717     if (("FIREWIRE" == cardtype) || ("DBOX2" == cardtype))
     733    if (("FIREWIRE" == cardtype) || ("DBOX2" == cardtype) || ("FREEBOX" == cardtype))
    718734        inputs += "MPEG2TS";
    719735    else if ("DVB" != cardtype)
    720736        inputs += probeV4LInputs(device);
  • mythtv/libs/libmythtv/dbcheck.cpp

    diff -ru --new-file --exclude=.svn myth-org/mythtv/libs/libmythtv/dbcheck.cpp myth-patch/mythtv/libs/libmythtv/dbcheck.cpp
    old new  
    1010#include "mythdbcon.h"
    1111
    1212/// This is the DB schema version expected by the running MythTV instance.
    13 const QString currentDatabaseVersion = "1130";
     13const QString currentDatabaseVersion = "1131";
    1414
    1515static bool UpdateDBVersionNumber(const QString &newnumber);
    1616static bool performActualUpdate(const QString updates[], QString version,
     
    20052005            return false;
    20062006    }
    20072007
     2008
    20082009    if (dbver == "1123")
    20092010    {
    20102011        const QString updates[] = {
     
    21232124//"ALTER TABLE capturecard DROP COLUMN dvb_recordts;" in 0.21
    21242125//"ALTER TABLE capturecard DROP COLUMN dvb_hw_decoder;" in 0.21
    21252126
     2127  if (dbver == "1130")
     2128    {
     2129        const QString updates[] = {
     2130"INSERT INTO profilegroups SET name = 'Freebox Input', cardtype = 'Freebox', is_default = 1;",
     2131"ALTER TABLE capturecard ADD COLUMN freebox_host varchar(64) DEFAULT 'mafreebox.freebox.fr';",
     2132""
     2133};
     2134
     2135        if (!performActualUpdate(updates, "1124", dbver))
     2136            return false;
     2137    }
     2138
     2139
    21262140    return true;
    21272141}
    21282142
     
    21832197"  `dbox2_port` int(10) unsigned NOT NULL default '31338',"
    21842198"  `dbox2_httpport` int(10) unsigned NOT NULL default '80',"
    21852199"  `dbox2_host` varchar(32) default NULL,"
     2200"  `freebox_host varchar(64) DEFAULT 'mafreebox.freebox.fr',"
    21862201"  `signal_timeout` int(11) NOT NULL default '1000',"
    21872202"  `channel_timeout` int(11) NOT NULL default '3000',"
    21882203"  PRIMARY KEY  (`cardid`)"
     
    27492764"INSERT INTO `profilegroups` VALUES (8,"
    27502765" 'USB Mpeg-4 Encoder (Plextor ConvertX, etc)','GO7007',1,NULL);",
    27512766"INSERT INTO `profilegroups` VALUES (9,'DBOX2 Input','DBOX2',1,NULL);",
     2767"INSERT INTO `profilegroups` VALUES (10,'Freebox Input','Freebox',1,NULL);",
    27522768"INSERT INTO `recordingprofiles` VALUES (1,'Default',NULL,NULL,1);",
    27532769"INSERT INTO `recordingprofiles` VALUES (2,'Live TV',NULL,NULL,1);",
    27542770"INSERT INTO `recordingprofiles` VALUES (3,'High Quality',NULL,NULL,1);",
  • mythtv/libs/libmythtv/freeboxchannel.cpp

    diff -ru --new-file --exclude=.svn myth-org/mythtv/libs/libmythtv/freeboxchannel.cpp myth-patch/mythtv/libs/libmythtv/freeboxchannel.cpp
    old new  
     1/**
     2 *  FreeboxChannel
     3 *  Copyright (c) 2005 by Levent Gündogdu
     4 *  Distributed as part of MythTV under GPL v2 and later.
     5 */
     6
     7
     8
     9#include <iostream>
     10#include <qsqldatabase.h>
     11#include "mythdbcon.h"
     12#include "mythcontext.h"
     13#include "freeboxchannel.h"
     14
     15#define FREEBOX_CHANNEL_DEBUG
     16
     17FreeboxChannel::FreeboxChannel(TVRec *parent, FreeboxDBOptions *freebox_options, int cardid):
     18                                QObject(NULL, "FreeboxChannel"),
     19                                ChannelBase(parent),
     20                                http(new QHttp()),
     21                                m_freeboxoptions(freebox_options),
     22                                m_freeboxchannelcount(0),
     23                                m_channelListReady(false),
     24                                m_requestChannel(""),
     25                                m_lastChannel("1"),
     26                                m_cardid(cardid)
     27
     28{
     29        Log(QString("new FreeboxChannel::FreeboxChannel"));
     30       
     31        connect(http,        SIGNAL(           done(bool)),
     32            this,        SLOT(  HttpRequestDone(bool)));
     33 
     34        LoadChannels();
     35}
     36
     37bool FreeboxChannel::SwitchToInput(const QString &inputname, const QString &chan)
     38{
     39        Log(QString("FreeboxChannel::Switch to input %1 %2").arg(inputname, chan));
     40
     41        int inputNum = GetInputByName(inputname);
     42        Log(QString("FreeboxChannel:inputNum %1").arg(inputNum));
     43        if (inputNum < 0)
     44         return false;
     45               
     46   return SetChannelByString(chan);
     47}
     48
     49bool FreeboxChannel::SetChannelByString(const QString &newChan)
     50{
     51        Log(QString("FreeboxChannel::SetChannelByString %1").arg(newChan));
     52       
     53         // Delay set channel when list has not yet been retrieved
     54    if (!m_channelListReady)
     55    {
     56        Log(QString("Channel list not received yet. Will switch to channel %1 later...").arg(newChan));
     57                m_requestChannel = newChan;
     58                return true;
     59    }
     60   
     61    QString chan = newChan;
     62    if (chan == "")
     63    {
     64        Log(QString("Empty channel name has been provided. Getting default name."));
     65                chan = GetDefaultChannel();
     66    }
     67   
     68    if (m_lastChannel != curchannelname)
     69        m_lastChannel = curchannelname;
     70
     71    curchannelname = chan;
     72   
     73    m_currenturl = GetChannelUrlFromNumber(curchannelname);
     74       
     75   
     76        Log(QString("FreeboxChannel:tochan:%1.").arg(m_currenturl));
     77
     78        emit ChannelChanged();
     79
     80    return true;
     81}
     82
     83QString FreeboxChannel::GetCurrentChannelUrl()
     84{
     85        return m_currenturl;
     86}
     87
     88bool FreeboxChannel::IsOpen(void) const
     89{
     90        VERBOSE(VB_IMPORTANT,QString("FreeboxChannel::IsOpen"));
     91        return true;
     92}
     93
     94bool FreeboxChannel::Open(void)
     95{
     96        Log(QString("FreeboxChannel::Open"));
     97
     98    if (!InitializeInputs())
     99        return false;
     100       
     101        return true;
     102}
     103
     104void FreeboxChannel::Close(void)
     105{
     106        Log(QString("FreeboxChannel::Close"));
     107}
     108
     109
     110
     111void FreeboxChannel::Log(QString string)
     112{
     113    VERBOSE(VB_IMPORTANT,QString("Freebox#%1").arg(string));
     114}
     115
     116
     117// =====================================================================================
     118//
     119//      C H A N N E L     L O A D I N G
     120// =====================================================================================
     121
     122
     123void FreeboxChannel::LoadChannels()
     124{
     125    Log(QString("Loading channels..."));
     126
     127    Log(QString("Reading channel list from %1").arg(m_freeboxoptions->host));
     128
     129    // Request Channel list via http. Signal will be emmitted when list is ready.
     130    QHttpRequestHeader header("GET", "/freeboxtv/playlist.m3u");
     131    header.setValue("Host", m_freeboxoptions->host);
     132    http->setHost(m_freeboxoptions->host, 80);
     133    http->request(header);
     134}
     135
     136
     137QString FreeboxChannel::normalize(QString channelName)
     138{
     139        QString res;
     140        for (unsigned int i=0;i<channelName.length();i++)
     141        {
     142                QChar c = channelName[i];
     143                if (c.isSpace()) continue;
     144                c=c.lower();
     145                if (c=='é' || c=='ê' || c=='ê') c='e';
     146                if (c=='à') c='a';
     147                if (c=='i' || c=='î') c=='i';
     148                if (c=='ô') c=='o';
     149               
     150                res += c;
     151        }
     152       
     153        return res;
     154}
     155
     156void FreeboxChannel::HttpRequestDone(bool error)
     157{
     158    if (error)
     159    {
     160        Log(QString("Reading channel list failed!"));
     161        return;
     162    }
     163
     164    QString buffer=http->readAll();
     165    Log(QString("Reading channel list succeeded."));
     166    m_freeboxchannelcount = 0;
     167
     168    int sepCount = 0;
     169   
     170    QString header = buffer.section("\n", sepCount, sepCount);
     171    sepCount++;
     172
     173        #ifdef FREEBOX_CHANNEL_DEBUG
     174        Log(QString("Found Header %1.").arg(header));
     175        #endif
     176       
     177        if (header != "#EXTM3U")
     178        {
     179                Log(QString("Invalid header while retrieve channel list."));
     180                return;
     181        }
     182   
     183    while (true)
     184    {
     185        QString line1 = buffer.section("\n", sepCount, sepCount);
     186                if (line1 == "")
     187                break;
     188           
     189            sepCount++;
     190
     191        QString line2 = buffer.section("\n", sepCount, sepCount);
     192                if (line2 == "")
     193                break;
     194
     195            sepCount++;
     196
     197                QString lineHead;
     198                QString extension;
     199                QString channelNum;
     200                QString channelName;
     201       
     202                int pos = 0;
     203                int oldPos = 0;
     204               
     205                pos = line1.find(":", oldPos);
     206                if (pos<0)
     207                {
     208                        Log(QString("Invalid header while retrieve channel list."));
     209                        return;
     210                }
     211                lineHead = line1.mid(0, pos);
     212               
     213                if (lineHead != "#EXTINF")
     214                {
     215                        Log(QString("Invalid header while retrieve channel list."));
     216                        return;
     217                }
     218               
     219                oldPos = pos + 1;
     220                pos = line1.find(",", oldPos);
     221                if (pos<0)
     222                {
     223                        Log(QString("Invalid header while retrieve channel list."));
     224                        return;
     225                }
     226                extension = line1.mid(oldPos, pos - oldPos);
     227               
     228
     229                oldPos = pos + 1;
     230                pos = line1.find(" ", oldPos);
     231                if (pos<0)
     232                {
     233                        Log(QString("Invalid header while retrieve channel list."));
     234                        return;
     235                }
     236                channelNum = line1.mid(oldPos, pos - oldPos);
     237               
     238               
     239                oldPos = pos + 1;
     240                pos = line1.find("- ", oldPos);
     241                if (pos<0)
     242                {
     243                        Log(QString("Invalid header while retrieve channel list."));
     244                        return;
     245                }
     246                channelName = line1.mid(pos + 2, line1.length());
     247               
     248               
     249
     250                QString channelUrl = line2;
     251               
     252                bool ok;
     253                int channelNumI = channelNum.toInt( &ok, 10 );     
     254   
     255        QString channelNameN = normalize(channelName);
     256               
     257                m_freeboxchannelIds[channelNumI] = m_freeboxchannelcount;
     258               
     259                m_freeboxchannelUrl[m_freeboxchannelcount] = channelUrl;
     260                m_freeboxchannelNames[m_freeboxchannelcount] = channelName;
     261                m_freeboxchannelNamesN[m_freeboxchannelcount] = channelNameN;
     262               
     263                #ifdef FREEBOX_CHANNEL_DEBUG
     264//              Log(QString("Found Channel %1:%2:%3:%4").arg(channelNum).arg(channelName).arg(channelNameN).arg(channelUrl));
     265                #endif
     266                m_freeboxchannelcount++;
     267    }
     268   
     269    Log(QString("Read %1 channels.").arg(m_freeboxchannelcount));
     270
     271    // Initialize EPG
     272    //m_epg->Init(m_dbox2options, m_cardid, this);
     273   
     274    // Channel list is ready.
     275    m_channelListReady = true;
     276   
     277    // Change channel if request available
     278    if (m_requestChannel != "")
     279    {
     280                SetChannelByString(m_requestChannel);
     281                m_requestChannel = "";
     282    }
     283}
     284
     285
     286QString FreeboxChannel::GetChannelUrlFromNumber(const QString& channelnumber)
     287{
     288    MSqlQuery query(MSqlQuery::InitCon());   
     289   
     290    query.prepare("SELECT name,freqid "
     291                  "FROM channel,cardinput "
     292                  "WHERE "
     293                  "channel.sourceid = cardinput.sourceid AND "
     294                  "cardinput.cardid = :CARDID AND "
     295                  "channel.channum = :CHANNUM");
     296                 
     297    query.bindValue(":CARDID", m_cardid);
     298    query.bindValue(":CHANNUM", channelnumber);
     299
     300    if (query.exec() && query.isActive() && query.size() > 0)
     301    {
     302        query.next();
     303        QString chanName = query.value(0).toString();
     304        int mFreqId = query.value(1).toInt();
     305
     306       
     307        if (mFreqId!=0)
     308        {
     309                int channelI = m_freeboxchannelIds[mFreqId];
     310                return m_freeboxchannelUrl[channelI];
     311        }
     312       
     313        for (int i=0;i<m_freeboxchannelcount;i++)
     314        {
     315                if (m_freeboxchannelNamesN[i] == chanName)
     316                {
     317                        return m_freeboxchannelUrl[i];
     318                }
     319        }
     320
     321                return "";       
     322    }
     323    return "";
     324}
     325
     326QString FreeboxChannel::GetDefaultChannel()
     327{
     328    MSqlQuery query(MSqlQuery::InitCon());   
     329    query.prepare("SELECT channum "
     330                  "FROM channel,cardinput "
     331                  "WHERE "
     332                  "channel.sourceid = cardinput.sourceid AND "
     333                  "cardinput.cardid = :CARDID "
     334                  "ORDER BY channum limit 1");
     335                 
     336    query.bindValue(":CARDID", m_cardid);
     337
     338    if (query.exec() && query.isActive() && query.size() > 0)
     339    {
     340        query.next();
     341        return query.value(0).toString();
     342    }
     343    return "";
     344}
     345 Pas de fin de ligne à la fin du fichier.
  • mythtv/libs/libmythtv/freeboxchannel.h

    diff -ru --new-file --exclude=.svn myth-org/mythtv/libs/libmythtv/freeboxchannel.h myth-patch/mythtv/libs/libmythtv/freeboxchannel.h
    old new  
     1#ifndef FREEBOXCHANNEL_H
     2#define FREEBOXCHANNEL_H
     3
     4#include <qstring.h>
     5#include <qmap.h>
     6#include <qhttp.h>
     7#include <qobject.h>
     8#include <qthread.h>
     9
     10#ifdef HAVE_STDINT_H
     11#include <stdint.h>
     12#endif
     13
     14#include "tv_rec.h"
     15#include "channelbase.h"
     16#include "sitypes.h"
     17
     18
     19class FreeboxChannel : public QObject, public ChannelBase
     20{
     21    Q_OBJECT
     22        public:
     23        FreeboxChannel(TVRec *parent, FreeboxDBOptions *freebox_options, int cardid);
     24        ~FreeboxChannel(void)
     25        { 
     26                }
     27
     28
     29        bool Open();
     30        void Close();
     31        bool SwitchToInput(const QString &inputname, const QString &chan);
     32        bool SetChannelByString(const QString &chan);
     33        bool IsOpen(void) const;
     34 
     35               
     36                QString GetCurrentChannelUrl();
     37               
     38               
     39            bool SwitchToInput(int newcapchannel, bool setstarting)
     40        {
     41                (void)newcapchannel;
     42                (void)setstarting;
     43                return false;
     44        }
     45       
     46        QString GetChannelUrlFromNumber(const QString& channelnumber);
     47                QString GetDefaultChannel();
     48               
     49  signals:
     50    void ChannelChanged();
     51   
     52        public slots:
     53        void HttpRequestDone(bool error);
     54   
     55        private:
     56        void LoadChannels();
     57                QString normalize(QString channelName);
     58
     59                void Log(QString string);
     60 
     61                QHttp                   *http;
     62                FreeboxDBOptions        *m_freeboxoptions;
     63               
     64
     65                bool                    m_channelListReady;
     66                QString                 m_requestChannel;
     67                QString                 m_lastChannel;
     68            int                 m_cardid;
     69            QString             m_currenturl;
     70               
     71                int                     m_freeboxchannelcount;
     72       
     73        QMap<int,int>           m_freeboxchannelIds;
     74        QMap<int,QString>       m_freeboxchannelUrl;
     75        QMap<int,QString>       m_freeboxchannelNames;
     76        QMap<int,QString>       m_freeboxchannelNamesN;
     77};
     78
     79#endif
  • mythtv/libs/libmythtv/freeboxrecorder.cpp

    diff -ru --new-file --exclude=.svn myth-org/mythtv/libs/libmythtv/freeboxrecorder.cpp myth-patch/mythtv/libs/libmythtv/freeboxrecorder.cpp
    old new  
     1/**
     2 *  FreeboxRecorder
     3 *  Copyright (c) 2005 by Levent G?u (mythtv@feature-it.com)
     4 *  Distributed as part of MythTV under GPL v2 and later.
     5 */
     6
     7#include <iostream>
     8using namespace std;
     9
     10
     11
     12#include <pthread.h>
     13#include "RingBuffer.h"
     14#include "mythcontext.h"
     15#include "freeboxrecorder.h"
     16#include "freeboxchannel.h"
     17#include <qhttp.h>
     18#include <qobject.h>
     19#include <sys/select.h>
     20#include <sys/types.h>
     21#include <sys/socket.h>
     22#include <netdb.h>
     23#include <fcntl.h>
     24#include <unistd.h>
     25#include <netinet/in.h>    // For sockaddr_in on OS X
     26
     27void subsessionAfterPlaying(void *clientData);
     28void subsessionByeHandler(void *clientData);
     29
     30
     31
     32
     33
     34FreeboxRecorder::FreeboxRecorder(TVRec *rec, FreeboxChannel *channel):DTVRecorder(rec, "FreeboxRecorder"),
     35                                m_channel(channel)
     36                                       
     37{
     38        Log(QString("FreeboxRecorder::new FreeboxRecorder"));
     39
     40        watchVariable = new char();
     41       
     42    connect (m_channel, SIGNAL(ChannelChanged()),
     43             this,      SLOT(  ChannelChanged()));
     44
     45}
     46
     47
     48
     49
     50void FreeboxRecorder::StartRecording()
     51{
     52        Log(QString("FreeboxRecorder::StartRecording"));
     53        Open();
     54}
     55
     56void FreeboxRecorder::StopRecording(void)
     57{
     58        Log(QString("FreeboxRecorder::StopRecording"));
     59        Close();       
     60}
     61
     62bool FreeboxRecorder::Open()
     63{
     64        Log(QString("FreeboxRecorder::Open"));
     65        DTVRecorder::Reset();
     66        DTVRecorder::ResetForNewFile();
     67    tvrec->TuningRestartRecorder();
     68        Play(m_channel->GetCurrentChannelUrl());
     69        return true;
     70}       
     71
     72void FreeboxRecorder::Pause(bool clear)
     73{
     74        Log(QString("FreeboxRecorder::Pause"));
     75        Close();
     76}
     77
     78void FreeboxRecorder::Close()
     79{
     80        Log(QString("FreeboxRecorder::Close"));
     81        paused=true;
     82        DTVRecorder::StopRecording();
     83        Reset();
     84
     85        waitShutdown = new QWaitCondition();
     86        *watchVariable = 1;
     87       
     88        waitShutdown->wait();
     89}
     90
     91void FreeboxRecorder::ChannelChanged()
     92{
     93    Log(QString("FreeboxRecorder: Channel changed. Requesting streams..."));
     94    Open();
     95}
     96
     97
     98
     99void FreeboxRecorder::SetOptionsFromProfile(RecordingProfile *profile,
     100                                                                                           const QString &videodev,
     101                                                                                           const QString &audiodev,
     102                                                                                           const QString &vbidev)
     103{
     104        Log(QString("FreeboxRecorder::SetOptionsFromProfile"));
     105       
     106}
     107
     108void FreeboxRecorder::Log(QString string)
     109{
     110    VERBOSE(VB_IMPORTANT,QString("Freebox#%1").arg(string));
     111}
     112
     113void FreeboxRecorder::Play(QString url)
     114{
     115        Log(QString("FreeboxRecorder::Play"));
     116  // Begin by setting up our usage environment:
     117  TaskScheduler* scheduler = BasicTaskScheduler::createNew();
     118  env = BasicUsageEnvironment::createNew(*scheduler);
     119
     120 
     121  // Create our client object:
     122  rtspClient = RTSPClient::createNew(*env, 0, "myRTSP", 0);
     123  if (rtspClient == NULL)
     124  {
     125    *env << "Failed to create RTSP client: " << env->getResultMsg() << "\n";
     126    shutdown();
     127  }
     128 
     129  char* sdpDescription = rtspClient->describeURL(url);
     130  rtspClient->describeStatus();
     131
     132  if (sdpDescription == NULL)
     133  {
     134    *env << "Failed to get a SDP description from URL \"" << url << "\": " << env->getResultMsg() << "\n";
     135    shutdown();
     136  }
     137 
     138  *env << "Opened URL \"" << url << "\", returning a SDP description:\n" << sdpDescription << "\n";
     139
     140  // Create a media session object from this SDP description:
     141  session = MediaSession::createNew(*env, sdpDescription);
     142  delete[] sdpDescription;
     143  if (session == NULL)
     144  {
     145    *env << "Failed to create a MediaSession object from the SDP description: " << env->getResultMsg() << "\n";
     146    shutdown();
     147  }
     148  else if (!session->hasSubsessions())
     149  {
     150    *env << "This session has no media subsessions (i.e., \"m=\" lines)\n";
     151    shutdown();
     152  }
     153 
     154    // Then, setup the "RTPSource"s for the session:
     155  MediaSubsessionIterator iter(*session);
     156  MediaSubsession *subsession;
     157  Boolean madeProgress = False;
     158  while ((subsession = iter.next()) != NULL)
     159  {
     160      if (!subsession->initiate(-1))
     161      {
     162                *env << "Unable to create receiver for \"" << subsession->mediumName()  << "/" << subsession->codecName()       << "\" subsession: " << env->getResultMsg() << "\n";
     163      }
     164      else
     165      {
     166                *env << "Created receiver for \"" << subsession->mediumName() << "/" << subsession->codecName() << "\" subsession (client ports " << subsession->clientPortNum()
     167                                << "-" << subsession->clientPortNum()+1 << ")\n";
     168               
     169                madeProgress = True;
     170
     171                if (subsession->rtpSource() != NULL)
     172                {
     173                  unsigned const thresh = 1000000; // 1 second
     174                  subsession->rtpSource()->setPacketReorderingThresholdTime(thresh);
     175                }
     176      }
     177  }
     178
     179
     180  if (!madeProgress) shutdown();
     181
     182
     183  // Perform additional 'setup' on each subsession, before playing them:
     184  madeProgress = false;
     185  iter.reset();
     186  while ((subsession = iter.next()) != NULL)
     187  {
     188    if (subsession->clientPortNum() == 0) continue; // port # was not set
     189
     190
     191    if (rtspClient->setupMediaSubsession(*subsession, False, false))
     192    {
     193      *env << "Setup \"" << subsession->mediumName() << "/" << subsession->codecName() << "\" subsession (client ports " << subsession->clientPortNum() << "-" << subsession->clientPortNum()+1 << ")\n";
     194       madeProgress = True;
     195        }
     196        else
     197        {       
     198      *env << "Failed to setup \"" << subsession->mediumName() << "/" << subsession->codecName() << "\" subsession: " << env->getResultMsg() << "\n";
     199    }
     200  }
     201 
     202 
     203  if (!madeProgress) shutdown();
     204 
     205 
     206  // Create and start "FileSink"s for each subsession:
     207  madeProgress = False;
     208  iter.reset();
     209  while ((subsession = iter.next()) != NULL)
     210  {
     211                if (subsession->readSource() == NULL) continue; // was not initiated
     212                char outFileName[1000];
     213                sprintf(outFileName, "out");
     214               
     215                MySink* mySink = MySink::createNew(*env, this);
     216           
     217        subsession->sink = mySink;
     218                if (subsession->sink == NULL)
     219                {
     220                         *env << "Failed to create FileSink for \"" << outFileName << "\": " << env->getResultMsg() << "\n";
     221                }
     222                else {
     223                          *env << "Created output file: \"" << outFileName << "\"\n";
     224                }
     225               
     226            subsession->sink->startPlaying(*(subsession->readSource()),  subsessionAfterPlaying, new MyClientData(this, subsession));
     227           
     228            if (subsession->rtcpInstance() != NULL) {
     229                        subsession->rtcpInstance()->setByeHandler(subsessionByeHandler, new MyClientData(this, subsession));
     230                }
     231
     232            madeProgress = True;
     233  }
     234
     235  if (!madeProgress) shutdown();
     236
     237  if (rtspClient->playMediaSession(*session))
     238  {
     239    *env << "Started playing session\n";
     240  }
     241  else
     242  {
     243         *env << "Failed to start playing session: " << env->getResultMsg() << "\n";
     244         shutdown();
     245  }
     246
     247  paused=false;
     248  _request_recording = true;
     249  _recording = true;
     250
     251 
     252  *watchVariable=0;
     253 
     254  env->taskScheduler().doEventLoop(watchVariable); // does not return
     255
     256  FinishRecording();
     257  _request_recording = false;
     258  _recording = false;
     259  shutdown();
     260  Log(QString("FreeboxRecorder::RecordStop"));
     261
     262  waitShutdown->wakeAll();
     263
     264
     265
     266}
     267
     268int FreeboxRecorder::findTSHeader(unsigned char *data, unsigned dataSize)
     269{
     270    unsigned int pos = 0;
     271   
     272    while (pos < dataSize)
     273    {
     274        if (data[pos] == 0x47)
     275                return pos;
     276                pos++;
     277    }
     278    return -1;
     279}
     280
     281
     282void FreeboxRecorder::addData(unsigned char* data, unsigned dataSize, struct timeval presentationTime)
     283
     284//      Log(QString("+"));
     285    unsigned int readIndex = 0;
     286    while (readIndex < dataSize)
     287    {
     288        // Try to find next TS
     289        int tsPos = findTSHeader(data + readIndex, dataSize);
     290        if (tsPos == -1)
     291        {
     292                VERBOSE(VB_IMPORTANT, QString("FREEBOX: No TS header."));
     293                break;
     294                }
     295     
     296                if (tsPos > 0)
     297                {
     298                VERBOSE(VB_IMPORTANT, QString("FREEBOX: TS header at %1, not in sync.").arg(tsPos));
     299            }
     300
     301                if ((dataSize - tsPos) < 188)
     302                {
     303                VERBOSE(VB_IMPORTANT, QString("FREEBOX: TS header at %1 but packet not yet complete.").arg(tsPos));
     304                        break;
     305            }
     306       
     307               
     308                       
     309            const void     *newData     = data + tsPos + readIndex;
     310            const TSPacket *tspacket = reinterpret_cast<const TSPacket*>(newData);
     311
     312                _buffer_packets = !FindKeyframes(tspacket);
     313
     314                BufferedWrite(*tspacket);
     315               
     316                readIndex += tsPos + TSPacket::SIZE;
     317               
     318        }
     319}
     320
     321
     322
     323
     324void FreeboxRecorder::shutdown(int exitCode)
     325{
     326  Log(QString("FreeboxRecorder::Shutdown"));
     327  if (session == NULL) return;
     328  MediaSubsessionIterator iter(*session);
     329  MediaSubsession* subsession;
     330  while ((subsession = iter.next()) != NULL)
     331  {
     332    Medium::close(subsession->sink);
     333    subsession->sink = NULL;
     334  }
     335 
     336  if (session == NULL) return;
     337 
     338  rtspClient->teardownMediaSession(*session);
     339 
     340 
     341  Medium::close(session);
     342  Medium::close(rtspClient);
     343}
     344
     345
     346
     347
     348void subsessionAfterPlaying(void *clientData)
     349{
     350        MyClientData *myData = (MyClientData*)clientData;
     351        myData->freeboxRecorder->SubsessionAfterPlaying(myData->mediaSubSession);
     352}
     353
     354void subsessionByeHandler(void *clientData)
     355{
     356        MyClientData *myData = (MyClientData*)clientData;
     357        myData->freeboxRecorder->SubsessionByeHandler(myData->mediaSubSession);
     358}
     359
     360void FreeboxRecorder::SubsessionAfterPlaying(MediaSubsession* subsession)
     361{
     362        Log(QString("FreeboxRecorder::SubsessionAfterPlaying"));
     363        Medium::close(subsession->sink);
     364  subsession->sink = NULL;
     365
     366  MediaSession& session = subsession->parentSession();
     367  MediaSubsessionIterator iter(session);
     368  while ((subsession = iter.next()) != NULL)
     369  {
     370    if (subsession->sink != NULL) return;
     371  }
     372
     373  shutdown(0);
     374
     375}
     376
     377
     378void FreeboxRecorder::SubsessionByeHandler(MediaSubsession* subsession)
     379{
     380        Log(QString("FreeboxRecorder::SubsessionByeHandler"));
     381  *env << "Received RTCP \"BYE\" on \"" << subsession->mediumName() << "/" << subsession->codecName() << "\n";
     382
     383  subsessionAfterPlaying(subsession);
     384}
     385
     386
     387
     388MySink::MySink(UsageEnvironment& pEnv, FreeboxRecorder *pRecorder) : MediaSink(pEnv)
     389{
     390        recorder = pRecorder;
     391        env = &pEnv;
     392        fBufferSize = 20000;
     393        fBuffer = new unsigned char[fBufferSize];
     394}
     395
     396MySink::~MySink()
     397{
     398         delete[] fBuffer;
     399}
     400
     401MySink* MySink::createNew(UsageEnvironment& env, FreeboxRecorder *pRecorder)
     402{
     403               
     404
     405  MySink* newSink = new MySink(env, pRecorder);
     406  return newSink;
     407}
     408
     409Boolean MySink::continuePlaying()
     410{
     411
     412  if (fSource == NULL) return False;
     413
     414  fSource->getNextFrame(fBuffer, fBufferSize, afterGettingFrame, this, onSourceClosure, this);
     415
     416  return True;
     417}
     418
     419void MySink::afterGettingFrame(void* clientData, unsigned frameSize, unsigned /*numTruncatedBytes*/,struct timeval presentationTime, unsigned /*durationInMicroseconds*/)
     420{
     421
     422  MySink* sink = (MySink*)clientData;
     423  sink->afterGettingFrame1(frameSize, presentationTime);
     424
     425
     426void MySink::afterGettingFrame1(unsigned frameSize, struct timeval presentationTime)
     427{
     428
     429        addData(fBuffer, frameSize, presentationTime);
     430    continuePlaying();
     431}
     432
     433void MySink::addData(unsigned char* data, unsigned dataSize, struct timeval presentationTime)
     434
     435        recorder->addData(data, dataSize, presentationTime);
     436}
     437
     438
     439
     440
     441
     442
  • mythtv/libs/libmythtv/freeboxrecorder.h

    diff -ru --new-file --exclude=.svn myth-org/mythtv/libs/libmythtv/freeboxrecorder.h myth-patch/mythtv/libs/libmythtv/freeboxrecorder.h
    old new  
     1/**
     2 *  DBOX2Recorder
     3 *  Copyright (c) 2005 by Levent Gündogdu
     4 *  Distributed as part of MythTV under GPL v2 and later.
     5 */
     6
     7#ifndef FREEBOXRECORDER_H_
     8#define FREEBOXRECORDER_H_
     9
     10#include "dtvrecorder.h"
     11#include <time.h>
     12#include "freeboxchannel.h"
     13#include "sitypes.h"
     14#include "qhttp.h"
     15#include "mpeg/tspacket.h"
     16
     17
     18#include "BasicUsageEnvironment.hh"
     19#include "GroupsockHelper.hh"
     20#include "liveMedia.hh"
     21
     22/**
     23
     24 *
     25 *  Constructs a FreeboxRecorder
     26 *
     27 */
     28
     29#if defined(__WIN32__) || defined(_WIN32)
     30#define snprintf _snprintf
     31#else
     32#include <signal.h>
     33#define USE_SIGNALS 1
     34#endif
     35
     36
     37
     38class FreeboxRecorder : public DTVRecorder
     39{
     40    Q_OBJECT
     41    public:
     42        FreeboxRecorder(TVRec *rec, FreeboxChannel *channel);
     43        ~FreeboxRecorder() {  }
     44
     45
     46        void StartRecording(void);
     47        void StopRecording(void);
     48        bool Open(void);
     49        void Close();
     50       
     51        void SetOptionsFromProfile(RecordingProfile *profile,
     52                                   const QString &videodev,
     53                                   const QString &audiodev,
     54                                   const QString &vbidev);
     55
     56           void SubsessionAfterPlaying(MediaSubsession* subsession);
     57           void SubsessionByeHandler(MediaSubsession* subsession);
     58           
     59           
     60           void addData(unsigned char* data, unsigned dataSize, struct timeval presentationTime);
     61           int findTSHeader(unsigned char *data, unsigned dataSize);
     62
     63
     64        void Pause(bool clear);
     65    public slots:
     66        void ChannelChanged();
     67               
     68 
     69        private:
     70           UsageEnvironment* env;
     71           RTSPClient* rtspClient;
     72           MediaSession* session;
     73           char* watchVariable;
     74           
     75           void FreeboxRecorder::Play(QString url);
     76           void Log(QString string);
     77           void shutdown(int exitCode = 1);
     78           
     79           FreeboxChannel *m_channel;
     80         
     81          QWaitCondition *waitShutdown;
     82};
     83
     84class MyClientData
     85{
     86        public:
     87                MyClientData(FreeboxRecorder *pFreeboxRecorder, MediaSubsession *pMediaSubSession)
     88                {
     89                        freeboxRecorder = pFreeboxRecorder;
     90                        mediaSubSession = pMediaSubSession;
     91                }
     92       
     93        FreeboxRecorder *freeboxRecorder;
     94        MediaSubsession *mediaSubSession;
     95};
     96
     97
     98
     99class MySink: public MediaSink {
     100        public:
     101          static MySink* createNew(UsageEnvironment& env, FreeboxRecorder *pRecorder);
     102       
     103          void addData(unsigned char* data, unsigned dataSize, struct timeval presentationTime);
     104       
     105        protected:
     106          MySink(UsageEnvironment& env, FreeboxRecorder *pRecorder);
     107          virtual ~MySink();
     108       
     109          static void afterGettingFrame(void* clientData, unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime, unsigned durationInMicroseconds);
     110          virtual void afterGettingFrame1(unsigned frameSize, struct timeval presentationTime);
     111       
     112        private:
     113          virtual Boolean continuePlaying();
     114         
     115          unsigned char* fBuffer;
     116          unsigned fBufferSize;
     117          UsageEnvironment *env;
     118          FreeboxRecorder *recorder;
     119          int bufferIndex;
     120         
     121};
     122#endif
  • mythtv/libs/libmythtv/libmythtv.pro

    diff -ru --new-file --exclude=.svn myth-org/mythtv/libs/libmythtv/libmythtv.pro myth-patch/mythtv/libs/libmythtv/libmythtv.pro
    old new  
    289289    # Support for set top boxes (Nokia DBox2 etc.)
    290290    using_dbox2:SOURCES += dbox2recorder.cpp dbox2channel.cpp dbox2epg.cpp
    291291    using_dbox2:HEADERS += dbox2recorder.h dbox2channel.h dbox2epg.h
     292   
     293    using_freebox:SOURCES += freeboxrecorder.cpp freeboxchannel.cpp
     294    using_freebox:HEADERS += freeboxrecorder.h freeboxchannel.h
    292295
    293296    # Support for PVR-150/250/350/500, etc. on Linux
    294297    using_ivtv:HEADERS += mpegrecorder.h
  • mythtv/libs/libmythtv/tv_rec.cpp

    diff -ru --new-file --exclude=.svn myth-org/mythtv/libs/libmythtv/tv_rec.cpp myth-patch/mythtv/libs/libmythtv/tv_rec.cpp
    old new  
    6868#include "dbox2channel.h"
    6969#endif
    7070
     71#ifdef USING_FREEBOX
     72#include "freeboxrecorder.h"
     73#include "freeboxchannel.h"
     74#endif
     75
    7176#define DEBUG_CHANNEL_PREFIX 0 /**< set to 1 to channel prefixing */
    7277
    7378#define LOC QString("TVRec(%1): ").arg(cardid)
     
    135140
    136141bool TVRec::CreateChannel(const QString &startchannel)
    137142{
     143        Log(QString("TVRec::CreateChannel"));
    138144    bool init_run = false;
    139145    if (genOpt.cardtype == "DVB")
    140146    {
     
    172178        init_run = true;
    173179#endif
    174180    }
     181    else if (genOpt.cardtype == "FREEBOX")
     182    {
     183#ifdef USING_FREEBOX
     184        channel = new FreeboxChannel(this, &freeboxOpt, cardid);
     185        channel->Open();
     186        InitChannel(genOpt.defaultinput, startchannel);
     187        init_run = true;
     188#endif
     189    }
    175190    else if (genOpt.cardtype == "MPEG" &&
    176191             genOpt.videodev.lower().left(5) == "file:")
    177192    {
     
    217232 */
    218233bool TVRec::Init(void)
    219234{
     235        Log(QString("TVRec::Init"));
    220236    QMutexLocker lock(&stateChangeLock);
    221237
    222     if (!GetDevices(cardid, genOpt, dvbOpt, fwOpt, dboxOpt))
     238    if (!GetDevices(cardid, genOpt, dvbOpt, fwOpt, dboxOpt, freeboxOpt))
    223239        return false;
    224240
     241        Log(QString("TVRec::Init1"));
    225242    QString startchannel = GetStartChannel(cardid, genOpt.defaultinput);
    226243    if (!CreateChannel(startchannel))
    227244        return false;
     245        Log(QString("TVRec::Init2"));
    228246
    229247    transcodeFirst    =
    230248        gContext->GetNumSetting("AutoTranscodeBeforeAutoCommflag", 0);
     
    286304        GetDBox2Channel()->deleteLater();
    287305    else
    288306#endif // USING_DBOX2
     307#ifdef USING_FREEBOX
     308        if (GetFreeboxChannel())
     309        GetFreeboxChannel()->deleteLater();
     310    else
     311#endif // USING_FREEBOX
    289312    if (channel)
    290313        delete channel;
    291314    channel = NULL;
     
    407430 */
    408431RecStatusType TVRec::StartRecording(const ProgramInfo *rcinfo)
    409432{
     433        Log(QString("TVRec::StartRecording"));
    410434    VERBOSE(VB_RECORD, LOC + QString("StartRecording(%1)").arg(rcinfo->title));
    411435
    412436    QMutexLocker lock(&stateChangeLock);
     
    537561 */
    538562void TVRec::StopRecording(void)
    539563{
     564        Log(QString("TVRec::StopRecording"));
    540565    if (StateIsRecording(GetState()))
    541566    {
    542567        QMutexLocker lock(&stateChangeLock);
     
    843868        recorder->SetOption("httpport", dboxOpt.httpport);
    844869#endif // USING_DBOX2
    845870    }
     871    else if (genOpt.cardtype == "FREEBOX")
     872    {
     873#ifdef USING_FREEBOX
     874        recorder = new FreeboxRecorder(this, GetFreeboxChannel());
     875        recorder->SetOption("host",     freeboxOpt.host);
     876#endif // USING_FREEBOX
     877    }
    846878    else if (genOpt.cardtype == "DVB")
    847879    {
    848880#ifdef USING_DVB
     
    9951027 */
    9961028void TVRec::InitChannel(const QString &inputname, const QString &startchannel)
    9971029{
     1030        Log(QString("TVRec::InitChannel(2)"));
    9981031    if (!channel)
    9991032        return;
    10001033
     
    10501083#endif // USING_DBOX2
    10511084}
    10521085
     1086FreeboxChannel *TVRec::GetFreeboxChannel(void)
     1087{
     1088#ifdef USING_FREEBOX
     1089    return dynamic_cast<FreeboxChannel*>(channel);
     1090#else
     1091    return NULL;
     1092#endif // USING_FREEBOX
     1093}
     1094
     1095
    10531096DVBChannel *TVRec::GetDVBChannel(void)
    10541097{
    10551098#ifdef USING_DVB
     
    11591202    return false;
    11601203}
    11611204
     1205void TVRec::Log(QString string)
     1206{
     1207        VERBOSE(VB_IMPORTANT,QString("Freebox#%1").arg(string));
     1208}
     1209
    11621210static bool is_dishnet_eit(int cardid)
    11631211{
    11641212    MSqlQuery query(MSqlQuery::InitCon());
     
    11841232 */
    11851233void TVRec::RunTV(void)
    11861234{
     1235        Log(QString("TVRec::RunTV"));
    11871236    QMutexLocker lock(&stateChangeLock);
    11881237    SetFlags(kFlagRunMainLoop);
    11891238    ClearFlags(kFlagExitPlayer | kFlagFinishRecording);
     
    11981247        // If there is a state change queued up, do it...
    11991248        if (changeState)
    12001249        {
     1250                Log(QString("!"));
    12011251            HandleStateChange();
    12021252            ClearFlags(kFlagFrontendReady | kFlagCancelNextRecording);
    12031253            SetFlags(kFlagAskAllowRecording);
     
    13811431                       GeneralDBOptions  &gen_opts,
    13821432                       DVBDBOptions      &dvb_opts,
    13831433                       FireWireDBOptions &firewire_opts,
    1384                        DBox2DBOptions    &dbox2_opts)
     1434                       DBox2DBOptions    &dbox2_opts,
     1435                       FreeboxDBOptions  &freebox_opts)
    13851436{
    13861437    int testnum = 0;
    13871438    QString test;
     
    13951446        "       firewire_port,    firewire_node,       firewire_speed, "
    13961447        "       firewire_model,   firewire_connection,                 "
    13971448        "       dbox2_port,       dbox2_host,          dbox2_httpport, "
    1398         "       signal_timeout,   channel_timeout                      "
     1449        "       signal_timeout,   channel_timeout,                     "
     1450        "               freebox_host                                                                                       "
    13991451        "FROM capturecard "
    14001452        "WHERE cardid = :CARDID");
    14011453    query.bindValue(":CARDID", cardid);
     
    14491501        if (test != QString::null)
    14501502           dbox2_opts.host = QString::fromUtf8(test);
    14511503        dbox2_opts.httpport = query.value(16).toInt();
     1504       
     1505        test = query.value(19).toString();
     1506        if (test != QString::null)
     1507                freebox_opts.host = QString::fromUtf8(test);
    14521508
    14531509        gen_opts.signal_timeout  = (uint) max(query.value(17).toInt(), 0);
    14541510        gen_opts.channel_timeout = (uint) max(query.value(18).toInt(), 0);
     
    14671523    QString msg("");
    14681524    QString startchan = QString::null;
    14691525
     1526        VERBOSE(VB_IMPORTANT, QString("default input:%1").arg(defaultinput));
     1527
    14701528    // Get last tuned channel from database, to use as starting channel
    14711529    MSqlQuery query(MSqlQuery::InitCon());
    14721530    query.prepare(
     
    14931551
    14941552    // If we failed to get the last tuned channel,
    14951553    // get a valid channel on our current input.
     1554    VERBOSE(VB_IMPORTANT, QString("input name:%1").arg(defaultinput));
    14961555    query.prepare(
    14971556        "SELECT channum "
    14981557        "FROM capturecard, cardinput, channel "
     
    21552214        return retval;
    21562215
    21572216    QString channelinput = chan->GetCurrentInput();
    2158    
     2217      
    21592218    query.prepare(
    21602219        QString(
    21612220            "SELECT channel.%1 "
     
    22402299                             int cardid, QString channelorder,
    22412300                             int channeldirection, QString &chanid)
    22422301{
    2243     bool isNum = true;
     2302   bool isNum = true;
    22442303    channum.toULong(&isNum);
    22452304
    22462305    if (!isNum && channelorder == "channum + 0")
     
    33993458        delete channel;
    34003459        channel = NULL;
    34013460
    3402         GetDevices(newCardID, genOpt, dvbOpt, fwOpt, dboxOpt);
     3461        GetDevices(newCardID, genOpt, dvbOpt, fwOpt, dboxOpt, freeboxOpt);
    34033462        genOpt.defaultinput = inputname;
    34043463        CreateChannel(channum);
    34053464        if (!(request.flags & kFlagNoRec))
     
    34363495 */
    34373496void TVRec::TuningFrequency(const TuningRequest &request)
    34383497{
     3498        Log(QString("TVRec::TuningFrequency"));
    34393499    QString channum, input;
    34403500    if (request.program)
    34413501        request.program->GetChannel(channum, input);
     
    40174077        return false;
    40184078
    40194079    QString channum = channel->GetCurrentName();
     4080        VERBOSE(VB_IMPORTANT, LOC_ERR + QString("parm1: %1").arg(channum));
    40204081    int chanid = GetChannelValue("chanid", channel, channum);
    40214082
    40224083    if (chanid < 0)
  • mythtv/libs/libmythtv/tv_rec.h

    diff -ru --new-file --exclude=.svn myth-org/mythtv/libs/libmythtv/tv_rec.h myth-patch/mythtv/libs/libmythtv/tv_rec.h
    old new  
    3434class DBox2Channel;
    3535class DVBChannel;
    3636class Channel;
     37class FreeboxChannel;
    3738
    3839class MPEGStreamData;
    3940class ProgramMapTable;
     
    101102    QString host;
    102103};
    103104
     105class FreeboxDBOptions
     106{
     107        public:
     108            FreeboxDBOptions() : host("mafreebox.freebox.fr") {;}
     109
     110        QString host;
     111};
     112
     113
    104114class TuningRequest
    105115{
    106116  public:
     
    180190    void PauseRecorder(void);
    181191    void ToggleChannelFavorite(void);
    182192
     193           void Log(QString string);
     194
    183195    void SetLiveRecording(int recording);
    184196
    185197    QStringList GetConnectedInputs(void) const;
     
    218230    void DVBGotPMT(void)
    219231        { QMutexLocker lock(&stateChangeLock); triggerEventLoop.wakeAll(); }
    220232
     233    void TuningRestartRecorder(void);
    221234  public slots:
    222235    void SignalMonitorAllGood() { triggerEventLoop.wakeAll(); }
    223236    void deleteLater(void);
     
    237250                           GeneralDBOptions   &general_opts,
    238251                           DVBDBOptions       &dvb_opts,
    239252                           FireWireDBOptions  &firewire_opts,
    240                            DBox2DBOptions     &dbox2_opts);
     253                           DBox2DBOptions     &dbox2_opts,
     254                           FreeboxDBOptions       &free_opts);
    241255
    242256
    243257    static QString GetStartChannel(int cardid, const QString &defaultinput);
     
    250264    bool CreateChannel(const QString &startChanNum);
    251265    void InitChannel(const QString &inputname, const QString &startchannel);
    252266    void CloseChannel(void);
     267    FreeboxChannel *GetFreeboxChannel(void);
    253268    DBox2Channel *GetDBox2Channel(void);
    254269    DVBChannel   *GetDVBChannel(void);
    255270    Channel      *GetV4LChannel(void);
     
    277292    bool TuningSignalCheck(void);
    278293    bool TuningPMTCheck(void);
    279294    void TuningNewRecorder(void);
    280     void TuningRestartRecorder(void);
    281295    uint TuningCheckForHWChange(const TuningRequest&,
    282296                                QString &channum,
    283297                                QString &inputname);
     
    333347    DVBDBOptions      dvbOpt;
    334348    FireWireDBOptions fwOpt;
    335349    DBox2DBOptions    dboxOpt;
     350    FreeboxDBOptions  freeboxOpt;
    336351
    337352    // State variables
    338353    QMutex         stateChangeLock;
  • mythtv/libs/libmythtv/videosource.cpp

    diff -ru --new-file --exclude=.svn myth-org/mythtv/libs/libmythtv/videosource.cpp myth-patch/mythtv/libs/libmythtv/videosource.cpp
    old new  
    894894 };
    895895
    896896
     897class FreeboxHost : public LineEditSetting, public CCSetting {
     898        public:
     899           FreeboxHost(const CaptureCard &parent):
     900           CCSetting(parent, "freebox_host") {
     901                        setValue("mafreebox.freebox.fr");
     902                        setLabel(QObject::tr("Freebox Host"));
     903            setHelpText(QObject::tr("The freebox host."));
     904        }
     905};
     906
     907class FreeboxConfigurationGroup: public VerticalConfigurationGroup {
     908public:
     909   FreeboxConfigurationGroup(CaptureCard& a_parent):
     910       parent(a_parent) {
     911       setUseLabel(false);
     912       addChild(new FreeboxHost(parent));
     913   };
     914  private:
     915     CaptureCard& parent;
     916 };
     917                     
    897918
    898919
    899920class V4LConfigurationGroup: public VerticalConfigurationGroup
     
    9881009    addTarget("MPEG", new MPEGConfigurationGroup(parent));
    9891010    addTarget("FIREWIRE", new FirewireConfigurationGroup(parent));
    9901011    addTarget("DBOX2", new DBOX2ConfigurationGroup(parent));
     1012    addTarget("FREEBOX", new FreeboxConfigurationGroup(parent));
    9911013}
    9921014
    9931015void CaptureCardGroup::triggerChanged(const QString& value)
     
    10221044    QString qstr =
    10231045        "SELECT cardtype, videodevice, cardid, "
    10241046        "       firewire_port, firewire_node, "
    1025         "       dbox2_port, dbox2_host, dbox2_httpport "
     1047        "       dbox2_port, dbox2_host, dbox2_httpport, freebox_host "
    10261048        "FROM capturecard "
    10271049        "WHERE hostname = :HOSTNAME";
    10281050    if (no_children)
     
    10521074                    "Streaming-Port: " + query.value(5).toString() + ", " +
    10531075                    "Http-Port: " + query.value(7).toString() +
    10541076                    "] ", query.value(2).toString());
    1055             }
     1077                        }
     1078            else if (query.value(0).toString() == "FREEBOX")
     1079            {
     1080                setting->addSelection(
     1081                    "[ " + query.value(0).toString() + " " +
     1082                    "HOST: " + query.value(8).toString() +  " " +
     1083                    "] ", query.value(2).toString());
     1084                        }
    10561085            else
    10571086            {
    10581087                setting->addSelection(
     
    10981127        "GO7007");
    10991128    setting->addSelection(
    11001129        QObject::tr("DBox2 TCP/IP cable box"), "DBOX2");
     1130    setting->addSelection(
     1131        QObject::tr("Freebox"), "FREEBOX");
    11011132}
    11021133
    11031134class CardID: public SelectLabelSetting, public CISetting {
     
    18471878    // SelectSetting provided a facility to edit the labels, we
    18481879    // could use CaptureCard::fillSelections
    18491880
     1881
    18501882    MSqlQuery query(MSqlQuery::InitCon());
    18511883    query.prepare(
    18521884        "SELECT cardid, videodevice, cardtype "
  • mythtv/programs/mythbackend/version.cpp

    diff -ru --new-file --exclude=.svn myth-org/mythtv/programs/mythbackend/version.cpp myth-patch/mythtv/programs/mythbackend/version.cpp
    old new  
     1const char *myth_source_version = "9324M";
  • mythtv/programs/mythfrontend/version.cpp

    diff -ru --new-file --exclude=.svn myth-org/mythtv/programs/mythfrontend/version.cpp myth-patch/mythtv/programs/mythfrontend/version.cpp
    old new  
     1const char *myth_source_version = "9324M";
  • mythtv/settings.pro

    diff -ru --new-file --exclude=.svn myth-org/mythtv/settings.pro myth-patch/mythtv/settings.pro
    old new  
    2020
    2121INCLUDEPATH += $${PREFIX}/include
    2222INCLUDEPATH += $$CONFIG_INCLUDEPATH
     23INCLUDEPATH += /usr/lib/live/liveMedia/include
     24INCLUDEPATH += /usr/lib/live/UsageEnvironment/include
     25INCLUDEPATH += /usr/lib/live/BasicUsageEnvironment/include
     26INCLUDEPATH += /usr/lib/live/groupsock/include
    2327
    2428# figure out compile flags based on qmake info
    2529
     
    7276}
    7377QMAKE_LIBDIR_OPENGL =
    7478
    75 EXTRA_LIBS = -lfreetype -lmp3lame
     79EXTRA_LIBS = -lfreetype -lmp3lame -L /usr/lib/live/liveMedia -lliveMedia -L/usr/lib/live/UsageEnvironment -lUsageEnvironment -L/usr/lib/live/groupsock -lgroupsock -L/usr/lib/live/BasicUsageEnvironment -lBasicUsageEnvironment
    7680EXTRA_LIBS += $$CONFIG_AUDIO_OSS_LIBS
    7781EXTRA_LIBS += $$CONFIG_AUDIO_ALSA_LIBS
    7882EXTRA_LIBS += $$CONFIG_AUDIO_ARTS_LIBS
  • mythtv/setup/Makefile

    diff -ru --new-file --exclude=.svn myth-org/mythtv/setup/Makefile myth-patch/mythtv/setup/Makefile
    old new  
     1#############################################################################
     2# Makefile for building: mythtv-setup
     3# Generated by qmake (1.07a) (Qt 3.3.4) on: Sat Mar 11 18:37:34 2006
     4# Project:  setup.pro
     5# Template: app
     6# Command: $(QMAKE) -o Makefile setup.pro
     7#############################################################################
     8
     9####### Compiler, tools and options
     10
     11CC       = gcc
     12CXX      = g++
     13LEX      = flex
     14YACC     = yacc
     15CFLAGS   = -pipe -march=athlon -Wall -W -g -D_REENTRANT  -DMMX -Di386 -DUSING_DBOX2 -DUSING_FREEBOX -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -DPREFIX=\"/opt/mythtv\" -DLIBDIR=\"/opt/mythtv/lib\" -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_NO_DEBUG
     16CXXFLAGS = -pipe -march=athlon -I/usr/include/kde/artsc -pthread -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -Wall -W -g -D_REENTRANT  -DMMX -Di386 -DUSING_DBOX2 -DUSING_FREEBOX -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -DPREFIX=\"/opt/mythtv\" -DLIBDIR=\"/opt/mythtv/lib\" -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_NO_DEBUG
     17LEXFLAGS =
     18YACCFLAGS= -d
     19INCPATH  = -I/usr/lib/qt-3.3/mkspecs/default -I. -I/opt/mythtv/include -I/usr/include -I/usr/X11R6/include -I../../../../../vlc/live/liveMedia/include -I../../../../../vlc/live/UsageEnvironment/include -I../../../../../vlc/live/BasicUsageEnvironment/include -I../../../../../vlc/live/groupsock/include -I../libs/libmythtv -I../libs -I../libs/libmyth -I../libs/libmythtv/dvbdev -I$(QTDIR)/include -I/usr/X11R6/include -I/usr/X11R6/include
     20LINK     = g++
     21LFLAGS   =
     22LIBS     = $(SUBLIBS) -L$(QTDIR)/lib -L../libs/libmyth -L../libs/libmythtv -L../libs/libavcodec -L../libs/libavformat -L../libs/libavutil -L../libs/libmythui -lmythtv-0.19 -lmythavformat-0.19 -lmythavcodec-0.19 -lmythavutil-0.19 -lmyth-0.19 -lmythui-0.19 -lfreetype -lmp3lame -L /usr/lib/live/liveMedia -lliveMedia -L/usr/lib/live/UsageEnvironment -lUsageEnvironment -L/usr/lib/live/groupsock -lgroupsock -L/usr/lib/live/BasicUsageEnvironment -lBasicUsageEnvironment -lasound -L/usr/lib -lartsc -lgmodule-2.0 -ldl -lgthread-2.0 -lglib-2.0 -L/usr/X11R6/lib -lXinerama -lXv -lXxf86vm -lXrandr `freetype-config --libs` -lqt-mt -lGLU -lGL -lXmu -lXext -lX11 -lm -lpthread
     23AR       = ar cqs
     24RANLIB   =
     25MOC      = $(QTDIR)/bin/moc
     26UIC      = $(QTDIR)/bin/uic
     27QMAKE    = qmake
     28TAR      = tar -cf
     29GZIP     = gzip -9f
     30COPY     = cp -f
     31COPY_FILE= $(COPY)
     32COPY_DIR = $(COPY) -r
     33INSTALL_FILE= $(COPY_FILE)
     34INSTALL_DIR = $(COPY_DIR)
     35DEL_FILE = rm -f
     36SYMLINK  = ln -sf
     37DEL_DIR  = rmdir
     38MOVE     = mv -f
     39CHK_DIR_EXISTS= test -d
     40MKDIR    = mkdir -p
     41
     42####### Output directory
     43
     44OBJECTS_DIR = ./
     45
     46####### Files
     47
     48HEADERS = backendsettings.h
     49SOURCES = backendsettings.cpp \
     50                checksetup.cpp \
     51                main.cpp
     52OBJECTS = backendsettings.o \
     53                checksetup.o \
     54                main.o
     55FORMS =
     56UICDECLS =
     57UICIMPLS =
     58SRCMOC   =
     59OBJMOC =
     60DIST       = ../libs/libmyth/mythconfig.mak \
     61                ../settings.pro \
     62                setup.pro
     63QMAKE_TARGET = mythtv-setup
     64DESTDIR  =
     65TARGET   = mythtv-setup
     66
     67first: all
     68####### Implicit rules
     69
     70.SUFFIXES: .c .o .cpp .cc .cxx .C
     71
     72.cpp.o:
     73        $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
     74
     75.cc.o:
     76        $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
     77
     78.cxx.o:
     79        $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
     80
     81.C.o:
     82        $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
     83
     84.c.o:
     85        $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
     86
     87####### Build rules
     88
     89all: Makefile $(TARGET)
     90
     91$(TARGET):  $(UICDECLS) $(OBJECTS) $(OBJMOC)  ../libs/libmythui/libmythui-0.19.so ../libs/libmyth/libmyth-0.19.so ../libs/libmythtv/libmythtv-0.19.so ../libs/libavcodec/libmythavcodec-0.19.so ../libs/libavformat/libmythavformat-0.19.so ../libs/libavutil/libmythavutil-0.19.so
     92        $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(OBJCOMP) $(LIBS)
     93
     94mocables: $(SRCMOC)
     95uicables: $(UICDECLS) $(UICIMPLS)
     96
     97$(MOC):
     98        ( cd $(QTDIR)/src/moc && $(MAKE) )
     99
     100Makefile: setup.pro  /usr/lib/qt-3.3/mkspecs/default/qmake.conf ../libs/libmyth/mythconfig.mak \
     101                ../settings.pro \
     102                /usr/lib/qt-3.3/lib/libqt-mt.prl
     103        $(QMAKE) -o Makefile setup.pro
     104qmake:
     105        @$(QMAKE) -o Makefile setup.pro
     106
     107dist:
     108        @mkdir -p .tmp/mythtv-setup && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) .tmp/mythtv-setup/ && ( cd `dirname .tmp/mythtv-setup` && $(TAR) mythtv-setup.tar mythtv-setup && $(GZIP) mythtv-setup.tar ) && $(MOVE) `dirname .tmp/mythtv-setup`/mythtv-setup.tar.gz . && $(DEL_FILE) -r .tmp/mythtv-setup
     109
     110mocclean:
     111
     112uiclean:
     113
     114yaccclean:
     115lexclean:
     116clean:
     117        -$(DEL_FILE) $(OBJECTS)
     118        -$(DEL_FILE) *~ core *.core
     119
     120
     121####### Sub-libraries
     122
     123distclean: clean
     124        -$(DEL_FILE) $(TARGET) $(TARGET)
     125
     126
     127FORCE:
     128
     129####### Compile
     130
     131backendsettings.o: backendsettings.cpp backendsettings.h
     132
     133checksetup.o: checksetup.cpp
     134
     135main.o: main.cpp backendsettings.h \
     136                checksetup.h
     137
     138####### Install
     139
     140install_target: all
     141        @$(CHK_DIR_EXISTS) "$(INSTALL_ROOT)/opt/mythtv/bin/" || $(MKDIR) "$(INSTALL_ROOT)/opt/mythtv/bin/"
     142        -$(INSTALL_FILE) "$(QMAKE_TARGET)" "$(INSTALL_ROOT)/opt/mythtv/bin/$(QMAKE_TARGET)"
     143
     144uninstall_target:
     145        -$(DEL_FILE) "$(INSTALL_ROOT)/opt/mythtv/bin/$(QMAKE_TARGET)"
     146        -$(DEL_DIR) "$(INSTALL_ROOT)/opt/mythtv/bin/"
     147
     148
     149install_menu: all
     150        @$(CHK_DIR_EXISTS) "$(INSTALL_ROOT)/opt/mythtv/share/mythtv/" || $(MKDIR) "$(INSTALL_ROOT)/opt/mythtv/share/mythtv/"
     151        -$(INSTALL_FILE) "setup.xml" "$(INSTALL_ROOT)/opt/mythtv/share/mythtv/"
     152
     153
     154uninstall_menu:
     155        -$(DEL_FILE) -r "$(INSTALL_ROOT)/opt/mythtv/share/mythtv/setup.xml"
     156        -$(DEL_DIR) "$(INSTALL_ROOT)/opt/mythtv/share/mythtv/"
     157
     158
     159install: install_target install_menu 
     160
     161uninstall: uninstall_target uninstall_menu 
     162