aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/Output/alsa/outputalsa.cpp25
-rw-r--r--src/plugins/Output/alsa/outputalsa.h4
-rw-r--r--src/plugins/Output/oss/outputoss.cpp20
-rw-r--r--src/plugins/Output/oss/outputoss.h4
-rw-r--r--src/plugins/Output/oss4/outputoss4.cpp28
-rw-r--r--src/plugins/Output/oss4/outputoss4.h4
-rw-r--r--src/plugins/Output/waveout/outputwaveout.cpp23
-rw-r--r--src/plugins/Output/waveout/outputwaveout.h7
-rw-r--r--src/qmmp/volume.h39
-rw-r--r--src/qmmp/volumecontrol.cpp28
-rw-r--r--src/qmmp/volumecontrol_p.h4
11 files changed, 91 insertions, 95 deletions
diff --git a/src/plugins/Output/alsa/outputalsa.cpp b/src/plugins/Output/alsa/outputalsa.cpp
index c9ed0eecd..f037d40b8 100644
--- a/src/plugins/Output/alsa/outputalsa.cpp
+++ b/src/plugins/Output/alsa/outputalsa.cpp
@@ -375,31 +375,28 @@ VolumeALSA::~VolumeALSA()
snd_mixer_close(mixer);
}
-void VolumeALSA::setVolume(int channel, int value)
+void VolumeALSA::setVolume(const VolumeSettings &vol)
{
if (!pcm_element)
return;
- _snd_mixer_selem_channel_id channel_id = SND_MIXER_SCHN_FRONT_LEFT;
- if(channel == Volume::RIGHT_CHANNEL)
- channel_id = SND_MIXER_SCHN_FRONT_RIGHT;
-
- snd_mixer_selem_set_playback_volume(pcm_element, channel_id, value);
+ snd_mixer_selem_set_playback_volume(pcm_element, SND_MIXER_SCHN_FRONT_LEFT, vol.left);
+ snd_mixer_selem_set_playback_volume(pcm_element, SND_MIXER_SCHN_FRONT_RIGHT, vol.right);
}
-int VolumeALSA::volume(int channel)
+VolumeSettings VolumeALSA::volume() const
{
+ VolumeSettings vol;
if (!pcm_element)
- return 0;
-
- _snd_mixer_selem_channel_id channel_id = SND_MIXER_SCHN_FRONT_LEFT;
- if(channel == Volume::RIGHT_CHANNEL)
- channel_id = SND_MIXER_SCHN_FRONT_RIGHT;
+ return vol;
long value = 0;
snd_mixer_handle_events(mixer);
- snd_mixer_selem_get_playback_volume(pcm_element, channel_id, &value);
- return value;
+ 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;
}
int VolumeALSA::setupMixer(QString card, QString device)
diff --git a/src/plugins/Output/alsa/outputalsa.h b/src/plugins/Output/alsa/outputalsa.h
index 664c9b30b..f909127ed 100644
--- a/src/plugins/Output/alsa/outputalsa.h
+++ b/src/plugins/Output/alsa/outputalsa.h
@@ -72,8 +72,8 @@ public:
VolumeALSA();
~VolumeALSA();
- void setVolume(int channel, int value);
- int volume(int channel);
+ void setVolume(const VolumeSettings &vol);
+ VolumeSettings volume() const;
private:
//alsa mixer
diff --git a/src/plugins/Output/oss/outputoss.cpp b/src/plugins/Output/oss/outputoss.cpp
index 148e18f7a..c62a798c6 100644
--- a/src/plugins/Output/oss/outputoss.cpp
+++ b/src/plugins/Output/oss/outputoss.cpp
@@ -167,14 +167,11 @@ VolumeOSS::~VolumeOSS()
}
}
-void VolumeOSS::setVolume(int channel, int value)
+void VolumeOSS::setVolume(const VolumeSettings &vol)
{
if (m_mixer_fd < 0)
return;
- int l = (channel == Volume::LEFT_CHANNEL) ? value : volume(Volume::LEFT_CHANNEL);
- int r = (channel == Volume::RIGHT_CHANNEL) ? value : volume(Volume::RIGHT_CHANNEL);
-
long cmd;
int devs = 0;
ioctl(m_mixer_fd, SOUND_MIXER_READ_DEVMASK, &devs);
@@ -187,14 +184,15 @@ void VolumeOSS::setVolume(int channel, int value)
//close(mifd);
return;
}
- int v = (r << 8) | l;
+ int v = (vol.right << 8) | vol.left;
ioctl(m_mixer_fd, cmd, &v);
}
-int VolumeOSS::volume(int channel)
+VolumeSettings VolumeOSS::volume() const
{
+ VolumeSettings vol;
if(m_mixer_fd < 0)
- return 0;
+ return vol;
int cmd;
int v, devs = 0;
ioctl(m_mixer_fd, SOUND_MIXER_READ_DEVMASK, &devs);
@@ -204,12 +202,12 @@ int VolumeOSS::volume(int channel)
else if ((devs & SOUND_MASK_VOLUME) && m_master)
cmd = SOUND_MIXER_READ_VOLUME;
else
- return 0;
+ return vol;
ioctl(m_mixer_fd, cmd, &v);
- if(channel == Volume::LEFT_CHANNEL)
- return (v & 0xFF00) >> 8;
- return (v & 0x00FF);
+ vol.left = (v & 0xFF00) >> 8;
+ vol.right = (v & 0x00FF);
+ return vol;
}
void VolumeOSS::openMixer()
diff --git a/src/plugins/Output/oss/outputoss.h b/src/plugins/Output/oss/outputoss.h
index c031dadd2..ff8022be1 100644
--- a/src/plugins/Output/oss/outputoss.h
+++ b/src/plugins/Output/oss/outputoss.h
@@ -55,8 +55,8 @@ public:
VolumeOSS();
~VolumeOSS();
- void setVolume(int channel, int value);
- int volume(int channel);
+ void setVolume(const VolumeSettings &vol);
+ VolumeSettings volume() const;
private:
//oss mixer
diff --git a/src/plugins/Output/oss4/outputoss4.cpp b/src/plugins/Output/oss4/outputoss4.cpp
index 7b20f317b..4c1775665 100644
--- a/src/plugins/Output/oss4/outputoss4.cpp
+++ b/src/plugins/Output/oss4/outputoss4.cpp
@@ -178,40 +178,34 @@ VolumeOSS4::~VolumeOSS4()
settings.setValue("OSS4/volume", m_volume);
}
-void VolumeOSS4::setVolume(int channel, int value)
+void VolumeOSS4::setVolume(const VolumeSettings &vol)
{
- int l = (channel == Volume::LEFT_CHANNEL) ? value : volume(Volume::LEFT_CHANNEL);
- int r = (channel == Volume::RIGHT_CHANNEL) ? value : volume(Volume::RIGHT_CHANNEL);
- m_volume = (r << 8) | l;
+ m_volume = (vol.right << 8) | vol.left;
if(OutputOSS4::instance() && OutputOSS4::instance()->fd() >= 0)
{
ioctl(OutputOSS4::instance()->fd(), SNDCTL_DSP_SETPLAYVOL, &m_volume);
}
}
-int VolumeOSS4::volume(int channel)
+VolumeSettings VolumeOSS4::volume() const
{
+ VolumeSettings vol;
if(OutputOSS4::instance() && OutputOSS4::instance()->fd() >= 0)
{
int v = 0;
if (ioctl(OutputOSS4::instance()->fd(), SNDCTL_DSP_GETPLAYVOL, &v) < 0)
v = 0;
m_volume = v;
- if(channel == Volume::LEFT_CHANNEL)
- return (v & 0x00FF);
- return (v & 0xFF00) >> 8;
- }
- else
- {
- if(channel == Volume::LEFT_CHANNEL)
- return (m_volume & 0x00FF);
- return (m_volume & 0xFF00) >> 8;
}
+ vol.left = m_volume & 0x00FF;
+ vol.right = (m_volume & 0xFF00) >> 8;
+ return vol;
}
void VolumeOSS4::restore()
{
- int v = m_volume;
- setVolume(Volume::LEFT_CHANNEL, (v & 0x00FF));
- setVolume(Volume::RIGHT_CHANNEL, (v & 0xFF00) >> 8);
+ if(OutputOSS4::instance() && OutputOSS4::instance()->fd() >= 0)
+ {
+ ioctl(OutputOSS4::instance()->fd(), SNDCTL_DSP_SETPLAYVOL, &m_volume);
+ }
}
diff --git a/src/plugins/Output/oss4/outputoss4.h b/src/plugins/Output/oss4/outputoss4.h
index ee8ccf6af..5266db71b 100644
--- a/src/plugins/Output/oss4/outputoss4.h
+++ b/src/plugins/Output/oss4/outputoss4.h
@@ -65,8 +65,8 @@ public:
VolumeOSS4();
~VolumeOSS4();
- void setVolume(int channel, int value);
- int volume(int channel);
+ void setVolume(const VolumeSettings &vol);
+ VolumeSettings volume() const;
void restore();
private:
diff --git a/src/plugins/Output/waveout/outputwaveout.cpp b/src/plugins/Output/waveout/outputwaveout.cpp
index 504e82e9f..25791ff64 100644
--- a/src/plugins/Output/waveout/outputwaveout.cpp
+++ b/src/plugins/Output/waveout/outputwaveout.cpp
@@ -245,21 +245,18 @@ VolumeWaveOut::VolumeWaveOut()
VolumeWaveOut::~VolumeWaveOut()
{}
-void VolumeWaveOut::setVolume(int channel, int value)
+void VolumeWaveOut::setVolume(const VolumeSettings &vol)
{
- int l = (channel == Volume::LEFT_CHANNEL) ? value : (long)LOWORD(m_volume) * 100 / 0xFFFF;
- int r = (channel == Volume::RIGHT_CHANNEL) ? value : (long)HIWORD(m_volume) * 100 / 0xFFFF;
- m_volume = (r*0xFFFF/100 << 16) | l*0xFFFF/100;
- waveOutSetVolume(0, m_volume);
+ DWORD data = (vol.right*0xFFFF/100 << 16) | vol.left*0xFFFF/100;
+ waveOutSetVolume(0, data);
}
-int VolumeWaveOut::volume(int channel)
+VolumeSettings VolumeWaveOut::volume() const
{
- DWORD volume;
- waveOutGetVolume(0, (PDWORD)&volume);
- m_volume = volume;
- if(channel == Volume::LEFT_CHANNEL)
- return (long)LOWORD(volume) * 100 / 0xFFFF + 1;
- else
- return (long)HIWORD(volume) * 100 / 0xFFFF + 1;
+ VolumeSettings vol;
+ DWORD data;
+ waveOutGetVolume(0, (PDWORD)&data);
+ vol.left = (long)LOWORD(data) * 100 / 0xFFFF + 1;
+ vol.right = (long)HIWORD(data) * 100 / 0xFFFF + 1;
+ return vol;
}
diff --git a/src/plugins/Output/waveout/outputwaveout.h b/src/plugins/Output/waveout/outputwaveout.h
index d4e44e30a..22e437a81 100644
--- a/src/plugins/Output/waveout/outputwaveout.h
+++ b/src/plugins/Output/waveout/outputwaveout.h
@@ -57,11 +57,8 @@ public:
VolumeWaveOut();
~VolumeWaveOut();
- void setVolume(int channel, int value);
- int volume(int channel);
-
-private:
- DWORD m_volume;
+ void setVolume(const VolumeSettings &vol);
+ VolumeSettings volume() const;
};
diff --git a/src/qmmp/volume.h b/src/qmmp/volume.h
index 26cbd0f28..4ba28da74 100644
--- a/src/qmmp/volume.h
+++ b/src/qmmp/volume.h
@@ -21,33 +21,44 @@
#ifndef VOLUME_H
#define VOLUME_H
-#endif // VOLUME_H
+/*! @brief The VolumeSettings structure stores volume levels
+ * @author Ilya Kotov <forkotov02@hotmail.ru>
+ */
+struct VolumeSettings
+{
+ /*!
+ * Constructor
+ */
+ VolumeSettings()
+ {
+ left = 0;
+ right = 0;
+ }
+ int left /*!< Volume of the left channel. It should be \b 0..100. */;
+ int right /*!< Volume of the left channel It should be \b 0..100. */;
+};
-/*! @brief The Volume class is a provides volume API
+/*! @brief The Volume class provides asbtract volume interface
* @author Ilya Kotov <forkotov02@hotmail.ru>
*/
class Volume
{
public:
- virtual ~Volume(){}
/*!
- * Volume control channel enum
+ * Destructor.
*/
- enum Channel
- {
- LEFT_CHANNEL = 0, /*!< Right channel */
- RIGHT_CHANNEL /*!< Left channel */
- };
+ virtual ~Volume(){}
/*!
- * Setups volume level.
+ * Setups volume levels.
* Subclass should reimplement this fucntion.
- * @param channel Channel
- * @param value Volume level. It should be \b 0..100
+ * @param volume Structure with required volume levels.
*/
- virtual void setVolume(int channel, int value) = 0;
+ virtual void setVolume(const VolumeSettings &volume) = 0;
/*!
* Returns volume level of the \b channel.
*/
- virtual int volume(int channel) = 0;
+ virtual VolumeSettings volume() const = 0;
};
+
+#endif // VOLUME_H
diff --git a/src/qmmp/volumecontrol.cpp b/src/qmmp/volumecontrol.cpp
index de9a21ed7..fdf2a4663 100644
--- a/src/qmmp/volumecontrol.cpp
+++ b/src/qmmp/volumecontrol.cpp
@@ -50,8 +50,10 @@ int VolumeControl::left()
void VolumeControl::setVolume(int left, int right)
{
- m_volume->setVolume(Volume::LEFT_CHANNEL, left);
- m_volume->setVolume(Volume::RIGHT_CHANNEL, right);
+ VolumeSettings v;
+ v.left = left;
+ v.right = right;
+ m_volume->setVolume(v);
checkVolume();
}
@@ -62,8 +64,9 @@ int VolumeControl::right()
void VolumeControl::checkVolume()
{
- int l = m_volume->volume(Volume::LEFT_CHANNEL);
- int r = m_volume->volume(Volume::RIGHT_CHANNEL);
+ VolumeSettings v = m_volume->volume();
+ int l = v.left;
+ int r = v.right;
l = (l > 100) ? 100 : l;
r = (r > 100) ? 100 : r;
@@ -123,21 +126,20 @@ SoftwareVolume::~SoftwareVolume()
m_instance = 0;
}
-void SoftwareVolume::setVolume(int channel, int value)
+void SoftwareVolume::setVolume(const VolumeSettings &v)
{
- if(channel == Volume::LEFT_CHANNEL)
- m_left = value;
- else
- m_right = value;
+ m_left = v.left;
+ m_right = v.right;
m_scaleLeft = (double)m_left/100.0;
m_scaleRight = (double)m_right/100.0;
}
-int SoftwareVolume::volume(int channel)
+VolumeSettings SoftwareVolume::volume() const
{
- if(channel == Volume::LEFT_CHANNEL)
- return m_left;
- return m_right;
+ VolumeSettings v;
+ v.left = m_left;
+ v.right = m_right;
+ return v;
}
void SoftwareVolume::changeVolume(Buffer *b, int chan, Qmmp::AudioFormat format)
diff --git a/src/qmmp/volumecontrol_p.h b/src/qmmp/volumecontrol_p.h
index bea4f50f2..99f90c675 100644
--- a/src/qmmp/volumecontrol_p.h
+++ b/src/qmmp/volumecontrol_p.h
@@ -96,8 +96,8 @@ public:
SoftwareVolume();
~SoftwareVolume();
- void setVolume(int channel, int value);
- int volume(int channel);
+ void setVolume(const VolumeSettings &v);
+ VolumeSettings volume() const;
void changeVolume(Buffer *b, int chan, Qmmp::AudioFormat format);
static SoftwareVolume *instance();