7 #ifndef SOFTWARE_SAMPLE_CONVERSION_H
8 #define SOFTWARE_SAMPLE_CONVERSION_H
15 template<
typename _sample_t>
18 static const uint channel_count = 1;
19 static const uint frame_stride = channel_count *
sizeof(_sample_t);
20 typedef _sample_t sample_t;
36 template<
typename Fmt, u
int ChannelCount>
38 static const uint channel_count = ChannelCount;
39 static const uint frame_stride = ChannelCount * Fmt::frame_stride;
40 typedef typename Fmt::sample_t sample_t;
49 template<
typename ToFmt,
typename FromFmt>
51 static typename ToFmt::sample_t convert_sample(
const typename FromFmt::sample_t &sample);
56 template<
typename Fmt>
58 static typename Fmt::sample_t convert_sample(
const typename Fmt::sample_t &sample) {
66 static int16_t convert_sample(
const uint16_t &sample) {
67 return sample ^ 0x8000u;
73 static int16_t convert_sample(
const int8_t &sample) {
80 static int16_t convert_sample(
const uint8_t &sample) {
81 return (sample << 8u) ^ 0x8000u;
89 static uint16_t convert_sample(
const int8_t &sample) {
90 return (sample << 8u) ^ 0x8000u;
96 static uint16_t convert_sample(
const uint8_t &sample) {
103 static uint16_t convert_sample(
const int16_t &sample) {
104 return sample ^ 0x8000u;
112 static int8_t convert_sample(
const uint16_t &sample) {
113 return (sample ^ 0x8000u) >> 8u;
119 static int8_t convert_sample(
const uint8_t &sample) {
120 return sample ^ 0x80;
126 static int8_t convert_sample(
const int16_t &sample) {
135 static uint8_t convert_sample(
const uint16_t &sample) {
142 static uint8_t convert_sample(
const int8_t &sample) {
143 return sample ^ 0x80;
149 static uint8_t convert_sample(
const int16_t &sample) {
150 return (sample ^ 0x8000u) >> 8u;
155 template<
typename ToFmt,
typename FromFmt>
157 static void copy(
typename ToFmt::sample_t *dest,
const typename FromFmt::sample_t *src, uint sample_count);
162 template<
class Fmt, u
int ChannelCount>
164 static void copy(
typename MultiChannelFmt<Fmt, ChannelCount>::sample_t *dest,
165 const typename MultiChannelFmt<Fmt, ChannelCount>::sample_t *src,
172 template<
typename ToFmt,
typename FromFmt, u
int NumChannels>
174 static void copy(
typename ToFmt::sample_t *dest,
const typename FromFmt::sample_t *src, uint sample_count) {
175 for (uint i = 0; i < sample_count * NumChannels; i++) {
183 template<
typename ToFmt,
typename FromFmt>
185 static void copy(
typename ToFmt::sample_t *dest,
const typename FromFmt::sample_t *src, uint sample_count) {
186 for (; sample_count; sample_count--) {
188 *dest++ = mono_sample;
189 *dest++ = mono_sample;
195 template<
typename ToFmt,
typename FromFmt>
197 static void copy(
typename ToFmt::sample_t *dest,
const typename FromFmt::sample_t *src, uint sample_count) {
198 for (; sample_count; sample_count--) {
200 typename FromFmt::sample_t averaged_sample = (src[0] + src[1]) / 2;
207 template<
typename ToFmt,
typename FromFmt>
212 if (!buffer)
return NULL;
213 assert(buffer->format->
sample_stride == ToFmt::frame_stride);
216 while (pos < buffer->max_sample_count) {
217 if (!cc->current_producer_buffer) {
219 if (!cc->current_producer_buffer) {
227 assert(cc->current_producer_buffer->format->
format->
channel_count == FromFmt::channel_count);
228 assert(cc->current_producer_buffer->format->
sample_stride == FromFmt::frame_stride);
229 cc->current_producer_buffer_pos = 0;
231 uint sample_count = std::min(buffer->max_sample_count - pos,
232 cc->current_producer_buffer->sample_count - cc->current_producer_buffer_pos);
234 ((
typename ToFmt::sample_t *) buffer->buffer->bytes) + pos * ToFmt::channel_count,
235 ((
typename FromFmt::sample_t *) cc->current_producer_buffer->buffer->bytes) +
236 cc->current_producer_buffer_pos * FromFmt::channel_count,
239 cc->current_producer_buffer_pos += sample_count;
240 if (cc->current_producer_buffer_pos == cc->current_producer_buffer->sample_count) {
242 cc->current_producer_buffer = NULL;
245 buffer->sample_count = pos;
249 template<
typename ToFmt,
typename FromFmt>
254 while (pos < buffer->sample_count) {
255 if (!pbc->current_consumer_buffer) {
257 pbc->current_consumer_buffer_pos = 0;
259 uint sample_count = std::min(buffer->sample_count - pos,
260 pbc->current_consumer_buffer->max_sample_count - pbc->current_consumer_buffer_pos);
261 assert(buffer->format->
sample_stride == FromFmt::frame_stride);
264 ((
typename ToFmt::sample_t *) pbc->current_consumer_buffer->buffer->bytes) +
265 pbc->current_consumer_buffer_pos * ToFmt::channel_count,
266 ((
typename FromFmt::sample_t *) buffer->buffer->bytes) + pos * FromFmt::channel_count, sample_count);
268 pbc->current_consumer_buffer_pos += sample_count;
269 if (pbc->current_consumer_buffer_pos == pbc->current_consumer_buffer->max_sample_count) {
270 pbc->current_consumer_buffer->sample_count = pbc->current_consumer_buffer->max_sample_count;
272 pbc->current_consumer_buffer = NULL;
276 #ifdef BLOCKING_GIVE_SYNCHRONIZE_BUFFERS
277 if (pbc->current_consumer_buffer) {
278 pbc->current_consumer_buffer->sample_count = pbc->current_consumer_buffer_pos;
280 pbc->current_consumer_buffer = NULL;
283 assert(pos == buffer->sample_count);
audio_buffer_t * get_full_audio_buffer(audio_buffer_pool_t *context, bool block)
Definition: audio.cpp:98
void queue_free_audio_buffer(audio_buffer_pool_t *context, audio_buffer_t *ab)
Definition: audio.cpp:90
void queue_full_audio_buffer(audio_buffer_pool_t *context, audio_buffer_t *ab)
Definition: audio.cpp:111
audio_buffer_t * get_free_audio_buffer(audio_buffer_pool_t *context, bool block)
Definition: audio.cpp:77
Definition: sample_conversion.h:16
Definition: sample_conversion.h:32
Definition: sample_conversion.h:26
Definition: sample_conversion.h:29
Definition: sample_conversion.h:23
Definition: sample_conversion.h:37
Audio buffer definition.
Definition: audio.h:63
Definition: sample_conversion.h:156
Definition: sample_conversion.h:50