sndfile.c
来自「LastWave」· C语言 代码 · 共 1,203 行 · 第 1/3 页
C
1,203 行
break ; case SF_FORMAT_PAF : if ((sf_errno = __paf_open_write (psf))) { free (psf) ; return NULL ; } ; break ; case SF_FORMAT_SVX : if ((sf_errno = __svx_open_write (psf))) { free (psf) ; return NULL ; } ; break ; default : sf_errno = SFE_UNKNOWN_FORMAT ; free (psf) ; return NULL ; } ; return (SNDFILE*) psf ;} /* sf_open_write *//*------------------------------------------------------------------------------*/int sf_perror (SNDFILE *sndfile){ SF_PRIVATE *psf ; int k, errnum ; if (! sndfile) { errnum = sf_errno ; } else { VALIDATE_SNDFILE_AND_ASSIGN_PSF(sndfile,psf) ; errnum = psf->error ; } ; errnum = (errnum >= SFE_MAX_ERROR || errnum < 0) ? 0 : errnum ; for (k = 0 ; SndfileErrors[k].str ; k++) if (errnum == SndfileErrors[k].error) { printf ("%s\n", SndfileErrors[k].str) ; return SFE_NO_ERROR ; } ; printf ("No error string for error number %d.\n", errnum) ; return SFE_NO_ERROR ;} /* sf_perror *//*------------------------------------------------------------------------------*/int sf_error_str (SNDFILE *sndfile, char *str, size_t maxlen){ SF_PRIVATE *psf ; int errnum, k ; if (! sndfile) { errnum = sf_errno ; } else { VALIDATE_SNDFILE_AND_ASSIGN_PSF(sndfile,psf) ; errnum = psf->error ; } ; errnum = (errnum >= SFE_MAX_ERROR || errnum < 0) ? 0 : errnum ; for (k = 0 ; SndfileErrors[k].str ; k++) if (errnum == SndfileErrors[k].error) { strncpy (str, SndfileErrors [errnum].str, maxlen) ; str [maxlen-1] = 0 ; return SFE_NO_ERROR ; } ; strncpy (str, "No error defined for this error number. This is a bug in libsndfile.", maxlen) ; str [maxlen-1] = 0 ; return SFE_NO_ERROR ;} /* sf_error_str *//*------------------------------------------------------------------------------*/int sf_error_number (int errnum, char *str, size_t maxlen){ int k ; errnum = (errnum >= SFE_MAX_ERROR || errnum < 0) ? 0 : errnum ; for (k = 0 ; SndfileErrors[k].str ; k++) if (errnum == SndfileErrors[k].error) { strncpy (str, SndfileErrors [errnum].str, maxlen) ; str [maxlen-1] = 0 ; return SFE_NO_ERROR ; } ; strncpy (str, "No error defined for this error number. This is a bug in libsndfile.", maxlen) ; str [maxlen-1] = 0 ; return SFE_NO_ERROR ;} /* sf_error_number *//*------------------------------------------------------------------------------*/int sf_format_check (const SF_INFO *info){ int subformat = info->format & SF_FORMAT_SUBMASK ; if (info->channels < 1 || info->channels > 256) return 0 ; switch (info->format & SF_FORMAT_TYPEMASK) { case SF_FORMAT_WAV : if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32)) return 1 ; if (subformat == SF_FORMAT_FLOAT && info->pcmbitwidth == 32) return 1 ; if (subformat == SF_FORMAT_IMA_ADPCM && info->pcmbitwidth == 16 && info->channels <= 2) return 1 ; if (subformat == SF_FORMAT_MS_ADPCM && info->pcmbitwidth == 16 && info->channels <= 2) return 1 ; if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) return 1 ; break ; case SF_FORMAT_AIFF : if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32)) return 1 ; break ; case SF_FORMAT_AU : if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32)) return 1 ; if (subformat == SF_FORMAT_ULAW) return 1 ; if (subformat == SF_FORMAT_ALAW) return 1 ; break ; case SF_FORMAT_AULE : if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32)) return 1 ; if (subformat == SF_FORMAT_ULAW) return 1 ; if (subformat == SF_FORMAT_ALAW) return 1 ; break ; case SF_FORMAT_RAW : if (subformat == SF_FORMAT_PCM_S8 && info->pcmbitwidth == 8) return 1 ; if (subformat == SF_FORMAT_PCM_U8 && info->pcmbitwidth == 8) return 1 ; if (subformat != SF_FORMAT_PCM_BE && subformat != SF_FORMAT_PCM_LE) break ; if (info->pcmbitwidth % 8 || info->pcmbitwidth > 32) break ; return 1 ; break ; case SF_FORMAT_PAF : if (subformat == SF_FORMAT_PCM_S8 && info->pcmbitwidth == 8) return 1 ; if (subformat != SF_FORMAT_PCM_BE && subformat != SF_FORMAT_PCM_LE) break ; if (info->pcmbitwidth % 8 || info->pcmbitwidth > 24) break ; return 1 ; break ; case SF_FORMAT_SVX : if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth == 8 || info->pcmbitwidth == 16)) return 1 ; break ; default : break ; } ; return 0 ;} /* sf_format_check *//*------------------------------------------------------------------------------*/size_t sf_get_header_info (SNDFILE *sndfile, char *buffer, size_t bufferlen, size_t offset){ SF_PRIVATE *psf ; int len ; if (! sndfile) { strncpy (buffer, sf_strbuffer, bufferlen - 1) ; buffer [bufferlen - 1] = 0 ; return strlen (sf_strbuffer) ; } ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ; len = strlen (psf->strbuffer) ; if (offset < 0 || offset >= len) return 0 ; strncpy (buffer, psf->strbuffer, bufferlen - 1) ; buffer [bufferlen - 1] = 0 ; return strlen (psf->strbuffer) ;} /* sf_get_header_info *//*------------------------------------------------------------------------------*/size_t sf_get_lib_version (char *buffer, size_t bufferlen){ if (! buffer || ! bufferlen) return 0 ; strncpy (buffer, PACKAGE, bufferlen - 1) ; buffer [bufferlen - 1] = 0 ; strncat (buffer, "-", bufferlen - strlen (buffer) - 1) ; strncat (buffer, VERSION, bufferlen - strlen (buffer) - 1) ; return strlen (buffer) ;} /* sf_get_lib_version *//*------------------------------------------------------------------------------*/double sf_signal_max (SNDFILE *sndfile){ SF_PRIVATE *psf ; off_t position ; unsigned int k, len, readcount ; double max = 0.0, *data, temp ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ; if (! psf->sf.seekable) { psf->error = SFE_NOT_SEEKABLE ; return 0.0 ; } ; if (! psf->read_double) { psf->error = SFE_UNIMPLEMENTED ; return -1 ; } ; position = sf_seek (sndfile, 0, SEEK_CUR) ; /* Get current position in file */ sf_seek (sndfile, 0, SEEK_SET) ; /* Go to start of file. */ len = psf->sf.channels * 1024 ; data = (double*) malloc (len * sizeof (double)) ; readcount = len ; while (readcount == len) { readcount = psf->read_double (psf, data, len, 0) ; for (k = 0 ; k < len ; k++) { temp = data [k] ; temp = temp < 0.0 ? -temp : temp ; max = temp > max ? temp : max ; } ; } ; free (data) ; sf_seek (sndfile, position, SEEK_SET) ; /* Return to original position. */ return max ;} /* sf_signal_max *//*------------------------------------------------------------------------------*/off_t sf_seek (SNDFILE *sndfile, off_t offset, int whence){ SF_PRIVATE *psf ; off_t realseek, position ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ; if (! psf->sf.seekable) { psf->error = SFE_NOT_SEEKABLE ; return ((off_t) -1) ; } ; if (psf->seek_func) return psf->seek_func (psf, offset, whence) ; if (! (psf->blockwidth && psf->datalength && psf->dataoffset>=0)) /* ??? EMMANUEL */ { psf->error = SFE_BAD_SEEK ; return ((off_t) -1) ; } ; switch (whence) { case SEEK_SET : if (offset < 0 || offset * psf->blockwidth > psf->datalength) { psf->error = SFE_BAD_SEEK ; return ((off_t) -1) ; } ; realseek = psf->dataoffset + offset * psf->blockwidth ; fseek (psf->file, realseek, SEEK_SET) ; position = ftell (psf->file) ; break ; case SEEK_CUR : realseek = offset * psf->blockwidth ; position = ftell (psf->file) - psf->dataoffset ; if (position + realseek > psf->datalength || position + realseek < 0) { psf->error = SFE_BAD_SEEK ; return ((off_t) -1) ; } ; fseek (psf->file, realseek, SEEK_CUR) ; position = ftell (psf->file) ; break ; case SEEK_END : if (offset > 0 || psf->sf.samples + offset < 0) { psf->error = SFE_BAD_SEEK ; return ((off_t) -1) ; } ; realseek = (psf->sf.samples + offset) * psf->blockwidth + psf->dataoffset ; fseek (psf->file, realseek, SEEK_SET) ; position = ftell (psf->file) ; break ; default : psf->error = SFE_BAD_SEEK ; return ((off_t) -1) ; } ; psf->current = (position - psf->dataoffset) / psf->blockwidth ; return psf->current ;} /* sf_seek *//*------------------------------------------------------------------------------*/size_t sf_read_raw (SNDFILE *sndfile, void *ptr, size_t bytes){ SF_PRIVATE *psf ; size_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ; if (psf->mode != SF_MODE_READ) { psf->error = SFE_NOT_READMODE ; return ((size_t) -1) ; } ; if (psf->current >= psf->datalength) { memset (ptr, 0, bytes) ; return 0 ; } ; if (bytes % (psf->sf.channels * psf->bytewidth)) { psf->error = SFE_BAD_READ_ALIGN ; return (size_t) -1 ; } ; count = fread (ptr, 1, bytes, psf->file) ; if (count < bytes) memset (((char*)ptr) + count, 0, bytes - count) ; psf->current += count / psf->blockwidth ; return count ;} /* sf_read_raw *//*------------------------------------------------------------------------------*/size_t sf_read_short (SNDFILE *sndfile, short *ptr, size_t len){ SF_PRIVATE *psf ; size_t count, extra ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ; if (psf->mode != SF_MODE_READ) { psf->error = SFE_NOT_READMODE ; return (size_t) -1 ; } ; if (len % psf->sf.channels) { psf->error = SFE_BAD_READ_ALIGN ; return (size_t) -1 ; } ; if (psf->current >= psf->sf.samples) { memset (ptr, 0, len * sizeof (short)) ; return 0 ; /* End of file. */ } ; if (! psf->read_short) { psf->error = SFE_UNIMPLEMENTED ; return (size_t) -1 ; } ; count = psf->read_short (psf, ptr, len) ; if (psf->current + count / psf->sf.channels > psf->sf.samples) { count = (psf->sf.samples - psf->current) * psf->sf.channels ; extra = len - count ; memset (ptr + count, 0, extra * sizeof (short)) ; psf->current = psf->sf.samples ;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?