Hi!
I'm new to the list and I'm not familiar with libmad, but have a look at this function from the madlld sample. You can easily change it to produce 32-bit floating point:
float f; if (Fixed & (1<<31)) { // negative Fixed = Fixed & ((1<<31)-1); // strip sign f = -(float)Fixed / (1<<MAD_F_FRACBITS); } else { f = (float)Fixed / (1<<MAD_F_FRACBITS); } return f;
hope this helps Jens
/**************************************************************************** * Converts a sample from mad's fixed point number format to an unsigned * * short (16 bits). * ****************************************************************************/ static unsigned short MadFixedToUshort(mad_fixed_t Fixed) { /* A fixed point number is formed of the following bit pattern: * * SWWWFFFFFFFFFFFFFFFFFFFFFFFFFFFF * MSB LSB * S ==> Sign (0 is positive, 1 is negative) * W ==> Whole part bits * F ==> Fractional part bits * * This pattern contains MAD_F_FRACBITS fractional bits, one * should alway use this macro when working on the bits of a fixed * point number. It is not guaranteed to be constant over the * different platforms supported by libmad. * * The unsigned short value is formed by the least significant * whole part bit, followed by the 15 most significant fractional * part bits. Warning: this is a quick and dirty way to compute * the 16-bit number, madplay includes much better algorithms. */ Fixed=Fixed>>(MAD_F_FRACBITS-15); return((unsigned short)Fixed); }