sintonia/library/ecasound-2.7.2/libecasound/audioio-seqbase.h

176 lines
4.3 KiB
C++

#ifndef INCLUDED_AUDIOIO_SEQUENCER_BASE_H
#define INCLUDED_AUDIOIO_SEQUENCER_BASE_H
#include <string>
#include "audioio-proxy.h"
#include "samplebuffer.h"
#include "eca-audio-time.h"
/**
* Base class for audio sequencer objects.
*
* Audio sequencer objects open one or more child objects
* and alter the sequence of audio that is read from them.
* Common operations are changing the position (inserting
* silence at start, slicing), and looping of segments.
*
* The child objects also implement the AUDIO_IO interface,
* or one of the more specialized subclasses.
*
* Related design patterns:
* - Proxy (GoF207)
*
* @author Kai Vehmanen
*/
class AUDIO_SEQUENCER_BASE : public AUDIO_IO_PROXY {
public:
/** @name Public functions */
/*@{*/
AUDIO_SEQUENCER_BASE ();
virtual ~AUDIO_SEQUENCER_BASE(void);
/*@}*/
/** @name Reimplemented functions from ECA_OBJECT */
/*@{*/
/* Pure virtual class, not implemented */
/*@}*/
/** @name Reimplemented functions from DYNAMIC_PARAMETERS<string> */
/*@{*/
/* none */
/*@}*/
/** @name Reimplemented functions from DYNAMIC_OBJECT<string> */
/*@{*/
virtual AUDIO_SEQUENCER_BASE* clone(void) const;
virtual AUDIO_SEQUENCER_BASE* new_expr(void) const { return new AUDIO_SEQUENCER_BASE(); }
/*@}*/
/** @name Reimplemented functions from ECA_AUDIO_POSITION */
/*@{*/
virtual SAMPLE_SPECS::sample_pos_t seek_position(SAMPLE_SPECS::sample_pos_t pos);
/*@}*/
/** @name Reimplemented functions from AUDIO_IO */
/*@{*/
virtual bool finite_length_stream(void) const;
virtual bool finished(void) const;
virtual void read_buffer(SAMPLE_BUFFER* sbuf);
virtual void write_buffer(SAMPLE_BUFFER* sbuf);
virtual void open(void) throw(AUDIO_IO::SETUP_ERROR&);
virtual void close(void);
/*@}*/
/** @name New functions */
/*@{*/
/**
* Sets the child object to open. Argument 'v' should
* be a string suitable for passing to ECA_OBJECT_MAP::object(),
* i.e. a Ecasound Option Syntax (EOS) string.
*/
void set_child_object_string(const std::string& v);
const std::string& child_object_string(void) const { return child_object_str_rep; }
/**
* Sets start offset for the child object.
*
* At this offset, samples from the child start to
* be read.
*
* If not set, defaults to zero offset (start
* consuming child object samples from the beginning).
*/
void set_child_offset(const ECA_AUDIO_TIME& v);
const ECA_AUDIO_TIME& child_offset(void) const { return child_offset_rep; }
/**
* Set start position inside child object.
*
* This is the position, within the child object, where
* first samples will be read.
*
* If not set, defaults to zero (read from start of
* child object).
*/
void set_child_start_position(const ECA_AUDIO_TIME& v);
const ECA_AUDIO_TIME& child_start_position(void) const { return child_start_pos_rep; }
/**
* Set the child length.
*
* If not set, defaults to the total length of
* the child object.
*
* @see reset_child_length(void);
*/
void set_child_length(const ECA_AUDIO_TIME& v);
/**
* Returns the child length.
*
* Note that in the case that child length is infinite,
* the returned object may be invalid (ECA_AUDIO_TIME::valid()
* returns false). So caller must check validity of
* the returned value before using it.
*/
ECA_AUDIO_TIME child_length(void) const;
/**
* Toggle whether child object data is looped.
*/
void toggle_looping(bool v) { child_looping_rep = v; }
bool child_looping(void) const { return child_looping_rep; }
/*@}*/
protected:
void dump_child_debug(const char *tag);
void set_child_length_private(const ECA_AUDIO_TIME& v);
SAMPLE_SPECS::sample_pos_t priv_public_to_child_pos(SAMPLE_SPECS::sample_pos_t pubpos) const;
private:
SAMPLE_BUFFER tmp_buffer;
bool child_looping_rep;
ECA_AUDIO_TIME child_offset_rep,
child_start_pos_rep,
child_length_rep;
bool child_length_set_by_client_rep;
std::string child_object_str_rep;
long int buffersize_rep;
bool child_write_started;
bool init_rep;
void change_child_name(const string& child_name) throw(AUDIO_IO::SETUP_ERROR &);
AUDIO_SEQUENCER_BASE& operator=(const AUDIO_SEQUENCER_BASE& x) { return *this; }
AUDIO_SEQUENCER_BASE (const AUDIO_SEQUENCER_BASE& x) { }
};
#endif