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) {