diff options
author | Max Kellermann <max@duempel.org> | 2013-07-29 23:18:55 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-07-30 00:04:16 +0200 |
commit | a9d2dc614496a8eee4269f4032457eb8a7fb6102 (patch) | |
tree | c208413095ee17dafd1a6280f3bf594357015e42 /src/pcm/pcm_resample_libsamplerate.c | |
parent | 46b9388bb0c867b1c80d9e8f037af56b862f5fd4 (diff) | |
download | mpd-a9d2dc614496a8eee4269f4032457eb8a7fb6102.tar.gz mpd-a9d2dc614496a8eee4269f4032457eb8a7fb6102.tar.xz mpd-a9d2dc614496a8eee4269f4032457eb8a7fb6102.zip |
pcm_resample: convert to C++
Diffstat (limited to '')
-rw-r--r-- | src/pcm/PcmResampleLibsamplerate.cxx (renamed from src/pcm/pcm_resample_libsamplerate.c) | 105 |
1 files changed, 44 insertions, 61 deletions
diff --git a/src/pcm/pcm_resample_libsamplerate.c b/src/pcm/PcmResampleLibsamplerate.cxx index f957e5155..532c79c8d 100644 --- a/src/pcm/pcm_resample_libsamplerate.c +++ b/src/pcm/PcmResampleLibsamplerate.cxx @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2011 The Music Player Daemon Project + * Copyright (C) 2003-2013 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -18,7 +18,7 @@ */ #include "config.h" -#include "pcm_resample_internal.h" +#include "PcmResampleInternal.hxx" #include "conf.h" #include <glib.h> @@ -41,14 +41,14 @@ libsamplerate_quark(void) static bool lsr_parse_converter(const char *s) { - assert(s != NULL); + assert(s != nullptr); if (*s == 0) return true; char *endptr; long l = strtol(s, &endptr, 10); - if (*endptr == 0 && src_get_name(l) != NULL) { + if (*endptr == 0 && src_get_name(l) != nullptr) { lsr_converter = l; return true; } @@ -56,7 +56,7 @@ lsr_parse_converter(const char *s) size_t length = strlen(s); for (int i = 0;; ++i) { const char *name = src_get_name(i); - if (name == NULL) + if (name == nullptr) break; if (g_ascii_strncasecmp(s, name, length) == 0) { @@ -84,7 +84,7 @@ pcm_resample_lsr_global_init(const char *converter, GError **error_r) } void -pcm_resample_lsr_init(struct pcm_resample_state *state) +pcm_resample_lsr_init(PcmResampler *state) { memset(state, 0, sizeof(*state)); @@ -94,9 +94,9 @@ pcm_resample_lsr_init(struct pcm_resample_state *state) } void -pcm_resample_lsr_deinit(struct pcm_resample_state *state) +pcm_resample_lsr_deinit(PcmResampler *state) { - if (state->state != NULL) + if (state->state != nullptr) state->state = src_delete(state->state); pcm_buffer_deinit(&state->in); @@ -105,20 +105,17 @@ pcm_resample_lsr_deinit(struct pcm_resample_state *state) } void -pcm_resample_lsr_reset(struct pcm_resample_state *state) +pcm_resample_lsr_reset(PcmResampler *state) { - if (state->state != NULL) + if (state->state != nullptr) src_reset(state->state); } static bool -pcm_resample_set(struct pcm_resample_state *state, +pcm_resample_set(PcmResampler *state, unsigned channels, unsigned src_rate, unsigned dest_rate, GError **error_r) { - int error; - SRC_DATA *data = &state->data; - /* (re)set the state/ratio if the in or out format changed */ if (channels == state->prev.channels && src_rate == state->prev.src_rate && @@ -133,6 +130,7 @@ pcm_resample_set(struct pcm_resample_state *state, if (state->state) state->state = src_delete(state->state); + int error; state->state = src_new(lsr_converter, channels, &error); if (!state->state) { g_set_error(error_r, libsamplerate_quark(), state->error, @@ -141,6 +139,7 @@ pcm_resample_set(struct pcm_resample_state *state, return false; } + SRC_DATA *data = &state->data; data->src_ratio = (double)dest_rate / (double)src_rate; g_debug("setting samplerate conversion ratio to %.2lf", data->src_ratio); @@ -150,7 +149,7 @@ pcm_resample_set(struct pcm_resample_state *state, } static bool -lsr_process(struct pcm_resample_state *state, GError **error_r) +lsr_process(PcmResampler *state, GError **error_r) { if (state->error == 0) state->error = src_process(state->state, &state->data); @@ -164,39 +163,31 @@ lsr_process(struct pcm_resample_state *state, GError **error_r) return true; } -static float * -deconst_float_buffer(const float *in) -{ - union { - const float *in; - float *out; - } u = { .in = in }; - return u.out; -} - const float * -pcm_resample_lsr_float(struct pcm_resample_state *state, +pcm_resample_lsr_float(PcmResampler *state, unsigned channels, unsigned src_rate, const float *src_buffer, size_t src_size, unsigned dest_rate, size_t *dest_size_r, GError **error_r) { + SRC_DATA *data = &state->data; + assert((src_size % (sizeof(*src_buffer) * channels)) == 0); if (!pcm_resample_set(state, channels, src_rate, dest_rate, error_r)) - return NULL; + return nullptr; + - SRC_DATA *data = &state->data; data->input_frames = src_size / sizeof(*src_buffer) / channels; - data->data_in = deconst_float_buffer(src_buffer); + data->data_in = const_cast<float *>(src_buffer); data->output_frames = (src_size * dest_rate + src_rate - 1) / src_rate; size_t data_out_size = data->output_frames * sizeof(float) * channels; - data->data_out = pcm_buffer_get(&state->out, data_out_size); + data->data_out = (float *)pcm_buffer_get(&state->out, data_out_size); if (!lsr_process(state, error_r)) - return NULL; + return nullptr; *dest_size_r = data->output_frames_gen * sizeof(*data->data_out) * channels; @@ -204,43 +195,39 @@ pcm_resample_lsr_float(struct pcm_resample_state *state, } const int16_t * -pcm_resample_lsr_16(struct pcm_resample_state *state, +pcm_resample_lsr_16(PcmResampler *state, unsigned channels, unsigned src_rate, const int16_t *src_buffer, size_t src_size, unsigned dest_rate, size_t *dest_size_r, GError **error_r) { - bool success; SRC_DATA *data = &state->data; - size_t data_in_size; - size_t data_out_size; - int16_t *dest_buffer; assert((src_size % (sizeof(*src_buffer) * channels)) == 0); - success = pcm_resample_set(state, channels, src_rate, dest_rate, - error_r); - if (!success) - return NULL; + if (!pcm_resample_set(state, channels, src_rate, dest_rate, + error_r)) + return nullptr; data->input_frames = src_size / sizeof(*src_buffer) / channels; - data_in_size = data->input_frames * sizeof(float) * channels; - data->data_in = pcm_buffer_get(&state->in, data_in_size); + size_t data_in_size = data->input_frames * sizeof(float) * channels; + data->data_in = (float *)pcm_buffer_get(&state->in, data_in_size); data->output_frames = (src_size * dest_rate + src_rate - 1) / src_rate; - data_out_size = data->output_frames * sizeof(float) * channels; - data->data_out = pcm_buffer_get(&state->out, data_out_size); + size_t data_out_size = data->output_frames * sizeof(float) * channels; + data->data_out = (float *)pcm_buffer_get(&state->out, data_out_size); src_short_to_float_array(src_buffer, data->data_in, data->input_frames * channels); if (!lsr_process(state, error_r)) - return NULL; + return nullptr; + int16_t *dest_buffer; *dest_size_r = data->output_frames_gen * sizeof(*dest_buffer) * channels; - dest_buffer = pcm_buffer_get(&state->buffer, *dest_size_r); + dest_buffer = (int16_t *)pcm_buffer_get(&state->buffer, *dest_size_r); src_float_to_short_array(data->data_out, dest_buffer, data->output_frames_gen * channels); @@ -268,43 +255,39 @@ src_float_to_int_array (const float *in, int *out, int len) #endif const int32_t * -pcm_resample_lsr_32(struct pcm_resample_state *state, +pcm_resample_lsr_32(PcmResampler *state, unsigned channels, unsigned src_rate, const int32_t *src_buffer, size_t src_size, unsigned dest_rate, size_t *dest_size_r, GError **error_r) { - bool success; SRC_DATA *data = &state->data; - size_t data_in_size; - size_t data_out_size; - int32_t *dest_buffer; assert((src_size % (sizeof(*src_buffer) * channels)) == 0); - success = pcm_resample_set(state, channels, src_rate, dest_rate, - error_r); - if (!success) - return NULL; + if (!pcm_resample_set(state, channels, src_rate, dest_rate, + error_r)) + return nullptr; data->input_frames = src_size / sizeof(*src_buffer) / channels; - data_in_size = data->input_frames * sizeof(float) * channels; - data->data_in = pcm_buffer_get(&state->in, data_in_size); + size_t data_in_size = data->input_frames * sizeof(float) * channels; + data->data_in = (float *)pcm_buffer_get(&state->in, data_in_size); data->output_frames = (src_size * dest_rate + src_rate - 1) / src_rate; - data_out_size = data->output_frames * sizeof(float) * channels; - data->data_out = pcm_buffer_get(&state->out, data_out_size); + size_t data_out_size = data->output_frames * sizeof(float) * channels; + data->data_out = (float *)pcm_buffer_get(&state->out, data_out_size); src_int_to_float_array(src_buffer, data->data_in, data->input_frames * channels); if (!lsr_process(state, error_r)) - return NULL; + return nullptr; + int32_t *dest_buffer; *dest_size_r = data->output_frames_gen * sizeof(*dest_buffer) * channels; - dest_buffer = pcm_buffer_get(&state->buffer, *dest_size_r); + dest_buffer = (int32_t *)pcm_buffer_get(&state->buffer, *dest_size_r); src_float_to_int_array(data->data_out, dest_buffer, data->output_frames_gen * channels); |