📄 sndfile.c
字号:
psf->Magick = SNDFILE_MAGICK ; /* fopen with 'b' means binary file mode for Win32 systems. */ if (! (psf->file = fopen (path, "wb"))) { sf_errno = SFE_OPEN_FAILED ; sf_close (psf) ; return NULL ; } ; psf->mode = SF_MODE_WRITE ; psf->filelength = ftell (psf->file) ; fseek (psf->file, 0, SEEK_SET) ; copy_filename (psf, path) ; switch (sfinfo->format & SF_FORMAT_TYPEMASK) { case SF_FORMAT_WAV : if ((sf_errno = wav_open_write (psf))) { sf_close (psf) ; return NULL ; } ; break ; case SF_FORMAT_AIFF : if ((sf_errno = aiff_open_write (psf))) { sf_close (psf) ; return NULL ; } ; break ; case SF_FORMAT_AU : case SF_FORMAT_AULE : if ((sf_errno = au_open_write (psf))) { sf_close (psf) ; return NULL ; } ; break ; case SF_FORMAT_RAW : if ((sf_errno = raw_open_write (psf))) { sf_close (psf) ; return NULL ; } ; break ; case SF_FORMAT_PAF : if ((sf_errno = paf_open_write (psf))) { sf_close (psf) ; return NULL ; } ; break ; case SF_FORMAT_SVX : if ((sf_errno = svx_open_write (psf))) { sf_close (psf) ; return NULL ; } ; break ; default : sf_errno = SFE_UNKNOWN_FORMAT ; sf_close (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 ; /* This is the place where each file format can check if the suppiled ** SF_INFO struct is valid. ** Return 0 on failure, 1 ons success. */ 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_GSM610 && info->pcmbitwidth == 16 && info->channels == 1) 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 : 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 ; if (subformat == SF_FORMAT_G721_32 && info->channels == 1) return 1 ; if (subformat == SF_FORMAT_G723_24 && info->channels == 1) 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 = 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)) { 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 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -