PcmConvert: add methods Open(), Close()
Replaces Reset() and eliminates the AudioFormat parameters from the Convert() method.
This commit is contained in:
+44
-24
@@ -32,23 +32,48 @@ const Domain pcm_convert_domain("pcm_convert");
|
||||
|
||||
PcmConvert::PcmConvert()
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
src_format.Clear();
|
||||
dest_format.Clear();
|
||||
#endif
|
||||
}
|
||||
|
||||
PcmConvert::~PcmConvert()
|
||||
{
|
||||
assert(!src_format.IsValid());
|
||||
assert(!dest_format.IsValid());
|
||||
}
|
||||
|
||||
bool
|
||||
PcmConvert::Open(AudioFormat _src_format, AudioFormat _dest_format,
|
||||
gcc_unused Error &error)
|
||||
{
|
||||
assert(!src_format.IsValid());
|
||||
assert(!dest_format.IsValid());
|
||||
assert(_src_format.IsValid());
|
||||
assert(_dest_format.IsValid());
|
||||
|
||||
src_format = _src_format;
|
||||
dest_format = _dest_format;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
PcmConvert::Reset()
|
||||
PcmConvert::Close()
|
||||
{
|
||||
dsd.Reset();
|
||||
resampler.Reset();
|
||||
|
||||
#ifndef NDEBUG
|
||||
src_format.Clear();
|
||||
dest_format.Clear();
|
||||
#endif
|
||||
}
|
||||
|
||||
inline const int16_t *
|
||||
PcmConvert::Convert16(const AudioFormat src_format,
|
||||
const void *src_buffer, size_t src_size,
|
||||
const AudioFormat dest_format, size_t *dest_size_r,
|
||||
PcmConvert::Convert16(const void *src_buffer, size_t src_size,
|
||||
size_t *dest_size_r,
|
||||
Error &error)
|
||||
{
|
||||
const int16_t *buf;
|
||||
@@ -96,9 +121,8 @@ PcmConvert::Convert16(const AudioFormat src_format,
|
||||
}
|
||||
|
||||
inline const int32_t *
|
||||
PcmConvert::Convert24(const AudioFormat src_format,
|
||||
const void *src_buffer, size_t src_size,
|
||||
const AudioFormat dest_format, size_t *dest_size_r,
|
||||
PcmConvert::Convert24(const void *src_buffer, size_t src_size,
|
||||
size_t *dest_size_r,
|
||||
Error &error)
|
||||
{
|
||||
const int32_t *buf;
|
||||
@@ -145,9 +169,8 @@ PcmConvert::Convert24(const AudioFormat src_format,
|
||||
}
|
||||
|
||||
inline const int32_t *
|
||||
PcmConvert::Convert32(const AudioFormat src_format,
|
||||
const void *src_buffer, size_t src_size,
|
||||
const AudioFormat dest_format, size_t *dest_size_r,
|
||||
PcmConvert::Convert32(const void *src_buffer, size_t src_size,
|
||||
size_t *dest_size_r,
|
||||
Error &error)
|
||||
{
|
||||
const int32_t *buf;
|
||||
@@ -194,9 +217,8 @@ PcmConvert::Convert32(const AudioFormat src_format,
|
||||
}
|
||||
|
||||
inline const float *
|
||||
PcmConvert::ConvertFloat(const AudioFormat src_format,
|
||||
const void *src_buffer, size_t src_size,
|
||||
const AudioFormat dest_format, size_t *dest_size_r,
|
||||
PcmConvert::ConvertFloat(const void *src_buffer, size_t src_size,
|
||||
size_t *dest_size_r,
|
||||
Error &error)
|
||||
{
|
||||
const float *buffer = (const float *)src_buffer;
|
||||
@@ -251,9 +273,7 @@ PcmConvert::ConvertFloat(const AudioFormat src_format,
|
||||
}
|
||||
|
||||
const void *
|
||||
PcmConvert::Convert(AudioFormat src_format,
|
||||
const void *src, size_t src_size,
|
||||
const AudioFormat dest_format,
|
||||
PcmConvert::Convert(const void *src, size_t src_size,
|
||||
size_t *dest_size_r,
|
||||
Error &error)
|
||||
{
|
||||
@@ -279,23 +299,23 @@ PcmConvert::Convert(AudioFormat src_format,
|
||||
|
||||
switch (dest_format.format) {
|
||||
case SampleFormat::S16:
|
||||
return Convert16(src_format, src, src_size,
|
||||
dest_format, dest_size_r,
|
||||
return Convert16(src, src_size,
|
||||
dest_size_r,
|
||||
error);
|
||||
|
||||
case SampleFormat::S24_P32:
|
||||
return Convert24(src_format, src, src_size,
|
||||
dest_format, dest_size_r,
|
||||
return Convert24(src, src_size,
|
||||
dest_size_r,
|
||||
error);
|
||||
|
||||
case SampleFormat::S32:
|
||||
return Convert32(src_format, src, src_size,
|
||||
dest_format, dest_size_r,
|
||||
return Convert32(src, src_size,
|
||||
dest_size_r,
|
||||
error);
|
||||
|
||||
case SampleFormat::FLOAT:
|
||||
return ConvertFloat(src_format, src, src_size,
|
||||
dest_format, dest_size_r,
|
||||
return ConvertFloat(src, src_size,
|
||||
dest_size_r,
|
||||
error);
|
||||
|
||||
default:
|
||||
|
||||
+16
-20
@@ -24,10 +24,10 @@
|
||||
#include "PcmDsd.hxx"
|
||||
#include "PcmResample.hxx"
|
||||
#include "PcmBuffer.hxx"
|
||||
#include "AudioFormat.hxx"
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
struct AudioFormat;
|
||||
class Error;
|
||||
|
||||
/**
|
||||
@@ -48,17 +48,23 @@ class PcmConvert {
|
||||
/** the buffer for converting the channel count */
|
||||
PcmBuffer channels_buffer;
|
||||
|
||||
AudioFormat src_format, dest_format;
|
||||
|
||||
public:
|
||||
PcmConvert();
|
||||
~PcmConvert();
|
||||
|
||||
/**
|
||||
* Prepare the object. Call Close() when done.
|
||||
*/
|
||||
bool Open(AudioFormat _src_format, AudioFormat _dest_format,
|
||||
Error &error);
|
||||
|
||||
/**
|
||||
* Reset the pcm_convert_state object. Use this at the
|
||||
* boundary between two distinct songs and each time the
|
||||
* format changes.
|
||||
* Close the object after it was prepared with Open(). After
|
||||
* that, it may be reused by calling Open() again.
|
||||
*/
|
||||
void Reset();
|
||||
void Close();
|
||||
|
||||
/**
|
||||
* Converts PCM data between two audio formats.
|
||||
@@ -72,34 +78,24 @@ public:
|
||||
* ignore errors
|
||||
* @return the destination buffer, or NULL on error
|
||||
*/
|
||||
const void *Convert(AudioFormat src_format,
|
||||
const void *src, size_t src_size,
|
||||
AudioFormat dest_format,
|
||||
const void *Convert(const void *src, size_t src_size,
|
||||
size_t *dest_size_r,
|
||||
Error &error);
|
||||
|
||||
private:
|
||||
const int16_t *Convert16(AudioFormat src_format,
|
||||
const void *src_buffer, size_t src_size,
|
||||
AudioFormat dest_format,
|
||||
const int16_t *Convert16(const void *src_buffer, size_t src_size,
|
||||
size_t *dest_size_r,
|
||||
Error &error);
|
||||
|
||||
const int32_t *Convert24(AudioFormat src_format,
|
||||
const void *src_buffer, size_t src_size,
|
||||
AudioFormat dest_format,
|
||||
const int32_t *Convert24(const void *src_buffer, size_t src_size,
|
||||
size_t *dest_size_r,
|
||||
Error &error);
|
||||
|
||||
const int32_t *Convert32(AudioFormat src_format,
|
||||
const void *src_buffer, size_t src_size,
|
||||
AudioFormat dest_format,
|
||||
const int32_t *Convert32(const void *src_buffer, size_t src_size,
|
||||
size_t *dest_size_r,
|
||||
Error &error);
|
||||
|
||||
const float *ConvertFloat(AudioFormat src_format,
|
||||
const void *src_buffer, size_t src_size,
|
||||
AudioFormat dest_format,
|
||||
const float *ConvertFloat(const void *src_buffer, size_t src_size,
|
||||
size_t *dest_size_r,
|
||||
Error &error);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user