KMix: 1) added direct DCOP access to the user selected mixer/device channel used as master.

2) fixed bug with volume update
3) unlinked global keyboard shortcuts for volume control to avoid
clashing with kmilo. A user can still link them manually if needed.

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

@ -60,7 +60,7 @@ tde_add_tdeinit_executable( kmix AUTOMOC
mixset.cpp mixdevice.cpp mixer_backend.cpp ksmallslider.cpp mixset.cpp mixdevice.cpp mixer_backend.cpp ksmallslider.cpp
volume.cpp kledbutton.cpp verticaltext.cpp mixerIface.skel volume.cpp kledbutton.cpp verticaltext.cpp mixerIface.skel
kmixtoolbox.cpp mixertoolbox.cpp dialogviewconfiguration.cpp kmixtoolbox.cpp mixertoolbox.cpp dialogviewconfiguration.cpp
KMixApp.cpp dialogselectmaster.cpp KMixApp.cpp dialogselectmaster.cpp kmixIface.skel
LINK tdeui-shared ${ALSA_LIBRARIES} LINK tdeui-shared ${ALSA_LIBRARIES}
) )

@ -11,7 +11,7 @@ noinst_HEADERS = kmix.h kmixdockwidget.h kmixprefdlg.h kmixerwidget.h \
viewbase.h viewoutput.h viewinput.h viewsliders.h viewswitches.h viewsurround.h viewdockareapopup.h viewgrid.h \ viewbase.h viewoutput.h viewinput.h viewsliders.h viewswitches.h viewsurround.h viewdockareapopup.h viewgrid.h \
mixdevicewidget.h mdwslider.h mdwswitch.h mdwenum.h \ mixdevicewidget.h mdwslider.h mdwswitch.h mdwenum.h \
mixer.h mixset.h mixdevice.h mixer_backend.h volume.h kledbutton.h version.h kmixtoolbox.h \ mixer.h mixset.h mixdevice.h mixer_backend.h volume.h kledbutton.h version.h kmixtoolbox.h \
ksmallslider.h kmixapplet.h mixerIface.h verticaltext.h \ ksmallslider.h kmixapplet.h mixerIface.h verticaltext.h kmixIface.h \
KMixApp.h dialogviewconfiguration.h kmixtoolbox.h mixertoolbox.h dialogselectmaster.h KMixApp.h dialogviewconfiguration.h kmixtoolbox.h mixertoolbox.h dialogselectmaster.h
@ -22,7 +22,7 @@ kmix_la_SOURCES = main.cpp kmix.cpp kmixdockwidget.cpp kmixprefdlg.cpp \
viewsliders.cpp viewgrid.cpp \ viewsliders.cpp viewgrid.cpp \
mixdevicewidget.cpp mdwslider.cpp mdwswitch.cpp mdwenum.cpp \ mixdevicewidget.cpp mdwslider.cpp mdwswitch.cpp mdwenum.cpp \
kmixerwidget.cpp mixer.cpp mixset.cpp mixdevice.cpp mixer_backend.cpp ksmallslider.cpp \ kmixerwidget.cpp mixer.cpp mixset.cpp mixdevice.cpp mixer_backend.cpp ksmallslider.cpp \
volume.cpp kledbutton.cpp verticaltext.cpp mixerIface.skel \ volume.cpp kledbutton.cpp verticaltext.cpp mixerIface.skel kmixIface.skel \
kmixtoolbox.cpp mixertoolbox.cpp dialogviewconfiguration.cpp KMixApp.cpp dialogselectmaster.cpp kmixtoolbox.cpp mixertoolbox.cpp dialogviewconfiguration.cpp KMixApp.cpp dialogselectmaster.cpp
kmix_la_LIBADD = $(LIB_TDEUI) $(LIB_TDEUTILS) $(LIBALIB) $(LIBOSSAUDIO) $(LIBASOUND) $(LIB_TQT) $(LIB_TDECORE) -lDCOP kmix_la_LIBADD = $(LIB_TDEUI) $(LIB_TDEUTILS) $(LIBALIB) $(LIBOSSAUDIO) $(LIBASOUND) $(LIB_TQT) $(LIB_TDECORE) -lDCOP

@ -61,7 +61,7 @@
* Constructs a mixer window (KMix main window) * Constructs a mixer window (KMix main window)
*/ */
KMixWindow::KMixWindow() KMixWindow::KMixWindow()
: TDEMainWindow(0, 0, 0, 0), m_showTicks( true ), : DCOPObject("kmix"), TDEMainWindow(0, 0, 0, 0), m_showTicks( true ),
m_dockWidget( 0L ) m_dockWidget( 0L )
{ {
m_visibilityUpdateAllowed = true; m_visibilityUpdateAllowed = true;
@ -121,11 +121,11 @@ KMixWindow::initActions()
m_globalAccel = new TDEGlobalAccel(this, "KMix"); m_globalAccel = new TDEGlobalAccel(this, "KMix");
m_globalAccel->insert( "Increase volume", i18n( "Increase Volume of Master Channel"), TQString(), m_globalAccel->insert( "Increase volume", i18n( "Increase Volume of Master Channel"), TQString(),
TDEShortcut(TQString("XF86AudioRaiseVolume")), TDEShortcut(TQString("XF86AudioRaiseVolume")), TQT_TQOBJECT(this), TQT_SLOT( increaseVolume() ) ); TDEShortcut(), TDEShortcut(), TQT_TQOBJECT(this), TQT_SLOT( slotIncreaseVolume() ) );
m_globalAccel->insert( "Decrease volume", i18n( "Decrease Volume of Master Channel"), TQString(), m_globalAccel->insert( "Decrease volume", i18n( "Decrease Volume of Master Channel"), TQString(),
TDEShortcut(TQString("XF86AudioLowerVolume")), TDEShortcut(TQString("XF86AudioLowerVolume")), TQT_TQOBJECT(this), TQT_SLOT( decreaseVolume() ) ); TDEShortcut(), TDEShortcut(), TQT_TQOBJECT(this), TQT_SLOT( slotDecreaseVolume() ) );
m_globalAccel->insert( "Toggle mute", i18n( "Toggle Mute of Master Channel"), TQString(), m_globalAccel->insert( "Toggle mute", i18n( "Toggle Mute of Master Channel"), TQString(),
TDEShortcut(TQString("XF86AudioMute")), TDEShortcut(TQString("XF86AudioMute")), TQT_TQOBJECT(this), TQT_SLOT( toggleMuted() ) ); TDEShortcut(), TDEShortcut(), TQT_TQOBJECT(this), TQT_SLOT( slotToggleMuted() ) );
m_globalAccel->readSettings(); m_globalAccel->readSettings();
m_globalAccel->updateConnections(); m_globalAccel->updateConnections();
@ -619,40 +619,162 @@ KMixWindow::configureGlobalShortcuts()
m_globalAccel->updateConnections(); m_globalAccel->updateConnections();
} }
void // KMixIface DCOP interface methods
KMixWindow::toggleMuted() void KMixWindow::setVolume(int percentage)
{
Mixer *mixerMaster = Mixer::masterCard();
if (mixerMaster)
{
mixerMaster->setMasterVolume(percentage);
}
}
void KMixWindow::increaseVolume(int percentage)
{ {
Mixer* mixerMaster = Mixer::masterCard(); Mixer *mixerMaster = Mixer::masterCard();
if ( mixerMaster != 0 ) { if (mixerMaster)
MixDevice* md = mixerMaster->masterDevice(); {
if ( md != 0 && md->hasMute() ) { MixDevice *md = mixerMaster->masterDevice();
mixerMaster->toggleMute(md->num()); if (md)
{
mixerMaster->increaseVolume(md->num(), percentage);
} }
} }
} }
void void KMixWindow::decreaseVolume(int percentage)
KMixWindow::increaseVolume()
{ {
Mixer* mixerMaster = Mixer::masterCard(); Mixer *mixerMaster = Mixer::masterCard();
if ( mixerMaster != 0 ) { if (mixerMaster)
MixDevice* md = mixerMaster->masterDevice(); {
if ( md != 0 ) { MixDevice *md = mixerMaster->masterDevice();
mixerMaster->increaseVolume(md->num()); if (md)
{
mixerMaster->decreaseVolume(md->num(), percentage);
} }
} }
} }
void int KMixWindow::volume()
KMixWindow::decreaseVolume() {
Mixer *mixerMaster = Mixer::masterCard();
if (mixerMaster)
{
return mixerMaster->masterVolume();
}
return -1;
}
void KMixWindow::setAbsoluteVolume(long absoluteVolume)
{
Mixer *mixerMaster = Mixer::masterCard();
if (mixerMaster)
{
MixDevice *md = mixerMaster->masterDevice();
if (md)
{
return mixerMaster->setAbsoluteVolume(md->num(), absoluteVolume);
}
}
}
long KMixWindow::absoluteVolume()
{
Mixer *mixerMaster = Mixer::masterCard();
if (mixerMaster)
{
MixDevice *md = mixerMaster->masterDevice();
if (md)
{
return mixerMaster->absoluteVolume(md->num());
}
}
return -1L;
}
long KMixWindow::absoluteVolumeMin()
{
Mixer *mixerMaster = Mixer::masterCard();
if (mixerMaster)
{
MixDevice *md = mixerMaster->masterDevice();
if (md)
{
return mixerMaster->absoluteVolumeMin(md->num());
}
}
return -1L;
}
long KMixWindow::absoluteVolumeMax()
{ {
Mixer* mixerMaster = Mixer::masterCard(); Mixer *mixerMaster = Mixer::masterCard();
if ( mixerMaster != 0 ) { if (mixerMaster)
MixDevice* md = mixerMaster->masterDevice(); {
if ( md != 0 ) { MixDevice *md = mixerMaster->masterDevice();
mixerMaster->decreaseVolume(md->num()); if (md)
{
return mixerMaster->absoluteVolumeMax(md->num());
} }
} }
return -1L;
}
void KMixWindow::setMute(bool on)
{
Mixer *mixerMaster = Mixer::masterCard();
if (mixerMaster)
{
mixerMaster->setMasterMute(on);
}
}
void KMixWindow::toggleMute()
{
Mixer *mixerMaster = Mixer::masterCard();
if (mixerMaster)
{
mixerMaster->toggleMasterMute();
}
}
bool KMixWindow::mute()
{
Mixer *mixerMaster = Mixer::masterCard();
if (mixerMaster)
{
return mixerMaster->masterMute();
}
return true;
}
TQString KMixWindow::mixerName()
{
Mixer *mixerMaster = Mixer::masterCard();
if (mixerMaster)
{
return mixerMaster->mixerName();
}
return TQString::null;
}
int KMixWindow::deviceIndex()
{
Mixer *mixerMaster = Mixer::masterCard();
if (mixerMaster)
{
return mixerMaster->masterDeviceIndex();
}
return -1;
}
void KMixWindow::setBalance(int balance)
{
Mixer *mixerMaster = Mixer::masterCard();
if (mixerMaster)
{
mixerMaster->setBalance(balance);
}
} }
#include "kmix.moc" #include "kmix.moc"

@ -49,18 +49,38 @@ class Mixer;
#include "mixer.h" #include "mixer.h"
#include "mixdevicewidget.h" #include "mixdevicewidget.h"
#include "kmixIface.h"
class class
KMixWindow : public TDEMainWindow KMixWindow : public TDEMainWindow, virtual public KMixIface
{ {
Q_OBJECT Q_OBJECT
public: public:
KMixWindow(); KMixWindow();
~KMixWindow(); ~KMixWindow();
// Additional functions for DCOP interface
void setVolume(int percentage);
void increaseVolume(int percentage);
void decreaseVolume(int percentage);
int volume();
void setAbsoluteVolume(long absoluteVolume);
long absoluteVolume();
long absoluteVolumeMin();
long absoluteVolumeMax();
void setMute(bool on);
void toggleMute();
bool mute();
TQString mixerName();
int deviceIndex();
void setBalance(int balance);
protected slots: protected slots:
void saveSettings(); void saveSettings();
@ -130,9 +150,9 @@ KMixWindow : public TDEMainWindow
void slotHWInfo(); void slotHWInfo();
void showSelectedMixer( int mixer ); void showSelectedMixer( int mixer );
void configureGlobalShortcuts(); void configureGlobalShortcuts();
void toggleMuted(); void slotToggleMuted() { toggleMute(); }
void increaseVolume(); void slotIncreaseVolume() { increaseVolume(5); }
void decreaseVolume(); void slotDecreaseVolume() { decreaseVolume(5); }
}; };
#endif // KMIX_H #endif // KMIX_H

@ -0,0 +1,82 @@
#ifndef __KMIX_IFACE_H
#define __KMIX_IFACE_H
#include <dcopobject.h>
/**
Provides a subset of MixerIface DCOP interface tailored to specifically
act onto the current device/channel selected by the user as main channel
*/
class KMixIface : virtual public DCOPObject
{
K_DCOP
k_dcop:
/**
Sets the volume to the percentage specified in the parameter.
*/
virtual void setVolume(int percentage)=0;
/**
Increase the volume by the percentage specified in the parameter.
*/
virtual void increaseVolume(int percentage)=0;
/**
Decrease the volume by the percentage specified in the parameter.
*/
virtual void decreaseVolume(int percentage)=0;
/**
Returns the volume of the device (as a percentage, 0..100).
*/
virtual int volume()=0;
/**
Sets the absolute volume of the device. Lower bound is absoluteVolumeMin(),
upper bound is absoluteVolumeMax().
*/
virtual void setAbsoluteVolume(long absoluteVolume)=0;
/**
Returns the absolute volume of the device. The volume is in the range of
absoluteVolumeMin() <= absoluteVolume() <= absoluteVolumeMax()
*/
virtual long absoluteVolume()=0;
/**
Returns the absolute maximum volume of the device.
*/
virtual long absoluteVolumeMin()=0;
/**
Returns the absolute minimum volume of the device.
*/
virtual long absoluteVolumeMax()=0;
/**
Mutes or unmutes the specified device.
*/
virtual void setMute(bool on)=0;
/**
Toggles mute-state for the given device.
*/
virtual void toggleMute()=0;
/**
Returns if the given device is muted or not. If no device is
available, it is reported as muted.
*/
virtual bool mute()=0;
/**
Returns the name of the mixer.
*/
virtual TQString mixerName()=0;
/**
Returns the index of the master device
*/
virtual int deviceIndex()=0;
/**
Sets the balance of the device (negative means balanced to the left
speaker and positive to the right one)
*/
virtual void setBalance(int balance)=0;
};
#endif

@ -760,15 +760,7 @@ void MDWSlider::setDisabled( bool value )
*/ */
void MDWSlider::increaseVolume() void MDWSlider::increaseVolume()
{ {
Volume vol = m_mixdevice->getVolume(); m_mixer->increaseVolume(m_mixdevice->num(), 5);
long inc = vol.maxVolume() / 20;
if ( inc == 0 )
inc = 1;
for ( int i = 0; i < vol.count(); i++ ) {
long newVal = (vol[i]) + inc;
m_mixdevice->setVolume( i, newVal < vol.maxVolume() ? newVal : vol.maxVolume() );
}
m_mixer->commitVolumeChange(m_mixdevice);
} }
/** /**
@ -777,15 +769,7 @@ void MDWSlider::increaseVolume()
*/ */
void MDWSlider::decreaseVolume() void MDWSlider::decreaseVolume()
{ {
Volume vol = m_mixdevice->getVolume(); m_mixer->decreaseVolume(m_mixdevice->num(), 5);
long inc = vol.maxVolume() / 20;
if ( inc == 0 )
inc = 1;
for ( int i = 0; i < vol.count(); i++ ) {
long newVal = (vol[i]) - inc;
m_mixdevice->setVolume( i, newVal > 0 ? newVal : 0 );
}
m_mixer->commitVolumeChange(m_mixdevice);
} }

@ -514,6 +514,9 @@ void Mixer::setVolume( int deviceidx, int percentage )
// @todo The next call doesn't handle negative volumes correctly. // @todo The next call doesn't handle negative volumes correctly.
vol.setAllVolumes( (percentage*vol.maxVolume())/100 ); vol.setAllVolumes( (percentage*vol.maxVolume())/100 );
_mixerBackend->writeVolumeToHW(deviceidx, vol); _mixerBackend->writeVolumeToHW(deviceidx, vol);
// Make sure volume reading is synced
readSetFromHWforceUpdate();
TQTimer::singleShot(50, this, TQT_SLOT(readSetFromHW()));
} }
/** /**
@ -579,12 +582,15 @@ void Mixer::setAbsoluteVolume( int deviceidx, long absoluteVolume ) {
Volume vol=mixdev->getVolume(); Volume vol=mixdev->getVolume();
vol.setAllVolumes( absoluteVolume ); vol.setAllVolumes( absoluteVolume );
_mixerBackend->writeVolumeToHW(deviceidx, vol); _mixerBackend->writeVolumeToHW(deviceidx, vol);
// Make sure volume reading is synced
readSetFromHWforceUpdate();
TQTimer::singleShot(50, this, TQT_SLOT(readSetFromHW()));
} }
// @dcop , especially for use in KMilo // @dcop , especially for use in KMilo
long Mixer::absoluteVolume( int deviceidx ) long Mixer::absoluteVolume(int deviceidx)
{ {
MixDevice *mixdev= mixDeviceByType( deviceidx ); MixDevice *mixdev= mixDeviceByType(deviceidx);
if (!mixdev) return 0; if (!mixdev) return 0;
Volume vol=mixdev->getVolume(); Volume vol=mixdev->getVolume();
@ -593,9 +599,9 @@ long Mixer::absoluteVolume( int deviceidx )
} }
// @dcop , especially for use in KMilo // @dcop , especially for use in KMilo
long Mixer::absoluteVolumeMax( int deviceidx ) long Mixer::absoluteVolumeMax(int deviceidx)
{ {
MixDevice *mixdev= mixDeviceByType( deviceidx ); MixDevice *mixdev= mixDeviceByType(deviceidx);
if (!mixdev) return 0; if (!mixdev) return 0;
Volume vol=mixdev->getVolume(); Volume vol=mixdev->getVolume();
@ -604,9 +610,9 @@ long Mixer::absoluteVolumeMax( int deviceidx )
} }
// @dcop , especially for use in KMilo // @dcop , especially for use in KMilo
long Mixer::absoluteVolumeMin( int deviceidx ) long Mixer::absoluteVolumeMin(int deviceidx)
{ {
MixDevice *mixdev= mixDeviceByType( deviceidx ); MixDevice *mixdev= mixDeviceByType(deviceidx);
if (!mixdev) return 0; if (!mixdev) return 0;
Volume vol=mixdev->getVolume(); Volume vol=mixdev->getVolume();
@ -626,44 +632,54 @@ int Mixer::masterVolume()
} }
// @dcop // @dcop
void Mixer::increaseVolume( int deviceidx ) void Mixer::increaseVolume(int deviceidx, int percentage)
{ {
MixDevice *mixdev= mixDeviceByType( deviceidx ); MixDevice *mixdev= mixDeviceByType(deviceidx);
if (mixdev != 0) if (mixdev && percentage > 0)
{ {
Volume vol = mixdev->getVolume(); Volume vol = mixdev->getVolume();
long inc = vol.maxVolume() / 20; long maxVol = vol.maxVolume();
if (inc == 0) if (maxVol > 0)
{
inc = 1;
}
for (int i = 0; i < vol.count(); i++)
{ {
long newVal = (vol[i]) + inc; for (int i = 0; i < vol.count(); i++)
mixdev->setVolume(i, newVal < vol.maxVolume() ? newVal : vol.maxVolume()); {
double perc = 100.0 * vol[i] / maxVol;
perc += percentage;
if (perc > 100.0)
{
perc = 100.0;
}
long newVal = (long)(perc * maxVol / 100.0);
mixdev->setVolume(i, newVal);
}
commitVolumeChange(mixdev);
} }
commitVolumeChange(mixdev);
} }
} }
// @dcop // @dcop
void Mixer::decreaseVolume( int deviceidx ) void Mixer::decreaseVolume(int deviceidx, int percentage)
{ {
MixDevice *mixdev= mixDeviceByType( deviceidx ); MixDevice *mixdev= mixDeviceByType(deviceidx);
if (mixdev != 0) if (mixdev && percentage > 0)
{ {
Volume vol = mixdev->getVolume(); Volume vol = mixdev->getVolume();
long inc = vol.maxVolume() / 20; long maxVol = vol.maxVolume();
if (inc == 0) if (maxVol > 0)
{
inc = 1;
}
for (int i = 0; i < vol.count(); i++)
{ {
long newVal = (vol[i]) - inc; for (int i = 0; i < vol.count(); i++)
mixdev->setVolume(i, newVal > 0 ? newVal : 0); {
double perc = 100.0 * vol[i] / maxVol;
perc -= percentage;
if (perc < 0.0)
{
perc = 0.0;
}
long newVal = (long)(perc * maxVol / 100.0);
mixdev->setVolume(i, newVal);
}
commitVolumeChange(mixdev);
} }
commitVolumeChange(mixdev);
} }
} }

@ -113,29 +113,29 @@ class Mixer : public TQObject, virtual public MixerIface
void setMasterDevice(TQString&); void setMasterDevice(TQString&);
/// DCOP oriented methods (look at mixerIface.h for the descriptions) /// DCOP oriented methods (look at mixerIface.h for the descriptions)
virtual void setVolume( int deviceidx, int percentage ); void setVolume( int deviceidx, int percentage );
virtual void setAbsoluteVolume( int deviceidx, long absoluteVolume ); void setAbsoluteVolume( int deviceidx, long absoluteVolume );
virtual void setMasterVolume( int percentage ); void setMasterVolume( int percentage );
virtual void increaseVolume( int deviceidx ); void increaseVolume( int deviceidx, int percentage );
virtual void decreaseVolume( int deviceidx ); void decreaseVolume( int deviceidx, int percentage );
virtual long absoluteVolume( int deviceidx ); long absoluteVolume( int deviceidx );
virtual long absoluteVolumeMin( int deviceidx ); long absoluteVolumeMin( int deviceidx );
virtual long absoluteVolumeMax( int deviceidx ); long absoluteVolumeMax( int deviceidx );
virtual int volume( int deviceidx ); int volume( int deviceidx );
virtual int masterVolume(); int masterVolume();
virtual int masterDeviceIndex(); int masterDeviceIndex();
virtual void setMute( int deviceidx, bool on ); void setMute( int deviceidx, bool on );
virtual void setMasterMute( bool on ); void setMasterMute( bool on );
virtual bool mute( int deviceidx ); bool mute( int deviceidx );
virtual bool masterMute(); bool masterMute();
virtual void toggleMute( int deviceidx ); void toggleMute( int deviceidx );
virtual void toggleMasterMute(); void toggleMasterMute();
virtual bool isRecordSource( int deviceidx ); bool isRecordSource( int deviceidx );
virtual bool isAvailableDevice( int deviceidx ); bool isAvailableDevice( int deviceidx );
void commitVolumeChange( MixDevice* md ); void commitVolumeChange( MixDevice* md );

@ -20,13 +20,13 @@ k_dcop:
virtual void setMasterVolume( int percentage )=0; virtual void setMasterVolume( int percentage )=0;
/** /**
Increase the volume of the given device by a 5% . Increase the volume of the given device by a given percentage.
*/ */
virtual void increaseVolume( int deviceidx )=0; virtual void increaseVolume( int deviceidx, int percentage )=0;
/** /**
Decrease the volume of the given device by a 5% . Decrease the volume of the given device by a a given percentage.
*/ */
virtual void decreaseVolume( int deviceidx )=0; virtual void decreaseVolume( int deviceidx, int percentage )=0;
/** /**
Returns the volume of the device (as a percentage, 0..100). Returns the volume of the device (as a percentage, 0..100).

Loading…
Cancel
Save