diff options
| -rw-r--r-- | src/plugins/Output/alsa/outputalsa.cpp | 25 | ||||
| -rw-r--r-- | src/plugins/Output/alsa/outputalsa.h | 4 | ||||
| -rw-r--r-- | src/plugins/Output/oss/outputoss.cpp | 20 | ||||
| -rw-r--r-- | src/plugins/Output/oss/outputoss.h | 4 | ||||
| -rw-r--r-- | src/plugins/Output/oss4/outputoss4.cpp | 28 | ||||
| -rw-r--r-- | src/plugins/Output/oss4/outputoss4.h | 4 | ||||
| -rw-r--r-- | src/plugins/Output/waveout/outputwaveout.cpp | 23 | ||||
| -rw-r--r-- | src/plugins/Output/waveout/outputwaveout.h | 7 | ||||
| -rw-r--r-- | src/qmmp/volume.h | 39 | ||||
| -rw-r--r-- | src/qmmp/volumecontrol.cpp | 28 | ||||
| -rw-r--r-- | src/qmmp/volumecontrol_p.h | 4 |
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(); |
