[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    kdemultimedia/kmix
From:       Christian Esken <esken () kde ! org>
Date:       2005-04-19 21:21:50
Message-ID: 20050419212150.DA73A5FA () office ! kde ! org
[Download RAW message or body]

CVS commit by esken: 

Close some small memory leaks, when destroying a Mixer_ALSA instance. Also, go back \
to the trivial getMixerElem() implementation, because it works and is less error \
prone.


  M +5 -2      mixer_alsa.h   1.21
  M +34 -9     mixer_alsa9.cpp   1.55


--- kdemultimedia/kmix/mixer_alsa9.cpp  #1.54:1.55
@@ -44,5 +44,4 @@ extern "C"
 //#define KMIX_ALSA_VOLUME_DEBUG
 
-// @todo Add file descriptor based notifying for seeing changes
 
 Mixer*
@@ -62,4 +61,5 @@ Mixer_ALSA::Mixer_ALSA( int device, int 
 Mixer_ALSA::~Mixer_ALSA()
 {
+    releaseMixer();
 }
 
@@ -113,5 +113,4 @@ Mixer_ALSA::openMixer()
 
     // Card information
-    QString devName;
     if( m_devnum == -1 )
         m_devnum = 0;
@@ -154,4 +153,5 @@ Mixer_ALSA::openMixer()
         kdDebug(67100) << probeMessage << "not found: snd_mixer_open err=" << \
snd_strerror(err) << endl;  //errormsg( Mixer::ERR_NODEV );
+        _handle = 0;
         return Mixer::ERR_NODEV; // if we cannot open the mixer, we have no devices
     }
@@ -171,4 +171,5 @@ Mixer_ALSA::openMixer()
     }
 
+    // Memory leak (according to Valgrind): Must possibly call sth. like \
snd_mixer_unload() in releaseMixer()  if ( ( err = snd_mixer_load ( _handle ) ) < 0 )
     {
@@ -190,5 +191,5 @@ Mixer_ALSA::openMixer()
 
 
-        sid = (snd_mixer_selem_id_t*)malloc(snd_mixer_selem_id_sizeof());  // I \
believe *we* must malloc it for ourself +        //sid = \
(snd_mixer_selem_id_t*)malloc(snd_mixer_selem_id_sizeof());  // I believe *we* must \
malloc it for ourself  snd_mixer_selem_get_id( elem, sid );
 
@@ -220,5 +221,6 @@ Mixer_ALSA::openMixer()
                 cc = MixDevice::ENUM;
                 vol = new Volume(); // Dummy, unused
-                mixer_sid_list.append( sid );
+                mixer_elem_list.append( elem );
+                //mixer_sid_list.append( sid );
                 
                 // --- get Enum names START ---
@@ -266,6 +268,6 @@ Mixer_ALSA::openMixer()
                  * it will be created with maxVolume == 0 && minVolume == 0 */
                 vol = new Volume( chn, maxVolumePlay, minVolumePlay, maxVolumeRec, \
                minVolumeRec );
-                //mixer_elem_list.append( elem );
-                mixer_sid_list.append( sid );
+                mixer_elem_list.append( elem );
+                //mixer_sid_list.append( sid );
                 
                 if ( snd_mixer_selem_has_playback_switch ( elem ) ) {   
@@ -348,5 +350,24 @@ int
 Mixer_ALSA::releaseMixer()
 {
-        int ret = snd_mixer_close( _handle );
+//  kdDebug(67100) << "IN  Mixer_ALSA::releaseMixer()" << endl;
+  int ret=0;
+  if ( _handle != 0 )
+  { 
+    snd_mixer_free ( _handle );
+    if ( ( ret = snd_mixer_detach ( _handle, devName.latin1() ) ) < 0 )
+    {
+        kdDebug(67100) << "snd_mixer_detach err=" << snd_strerror(ret) << endl;
+    }
+    int ret2 = 0;
+    if ( ( ret2 = snd_mixer_close ( _handle ) ) < 0 )
+    {
+        kdDebug(67100) << "snd_mixer_close err=" << snd_strerror(ret2) << endl;
+        if ( ret == 0 ) ret = ret2; // no error before => use current error code
+    }
+
+    _handle = 0;
+  }
+
+//  kdDebug(67100) << "OUT Mixer_ALSA::releaseMixer()" << endl;
         return ret;
 }
@@ -354,4 +375,5 @@ Mixer_ALSA::releaseMixer()
 
 snd_mixer_elem_t* Mixer_ALSA::getMixerElem(int devnum) {
+/*
         snd_mixer_elem_t* elem = 0;
         if ( int( mixer_sid_list.count() ) > devnum ) {
@@ -364,5 +386,8 @@ snd_mixer_elem_t* Mixer_ALSA::getMixerEl
         }
         return elem;
-//      return mixer_elem_list[ devnum ];
+*/
+
+        snd_mixer_elem_t* elem = mixer_elem_list[ devnum ];
+        return elem;
 }
 

--- kdemultimedia/kmix/mixer_alsa.h  #1.20:1.21
@@ -32,9 +32,12 @@ class Mixer_ALSA : public Mixer
 
                 virtual QString errorText(int mixer_error);
-                typedef QValueList<snd_mixer_selem_id_t *>AlsaMixerSidList;
-                AlsaMixerSidList mixer_sid_list;
+                //typedef QValueList<snd_mixer_selem_id_t *>AlsaMixerSidList;
+                //AlsaMixerSidList mixer_sid_list;
+                typedef QValueList<snd_mixer_elem_t *> AlsaMixerElemList;
+                AlsaMixerElemList mixer_elem_list;
 
                 bool _initialUpdate;
                 snd_mixer_t *_handle;
+                QString devName;
 };
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic