summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kmix/mixer.cpp82
1 files changed, 35 insertions, 47 deletions
diff --git a/kmix/mixer.cpp b/kmix/mixer.cpp
index 46e4e138..9e3aa359 100644
--- a/kmix/mixer.cpp
+++ b/kmix/mixer.cpp
@@ -527,6 +527,11 @@ void Mixer::setVolume( int deviceidx, int percentage )
void Mixer::commitVolumeChange( MixDevice* md ) {
_mixerBackend->writeVolumeToHW(md->num(), md->getVolume() );
_mixerBackend->setEnumIdHW(md->num(), md->enumId() );
+
+ // Muting/unmuting PulseAudio directly does not send back any notification to the mixer
+ // so we make sure we always update the tray icon after each operation.
+ readSetFromHWforceUpdate();
+ TQTimer::singleShot(50, this, TQT_SLOT(readSetFromHW()));
}
// @dcop only
@@ -624,51 +629,42 @@ int Mixer::masterVolume()
void Mixer::increaseVolume( int deviceidx )
{
MixDevice *mixdev= mixDeviceByType( deviceidx );
- if (mixdev != 0) {
- Volume vol=mixdev->getVolume();
- double fivePercent = (vol.maxVolume()-vol.minVolume()+1) / 20;
- for (unsigned int i=Volume::CHIDMIN; i <= Volume::CHIDMAX; i++) {
- int volToChange = vol.getVolume((Volume::ChannelID)i);
- if ( fivePercent < 1 ) fivePercent = 1;
- volToChange += (int)fivePercent;
- vol.setVolume((Volume::ChannelID)i, volToChange);
- }
- _mixerBackend->writeVolumeToHW(deviceidx, vol);
+ if (mixdev != 0)
+ {
+ Volume vol = mixdev->getVolume();
+ long inc = vol.maxVolume() / 20;
+ if (inc == 0)
+ {
+ inc = 1;
+ }
+ for (int i = 0; i < vol.count(); i++)
+ {
+ long newVal = (vol[i]) + inc;
+ mixdev->setVolume(i, newVal < vol.maxVolume() ? newVal : vol.maxVolume());
+ }
+ commitVolumeChange(mixdev);
}
-
- /* see comment at the end of decreaseVolume()
- int vol=volume(deviceidx);
- setVolume(deviceidx, vol+5);
- */
}
// @dcop
void Mixer::decreaseVolume( int deviceidx )
{
MixDevice *mixdev= mixDeviceByType( deviceidx );
- if (mixdev != 0) {
- Volume vol=mixdev->getVolume();
- double fivePercent = (vol.maxVolume()-vol.minVolume()+1) / 20;
- for (unsigned int i=Volume::CHIDMIN; i <= Volume::CHIDMAX; i++) {
- int volToChange = vol.getVolume((Volume::ChannelID)i);
- //std::cout << "Mixer::decreaseVolume(): before: volToChange " <<i<< "=" <<volToChange << std::endl;
- if ( fivePercent < 1 ) fivePercent = 1;
- volToChange -= (int)fivePercent;
- //std::cout << "Mixer::decreaseVolume(): after: volToChange " <<i<< "=" <<volToChange << std::endl;
- vol.setVolume((Volume::ChannelID)i, volToChange);
- //int volChanged = vol.getVolume((Volume::ChannelID)i);
- //std::cout << "Mixer::decreaseVolume(): check: volChanged " <<i<< "=" <<volChanged << std::endl;
- } // for
- _mixerBackend->writeVolumeToHW(deviceidx, vol);
+ if (mixdev != 0)
+ {
+ Volume vol = mixdev->getVolume();
+ long inc = vol.maxVolume() / 20;
+ if (inc == 0)
+ {
+ inc = 1;
+ }
+ for (int i = 0; i < vol.count(); i++)
+ {
+ long newVal = (vol[i]) - inc;
+ mixdev->setVolume(i, newVal > 0 ? newVal : 0);
+ }
+ commitVolumeChange(mixdev);
}
-
- /************************************************************
- It is important, not to implement this method like this:
- int vol=volume(deviceidx);
- setVolume(deviceidx, vol-5);
- It creates too big rounding errors. If you don't beleive me, then
- do a decreaseVolume() and increaseVolume() with "vol.maxVolume() == 31".
- ***********************************************************/
}
// @dcop
@@ -698,16 +694,8 @@ void Mixer::toggleMute( int deviceidx )
MixDevice *mixdev= mixDeviceByType( deviceidx );
if (!mixdev) return;
- bool previousState= mixdev->isMuted();
-
- mixdev->setMuted( !previousState );
-
- _mixerBackend->writeVolumeToHW(deviceidx, mixdev->getVolume());
-
- // Muting/unmuting PulseAudio directly does not send back any notification to the mixer
- // so we make sure we always update the tray icon after each operation.
- readSetFromHWforceUpdate();
- TQTimer::singleShot(50, this, TQT_SLOT(readSetFromHW()));
+ mixdev->setMuted(!mixdev->isMuted());
+ commitVolumeChange(mixdev);
}
// @dcop only