|
|
|
//-*-C++-*-
|
|
|
|
/*
|
|
|
|
* KMix -- KDE's full featured mini mixer
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* 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 MIXER_BACKEND_H
|
|
|
|
#define MIXER_BACKEND_H
|
|
|
|
|
|
|
|
#include "mixer.h"
|
|
|
|
|
|
|
|
class Mixer_Backend
|
|
|
|
{
|
|
|
|
// The Mixer Backend's may only be accessed from the Mixer class.
|
|
|
|
friend class Mixer;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
Mixer_Backend(int devnum);
|
|
|
|
virtual ~Mixer_Backend();
|
|
|
|
|
|
|
|
/// Derived classes MUST implement this to open the mixer. Returns a KMix error code (O=OK).
|
|
|
|
virtual int open() = 0;
|
|
|
|
virtual int close() = 0;
|
|
|
|
|
|
|
|
/** Returns, whether this Mixer object contains a valid Mixer. You should return "false", when
|
|
|
|
* the Mixer with the devnum given in the constructor is not supported by the Backend. The two
|
|
|
|
* typical cases are:
|
|
|
|
* (1) No such hardware installed
|
|
|
|
* (2) The hardware exists, but has no mixer support (e.g. external soundcard with only mechanical volume knobs)
|
|
|
|
* The default implementation calls open(), checks the return code and whether the number of
|
|
|
|
* supported channels is > 0. Then it calls close().
|
|
|
|
* You should reimplement this method in your backend, when there is a less time-consuming method than
|
|
|
|
* calling open() and close() for checking the existance of a Mixer.
|
|
|
|
*/
|
|
|
|
virtual bool isValid();
|
|
|
|
|
|
|
|
/** @return true, if the Mixer is open (and thus can be operated) */
|
|
|
|
bool isOpen();
|
|
|
|
|
|
|
|
virtual bool prepareUpdateFromHW();
|
|
|
|
|
|
|
|
/// Volume Read
|
|
|
|
virtual int readVolumeFromHW( int devnum, Volume &vol ) = 0;
|
|
|
|
/// Volume Write
|
|
|
|
virtual int writeVolumeToHW( int devnum, Volume &volume ) = 0;
|
|
|
|
|
|
|
|
/// Enums
|
|
|
|
virtual void setEnumIdHW(int mixerIdx, unsigned int);
|
|
|
|
virtual unsigned int enumIdHW(int mixerIdx);
|
|
|
|
|
|
|
|
/// Recording Switches
|
|
|
|
virtual bool setRecsrcHW( int devnum, bool on) = 0;
|
|
|
|
virtual bool isRecsrcHW( int devnum ) = 0;
|
|
|
|
|
|
|
|
/// Overwrite in the backend if the backend can see changes without polling
|
|
|
|
virtual bool needsPolling() { return true; }
|
|
|
|
|
|
|
|
/** overwrite this if you need to connect to slots in the mixer (e.g. readSetFromHW)
|
|
|
|
this called in the very beginning and only if !needsPolling
|
|
|
|
*/
|
|
|
|
virtual void prepareSignalling( Mixer * ) {}
|
|
|
|
|
|
|
|
MixDevice* recommendedMaster();
|
|
|
|
|
|
|
|
/** Return a translated error text for the given error number.
|
|
|
|
* Subclasses can override this method to produce platform
|
|
|
|
* specific error descriptions.
|
|
|
|
*/
|
|
|
|
virtual QString errorText(int mixer_error);
|
|
|
|
/// Prints out a translated error text for the given error number on stderr
|
|
|
|
void errormsg(int mixer_error);
|
|
|
|
|
|
|
|
|
|
|
|
int m_devnum;
|
|
|
|
/// User friendly name of the Mixer (e.g. "IRIX Audio Mixer"). If your mixer API
|
|
|
|
/// gives you a usable name, use that name.
|
|
|
|
QString m_mixerName;
|
|
|
|
// All mix devices of this phyisical device.
|
|
|
|
MixSet m_mixDevices;
|
|
|
|
|
|
|
|
/******************************************************************************************
|
|
|
|
* Please don't access the next vars from the Mixer class (even though Mixer is a friend).
|
|
|
|
* There are proper accesor methods for them.
|
|
|
|
******************************************************************************************/
|
|
|
|
bool m_isOpen;
|
|
|
|
// The MixDevice that would qualify best as MasterDevice (according to the taste of the Backend developer)
|
|
|
|
MixDevice* m_recommendedMaster;
|
|
|
|
};
|
|
|
|
|
|
|
|
class DevIterator
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
DevIterator();
|
|
|
|
virtual ~DevIterator();
|
|
|
|
virtual void next();
|
|
|
|
virtual int getdev();
|
|
|
|
virtual bool end();
|
|
|
|
protected:
|
|
|
|
int N, NMax;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|