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;
openSUSE Build Service is sponsored by