float.c
资源名称:tcpmp.rar [点击查看]
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:2k
源码类别:
Windows CE
开发平台:
C/C++
- ////////////////////////////////////////////////////////////////////////////
- // **** WAVPACK **** //
- // Hybrid Lossless Wavefile Compressor //
- // Copyright (c) 1998 - 2004 Conifer Software. //
- // All Rights Reserved. //
- // Distributed under the BSD Software License (see license.txt) //
- ////////////////////////////////////////////////////////////////////////////
- // float.c
- #include "wavpack.h"
- int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd)
- {
- int bytecnt = wpmd->byte_length;
- char *byteptr = wpmd->data;
- if (bytecnt != 4)
- return FALSE;
- wps->float_flags = *byteptr++;
- wps->float_shift = *byteptr++;
- wps->float_max_exp = *byteptr++;
- wps->float_norm_exp = *byteptr;
- return TRUE;
- }
- void float_values (WavpackStream *wps, long *values, long num_values)
- {
- while (num_values--) {
- int shift_count = 0, exp = wps->float_max_exp;
- f32 outval = { 0, 0, 0 };
- if (*values) {
- *values <<= wps->float_shift;
- if (*values < 0) {
- *values = -*values;
- outval.sign = 1;
- }
- if (*values == 0x1000000)
- outval.exponent = 255;
- else {
- if (exp)
- while (!(*values & 0x800000) && --exp) {
- shift_count++;
- *values <<= 1;
- }
- if (shift_count && (wps->float_flags & FLOAT_SHIFT_ONES))
- *values |= ((1 << shift_count) - 1);
- outval.mantissa = *values;
- outval.exponent = exp;
- }
- }
- * (f32 *) values++ = outval;
- }
- }
- void float_normalize (long *values, long num_values, int delta_exp)
- {
- f32 *fvalues = (f32 *) values, fzero = { 0, 0, 0 };
- int exp;
- if (!delta_exp)
- return;
- while (num_values--) {
- if ((exp = fvalues->exponent) == 0 || exp + delta_exp <= 0)
- *fvalues = fzero;
- else if (exp == 255 || (exp += delta_exp) >= 255) {
- fvalues->exponent = 255;
- fvalues->mantissa = 0;
- }
- else
- fvalues->exponent = exp;
- fvalues++;
- }
- }