mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-24 10:52:53 +00:00
245 lines
7.4 KiB
C
245 lines
7.4 KiB
C
![]() |
/*
|
||
|
* KMix -- KDE's full featured mini mixer
|
||
|
*
|
||
|
* Copyright 2006-2007 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
*/
|
||
|
|
||
|
#ifndef _GUIPROFILE_H_
|
||
|
#define _GUIPROFILE_H_
|
||
|
|
||
|
class Mixer;
|
||
|
|
||
|
#include <qxml.h>
|
||
|
#include <QColor>
|
||
|
#include <QTextStream>
|
||
|
#include <QString>
|
||
|
|
||
|
#include <string>
|
||
|
#include <map>
|
||
|
#include <set>
|
||
|
#include <vector>
|
||
|
#include <ostream>
|
||
|
|
||
|
#include <KDebug>
|
||
|
|
||
|
struct SortedStringComparator
|
||
|
{
|
||
|
bool operator()(const std::string&, const std::string&) const;
|
||
|
};
|
||
|
|
||
|
|
||
|
struct ProfProduct
|
||
|
{
|
||
|
QString vendor;
|
||
|
QString productName;
|
||
|
// In case the vendor ships different products under the same productName
|
||
|
QString productRelease;
|
||
|
QString comment;
|
||
|
};
|
||
|
|
||
|
class ProfControlPrivate
|
||
|
{
|
||
|
public:
|
||
|
// List of controls, e.g: "rec:1-2,recswitch"
|
||
|
// THIS IS RAW DATA AS LOADED FROM THE PROFILE. DO NOT USE IT, except for debugging.
|
||
|
QString subcontrols;
|
||
|
|
||
|
};
|
||
|
|
||
|
class ProfControl
|
||
|
{
|
||
|
public:
|
||
|
ProfControl(QString& id, QString& subcontrols);
|
||
|
ProfControl(const ProfControl &ctl); // copy constructor
|
||
|
~ProfControl();
|
||
|
// ID as returned by the Mixer Backend, e.g. Master:0
|
||
|
QString id;
|
||
|
|
||
|
void setSubcontrols(QString sctls);
|
||
|
bool useSubcontrolPlayback() {return _useSubcontrolPlayback;};
|
||
|
bool useSubcontrolCapture() {return _useSubcontrolCapture;};
|
||
|
bool useSubcontrolPlaybackSwitch() {return _useSubcontrolPlaybackSwitch;};
|
||
|
bool useSubcontrolCaptureSwitch() {return _useSubcontrolCaptureSwitch;};
|
||
|
bool useSubcontrolEnum() {return _useSubcontrolEnum;};
|
||
|
QString renderSubcontrols();
|
||
|
|
||
|
QString getBackgroundColor() const { return backgroundColor; }
|
||
|
void setBackgroundColor(QString& backgroundColor) { this->backgroundColor = backgroundColor; }
|
||
|
QString getSwitchtype() const { return switchtype; }
|
||
|
void setSwitchtype(QString switchtype) { this->switchtype = switchtype; }
|
||
|
|
||
|
// Visible name for the User ( if name.isNull(), id will be used - And in the future a default lookup table will be consulted ).
|
||
|
// Because the name is visible, some kind of i18n() should be used.
|
||
|
QString name;
|
||
|
|
||
|
void setVisible(bool);
|
||
|
// show or hide (contains the GUI type: simple, extended, all)
|
||
|
// Future direction: Make "show" private
|
||
|
QString show;
|
||
|
|
||
|
bool isMandatory() const
|
||
|
{
|
||
|
return _mandatory;
|
||
|
}
|
||
|
|
||
|
void setMandatory(bool _mandatory)
|
||
|
{
|
||
|
this->_mandatory = _mandatory;
|
||
|
}
|
||
|
void setSplit ( bool split ) {
|
||
|
_split = split;
|
||
|
}
|
||
|
bool isSplit() const {
|
||
|
return _split;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
// The following are the deserialized values of _subcontrols
|
||
|
bool _useSubcontrolPlayback;
|
||
|
bool _useSubcontrolCapture;
|
||
|
bool _useSubcontrolPlaybackSwitch;
|
||
|
bool _useSubcontrolCaptureSwitch;
|
||
|
bool _useSubcontrolEnum;
|
||
|
|
||
|
// For applying custom colors
|
||
|
QString backgroundColor;
|
||
|
// For defining the switch type when it is not a standard palyback or capture switch
|
||
|
QString switchtype;
|
||
|
|
||
|
bool _mandatory; // A mandatory control must be included in all GUIProfile copies
|
||
|
|
||
|
ProfControlPrivate *d;
|
||
|
bool _split; // true if this widget is to show two sliders
|
||
|
};
|
||
|
|
||
|
|
||
|
struct ProductComparator
|
||
|
{
|
||
|
bool operator()(const ProfProduct*, const ProfProduct*) const;
|
||
|
};
|
||
|
|
||
|
class GUIProfile
|
||
|
{
|
||
|
public:
|
||
|
typedef std::set<ProfProduct*, ProductComparator> ProductSet;
|
||
|
typedef QList<ProfControl*> ControlSet;
|
||
|
|
||
|
static const QString PNameSimple;
|
||
|
static const QString PNameExtended;
|
||
|
static const QString PNameAll;
|
||
|
static const QString PNameCustom;
|
||
|
|
||
|
private:
|
||
|
static QMap<QString, GUIProfile*>& getProfiles() { return s_profiles; }
|
||
|
// Loading
|
||
|
static QString buildProfileName(Mixer* mixer, QString profileName, bool ignoreCard);
|
||
|
static QString buildReadableProfileName(Mixer* mixer, QString profileName);
|
||
|
|
||
|
static GUIProfile* loadProfileFromXMLfiles(Mixer* mixer, QString profileName);
|
||
|
static void addProfile(GUIProfile* guiprof);
|
||
|
static const QString createNormalizedFilename(const QString& profileId);
|
||
|
|
||
|
static QMap<QString, GUIProfile*> s_profiles;
|
||
|
|
||
|
|
||
|
public:
|
||
|
GUIProfile();
|
||
|
virtual ~GUIProfile();
|
||
|
|
||
|
static void clearCache();
|
||
|
|
||
|
bool readProfile(const QString& ref_fileNamestring);
|
||
|
bool finalizeProfile() const;
|
||
|
bool writeProfile();
|
||
|
|
||
|
bool isDirty() const;
|
||
|
void setDirty();
|
||
|
|
||
|
void setId(const QString& id);
|
||
|
QString getId() const;
|
||
|
QString getMixerId() const { return _mixerId; }
|
||
|
|
||
|
|
||
|
unsigned long match(Mixer* mixer);
|
||
|
friend std::ostream& operator<<(std::ostream& os, const GUIProfile& vol);
|
||
|
friend QTextStream& operator<<(QTextStream &outStream, const GUIProfile& guiprof);
|
||
|
|
||
|
|
||
|
|
||
|
static GUIProfile* find(Mixer* mixer, QString profileName, bool profileNameIsFullyQualified, bool ignoreCardName);
|
||
|
static GUIProfile* find(QString id);
|
||
|
static GUIProfile* selectProfileFromXMLfiles(Mixer*, QString preferredProfile);
|
||
|
static GUIProfile* fallbackProfile(Mixer*);
|
||
|
|
||
|
// --- Getters and setters ----------------------------------------------------------------------
|
||
|
const ControlSet& getControls() const;
|
||
|
ControlSet& getControls();
|
||
|
void setControls(ControlSet& newControlSet);
|
||
|
|
||
|
QString getName() const { return _name; }
|
||
|
void setName(QString _name) { this->_name = _name; }
|
||
|
|
||
|
void addProduct(ProfProduct*);
|
||
|
|
||
|
|
||
|
// --- The values from the <soundcard> tag: No getters and setters for them (yet) -----------------------------
|
||
|
QString _soundcardDriver;
|
||
|
// The driver version: 1000*1000*MAJOR + 1000*MINOR + PATCHLEVEL
|
||
|
unsigned long _driverVersionMin;
|
||
|
unsigned long _driverVersionMax;
|
||
|
QString _soundcardName;
|
||
|
QString _soundcardType;
|
||
|
unsigned long _generation;
|
||
|
|
||
|
private:
|
||
|
ControlSet _controls;
|
||
|
ProductSet _products;
|
||
|
|
||
|
QString _id;
|
||
|
QString _name;
|
||
|
QString _mixerId;
|
||
|
bool _dirty;
|
||
|
};
|
||
|
|
||
|
std::ostream& operator<<(std::ostream& os, const GUIProfile& vol);
|
||
|
QTextStream& operator<<(QTextStream &outStream, const GUIProfile& guiprof);
|
||
|
|
||
|
class GUIProfileParser : public QXmlDefaultHandler
|
||
|
{
|
||
|
public:
|
||
|
GUIProfileParser(GUIProfile* ref_gp);
|
||
|
// Enumeration for the scope
|
||
|
enum ProfileScope { NONE, SOUNDCARD };
|
||
|
|
||
|
bool startDocument();
|
||
|
bool startElement( const QString&, const QString&, const QString& , const QXmlAttributes& );
|
||
|
bool endElement( const QString&, const QString&, const QString& );
|
||
|
|
||
|
private:
|
||
|
void addControl(const QXmlAttributes& attributes);
|
||
|
void addProduct(const QXmlAttributes& attributes);
|
||
|
void addSoundcard(const QXmlAttributes& attributes);
|
||
|
void addProfileInfo(const QXmlAttributes& attributes);
|
||
|
void printAttributes(const QXmlAttributes& attributes);
|
||
|
void splitPair(const QString& pairString, std::pair<QString,QString>& result, char delim);
|
||
|
|
||
|
ProfileScope _scope;
|
||
|
GUIProfile* _guiProfile;
|
||
|
};
|
||
|
|
||
|
#endif //_GUIPROFILE_H_
|