KMix: fixed handling of slider's mute/unmute and wheel events. Fixed mixer's increase/decrease volume logic.

Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
pull/19/head
Michele Calgaro 5 years ago
parent 244f76de8d
commit c0249fdb66
Signed by: MicheleC
GPG Key ID: 2A75B7CA8ADED5CF

@ -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) {
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);
long inc = vol.maxVolume() / 20;
if (inc == 0)
{
inc = 1;
}
_mixerBackend->writeVolumeToHW(deviceidx, vol);
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) {
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);
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

Loading…
Cancel
Save