-
- if (fval >= 1)
- {
- warn("value clamped to +1.");
- eval = 0x7fffff;
- }
- else if (fval <= -1)
- {
- warn("value clamped to -1.");
- eval = 0x800000;
- }
- else
- {
- // Convert fraction to 24 bits fixed point with sign and rounding
- // Yeah, that cast to int32_t has to be there because casting
- // a float to unsigned int is "undefined" according to the C
- // standard. Which most compilers seem to do the sensible thing
- // and just cast the f**king value properly, except gcc 4.x.x
- // for arm (tested on raspbian).
- // Thanks, C and gcc! Thanks for making me waste a few hours \o/
- eval = 0;//!!! FIX !!! (uint32_t)(int32_t)round(fval*(1 << 23));
- }