summaryrefslogtreecommitdiffstats
path: root/kaffeine/terminate.patch
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-10 00:59:09 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-10 00:59:09 +0000
commit7f66b9e8ba186fb14a2db598a87dfa8de7b5a47b (patch)
treeb5e07812e82f00c780d2c035dca102b8e364f447 /kaffeine/terminate.patch
downloadkaffeine-7f66b9e8ba186fb14a2db598a87dfa8de7b5a47b.tar.gz
kaffeine-7f66b9e8ba186fb14a2db598a87dfa8de7b5a47b.zip
Added old abandoned KDE3 version of Kaffeine
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kaffeine@1088031 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kaffeine/terminate.patch')
-rw-r--r--kaffeine/terminate.patch269
1 files changed, 269 insertions, 0 deletions
diff --git a/kaffeine/terminate.patch b/kaffeine/terminate.patch
new file mode 100644
index 0000000..fd0d17e
--- /dev/null
+++ b/kaffeine/terminate.patch
@@ -0,0 +1,269 @@
+diff -ru kaffeine-0.8.4.cvs.orig/kaffeine/src/input/dvb/dvbout.cpp kaffeine-0.8.4.cvs/kaffeine/src/input/dvb/dvbout.cpp
+--- kaffeine-0.8.4.cvs.orig/kaffeine/src/input/dvb/dvbout.cpp 2007-11-25 12:57:46.000000000 +0200
++++ kaffeine-0.8.4.cvs/kaffeine/src/input/dvb/dvbout.cpp 2007-11-26 00:35:52.000000000 +0200
+@@ -19,6 +19,7 @@
+ */
+
+ #include <fcntl.h>
++#include <errno.h>
+
+ #include <kstandarddirs.h>
+
+@@ -47,7 +48,6 @@
+ plugHandle = plug->init( chan.sid, anum, tnum, chan.fta );
+ }
+
+- fdPipe=0;
+ channel = chan;
+ thWrite = 0;
+ rtp = 0;
+@@ -58,7 +58,7 @@
+ for ( i=0; i<channel.nsubpid && i<MAX_DVBSUB; i++ )
+ pids.append( channel.subpid[i].pid );
+ wBuf = NULL;
+- timeShifting = beginLive = false;
++ timeShifting = false;
+ haveRec = haveLive = instantRec = haveBroadcast = false;
+ patpmt = wpatpmt = false;
+ connect( &stopRecTimer, SIGNAL(timeout()), this, SLOT(stopRec()) );
+@@ -232,7 +232,7 @@
+
+ bool DVBout::hasLive() const
+ {
+- if ( haveLive || fdPipe || timeShifting )
++ if ( haveLive || timeShifting )
+ return true;
+ return false;
+ }
+@@ -248,6 +248,7 @@
+
+ bool DVBout::doPause( const QString &name ) // called from dvbstream::run()
+ {
++ fprintf(stderr,"DVBout::doPause\n");
+ if ( !haveLive )
+ return false;
+
+@@ -255,23 +256,13 @@
+ liveFile.setName( name );
+ liveFile.open( IO_WriteOnly|IO_Truncate );
+ liveFile.writeBlock( (char*)tspat, TS_SIZE );
+- liveFile.writeBlock( (char*)tspmt, TS_SIZE );
++ liveFile.writeBlock( (char*)tspmt, TS_SIZE );
+ mutex.lock();
+ haveLive = false;
+- mutex.unlock();
+- if ( !wait(100) ) {
+- terminate();
+- wait();
+- }
+- mutex.lock();
+- haveLive = true;
+- if ( close( fdPipe )<0 )
+- perror("close out pipe: ");
+- else
+- fprintf(stderr,"out pipe closed\n");
+- fdPipe = 0;
+- mutex.unlock();
+ timeShifting = true;
++ mutex.unlock();
++ fprintf(stderr,"doPause: starting timeshift, waiting live thread to finish\n");
++ wait();
+ //emit shifting( timeShifting );
+ }
+ return true;
+@@ -288,11 +279,10 @@
+
+ bool DVBout::goLive( const QString &name )
+ {
+- if ( fdPipe ) return false;
+-
++ fprintf(stderr,"goLive\n");
++ if (haveLive) return false;
+ haveLive = true;
+ pipeName = name;
+- beginLive = true;
+ //activeApid = napid;
+
+ writePat();
+@@ -310,31 +300,26 @@
+
+ void DVBout::preStopLive()
+ {
+- mutex.lock();
+- haveLive = false;
+- mutex.unlock();
++ // FIXME: maybe some way to tell the thread that it can stop?
++ // or maybe not. It won't make things much faster.
+ }
+
+
+-
+ void DVBout::stopLive()
+ {
++ fprintf(stderr,"stopLive\n");
+ mutex.lock();
+ if ( timeShifting ) {
+ liveFile.close();
+ timeShifting = false;
+ emit shifting( timeShifting );
+ }
+- mutex.unlock();
+- if ( !wait(500) ) {
+- terminate();
+- wait();
+- }
+- if ( fdPipe ) {
+- close( fdPipe );
+- fprintf( stderr, "pipe closed\n" );
+- fdPipe = 0;
+- }
++ if (haveLive) {
++ haveLive=false;
++ mutex.unlock();
++ fprintf(stderr,"stopLive: Waiting live thread to finish\n");
++ wait();
++ } else mutex.unlock();
+ delete [] wBuf;
+ wBuf = NULL;
+ }
+@@ -464,11 +449,7 @@
+ if ( plug && plugHandle )
+ plug->process( plugHandle, thBuf, TS_SIZE*NTS );
+ mutex.lock();
+- if ( haveLive && fdPipe ) {
+- if ( beginLive ) {
+- beginLive = !beginLive;
+- start();
+- }
++ if ( haveLive ) {
+ if ( wDist<95 ) {
+ memcpy( wBuf+(wWrite*TS_SIZE*NTS), thBuf, TS_SIZE*NTS );
+ wpatpmt = patpmt;
+@@ -525,40 +506,67 @@
+ }
+ }
+
+-
++bool DVBout::writeBytes(int fd, const unsigned char *buf, int bytes) {
++ int w=0;
++ mutex.lock();
++ while (haveLive && w<bytes) {
++ mutex.unlock();
++ int r=write(fd, buf+w, bytes-w);
++ if (r>=0) w+=r;
++ else {
++ if ( errno != EAGAIN ) {
++ perror("DVBout: pipe writeBytes");
++ return false;
++ }
++ usleep( 100 );
++ }
++ mutex.lock();
++ }
++ mutex.unlock();
++ return haveLive;
++}
+
+ void DVBout::run()
+ {
+- if ( haveLive && fdPipe ) {
+- while ( haveLive && fdPipe ) {
+- if ( wDist>0 ) {
+- if ( wpatpmt ) {
+- write( fdPipe, tspat, TS_SIZE );
+- write( fdPipe, tspmt, TS_SIZE );
+- wpatpmt = false;
+- }
+- write( fdPipe, wBuf+(wRead*TS_SIZE*NTS), TS_SIZE*NTS );
+- --wDist;
+- ++wRead;
+- if ( wRead>99 )
+- wRead = 0;
+- }
+- else
+- usleep( 100 );
++ int fd=-1;
++ fprintf(stderr,"DVBout::run started\n");
++
++ while (haveLive && (fd=open( pipeName.ascii(), O_WRONLY | O_NONBLOCK )) == -1 ) {
++ if (errno!=ENXIO) {
++ perror("DVBout::run open pipe");
++ return;
+ }
+- return;
++ usleep ( 100 );
+ }
++ fprintf(stderr,"DVBout::run write pipe %s opened\n",pipeName.ascii());
++ emit playDvb();
++ fprintf(stderr,"DVBout::run signal emitted\n");
+
+- if ( (fdPipe=open( pipeName.ascii(), O_WRONLY))<0 ) {
+- perror("PIPE FILE: ");
+- return;
++ mutex.lock();
++ while (haveLive) {
++ mutex.unlock();
++ if (wpatpmt) {
++ if (writeBytes(fd, tspat, TS_SIZE) && writeBytes(fd, tspmt, TS_SIZE) ) {
++ wpatpmt = false;
++ } else goto fail;
++ }
++ if (wDist>0) {
++ if ( writeBytes (fd, wBuf+(wRead*TS_SIZE*NTS), TS_SIZE*NTS ) ) {
++ mutex.lock();
++ --wDist;
++ ++wRead;
++ if (wRead>99) wRead=0;
++ mutex.unlock();
++ } else goto fail;
++ } else usleep ( 100 );
++ mutex.lock();
+ }
+- fprintf(stderr,"pipe opened\n");
+- emit playDvb();
++ mutex.unlock();
++fail:
++ if(fd>=0) close(fd);
++ fprintf(stderr,"DVBout::run finished\n");
+ }
+
+-
+-
+ DVBout::~DVBout()
+ {
+ if ( plug )
+diff -ru kaffeine-0.8.4.cvs.orig/kaffeine/src/input/dvb/dvbout.h kaffeine-0.8.4.cvs/kaffeine/src/input/dvb/dvbout.h
+--- kaffeine-0.8.4.cvs.orig/kaffeine/src/input/dvb/dvbout.h 2007-11-25 12:57:46.000000000 +0200
++++ kaffeine-0.8.4.cvs/kaffeine/src/input/dvb/dvbout.h 2007-11-25 23:09:58.000000000 +0200
+@@ -35,7 +35,7 @@
+
+ class KaffeineDvbPlugin;
+
+-class DVBout : public QObject, public QThread
++class DVBout : public QObject, private QThread
+ {
+ Q_OBJECT
+
+@@ -77,13 +77,13 @@
+ void writePat();
+ void calculateCRC( unsigned char *p_begin, unsigned char *p_end );
+ void renameFile( QString &name, const QString &ext );
++ bool writeBytes(int fd, const unsigned char *buf, int bytes);
+
+ int pmtpid;
+ bool patpmt, wpatpmt;
+ bool timeShifting;
+ QString pipeName;
+ QFile outFile, liveFile;
+- int fdPipe;
+ Ts2Rtp *rtp;
+ unsigned char thBuf[188*100];
+ unsigned char *wBuf;
+@@ -92,7 +92,6 @@
+ unsigned char tspmt[188];
+ unsigned int CRC32[256];
+ int thWrite;
+- bool beginLive;
+ bool haveRec, haveLive, instantRec, haveBroadcast;
+ QTimer stopRecTimer, timerPatPmt;
+ QMutex mutex;