File kdemm-fix-leak.diff of Package kdelibs3
--- arts/knotify/knotify.cpp
+++ arts/knotify/knotify.cpp
@@ -54,7 +54,6 @@
#include <kstandarddirs.h>
#include <kuniqueapplication.h>
#include <kwin.h>
-#include <kdemm/simpleplayer.h>
#include "knotify.h"
#include "knotify.moc"
@@ -131,11 +130,15 @@
d->externalPlayerProc = 0;
d->useKDEMM = useKDEMM;
- d->volume = 100;
+ d->inStartup = 0;
+ d->volume = 100;
d->playTimer = 0;
loadConfig();
+
+ connect ( this, SIGNAL(deletePlayObject(KDE::Multimedia::SimplePlayer*)),
+ SLOT(objectDeleter(KDE::Multimedia::SimplePlayer*)) );
}
KNotify::~KNotify()
@@ -513,20 +518,30 @@
void KNotify::playTimeout()
{
+qDebug("KNotify::playTimeout");
for( QMap< KDE::Multimedia::SimplePlayer*, int >::Iterator it = d->playObjectEventMap.begin();
it != d->playObjectEventMap.end();
)
{
QMap< KDE::Multimedia::SimplePlayer*, int >::Iterator current = it;
++it;
- if ( !current.key()->isPlaying() || current.key()->totalTime() <= 0 ) // may be "playing" even if there's an error
+ KDE::Multimedia::SimplePlayer* playObject = current.key();
+ if ( !playObject->isPlaying() || playObject->totalTime() <= 0 ) // may be "playing" even if there's an error
{
soundFinished( *current, PlayedOK );
d->playObjectEventMap.remove( current );
+ disconnect( playObject, SIGNAL( finished() ) );
+ playObject->stop();
+ emit deletePlayObject(playObject);
}
}
if ( !d->playObjectEventMap.count() )
d->playTimer->stop();
+}
+
+void KNotify::objectDeleter( KDE::Multimedia::SimplePlayer *playObject )
+{
+ delete playObject;
}
void KNotify::soundFinished( int eventId, PlayingFinishedStatus reason )
diff -urN --exclude=Makefile --exclude=.deps --exclude=.libs kdelibs-3.4.2/arts/knotify/knotify.h kdelibs-3.4.2.orig/arts/knotify/knotify.h
--- arts/knotify/knotify.h
+++ arts/knotify/knotify.h
@@ -24,6 +24,8 @@
#include <knotifyclient.h>
#include <dcopobject.h>
+#include <kdemm/simpleplayer.h>
+
class KNotifyPrivate;
class KProcess;
@@ -95,6 +97,11 @@
private slots:
void playTimeout();
void slotPlayerProcessExited( KProcess *proc );
+ void objectDeleter( KDE::Multimedia::SimplePlayer* );
+
+signals:
+ void deletePlayObject( KDE::Multimedia::SimplePlayer* );
+
private:
KNotifyPrivate* d;
--- kdemm/simpleplayer.cpp.orig 2005-08-19 14:07:57.000000000 +0200
+++ kdemm/simpleplayer.cpp 2005-08-19 14:08:11.000000000 +0200
@@ -50,10 +50,12 @@
connect( Factory::self(), SIGNAL( recreateObjects() ), SLOT( recreateObjects() ) );
d->channel = Factory::self()->createChannel( KGlobal::instance()->aboutData()->programName() );
d->player = Factory::self()->createPlayer();
- d->player->setOutputChannel( d->channel );
- connect( d->player, SIGNAL( stateChanged( KDE::Multimedia::Player::State, KDE::Multimedia::Player::State ) ),
+ if ( d->player ) {
+ d->player->setOutputChannel( d->channel );
+ connect( d->player, SIGNAL( stateChanged( KDE::Multimedia::Player::State, KDE::Multimedia::Player::State ) ),
SLOT( stateChanged( KDE::Multimedia::Player::State, KDE::Multimedia::Player::State ) ) );
- connect( d->player, SIGNAL( finished() ), SIGNAL( finished() ) );
+ connect( d->player, SIGNAL( finished() ), SIGNAL( finished() ) );
+ };
}
SimplePlayer::~SimplePlayer()
@@ -64,6 +66,8 @@
void SimplePlayer::play( const KURL & url )
{
+ if( ! d->player )
+ return;
if( isPaused() && url == d->url )
{
d->player->play();
@@ -78,51 +82,71 @@
void SimplePlayer::pause()
{
+ if( ! d->player )
+ return;
d->player->pause();
}
void SimplePlayer::stop()
{
+ if( ! d->player )
+ return;
d->player->stop();
}
long SimplePlayer::totalTime() const
{
+ if( ! d->player )
+ return 0;
return d->player->totalTime();
}
long SimplePlayer::currentTime() const
{
+ if( ! d->player )
+ return 0;
return d->player->currentTime();
}
void SimplePlayer::seek( long ms )
{
+ if( ! d->player )
+ return;
d->player->seek( ms );
}
float SimplePlayer::volume() const
{
+ if( ! d->player )
+ return 0;
return d->channel->volume();
}
void SimplePlayer::setVolume( float v )
{
+ if( ! d->player )
+ return;
d->channel->setVolume( v );
}
bool SimplePlayer::isPlaying() const
{
+ if( ! d->player )
+ return false;
return ( d->player->state() == Player::Playing );
}
bool SimplePlayer::isPaused() const
{
+ if( ! d->player )
+ return false;
return ( d->player->state() == Player::Paused );
}
void SimplePlayer::stateChanged( Player::State ns, Player::State os )
{
+ if( ! d->player )
+ return;
if( os == Player::Loading && ns == Player::Stopped )
d->player->play();
}
@@ -135,7 +159,8 @@
d->title = d->channel->channelName();
d->type = d->channel->channelType();
- d->player->stop();
+ if( d->player )
+ d->player->stop();
delete d->player;
delete d->channel;
@@ -149,6 +174,9 @@
d->channel->setVolume( d->channelvolume );
d->player = Factory::self()->createPlayer();
+ if( ! d->player )
+ return;
+
d->player->setOutputChannel( d->channel );
if( d->state != Player::NoMedia )
--- kdemm/factory.cpp.orig 2005-08-19 14:07:48.000000000 +0200
+++ kdemm/factory.cpp 2005-08-19 14:08:11.000000000 +0200
@@ -80,6 +80,7 @@
":\n" << e << endl;
}
}
+#if 0
if( 0 == backend )
{
if( offers.size() == 0 )
@@ -100,6 +101,7 @@
i18n( "Unable to use any of the available Multimedia Backends" ), details );
}
}
+#endif
}
Backend * backend;