Output of what? The output of scale is a signed int, which then gets copied to a char array, then to a ringbuffer..
int rio_mad_output(void *ptr, struct mad_header const *header, struct mad_pcm *pcm) { unsigned int nchannels, nsamples; mad_fixed_t const *left_ch, *right_ch; char *outbuffer; int i; signed int sample; r_glue *g = ptr;
/* pcm->samplerate contains the sampling frequency */
if (g->decode_status == DECODE) { nchannels = pcm->channels; nsamples = pcm->length; left_ch = pcm->samples[0]; right_ch = pcm->samples[1];
outbuffer = (char*) malloc(sizeof(char) * nsamples * nchannels * 2); [ ..sanity checks.. ] for (i=0; i<(nsamples*4); i+=4) { sample = rio_mad_scale(*left_ch++); outbuffer[i] = (sample >> 0) & 0xff; outbuffer[i+1] = (sample >> 8) & 0xff; if (nchannels == 2) sample = rio_mad_scale(*right_ch++); outbuffer[i+2] = (sample >> 0) & 0xff; outbuffer[i+3] = (sample >> 8) & 0xff; } rio_ringbuffer_write(g->ringbuffer, outbuffer, nsamples*nchannels*2); free(outbuffer); return MAD_FLOW_CONTINUE; } else if (g->decode_status == CLEAR) { return MAD_FLOW_STOP; } return MAD_FLOW_BREAK;
}
It's probably something simple that I'm missing, and that's the worst part of it.
Reza
Joe Drew wrote:
On Mon, 2002-05-27 at 18:01, Reza Naima wrote:
However, it still sounds like shit. It makes a clicking/swooshing sound at about 4Hz, but you can clearly hear the audio in the background. Could this be a result of the simplified scale() function in minimad (which I'm currently using?)
Probably not. The scale() function isn't optimal, but isn't *that* bad.
I remember something similar happening with mpg321. Make sure you're using signed ints for output (I believe signed is the correct one). It's possibly just a one-bit error in all sound.