00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MPD_PCM_RESAMPLE_H
00021 #define MPD_PCM_RESAMPLE_H
00022
00023 #include "check.h"
00024 #include "pcm_buffer.h"
00025
00026 #include <stdint.h>
00027 #include <stddef.h>
00028 #include <stdbool.h>
00029
00030 #ifdef HAVE_LIBSAMPLERATE
00031 #include <samplerate.h>
00032 #endif
00033
00038 struct pcm_resample_state {
00039 #ifdef HAVE_LIBSAMPLERATE
00040 SRC_STATE *state;
00041 SRC_DATA data;
00042
00043 struct pcm_buffer in, out;
00044
00045 struct {
00046 unsigned src_rate;
00047 unsigned dest_rate;
00048 unsigned channels;
00049 } prev;
00050
00051 int error;
00052 #endif
00053
00054 struct pcm_buffer buffer;
00055 };
00056
00057 bool
00058 pcm_resample_global_init(GError **error_r);
00059
00063 void pcm_resample_init(struct pcm_resample_state *state);
00064
00069 void pcm_resample_deinit(struct pcm_resample_state *state);
00070
00074 void
00075 pcm_resample_reset(struct pcm_resample_state *state);
00076
00089 const float *
00090 pcm_resample_float(struct pcm_resample_state *state,
00091 unsigned channels,
00092 unsigned src_rate,
00093 const float *src_buffer, size_t src_size,
00094 unsigned dest_rate, size_t *dest_size_r,
00095 GError **error_r);
00096
00109 const int16_t *
00110 pcm_resample_16(struct pcm_resample_state *state,
00111 unsigned channels,
00112 unsigned src_rate,
00113 const int16_t *src_buffer, size_t src_size,
00114 unsigned dest_rate, size_t *dest_size_r,
00115 GError **error_r);
00116
00129 const int32_t *
00130 pcm_resample_32(struct pcm_resample_state *state,
00131 unsigned channels,
00132 unsigned src_rate,
00133 const int32_t *src_buffer, size_t src_size,
00134 unsigned dest_rate, size_t *dest_size_r,
00135 GError **error_r);
00136
00149 static inline const int32_t *
00150 pcm_resample_24(struct pcm_resample_state *state,
00151 unsigned channels,
00152 unsigned src_rate,
00153 const int32_t *src_buffer, size_t src_size,
00154 unsigned dest_rate, size_t *dest_size_r,
00155 GError **error_r)
00156 {
00157
00158
00159 return pcm_resample_32(state, channels,
00160 src_rate, src_buffer, src_size,
00161 dest_rate, dest_size_r, error_r);
00162 }
00163
00164 #endif