kwave  18.07.70
Kwave::SampleEncoderLinear Class Reference

#include <SampleEncoderLinear.h>

Inheritance diagram for Kwave::SampleEncoderLinear:
Inheritance graph
Collaboration diagram for Kwave::SampleEncoderLinear:
Collaboration graph

Public Member Functions

 SampleEncoderLinear (Kwave::SampleFormat::Format sample_format, unsigned int bits_per_sample, Kwave::byte_order_t endianness)
 
virtual ~SampleEncoderLinear () Q_DECL_OVERRIDE
 
virtual void encode (const Kwave::SampleArray &samples, unsigned int count, QByteArray &raw_data) Q_DECL_OVERRIDE
 
virtual unsigned int rawBytesPerSample () Q_DECL_OVERRIDE
 
- Public Member Functions inherited from Kwave::SampleEncoder
 SampleEncoder ()
 
virtual ~SampleEncoder ()
 

Private Attributes

unsigned int m_bytes_per_sample
 
void(* m_encoder )(const sample_t *, quint8 *, unsigned int)
 

Detailed Description

Definition at line 31 of file SampleEncoderLinear.h.

Constructor & Destructor Documentation

◆ SampleEncoderLinear()

Kwave::SampleEncoderLinear::SampleEncoderLinear ( Kwave::SampleFormat::Format  sample_format,
unsigned int  bits_per_sample,
Kwave::byte_order_t  endianness 
)

Constructor

Parameters
sample_formatindex of the sample format (signed/unsigned)
bits_per_samplenumber of bits per sample in the raw data
endiannesseither SOURCE_LITTLE_ENDIAN or SOURCE_BIG_ENDIAN

Definition at line 108 of file SampleEncoderLinear.cpp.

References Kwave::BigEndian, Kwave::CpuEndian, encode_NULL(), Kwave::LittleEndian, m_bytes_per_sample, m_encoder, MAKE_ENCODER, Kwave::SampleFormat::Signed, Kwave::UnknownEndian, and Kwave::SampleFormat::Unsigned.

113  :SampleEncoder(),
114  m_bytes_per_sample((bits_per_sample + 7) >> 3),
116 {
117  // sanity checks: we support only signed/unsigned and big/little endian
118  Q_ASSERT((sample_format == Kwave::SampleFormat::Signed) ||
119  (sample_format == Kwave::SampleFormat::Unsigned));
120  if ((sample_format != Kwave::SampleFormat::Signed) &&
121  (sample_format != Kwave::SampleFormat::Unsigned)) return;
122 
123  // allow unknown endianness only with 8 bits
124  Q_ASSERT((endianness != Kwave::UnknownEndian) || (m_bytes_per_sample == 1));
125  if ( (endianness == Kwave::UnknownEndian) &&
126  (m_bytes_per_sample != 1) ) return;
127 
128  // map cpu endianness to little or big
129 #if Q_BYTE_ORDER == Q_BIG_ENDIAN
130  if (endianness == Kwave::CpuEndian) endianness = Kwave::BigEndian;
131 #else
132  if (endianness == Kwave::CpuEndian) endianness = Kwave::LittleEndian;
133 #endif
134 
135 // qDebug("SampleEncoderLinear::SampleEncoderLinear(fmt=%s, "
136 // "%u bit [%u bytes], endian=%s)",
137 // (sample_format == Kwave::SampleFormat::Signed) ?
138 // "signed" : "unsigned",
139 // bits_per_sample, m_bytes_per_sample,
140 // (endianness == Kwave::BigEndian) ? "BE" : "LE");
141 
142  switch (bits_per_sample) {
143  case 8:
144  MAKE_ENCODER(8);
145  break;
146  case 16:
147  MAKE_ENCODER(16);
148  break;
149  case 18:
150  MAKE_ENCODER(18);
151  break;
152  case 20:
153  MAKE_ENCODER(20);
154  break;
155  case 24:
156  MAKE_ENCODER(24);
157  break;
158  case 32:
159  MAKE_ENCODER(32);
160  break;
161  }
162 
163  Q_ASSERT(m_encoder != encode_NULL);
164 }
#define MAKE_ENCODER(bits)
void(* m_encoder)(const sample_t *, quint8 *, unsigned int)
static void encode_NULL(const sample_t *src, quint8 *dst, unsigned int count)
Here is the call graph for this function:

◆ ~SampleEncoderLinear()

Kwave::SampleEncoderLinear::~SampleEncoderLinear ( )
virtual

Destructor

Definition at line 167 of file SampleEncoderLinear.cpp.

168 {
169 }

Member Function Documentation

◆ encode()

void Kwave::SampleEncoderLinear::encode ( const Kwave::SampleArray samples,
unsigned int  count,
QByteArray &  raw_data 
)
virtual

Encodes a buffer with samples into a buffer with raw data.

Parameters
samplesarray with samples
countnumber of samples
raw_dataarray with raw encoded audio data

Implements Kwave::SampleEncoder.

Definition at line 172 of file SampleEncoderLinear.cpp.

References Kwave::SampleArray::constData(), m_bytes_per_sample, m_encoder, and Kwave::toUint().

175 {
176  Q_ASSERT(m_encoder);
177  if (!m_encoder) return;
178 
179  Q_ASSERT(count * m_bytes_per_sample <= Kwave::toUint(raw_data.size()));
180  if (count * m_bytes_per_sample > Kwave::toUint(raw_data.size())) return;
181 
182  const sample_t *src = samples.constData();
183  quint8 *dst = reinterpret_cast<quint8 *>(raw_data.data());
184 
185  m_encoder(src, dst, count);
186 }
void(* m_encoder)(const sample_t *, quint8 *, unsigned int)
const sample_t * constData() const
Definition: SampleArray.h:54
unsigned int toUint(T x)
Definition: Utils.h:109
qint32 sample_t
Definition: Sample.h:37
Here is the call graph for this function:

◆ rawBytesPerSample()

unsigned int Kwave::SampleEncoderLinear::rawBytesPerSample ( )
virtual

Returns the number of bytes per sample in raw (encoded) form

Implements Kwave::SampleEncoder.

Definition at line 189 of file SampleEncoderLinear.cpp.

References m_bytes_per_sample.

190 {
191  return m_bytes_per_sample;
192 }

Member Data Documentation

◆ m_bytes_per_sample

unsigned int Kwave::SampleEncoderLinear::m_bytes_per_sample
private

number of bytes per raw sample

Definition at line 64 of file SampleEncoderLinear.h.

Referenced by encode(), rawBytesPerSample(), and SampleEncoderLinear().

◆ m_encoder

void(* Kwave::SampleEncoderLinear::m_encoder) (const sample_t *, quint8 *, unsigned int)
private

optimized function used for encoding the given format

Definition at line 67 of file SampleEncoderLinear.h.

Referenced by encode(), and SampleEncoderLinear().


The documentation for this class was generated from the following files: