needed changes for dm800/dm8000 drivers >= 20090720
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Tue, 21 Jul 2009 19:42:27 +0000 (19:42 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Tue, 21 Jul 2009 19:42:27 +0000 (19:42 +0000)
vlcplayer/src/servicets/servicets.cpp
vlcplayer/src/servicets/servicets.h

index 4b57d42..ff9fe47 100644 (file)
@@ -115,13 +115,13 @@ eServiceTS::eServiceTS(const eServiceReference &url): m_pump(eApp, 1)
        m_apid = url.getData(1) == 0 ? 0x45 : url.getData(1);
        m_state = stIdle;
        m_audioInfo = 0;
+       m_destfd = -1;
 }
 
 eServiceTS::~eServiceTS()
 {
        eDebug("ServiceTS destruct!");
-       if (m_state == stRunning)
-               stop();
+       stop();
 }
 
 DEFINE_REF(eServiceTS);
@@ -254,13 +254,21 @@ RESULT eServiceTS::start()
        ePtr<eDVBResourceManager> rmgr;
        eDVBResourceManager::getInstance(rmgr);
        eDVBChannel dvbChannel(rmgr, 0);
+       if (m_destfd == -1)
+       {
+               m_destfd = ::open("/dev/misc/pvr", O_WRONLY);
+               if (m_destfd < 0) {
+                       eDebug("Cannot open /dev/misc/pvr");
+                       return -1;
+               }
+       }
        if (dvbChannel.getDemux(m_decodedemux, iDVBChannel::capDecode) != 0) {
                eDebug("Cannot allocate decode-demux");
-               return 1;
+               return -1;
        }
        if (m_decodedemux->getMPEGDecoder(m_decoder, 1) != 0) {
                eDebug("Cannot allocate MPEGDecoder");
-               return 1;
+               return -1;
        }
        m_decoder->setVideoPID(m_vpid, eDVBVideo::MPEG2);
        m_decoder->setAudioPID(m_apid, eDVBAudio::aMPEG);
@@ -275,6 +283,8 @@ RESULT eServiceTS::start()
 
 RESULT eServiceTS::stop()
 {
+       if (m_destfd >= 0)
+               ::close(m_destfd);
        if (m_state != stRunning)
                return -1;
        printf("TS: %s stop\n", m_filename.c_str());
@@ -346,15 +356,8 @@ RESULT eServiceTS::unpause()
                eDebug("Cannot open source stream: %s", m_filename.c_str());
                return 1;
        }
-
-       int destfd = ::open("/dev/misc/pvr", O_WRONLY);
-       if (destfd < 0) {
-               eDebug("Cannot open /dev/misc/pvr");
-               ::close(srcfd);
-               return 1;
-       }
        m_decodedemux->flush();
-       m_streamthread->start(srcfd, destfd);
+       m_streamthread->start(srcfd, m_destfd);
        m_decoder->play();
        return 0;
 }
@@ -482,6 +485,7 @@ void eStreamThread::start(int srcfd, int destfd) {
        m_audioInfo = 0;
        run(IOPRIO_CLASS_RT);
 }
+
 void eStreamThread::stop() {
        m_stop = true;
        kill();
@@ -687,8 +691,6 @@ void eStreamThread::thread() {
                        }
                }
                if (eof && (r==w)) {
-                       ::close(m_destfd);
-                       m_destfd = -1;
                        ::close(m_srcfd);
                        m_srcfd = -1;
                        m_messagepump.send(evtEOS);
@@ -700,7 +702,6 @@ void eStreamThread::thread() {
 
 void eStreamThread::thread_finished() {
        if (m_srcfd >= 0) ::close(m_srcfd);
-       if (m_destfd >= 0) ::close(m_destfd);
        eDebug("eStreamThread closed");
 }
 
index 6435ee4..3455f0f 100644 (file)
@@ -85,7 +85,6 @@ public:
        RESULT pause();
        RESULT unpause();
 
-
        // iSeekableService
        RESULT getLength(pts_t &SWIG_OUTPUT);
        RESULT seekTo(pts_t to);
@@ -113,7 +112,7 @@ private:
        friend class eServiceFactoryTS;
        std::string m_filename;
        int m_vpid, m_apid;
-       int m_srcfd, m_destfd;
+       int m_destfd;
        ePtr<iDVBDemux> m_decodedemux;
        ePtr<iTSMPEGDecoder> m_decoder;
        ePtr<eStreamThread> m_streamthread;