summaryrefslogtreecommitdiffstats
path: root/kmix/mixer_alsa9.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmix/mixer_alsa9.cpp')
-rw-r--r--kmix/mixer_alsa9.cpp39
1 files changed, 32 insertions, 7 deletions
diff --git a/kmix/mixer_alsa9.cpp b/kmix/mixer_alsa9.cpp
index 22303b43..29424226 100644
--- a/kmix/mixer_alsa9.cpp
+++ b/kmix/mixer_alsa9.cpp
@@ -6,6 +6,7 @@
*
* Copyright (C) 2002 Helio Chissini de Castro <helio@conectiva.com.br>
* 2004 Christian Esken <esken@kde.org>
+ * Copyright (C) 2020 Roman Savochenko <roman@oscada.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -107,11 +108,7 @@ Mixer_ALSA::open()
snd_ctl_t *ctl_handle;
snd_ctl_card_info_t *hw_info;
- snd_ctl_card_info_alloca(&hw_info);
-
- snd_mixer_elem_t *elem;
- snd_mixer_selem_id_t *sid;
- snd_mixer_selem_id_alloca( &sid );
+ snd_ctl_card_info_malloc(&hw_info);
// Card information
if ((unsigned)m_devnum > 31) m_devnum = -1;
@@ -126,6 +123,7 @@ Mixer_ALSA::open()
{
kdDebug(67100) << probeMessage << "not found: snd_ctl_open err=" << snd_strerror(err) << endl;
//_stateMessage = errorText( Mixer::ERR_NODEV );
+ snd_ctl_card_info_free(hw_info);
return Mixer::ERR_OPEN;
}
@@ -134,6 +132,7 @@ Mixer_ALSA::open()
kdDebug(67100) << probeMessage << "not found: snd_ctl_card_info err=" << snd_strerror(err) << endl;
//_stateMessage = errorText( Mixer::ERR_READ );
snd_ctl_close( ctl_handle );
+ snd_ctl_card_info_free(hw_info);
return Mixer::ERR_READ;
}
@@ -155,6 +154,7 @@ Mixer_ALSA::open()
kdDebug(67100) << probeMessage << "not found: snd_mixer_open err=" << snd_strerror(err) << endl;
//errormsg( Mixer::ERR_NODEV );
_handle = 0;
+ snd_ctl_card_info_free(hw_info);
return Mixer::ERR_NODEV; // if we cannot open the mixer, we have no devices
}
//kdDebug(67100) << "OUT Mixer_ALSA snd_mixer_open()" << endl;
@@ -163,6 +163,8 @@ Mixer_ALSA::open()
{
kdDebug(67100) << probeMessage << "not found: snd_mixer_attach err=" << snd_strerror(err) << endl;
//errormsg( Mixer::ERR_PERM );
+ close();
+ snd_ctl_card_info_free(hw_info);
return Mixer::ERR_OPEN;
}
@@ -170,6 +172,8 @@ Mixer_ALSA::open()
{
kdDebug(67100) << probeMessage << "not found: snd_mixer_selem_register err=" << snd_strerror(err) << endl;
//errormsg( Mixer::ERR_READ );
+ close();
+ snd_ctl_card_info_free(hw_info);
return Mixer::ERR_READ;
}
@@ -178,11 +182,15 @@ Mixer_ALSA::open()
kdDebug(67100) << probeMessage << "not found: snd_mixer_load err=" << snd_strerror(err) << endl;
//errormsg( Mixer::ERR_READ );
close();
+ snd_ctl_card_info_free(hw_info);
return Mixer::ERR_READ;
}
kdDebug(67100) << probeMessage << "found" << endl;
+ snd_mixer_elem_t *elem;
+ snd_mixer_selem_id_t *sid;
+
unsigned int mixerIdx = 0;
for ( elem = snd_mixer_first_elem( _handle ); elem; elem = snd_mixer_elem_next( elem ), mixerIdx++ )
{
@@ -195,8 +203,7 @@ Mixer_ALSA::open()
continue;
}
-
- sid = (snd_mixer_selem_id_t*)malloc(snd_mixer_selem_id_sizeof()); // I believe *we* must malloc it for ourself
+ snd_mixer_selem_id_malloc( &sid );
snd_mixer_selem_get_id( elem, sid );
bool canPlay = false;
@@ -359,6 +366,8 @@ Mixer_ALSA::open()
}
if( !found )
{
+ close();
+ snd_ctl_card_info_free(hw_info);
return Mixer::ERR_INCOMPATIBLESET;
}
} // !virginOpen
@@ -372,6 +381,8 @@ Mixer_ALSA::open()
***************************************************************************************/
if ( !validDevice )
{
+ close();
+ snd_ctl_card_info_free(hw_info);
return Mixer::ERR_NODEV;
}
@@ -385,6 +396,8 @@ Mixer_ALSA::open()
/* setup for select on stdin and the mixer fd */
if ((m_count = snd_mixer_poll_descriptors_count(_handle)) < 0) {
kdDebug(67100) << "Mixer_ALSA::poll() , snd_mixer_poll_descriptors_count() err=" << m_count << "\n";
+ close();
+ snd_ctl_card_info_free(hw_info);
return Mixer::ERR_OPEN;
}
@@ -393,19 +406,27 @@ Mixer_ALSA::open()
m_fds = (struct pollfd*)calloc(m_count, sizeof(struct pollfd));
if (m_fds == NULL) {
kdDebug(67100) << "Mixer_ALSA::poll() , calloc() = null" << "\n";
+ close();
+ snd_ctl_card_info_free(hw_info);
return Mixer::ERR_OPEN;
}
m_fds->events = POLLIN;
if ((err = snd_mixer_poll_descriptors(_handle, m_fds, m_count)) < 0) {
kdDebug(67100) << "Mixer_ALSA::poll() , snd_mixer_poll_descriptors_count() err=" << err << "\n";
+ close();
+ snd_ctl_card_info_free(hw_info);
return Mixer::ERR_OPEN;
}
if (err != m_count) {
kdDebug(67100) << "Mixer_ALSA::poll() , snd_mixer_poll_descriptors_count() err=" << err << " m_count=" << m_count << "\n";
+ close();
+ snd_ctl_card_info_free(hw_info);
return Mixer::ERR_OPEN;
}
+ snd_ctl_card_info_free(hw_info);
+
return 0;
}
@@ -462,6 +483,10 @@ Mixer_ALSA::close()
}
+ for(int iMS = 0; iMS < mixer_sid_list.count(); iMS++)
+ if(mixer_sid_list[iMS])
+ snd_mixer_selem_id_free(mixer_sid_list[iMS]);
+
mixer_elem_list.clear();
mixer_sid_list.clear();
m_mixDevices.clear();