You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
arts/flow/audioio.h

146 lines
4.8 KiB

/*
Copyright (C) 2000 Stefan Westerfeld
stefan@space.twc.de
This library 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 library 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 library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef ARTS_AUDIOIO_H
#define ARTS_AUDIOIO_H
#include <startupmanager.h>
#include <string>
#include "arts_export.h"
/*
* BC - Status (2002-03-08): AudioIO, AudioIOFactory
*
* Right now, these classes are considered an implementation detail. No binary
* compatibility guaranteed, its safe to add virtual methods when required.
*/
/*
* The AudioIO class - it is used as follows:
*
* 1. check the settings with getParam, modify what you don't like
* 2. call open -> print getInfo(lastError) if it failed (returned false)
* 3. check whether the settings are still what you expected them to
* be (as the AudioIO class will maybe only know after open if the
* requested parameters can be achieved)
*/
namespace Arts {
class AudioIOPrivate;
class AudioIOFactory;
class ARTS_EXPORT AudioIO {
private:
class AudioIOPrivate *d;
public:
enum AudioParam {
/* the following has to be supported */
samplingRate = 1, /* usually 4000..48000 (Hz) */
channels = 2, /* usually 1 (mono) or 2 (stereo) */
format = 3, /* 8 = 8bit unsigned
* 16 = 16bit signed little endian
* 17 = 16bit signed big endian
* 32 = 32bit float */
/* the following -can- be supported (value=-1 if they are not) */
direction = 101, /* 1 = read, 2 = write, 3 = read|write */
fragmentCount = 102,/* usually 3..16 (to control latency) */
fragmentSize = 103, /* usually 256,512,...8192 (a 2^N value) */
canRead = 104, /* the amount of bytes that can be read */
canWrite = 105, /* the amount of bytes that can be written */
selectReadFD = 106, /* filedescriptor to be select()ed on for reading */
selectWriteFD = 107,/* filedescriptor to be select()ed on for writing */
autoDetect = 108, /* 0 = don't use this as default
* 1 or higher = preference of using this as default
*
* if nothing else is specified, aRts asks all
* available AudioIO classes for the autoDetect
* value and chooses the one which returned the
* highest number */
/* string parameters that have to be supported */
lastError = 201, /* the last error message as human readable text */
/* string parameters that -can- be supported */
deviceName = 301, /* name of the device to open */
/* class parameters: same semantics as above */
name = 1201, /* name of the driver (i.e. oss) */
fullName = 1202 /* full name (i.e. Open Sound System) */
};
enum {
directionRead = 1,
directionWrite = 2,
directionReadWrite = 3
};
AudioIO();
virtual ~AudioIO();
virtual void setParamStr(AudioParam param, const char *value);
virtual void setParam(AudioParam param, int& value);
virtual int getParam(AudioParam param);
virtual const char *getParamStr(AudioParam param);
virtual bool open() = 0;
virtual void close() = 0;
virtual int read(void *buffer, int size) = 0;
virtual int write(void *buffer, int size) = 0;
/* ---- factory querying stuff ---- */
static int queryAudioIOCount();
static int queryAudioIOParam(int audioIO, AudioParam param);
static const char *queryAudioIOParamStr(int audioIO, AudioParam param);
/* ---- factory stuff ---- */
static AudioIO *createAudioIO(const char *name);
static void addFactory(AudioIOFactory *factory);
static void removeFactory(AudioIOFactory *factory);
protected:
int& param(AudioParam param);
std::string& paramStr(AudioParam param);
};
class ARTS_EXPORT AudioIOFactory : public StartupClass {
public:
void startup();
void shutdown();
virtual AudioIO *createAudioIO() = 0;
virtual const char *name() = 0;
virtual const char *fullName() = 0;
};
}
#define REGISTER_AUDIO_IO(impl,implName,implFullName) \
static class AudioIOFactory ## impl : public AudioIOFactory { \
public: \
AudioIO *createAudioIO() { return new impl(); } \
virtual const char *name() { return implName; } \
virtual const char *fullName() { return implFullName; } \
} The_ ## impl ## _Factory /* <- add semicolon when calling this macro */
#endif /* ARTS_AUDIOIO_H */