On Fri, 09 Aug 2002 18:18:44 -0700
Martin Wolters <[EMAIL PROTECTED]> wrote:

> I tried using something like the following to convert the data:
> 
> float samples[samplesInBuffer];
> for(i=0;i<samplesInBuffer;i++) {
>     int value = (buf[1] << 8) + (buf[0] << 16);
>     sample[i] = ((float)(value/256))*scalefactor;
>     buf += 2;
> }

Thats not going to work. 

The data in buf are unsigned chars but I am almost certain that the actual
data in the buffer are signed short values. This means that this:

        (buf[1] << 8) + (buf[0] << 16)

gives an unsigned value which is definitely wrong.

Try this:

 float samples[samplesInBuffer];
 for(i=0;i<samplesInBuffer;i++) {
     short value = (short) (buf[1] | (buf[0] << 8));
     sample[i] = (value / ((float) 0x8000) ;
     buf += 2;
 }

This should give you floats in the range [-1.0, 1.0].

The bitwise or means that the combination of buf [0] and buf [1] will not
try and do anything remotely arithmetic but instead paste the two values
together.

Hope this helps,
Erik
-- 
+-----------------------------------------------------------+
  Erik de Castro Lopo  [EMAIL PROTECTED] (Yes it's valid)
+-----------------------------------------------------------+
"Therapists typically base the nuttiness of a patient on the strength of 
their convictions, on which basis this 43,000 word opus alone stands as a 
kind of testament to Bill's (Gates) madness." - The Register

Reply via email to