aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Output/alsa/outputalsa.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2015-08-19 09:43:17 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2015-08-19 09:43:17 +0000
commit1ef98753ff23287aaa23e0c35e03719256ea268f (patch)
tree11cb2d4f70444fb7cc704e04aca7fe41869778da /src/plugins/Output/alsa/outputalsa.cpp
parent7a8026a4ad54588c131fefbdb5dc3fd118054011 (diff)
downloadqmmp-1ef98753ff23287aaa23e0c35e03719256ea268f.tar.gz
qmmp-1ef98753ff23287aaa23e0c35e03719256ea268f.tar.bz2
qmmp-1ef98753ff23287aaa23e0c35e03719256ea268f.zip
using QSocketNotifier to track alsa volume (patch by Hong Jen Yee)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@5424 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Output/alsa/outputalsa.cpp')
-rw-r--r--src/plugins/Output/alsa/outputalsa.cpp44
1 files changed, 33 insertions, 11 deletions
diff --git a/src/plugins/Output/alsa/outputalsa.cpp b/src/plugins/Output/alsa/outputalsa.cpp
index 4e6a33b54..69662abfe 100644
--- a/src/plugins/Output/alsa/outputalsa.cpp
+++ b/src/plugins/Output/alsa/outputalsa.cpp
@@ -18,9 +18,8 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
-#include <QDir>
#include <QSettings>
-#include <QTimer>
+#include <QSocketNotifier>
#include <stdio.h>
#include <stdint.h>
@@ -33,6 +32,7 @@
#include <qmmp/statehandler.h>
#include "outputalsa.h"
+
OutputALSA::OutputALSA() : m_inited(false)
{
QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
@@ -425,15 +425,16 @@ void VolumeALSA::setVolume(const VolumeSettings &vol)
VolumeSettings VolumeALSA::volume() const
{
VolumeSettings vol;
- if (!pcm_element)
- return vol;
-
- long value = 0;
- snd_mixer_handle_events(m_mixer);
- snd_mixer_selem_get_playback_volume(pcm_element, SND_MIXER_SCHN_FRONT_LEFT, &value);
- vol.left = value;
- snd_mixer_selem_get_playback_volume(pcm_element, SND_MIXER_SCHN_FRONT_RIGHT, &value);
- vol.right = value;
+
+ if(pcm_element)
+ {
+ long value = 0;
+ snd_mixer_handle_events(m_mixer);
+ snd_mixer_selem_get_playback_volume(pcm_element, SND_MIXER_SCHN_FRONT_LEFT, &value);
+ vol.left = value;
+ snd_mixer_selem_get_playback_volume(pcm_element, SND_MIXER_SCHN_FRONT_RIGHT, &value);
+ vol.right = value;
+ }
return vol;
}
@@ -467,10 +468,26 @@ int VolumeALSA::setupMixer(QString card, QString device)
return -1;
}
+ // setup socket notifiers to monitor the state changes of the mixer
+ int n = snd_mixer_poll_descriptors_count(m_mixer);
+ if(n > 0)
+ {
+ struct pollfd* fds = new struct pollfd[n];
+ n = snd_mixer_poll_descriptors(m_mixer, fds, n);
+ for(int i = 0; i < n; ++i)
+ {
+ int sock = fds[i].fd;
+ QSocketNotifier* sn = new QSocketNotifier(sock, QSocketNotifier::Read, this);
+ connect(sn, SIGNAL(activated(int)), SIGNAL(changed()));
+ }
+ delete []fds;
+ }
+
qDebug("OutputALSA: setupMixer() success");
return 0;
}
+
void VolumeALSA::parseMixerName(char *str, char **name, int *index)
{
char *end;
@@ -543,3 +560,8 @@ int VolumeALSA::getMixer(snd_mixer_t **mixer, QString card)
}
return (*mixer != NULL);
}
+
+bool VolumeALSA::hasNotifySignal() const
+{
+ return true;
+}