diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | e2de64d6f1beb9e492daf5b886e19933c1fa41dd (patch) | |
tree | 9047cf9e6b5c43878d5bf82660adae77ceee097a /kmix/mixdevice.cpp | |
download | tdemultimedia-e2de64d6f1beb9e492daf5b886e19933c1fa41dd.tar.gz tdemultimedia-e2de64d6f1beb9e492daf5b886e19933c1fa41dd.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdemultimedia@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kmix/mixdevice.cpp')
-rw-r--r-- | kmix/mixdevice.cpp | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/kmix/mixdevice.cpp b/kmix/mixdevice.cpp new file mode 100644 index 00000000..16984ceb --- /dev/null +++ b/kmix/mixdevice.cpp @@ -0,0 +1,221 @@ +/* + * KMix -- KDE's full featured mini mixer + * + * + * Copyright (C) 1996-2004 Christian Esken <esken@kde.org> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include <kdebug.h> +#include <klocale.h> + +#include "mixdevice.h" + + +/** + * Constructs a MixDevice. A MixDevice represents one channel or control of + * the mixer hardware. A MixDevice has a type (e.g. PCM), a descriptive name + * (for example "Master" or "Headphone" or "IEC 958 Output"), + * can have a volume level (2 when stereo), can be recordable and muted. + * The category tells which kind of control the MixDevice is. + * + * Hints: Meaning of "category" has changed. In future the MixDevice might contain two + * Volume objects, one for Output (Playback volume) and one for Input (Record volume). + */ +MixDevice::MixDevice( int num, Volume &vol, bool recordable, bool mute, + QString name, ChannelType type, DeviceCategory category ) : + _volume( vol ), _type( type ), _num( num ), _recordable( recordable ), + _mute( mute ), _category( category ) +{ + // Hint: "_volume" gets COPIED from "vol" due to the fact that the copy-constructor actually copies the volume levels. + _switch = false; + _recSource = false; + if( name.isEmpty() ) + _name = i18n("unknown"); + else + _name = name; + + _pk.setNum(num); + + + if( category == MixDevice::SWITCH ) + _switch = true; +} + +MixDevice::MixDevice(const MixDevice &md) : QObject() +{ + _name = md._name; + _volume = md._volume; + _type = md._type; + _num = md._num; + _pk = md._pk; + _recordable = md._recordable; + _recSource = md._recSource; + _category = md._category; + _switch = md._switch; + _mute = md._mute; + _enumValues = md._enumValues; +} + +MixDevice::~MixDevice() { + // Clear MixDevices enum Strings (switch on auto-delete, so the QString's inside will be cleared) + _enumValues.setAutoDelete(true); + _enumValues.clear(); +} + +Volume& MixDevice::getVolume() +{ + return _volume; +} + +long MixDevice::getVolume(Volume::ChannelID chid) { + return _volume.getVolume(chid); +} + +long MixDevice::maxVolume() { + return _volume.maxVolume(); +} + +long MixDevice::minVolume() { + return _volume.minVolume(); +} + +void MixDevice::setEnumId(int enumId) +{ + if ( enumId < _enumValues.count() ) { + _enumCurrentId = enumId; + } +} + +unsigned int MixDevice::enumId() +{ + return _enumCurrentId; +} + +QPtrList<QString>& MixDevice::enumValues() { + return _enumValues; +} + + +// @todo Used only at mixdevicewidget.cpp:625 . Replace that ASAP !!! +void MixDevice::setVolume( int channel, int volume ) +{ + _volume.setVolume( (Volume::ChannelID)channel /* ARGH! */, volume ); +} + +QString& MixDevice::getPK() { + return _pk; +} + +void MixDevice::setPK(QString &PK) { + _pk = PK; + // The key is used in the config file. It should not contain spaces + _pk.replace(' ', '_'); +} + +/** + * This mehtod is currently only called on "kmixctrl --restore" + * + * Normally we have a working _volume object already, which is very important, + * because we need to read the minimum and maximum volume levels. + * (Another solutien would be to "equip" volFromConfig with maxInt and minInt values). + */ +void MixDevice::read( KConfig *config, const QString& grp ) +{ + QString devgrp; + devgrp.sprintf( "%s.Dev%i", grp.ascii(), _num ); + config->setGroup( devgrp ); + //kdDebug(67100) << "MixDevice::read() of group devgrp=" << devgrp << endl; + + char *nameLeftVolume, *nameRightVolume; + if ( _volume.isCapture() ) { + nameLeftVolume = "volumeLCapture"; + nameRightVolume = "volumeRCapture"; + } else { + nameLeftVolume = "volumeL"; + nameRightVolume = "volumeR"; + } + Volume::ChannelMask chMask = Volume::MNONE; + int vl = config->readNumEntry(nameLeftVolume, -1); + if (vl!=-1) { + chMask = (Volume::ChannelMask)(chMask | Volume::MLEFT); + } + int vr = config->readNumEntry(nameRightVolume, -1); + if (vr!=-1) { + chMask = (Volume::ChannelMask)(chMask | Volume::MRIGHT); + } + + /* + * Now start construction a temporary Volume object. + * We take the maxvol and minvol values from _volume, which is already constructed. + * Otherwise we would have to wildly guess those values + */ + Volume *volFromConfig = new Volume(chMask, _volume._maxVolume, _volume._minVolume); + if (vl!=-1) { + volFromConfig->setVolume(Volume::LEFT , vl); + } + if (vr!=-1) { + volFromConfig->setVolume(Volume::RIGHT, vr); + } + // commit the read config + _volume.setVolume(*volFromConfig); + delete volFromConfig; + + int mute = config->readNumEntry("is_muted", -1); + if ( mute!=-1 ) { + _volume.setMuted( mute!=0 ); + } + + int recsrc = config->readNumEntry("is_recsrc", -1); + if ( recsrc!=-1 ) { + setRecSource( recsrc!=0 ); + } + + int enumId = config->readNumEntry("enum_id", -1); + if ( enumId != -1 ) { + setEnumId( enumId ); + } +} + +/** + * called on "kmixctrl --save" and from the GUI's (currently only on exit) + */ +void MixDevice::write( KConfig *config, const QString& grp ) +{ + QString devgrp; + devgrp.sprintf( "%s.Dev%i", grp.ascii(), _num ); + config->setGroup(devgrp); + // kdDebug(67100) << "MixDevice::write() of group devgrp=" << devgrp << endl; + char *nameLeftVolume, *nameRightVolume; + if ( _volume.isCapture() ) { + nameLeftVolume = "volumeLCapture"; + nameRightVolume = "volumeRCapture"; + } else { + nameLeftVolume = "volumeL"; + nameRightVolume = "volumeR"; + } + config->writeEntry(nameLeftVolume, getVolume( Volume::LEFT ) ); + config->writeEntry(nameRightVolume, getVolume( Volume::RIGHT ) ); + config->writeEntry("is_muted", (int)_volume.isMuted() ); + config->writeEntry("is_recsrc", (int)isRecSource() ); + config->writeEntry("name", _name); + if ( isEnum() ) { + config->writeEntry("enum_id", enumId() ); + } +} + +#include "mixdevice.moc" + |