From c57b3a9e5071a269d44d0ea01210a13ee56ca6fd Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Fri, 27 Nov 2009 15:42:18 +0000 Subject: [PATCH] disorder-normalize always uses a fresh resampler on each chunk (the old way does not work - src_process() consumes 0 bytes on the second chunk for some reason). Organization: Straylight/Edgeware From: Richard Kettlewell --- lib/resample.c | 6 ++++++ server/normalize.c | 10 +++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/resample.c b/lib/resample.c index c4c814e..39514ed 100644 --- a/lib/resample.c +++ b/lib/resample.c @@ -264,6 +264,7 @@ size_t resample_convert(const struct resampler *rs, if(rs->state) { /* A sample-rate conversion must be performed */ SRC_DATA data; + memset(&data, 0, sizeof data); /* Compute how many frames are expected to come out. */ size_t maxframesout = nframesin * rs->output_rate / rs->input_rate + 1; output = xcalloc(maxframesout * rs->output_channels, sizeof(float)); @@ -273,11 +274,16 @@ size_t resample_convert(const struct resampler *rs, data.output_frames = maxframesout; data.end_of_input = eof; data.src_ratio = (double)rs->output_rate / rs->input_rate; + D(("nframesin=%zu maxframesout=%zu eof=%d ratio=%d.%06d", + nframesin, maxframesout, eof, + (int)data.src_ratio, + ((int)(data.src_ratio * 1000000) % 1000000))); int error_ = src_process(rs->state, &data); if(error_) disorder_fatal(0, "calling src_process: %s", src_strerror(error_)); nframesin = data.input_frames_used; nsamplesout = data.output_frames_gen * rs->output_channels; + D(("new nframesin=%zu nsamplesout=%zu", nframesin, nsamplesout)); } #endif if(!output) { diff --git a/server/normalize.c b/server/normalize.c index bcfc3a8..8935927 100644 --- a/server/normalize.c +++ b/server/normalize.c @@ -188,6 +188,8 @@ int main(int argc, char attribute((unused)) **argv) { } if(!n) break; + D(("NEW HEADER: %"PRIu32" bytes %"PRIu32"Hz %"PRIu8" channels %"PRIu8" bits %"PRIu8" endian", + header.nbytes, header.rate, header.channels, header.bits, header.endian)); /* Sanity check the header */ if(header.rate < 100 || header.rate > 1000000) disorder_fatal(0, "implausible rate %"PRId32"Hz (%#"PRIx32")", @@ -210,7 +212,8 @@ int main(int argc, char attribute((unused)) **argv) { else { /* If we have a resampler active already check it is suitable and destroy * it if not */ - if(!formats_equal(&header, &latest_format) && rs_in_use) { + if(rs_in_use) { + D(("call resample_close")); resample_close(rs); rs_in_use = 0; } @@ -227,6 +230,7 @@ int main(int argc, char attribute((unused)) **argv) { config->sample_format.endian);*/ if(!rs_in_use) { /* Create a suitable resampler. */ + D(("call resample_init")); resample_init(rs, header.bits, header.channels, @@ -260,17 +264,21 @@ int main(int argc, char attribute((unused)) **argv) { left -= r; used += r; //syslog(LOG_INFO, "read %zd bytes", r); + D(("read %zd bytes", r)); } /*syslog(LOG_INFO, " in: %02x %02x %02x %02x", (uint8_t)buffer[0], (uint8_t)buffer[1], (uint8_t)buffer[2], (uint8_t)buffer[3]);*/ + D(("calling resample_convert used=%zu !left=%d", used, !left)); const size_t consumed = resample_convert(rs, (uint8_t *)buffer, used, !left, converted, 0); //syslog(LOG_INFO, "used=%zu consumed=%zu", used, consumed); + D(("consumed=%zu", consumed)); + assert(consumed != 0); memmove(buffer, buffer + consumed, used - consumed); used -= consumed; } -- [mdw]