sintonia/library/ecasound-2.7.2/libecasound/eca-audio-format.h

199 lines
4.3 KiB
C++

#ifndef INCLUDED_ECA_AUDIO_FORMAT_H
#define INCLUDED_ECA_AUDIO_FORMAT_H
#include <string>
#include "sample-specs.h"
#include "eca-samplerate-aware.h"
#include "eca-error.h"
/**
* Class that represents audio format parameters. Audio format
* is based on:
*
* - number of channels
*
* - channels interleaving
*
* - representation of individual sample
*/
class ECA_AUDIO_FORMAT : public ECA_SAMPLERATE_AWARE {
public:
/** @name Public type definitions and constants */
/*@{*/
enum Sample_format {
sfmt_none,
sfmt_u8,
sfmt_s8,
sfmt_s16,
sfmt_s16_le,
sfmt_s16_be,
sfmt_s24,
sfmt_s24_le,
sfmt_s24_be,
sfmt_s32,
sfmt_s32_le,
sfmt_s32_be,
sfmt_f32,
sfmt_f32_le,
sfmt_f32_be,
sfmt_f64,
sfmt_f64_le,
sfmt_f64_be
};
enum Sample_endianess {
se_native,
se_big,
se_little
};
enum Sample_coding {
sc_signed,
sc_unsigned,
sc_float
};
/*@}*/
public:
/*@}*/
/** @name Constructors and destructors */
/*@{*/
ECA_AUDIO_FORMAT (int ch, long int srate, Sample_format format, bool ileaved = false);
ECA_AUDIO_FORMAT (void);
virtual ~ECA_AUDIO_FORMAT (void);
/*@}*/
/** @name Public functions for getting audio format information */
/*@{*/
/**
* Returns frame size in bytes (sample size * channels)
*/
int frame_size(void) const { return align_rep * channels_rep; }
/**
* Returns sample size in bytes (size of individual sample value)
*/
int sample_size(void) const { return align_rep; }
/**
* How many bits are used to represent one sample value.
* Notice! This isn't necessarily sample_size() / 8. For example,
* 24bit samples are represented with 32bit values.
*/
int bits(void) const;
/**
* Returns sample format specification. See @ref Sample_format
*/
Sample_format sample_format(void) const;
/**
* Returns sample coding. See @ref Sample_coding
*/
Sample_coding sample_coding(void) const { return sc_rep ; }
/**
* Returns sample endianess. See @ref Sample_endianess
*/
Sample_endianess sample_endianess(void) const { return se_rep; }
/**
* Returns sampling rate in bytes per second (data transfer
* rate).
*/
long int bytes_per_second(void) const { return samples_per_second() * align_rep * channels_rep; }
/**
* Returns number of channels.
*/
SAMPLE_SPECS::channel_t channels(void) const { return channels_rep; }
/**
* Are channels interleaved?
*/
bool interleaved_channels(void) const { return ileaved_rep; }
/**
* Returns an identical audio format object
*/
ECA_AUDIO_FORMAT audio_format(void) const;
/**
* Return the current sample format as a formatted std::string.
*
* @see set_sample_format
*/
std::string format_string(void) const;
/*@}*/
/** @name Public virtual functions for setting audio format information */
/*@{*/
virtual void set_channels(SAMPLE_SPECS::channel_t v);
virtual void set_sample_format(Sample_format v) throw(ECA_ERROR&);
virtual void set_audio_format(const ECA_AUDIO_FORMAT& f_str);
virtual void toggle_interleaved_channels(bool v);
/*@}*/
/** @name Public functions for setting audio format information */
/*@{*/
/**
* Sets sample type based on the formatted std::string given as
* argument.
*
* The first letter is either "u", "s" and "f" (unsigned,
* signed, floating point).
*
* The following number specifies sample size in bits.
*
* If sample is little endian, "_le" is added to the end.
* Similarly if big endian, "_be" is added. This postfix
* can be omitted if applicable.
*/
void set_sample_format_string(const std::string& f_str) throw(ECA_ERROR&);
/**
* Sets the sample endianess to big endian.
*/
void set_sample_coding(Sample_coding v);
/**
* Sets the sample endianess to big endian.
*/
void set_sample_endianess(Sample_endianess v);
/*@}*/
private:
Sample_format string_to_sample_format(const std::string& str) const throw(ECA_ERROR&);
void update_sample_endianess(Sample_endianess v);
bool ileaved_rep;
SAMPLE_SPECS::channel_t channels_rep;
size_t align_rep; // the size of one sample value in bytes
Sample_coding sc_rep;
Sample_endianess se_rep;
};
#endif