pcm_resample: use pcm_buffer (2/2)
Use the PCM buffer library for the libsamplerate output buffer.
This commit is contained in:
parent
2a83138913
commit
bb08679a70
@ -17,6 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pcm_resample.h"
|
#include "pcm_resample.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -24,5 +25,10 @@ void pcm_resample_init(struct pcm_resample_state *state)
|
|||||||
{
|
{
|
||||||
memset(state, 0, sizeof(*state));
|
memset(state, 0, sizeof(*state));
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBSAMPLERATE
|
||||||
|
pcm_buffer_init(&state->in);
|
||||||
|
pcm_buffer_init(&state->out);
|
||||||
|
#endif
|
||||||
|
|
||||||
pcm_buffer_init(&state->buffer);
|
pcm_buffer_init(&state->buffer);
|
||||||
}
|
}
|
||||||
|
@ -35,8 +35,8 @@ struct pcm_resample_state {
|
|||||||
#ifdef HAVE_LIBSAMPLERATE
|
#ifdef HAVE_LIBSAMPLERATE
|
||||||
SRC_STATE *state;
|
SRC_STATE *state;
|
||||||
SRC_DATA data;
|
SRC_DATA data;
|
||||||
size_t data_in_size;
|
|
||||||
size_t data_out_size;
|
struct pcm_buffer in, out;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
unsigned src_rate;
|
unsigned src_rate;
|
||||||
|
@ -34,6 +34,8 @@ void pcm_resample_deinit(struct pcm_resample_state *state)
|
|||||||
if (state->state != NULL)
|
if (state->state != NULL)
|
||||||
state->state = src_delete(state->state);
|
state->state = src_delete(state->state);
|
||||||
|
|
||||||
|
pcm_buffer_deinit(&state->in);
|
||||||
|
pcm_buffer_deinit(&state->out);
|
||||||
pcm_buffer_deinit(&state->buffer);
|
pcm_buffer_deinit(&state->buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,17 +138,11 @@ pcm_resample_16(struct pcm_resample_state *state,
|
|||||||
|
|
||||||
data->input_frames = src_size / sizeof(*src_buffer) / channels;
|
data->input_frames = src_size / sizeof(*src_buffer) / channels;
|
||||||
data_in_size = data->input_frames * sizeof(float) * channels;
|
data_in_size = data->input_frames * sizeof(float) * channels;
|
||||||
if (data_in_size > state->data_in_size) {
|
data->data_in = pcm_buffer_get(&state->in, data_in_size);
|
||||||
state->data_in_size = data_in_size;
|
|
||||||
data->data_in = g_realloc(data->data_in, data_in_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
data->output_frames = (src_size * dest_rate + src_rate - 1) / src_rate;
|
data->output_frames = (src_size * dest_rate + src_rate - 1) / src_rate;
|
||||||
data_out_size = data->output_frames * sizeof(float) * channels;
|
data_out_size = data->output_frames * sizeof(float) * channels;
|
||||||
if (data_out_size > state->data_out_size) {
|
data->data_out = pcm_buffer_get(&state->out, data_out_size);
|
||||||
state->data_out_size = data_out_size;
|
|
||||||
data->data_out = g_realloc(data->data_out, data_out_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
src_short_to_float_array(src_buffer, data->data_in,
|
src_short_to_float_array(src_buffer, data->data_in,
|
||||||
data->input_frames * channels);
|
data->input_frames * channels);
|
||||||
@ -212,17 +208,11 @@ pcm_resample_24(struct pcm_resample_state *state,
|
|||||||
|
|
||||||
data->input_frames = src_size / sizeof(*src_buffer) / channels;
|
data->input_frames = src_size / sizeof(*src_buffer) / channels;
|
||||||
data_in_size = data->input_frames * sizeof(float) * channels;
|
data_in_size = data->input_frames * sizeof(float) * channels;
|
||||||
if (data_in_size > state->data_in_size) {
|
data->data_in = pcm_buffer_get(&state->in, data_in_size);
|
||||||
state->data_in_size = data_in_size;
|
|
||||||
data->data_in = g_realloc(data->data_in, data_in_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
data->output_frames = (src_size * dest_rate + src_rate - 1) / src_rate;
|
data->output_frames = (src_size * dest_rate + src_rate - 1) / src_rate;
|
||||||
data_out_size = data->output_frames * sizeof(float) * channels;
|
data_out_size = data->output_frames * sizeof(float) * channels;
|
||||||
if (data_out_size > state->data_out_size) {
|
data->data_out = pcm_buffer_get(&state->out, data_out_size);
|
||||||
state->data_out_size = data_out_size;
|
|
||||||
data->data_out = g_realloc(data->data_out, data_out_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
src_int_to_float_array(src_buffer, data->data_in,
|
src_int_to_float_array(src_buffer, data->data_in,
|
||||||
data->input_frames * channels);
|
data->input_frames * channels);
|
||||||
|
Loading…
Reference in New Issue
Block a user