aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/Output/alsa/CMakeLists.txt8
-rw-r--r--src/plugins/Output/alsa/outputalsa.cpp44
-rw-r--r--src/plugins/Output/alsa/outputalsa.h4
3 files changed, 37 insertions, 19 deletions
diff --git a/src/plugins/Output/alsa/CMakeLists.txt b/src/plugins/Output/alsa/CMakeLists.txt
index 6406d7e75..7b4e361fb 100644
--- a/src/plugins/Output/alsa/CMakeLists.txt
+++ b/src/plugins/Output/alsa/CMakeLists.txt
@@ -37,17 +37,12 @@ SET(libalsa_SRCS
settingsdialog.cpp
)
-SET(libalsa_HDRS
- outputalsa.h
-)
-
SET(libalsa_RCCS translations/translations.qrc)
QT4_ADD_RESOURCES(libalsa_RCC_SRCS ${libalsa_RCCS})
# user interface
-
SET(libalsa_UIS
settingsdialog.ui
)
@@ -58,8 +53,7 @@ QT4_WRAP_UI(libalsa_UIS_H ${libalsa_UIS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
IF(ALSA_FOUND)
-ADD_LIBRARY(alsa MODULE ${libalsa_SRCS} ${libalsa_UIS_H}
- ${libalsa_RCC_SRCS} ${libalsa_HDRS})
+ADD_LIBRARY(alsa MODULE ${libalsa_SRCS} ${libalsa_UIS_H} ${libalsa_RCC_SRCS})
add_dependencies(alsa qmmp)
target_link_libraries(alsa ${QT_LIBRARIES} -lqmmp ${ALSA_LDFLAGS})
install(TARGETS alsa DESTINATION ${LIB_DIR}/qmmp/Output)
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;
+}
diff --git a/src/plugins/Output/alsa/outputalsa.h b/src/plugins/Output/alsa/outputalsa.h
index 074b9ac0a..1e4a0a5f9 100644
--- a/src/plugins/Output/alsa/outputalsa.h
+++ b/src/plugins/Output/alsa/outputalsa.h
@@ -32,7 +32,6 @@ extern "C"
#include <qmmp/output.h>
#include <qmmp/volume.h>
-
class OutputALSA : public Output
{
public:
@@ -72,6 +71,7 @@ private:
class VolumeALSA : public Volume
{
+ Q_OBJECT
public:
VolumeALSA();
virtual ~VolumeALSA();
@@ -79,6 +79,8 @@ public:
void setVolume(const VolumeSettings &vol);
VolumeSettings volume() const;
+ bool hasNotifySignal() const;
+
private:
//alsa mixer
int setupMixer(QString card, QString device);