214 lines
5.2 KiB
C++
214 lines
5.2 KiB
C++
#ifndef INCLUDED_AUDIOIO_DEVICE_H
|
|
#define INCLUDED_AUDIOIO_DEVICE_H
|
|
|
|
#include "audioio-buffered.h"
|
|
|
|
/**
|
|
* Virtual base class for real-time devices.
|
|
*
|
|
* A realtime device...
|
|
*
|
|
* - is disabled after device is opened
|
|
*
|
|
* - is enabled with start()
|
|
*
|
|
* - once enabled, will handle I/O at a constant speed
|
|
* based on the sample format paremeters
|
|
*
|
|
* - is disabled with stop()
|
|
*
|
|
* @author Kai Vehmanen
|
|
*/
|
|
class AUDIO_IO_DEVICE : public AUDIO_IO_BUFFERED {
|
|
|
|
public:
|
|
|
|
/** @name Public static functions */
|
|
/*@{*/
|
|
|
|
/**
|
|
* Whether given object is an AUDIO_IO_DEVICE object.
|
|
*/
|
|
static bool is_realtime_object(const AUDIO_IO* aobj);
|
|
|
|
/*@}*/
|
|
|
|
/** @name Constructors and destructors */
|
|
/*@{*/
|
|
|
|
AUDIO_IO_DEVICE(void);
|
|
virtual ~AUDIO_IO_DEVICE(void);
|
|
|
|
/*@}*/
|
|
|
|
/** @name Configuration
|
|
*
|
|
* For setting and getting configuration parameters.
|
|
*/
|
|
/*@{*/
|
|
|
|
/**
|
|
* Whether to ignore possible under- and overrun
|
|
* situations. If enabled, device should try to
|
|
* recover from these situations, ie. keep on
|
|
* running. If disabled, processing should be aborted
|
|
* if an xrun occurs. Should be set before opening
|
|
* the device. Defaults to 'true'.
|
|
*
|
|
* @pre is_open() != true
|
|
*/
|
|
virtual void toggle_ignore_xruns(bool v) { ignore_xruns_rep = v; }
|
|
|
|
/**
|
|
* Whether the device should maximize the use
|
|
* of internal buffering. If disabled, the device
|
|
* should use minimal amount of internal buffering. The
|
|
* recommended size is two or three fragments, each
|
|
* buffersize() sample frames in size. If enabled,
|
|
* device is free to use as much as buffering as
|
|
* is possible. The default state is enabled.
|
|
*
|
|
* The exact amount of buffering can be checked
|
|
* with the latency() function.
|
|
*
|
|
* @pre is_open() != true
|
|
*/
|
|
virtual void toggle_max_buffers(bool v) { max_buffers_rep = v; }
|
|
|
|
/**
|
|
* Returns the current setting for xrun handling.
|
|
*/
|
|
virtual bool ignore_xruns(void) const { return ignore_xruns_rep; }
|
|
|
|
/**
|
|
* Returns the current setting for how internal
|
|
* buffering is used.
|
|
*/
|
|
virtual bool max_buffers(void) const { return max_buffers_rep; }
|
|
|
|
/**
|
|
* Returns the systematic latency in sample frames.
|
|
* This value is usually a multiple of buffersize().
|
|
* Note that the latency introduced by prefilling
|
|
* outputs is not included in this figure.
|
|
*
|
|
* @see delay()
|
|
* @see prefill_space()
|
|
*
|
|
* @pre is_open() == true
|
|
*/
|
|
virtual long int latency(void) const { return 0; }
|
|
|
|
/**
|
|
* How much data in sample frames can be prefilled
|
|
* to a output device before processing is started
|
|
* with start() (after prepare())?
|
|
*
|
|
* Note! Prefilling will have an affect to
|
|
* output latency.
|
|
*
|
|
* @see latency()
|
|
*/
|
|
virtual long int prefill_space(void) const { return 0; }
|
|
|
|
/*@}*/
|
|
|
|
/** @name Main functionality */
|
|
/*@{*/
|
|
|
|
/**
|
|
* Prepare device for processing. After this call, device is
|
|
* ready for input/output (buffer can be pre-filled).
|
|
*
|
|
* require:
|
|
* is_running() != true
|
|
*
|
|
* ensure:
|
|
* (io_mode() == si_read && readable() == true) || writable()
|
|
*/
|
|
virtual void prepare(void) { is_prepared_rep = true; }
|
|
|
|
/**
|
|
* Start prosessing sample data. Underruns will occur if the
|
|
* calling program can't handle data at the speed of the
|
|
* source device. Write_buffer() calls are blocked if necessary.
|
|
*
|
|
* Note! For output devices, at least one buffer of data
|
|
* must have been written before issuing start()!
|
|
*
|
|
* require:
|
|
* is_running() != true
|
|
* is_prepared() == true
|
|
*
|
|
* ensure:
|
|
* is_running() == true
|
|
*/
|
|
virtual void start(void) { is_running_rep = true; }
|
|
|
|
/**
|
|
* Stop processing. Doesn't usually concern non-realtime devices.
|
|
* I/O is not allowed after this call. This should be used when
|
|
* audio object is not going to be used for a while.
|
|
*
|
|
* require:
|
|
* is_running() == true
|
|
*
|
|
* ensure:
|
|
* is_running() != true
|
|
* is_prepared() != true
|
|
* readable() == false
|
|
* writable() == false
|
|
*/
|
|
virtual void stop(void) { is_running_rep = false; is_prepared_rep = false; }
|
|
|
|
/*@}*/
|
|
|
|
/** @name Runtime information */
|
|
/*@{*/
|
|
|
|
/**
|
|
* Returns the delay between current read/write position
|
|
* and the exact hardware i/o location. For instance
|
|
* with soundcard hardware this value tells the distance
|
|
* to the exact audio frame currently being played or
|
|
* recorded.
|
|
*
|
|
* @see latency()
|
|
* @see position_in_samples()
|
|
*
|
|
* @pre is_running() == true
|
|
* @post delay() <= latency()
|
|
*/
|
|
virtual long int delay(void) const { return 0; }
|
|
|
|
/**
|
|
* Whether device has been started?
|
|
*/
|
|
bool is_running(void) const { return is_running_rep; }
|
|
|
|
/**
|
|
* Whether device has been prepared for processing?
|
|
*/
|
|
bool is_prepared(void) const { return is_prepared_rep; }
|
|
|
|
/*@}*/
|
|
|
|
/** @name Functions reimplemented from AUDIO_IO */
|
|
/*@{*/
|
|
|
|
virtual bool supports_seeking(void) const { return true; }
|
|
virtual bool finished(void) const { return is_open() == false; }
|
|
virtual std::string status(void) const;
|
|
|
|
/*@}*/
|
|
|
|
private:
|
|
|
|
bool is_running_rep;
|
|
bool is_prepared_rep;
|
|
bool ignore_xruns_rep;
|
|
bool max_buffers_rep;
|
|
};
|
|
|
|
#endif
|