📄 pcm.c
字号:
/*** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>** ** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU Lesser General Public License as published by** the Free Software Foundation; either version 2.1 of the License, or** (at your option) any later version.** ** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the** GNU Lesser General Public License for more details.** ** You should have received a copy of the GNU Lesser General Public License** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*/#include <unistd.h>#include "config.h"#include "sndfile.h"#include "common.h"#include "sfendian.h"#include "pcm.h"/* Important!!! Do not assume that sizeof (tribyte) == 3. Some compilers ** (Metrowerks CodeWarrior for Mac is one) pad the struct with an extra byte.*/typedef struct{ char bytes [3] ;} tribyte ;static void sc2s_array (signed char *buffer, unsigned int count, short *ptr, int index) ;static void uc2s_array (unsigned char *buffer, unsigned int count, short *ptr, int index) ;static void bet2s_array (tribyte *buffer, unsigned int count, short *ptr, int index) ;static void let2s_array (tribyte *buffer, unsigned int count, short *ptr, int index) ;static void bei2s_array (int *buffer, unsigned int count, short *ptr, int index) ;static void lei2s_array (int *buffer, unsigned int count, short *ptr, int index) ;static void f2s_array (float *buffer, unsigned int count, short *ptr, int index) ;static void sc2i_array (signed char *buffer, unsigned int count, int *ptr, int index) ;static void uc2i_array (unsigned char *buffer, unsigned int count, int *ptr, int index) ;static void bes2i_array (short *buffer, unsigned int count, int *ptr, int index) ;static void les2i_array (short *buffer, unsigned int count, int *ptr, int index) ;static void bet2i_array (tribyte *buffer, unsigned int count, int *ptr, int index) ;static void let2i_array (tribyte *buffer, unsigned int count, int *ptr, int index) ;static void f2i_array (float *buffer, unsigned int count, int *ptr, int index) ;static void sc2d_array (signed char *buffer, unsigned int count, double *ptr, int index, double normfact) ;static void uc2d_array (unsigned char *buffer, unsigned int count, double *ptr, int index, double normfact) ;static void bes2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact) ;static void les2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact) ;static void bet2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact) ;static void let2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact) ;static void bei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact) ;static void lei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact) ;static void f2d_array (float *buffer, unsigned int count, double *ptr, int index, double normfact) ;static void s2sc_array (short *ptr, int index, signed char *buffer, unsigned int count) ;static void s2uc_array (short *ptr, int index, unsigned char *buffer, unsigned int count) ;static void s2bet_array (short *ptr, int index, tribyte *buffer, unsigned int count) ;static void s2let_array (short *ptr, int index, tribyte *buffer, unsigned int count) ;static void s2bei_array (short *ptr, int index, int *buffer, unsigned int count) ;static void s2lei_array (short *ptr, int index, int *buffer, unsigned int count) ;static void s2f_array (short *ptr, int index, float *buffer, unsigned int count) ;static void i2sc_array (int *ptr, int index, signed char *buffer, unsigned int count) ;static void i2uc_array (int *ptr, int index, unsigned char *buffer, unsigned int count) ;static void i2bes_array (int *ptr, int index, short *buffer, unsigned int count) ;static void i2les_array (int *ptr, int index, short *buffer, unsigned int count) ;static void i2bet_array (int *ptr, int index, tribyte *buffer, unsigned int count) ;static void i2let_array (int *ptr, int index, tribyte *buffer, unsigned int count) ;static void i2f_array (int *ptr, int index, float *buffer, unsigned int count) ;static void d2sc_array (double *ptr, int index, signed char *buffer, unsigned int count, double normfact) ;static void d2uc_array (double *ptr, int index, unsigned char *buffer, unsigned int count, double normfact) ;static void d2bes_array (double *ptr, int index, short *buffer, unsigned int count, double normfact) ;static void d2les_array (double *ptr, int index, short *buffer, unsigned int count, double normfact) ;static void d2bet_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact) ;static void d2let_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact) ;static void d2bei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact) ;static void d2lei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact) ;static void d2f_array (double *ptr, int index, float *buffer, unsigned int count, double normfact) ;/*----------------------------------------------------------------------------------------------- */int pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; sc2s_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_sc2s */int pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; uc2s_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_uc2s */int pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, int len){ int total ; total = fread (ptr, 1, len * sizeof (short), psf->file) ; if (CPU_IS_LITTLE_ENDIAN) endswap_short_array (ptr, len) ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_bes2s */int pcm_read_les2s (SF_PRIVATE *psf, short *ptr, int len){ int total ; total = fread (ptr, 1, len * sizeof (short), psf->file) ; if (CPU_IS_BIG_ENDIAN) endswap_short_array (ptr, len) ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_les2s */int pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; bet2s_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_bet2s */int pcm_read_let2s (SF_PRIVATE *psf, short *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; let2s_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_let2s */int pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; bei2s_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_bei2s */int pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; lei2s_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_lei2s */int pcm_read_f2s (SF_PRIVATE *psf, short *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; f2s_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_f2s *//*----------------------------------------------------------------------------------------------- */int pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; sc2i_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_sc2i */int pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; uc2i_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_uc2i */int pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; bes2i_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_bes2i */int pcm_read_les2i (SF_PRIVATE *psf, int *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; les2i_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_les2i */int pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; bet2i_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_bet2i */int pcm_read_let2i (SF_PRIVATE *psf, int *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; let2i_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ; index += thisread / psf->bytewidth ; bytecount -= thisread ; } ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_let2i */int pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, int len){ int total ; total = fread (ptr, 1, len * sizeof (int), psf->file) ; if (CPU_IS_LITTLE_ENDIAN) endswap_int_array (ptr, len) ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_bei2i */int pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, int len){ int total ; total = fread (ptr, 1, len * sizeof (int), psf->file) ; if (CPU_IS_BIG_ENDIAN) endswap_int_array (ptr, len) ; total /= psf->bytewidth ; if (total < len) psf->error = SFE_SHORT_READ ; return total ;} /* pcm_read_lei2i */int pcm_read_f2i (SF_PRIVATE *psf, int *ptr, int len){ unsigned int readcount, thisread ; int bytecount, bufferlen ; int index = 0, total = 0 ; bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ; bytecount = len * psf->bytewidth ; while (bytecount > 0) { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ; thisread = fread (psf->buffer, 1, readcount, psf->file) ; f2i_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ; total += thisread ; if (thisread < readcount) break ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -