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);
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);
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());
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;
}
m_audioInfo = 0;
run(IOPRIO_CLASS_RT);
}
+
void eStreamThread::stop() {
m_stop = true;
kill();
}
}
if (eof && (r==w)) {
- ::close(m_destfd);
- m_destfd = -1;
::close(m_srcfd);
m_srcfd = -1;
m_messagepump.send(evtEOS);
void eStreamThread::thread_finished() {
if (m_srcfd >= 0) ::close(m_srcfd);
- if (m_destfd >= 0) ::close(m_destfd);
eDebug("eStreamThread closed");
}