bits.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:4k
源码类别:

Windows CE

开发平台:

C/C++

  1. ////////////////////////////////////////////////////////////////////////////
  2. //                           **** WAVPACK ****                            //
  3. //                  Hybrid Lossless Wavefile Compressor                   //
  4. //              Copyright (c) 1998 - 2004 Conifer Software.               //
  5. //                          All Rights Reserved.                          //
  6. //      Distributed under the BSD Software License (see license.txt)      //
  7. ////////////////////////////////////////////////////////////////////////////
  8. // bits.c
  9. // This module provides utilities to support the BitStream structure which is
  10. // used to read and write all WavPack audio data streams. It also contains a
  11. // wrapper for the stream I/O functions and a set of functions dealing with
  12. // endian-ness, both for enhancing portability. Finally, a debug wrapper for
  13. // the malloc() system is provided.
  14. #include "wavpack.h"
  15. #include <string.h>
  16. #include <ctype.h>
  17. ////////////////////////// Bitstream functions ////////////////////////////////
  18. // Open the specified BitStream and associate with the specified buffer.
  19. static void bs_read (Bitstream *bs);
  20. void bs_open_read (Bitstream *bs, uchar *buffer_start, uchar *buffer_end, read_stream file, ulong file_bytes)
  21. {  
  22.   void *privdata = bs->privdata;
  23.     CLEAR (*bs);
  24.     bs->buf = buffer_start;
  25.     bs->end = buffer_end;
  26.     bs->privdata = privdata;
  27.     if (file) {
  28. bs->ptr = bs->end - 1;
  29. bs->file_bytes = file_bytes;
  30. bs->file = file;
  31.     }
  32.     else
  33. bs->ptr = bs->buf - 1;
  34.     bs->wrap = bs_read;
  35. }
  36. // This function is only called from the getbit() and getbits() macros when
  37. // the BitStream has been exhausted and more data is required. Sinve these
  38. // bistreams no longer access files, this function simple sets an error and
  39. // resets the buffer.
  40. static void bs_read (Bitstream *bs)
  41. {
  42.     if (bs->file && bs->file_bytes) {
  43. ulong bytes_read, bytes_to_read = bs->end - bs->buf;
  44. if (bytes_to_read > bs->file_bytes)
  45.     bytes_to_read = bs->file_bytes;
  46. bytes_read = bs->file (bs->buf, bytes_to_read, bs->privdata);
  47. if (bytes_read) {
  48.     bs->end = bs->buf + bytes_read;
  49.     bs->file_bytes -= bytes_read;
  50. }
  51. else {
  52.     memset (bs->buf, -1, bs->end - bs->buf);
  53.     bs->error = 1;
  54. }
  55.     }
  56.     else
  57. bs->error = 1;
  58.     if (bs->error)
  59. memset (bs->buf, -1, bs->end - bs->buf);
  60.     bs->ptr = bs->buf;
  61. }
  62. /////////////////////// Endian Correction Routines ////////////////////////////
  63. void little_endian_to_native (void *data, char *format)
  64. {
  65.     uchar *cp = (uchar *) data;
  66.     long temp;
  67.     while (*format) {
  68. switch (*format) {
  69.     case 'L':
  70. temp = cp [0] + ((long) cp [1] << 8) + ((long) cp [2] << 16) + ((long) cp [3] << 24);
  71. * (long *) cp = temp;
  72. cp += 4;
  73. break;
  74.     case 'S':
  75. temp = cp [0] + (cp [1] << 8);
  76. * (short *) cp = (short) temp;
  77. cp += 2;
  78. break;
  79.     default:
  80. if (isdigit (*format))
  81.     cp += *format - '0';
  82. break;
  83. }
  84. format++;
  85.     }
  86. }
  87. void native_to_little_endian (void *data, char *format)
  88. {
  89.     uchar *cp = (uchar *) data;
  90.     long temp;
  91.     while (*format) {
  92. switch (*format) {
  93.     case 'L':
  94. temp = * (long *) cp;
  95. *cp++ = (uchar) temp;
  96. *cp++ = (uchar) (temp >> 8);
  97. *cp++ = (uchar) (temp >> 16);
  98. *cp++ = (uchar) (temp >> 24);
  99. break;
  100.     case 'S':
  101. temp = * (short *) cp;
  102. *cp++ = (uchar) temp;
  103. *cp++ = (uchar) (temp >> 8);
  104. break;
  105.     default:
  106. if (isdigit (*format))
  107.     cp += *format - '0';
  108. break;
  109. }
  110. format++;
  111.     }
  112. }