35 struct xmms_sample_converter_St {
48 guint interpolator_ratio;
49 guint decimator_ratio;
80 gint fformat, fsamplerate, fchannels;
81 gint tformat, tsamplerate, tchannels;
90 g_return_val_if_fail (tformat != -1, NULL);
91 g_return_val_if_fail (tchannels != -1, NULL);
92 g_return_val_if_fail (tsamplerate != -1, NULL);
97 conv->resample = fsamplerate != tsamplerate;
99 conv->func = xmms_sample_conv_get (fchannels, fformat,
106 xmms_sample_name_get (fformat), fsamplerate, fchannels,
107 xmms_sample_name_get (tformat), tsamplerate, tchannels);
112 recalculate_resampler (conv, fsamplerate, tsamplerate);
123 g_return_val_if_fail (conv, NULL);
134 g_return_val_if_fail (conv, NULL);
149 XMMS_MEDIALIB_ENTRY_PROPERTY_FMT_SAMPLEFMT_IN,
150 xmms_sample_name_get (conv->from->format));
152 XMMS_MEDIALIB_ENTRY_PROPERTY_FMT_SAMPLERATE_IN,
153 conv->from->samplerate);
155 XMMS_MEDIALIB_ENTRY_PROPERTY_FMT_CHANNELS_IN,
156 conv->from->channels);
159 XMMS_MEDIALIB_ENTRY_PROPERTY_FMT_SAMPLEFMT_OUT,
160 xmms_sample_name_get (conv->to->format));
162 XMMS_MEDIALIB_ENTRY_PROPERTY_FMT_SAMPLERATE_OUT,
163 conv->to->samplerate);
165 XMMS_MEDIALIB_ENTRY_PROPERTY_FMT_CHANNELS_OUT,
181 return (guint)(((gdouble) rate) * milliseconds / 1000);
192 return (guint) (((gdouble)samples) * 1000.0 / rate);
208 gint format, channels;
211 return xmms_sample_size_get (format) * channels;
234 XMMS_DBG (
"Resampling ratio: %d:%d",
237 conv->interpolator_ratio = to/a;
238 conv->decimator_ratio = from/a;
264 g_return_if_fail (len % inusiz == 0);
276 if (conv->resample) {
277 olen = (len * conv->interpolator_ratio / conv->decimator_ratio) * outusiz + outusiz;
279 olen = len * outusiz;
281 if (olen > conv->bufsiz) {
283 t = g_realloc (conv->buf, olen);
289 res = conv->func (conv, in, len, conv->buf);
291 *outlen = res * outusiz;
305 return samples * conv->decimator_ratio / conv->interpolator_ratio;
313 return samples * conv->interpolator_ratio / conv->decimator_ratio;
319 if (conv->resample) {
guint xmms_sample_ms_to_samples(const xmms_stream_type_t *st, guint milliseconds)
convert from milliseconds to samples for this format.
gint xmms_stream_type_get_int(const xmms_stream_type_t *st, xmms_stream_type_key_t key)
#define xmms_object_unref(obj)
struct xmms_stream_type_St xmms_stream_type_t
xmms_sample_converter_t * xmms_sample_converter_init(xmms_stream_type_t *from, xmms_stream_type_t *to)
guint xmms_sample_bytes_to_ms(const xmms_stream_type_t *st, guint bytes)
Convert from bytes to milliseconds for this format.
struct xmms_sample_converter_St xmms_sample_converter_t
#define xmms_log_error(fmt,...)
guint xmms_sample_samples_to_ms(const xmms_stream_type_t *st, guint samples)
Convert from samples to milliseconds for this format.
guint(* xmms_sample_conv_func_t)(xmms_sample_converter_t *, xmms_sample_t *, guint, xmms_sample_t *)
xmms_stream_type_t * xmms_sample_converter_get_from(xmms_sample_converter_t *conv)
Return the audio format used by the converter as source.
gint64 xmms_sample_convert_scale(xmms_sample_converter_t *conv, gint64 samples)
void xmms_sample_convert(xmms_sample_converter_t *conv, xmms_sample_t *in, guint len, xmms_sample_t **out, guint *outlen)
do the actual converstion between two audio formats.
gint xmms_sample_frame_size_get(const xmms_stream_type_t *st)
#define XMMS_DBG(fmt,...)
xmms_stream_type_t * xmms_sample_converter_get_to(xmms_sample_converter_t *conv)
Return the audio format used by the converter as target.
void xmms_sample_converter_to_medialib(xmms_sample_converter_t *conv, xmms_medialib_entry_t entry)
#define xmms_object_new(objtype, destroyfunc)
gint64 xmms_sample_convert_rev_scale(xmms_sample_converter_t *conv, gint64 samples)
void xmms_sample_convert_reset(xmms_sample_converter_t *conv)