📄 sndfile.c
字号:
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_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 ; if (subformat == SF_FORMAT_FLOAT && info->pcmbitwidth == 32) return 1 ; break ; case SF_FORMAT_AIFF : if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32)) return 1 ; if (subformat == SF_FORMAT_PCM_LE && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32)) return 1 ; if (subformat == SF_FORMAT_PCM_BE && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32)) return 1 ; if (subformat == SF_FORMAT_FLOAT && (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 ; case SF_FORMAT_NIST : if (subformat == SF_FORMAT_PCM_BE && info->pcmbitwidth >= 16 && info->pcmbitwidth <= 32) return 1 ; if (subformat == SF_FORMAT_PCM_LE && info->pcmbitwidth >= 16 && info->pcmbitwidth <= 32) return 1 ; break ; default : break ; } ; return 0 ;} /* sf_format_check *//*------------------------------------------------------------------------------*/size_tsf_get_header_info (SNDFILE *sndfile, char *buffer, size_t bufferlen, size_t offset){ SF_PRIVATE *psf ; int len ; if (! sndfile) { strncpy (buffer, sf_logbuffer, bufferlen - 1) ; buffer [bufferlen - 1] = 0 ; return strlen (sf_logbuffer) ; } ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ; len = strlen (psf->logbuffer) ; if (offset < 0 || offset >= len) return 0 ; strncpy (buffer, psf->logbuffer, bufferlen - 1) ; buffer [bufferlen - 1] = 0 ; return strlen (psf->logbuffer) ;} /* sf_get_header_info *//*------------------------------------------------------------------------------*/size_t sf_get_lib_version (char *buffer, size_t bufferlen){ if (! buffer || ! bufferlen) return 0 ; strncpy (buffer, PACKAGE "-" VERSION, bufferlen - 1) ; buffer [bufferlen - 1] = 0 ; 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 the file has a PEAK chunk use that information. */ if (psf->has_peak) { int k ; for (k = 0 ; k < psf->sf.channels ; k++) if (max < fabs (psf->peak.peak [k].value)) max = fabs (psf->peak.peak [k].value); return max ; } ; /* If the file is not seekable, there is nothing we can do. */ if (! psf->sf.seekable) { psf->error = SFE_NOT_SEEKABLE ; return 0.0 ; } ; if (! psf->read_double) { psf->error = SFE_UNIMPLEMENTED ; return -1 ; } ; /* Brute force. Read the whole file and find the biggest sample. */ 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 = sf_read_double (sndfile, 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) { psf->seek_func (psf, offset, whence) ; return psf->current ; } ; 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) ; */ position = (ftell (psf->file) - psf->dataoffset) / psf->blockwidth ; if (psf->current + offset > psf->sf.samples) { psf->error = SFE_BAD_SEEK ; return ((off_t) -1) ; } ; realseek = psf->dataoffset + (position + offset) * psf->blockwidth ; fseek (psf->file, realseek, SEEK_SET) ; 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_tsf_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 0 ; } ; 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 0 ; } ; 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_tsf_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 0 ; } ; if (len % psf->sf.channels) { psf->error = SFE_BAD_READ_ALIGN ; return 0 ; } ; 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 0 ; } ; 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 ; } ; psf->current += count / psf->sf.channels ; return count ;} /* sf_read_short */size_tsf_readf_short (SNDFILE *sndfile, short *ptr, size_t frames){ 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 0 ; } ; if (psf->current >= psf->sf.samples) { memset (ptr, 0, frames * psf->sf.channels * sizeof (short)) ; return 0 ; /* End of file. */ } ; if (! psf->read_short) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->read_short (psf, ptr, frames * psf->sf.channels) ; if (psf->current + count / psf->sf.channels > psf->sf.samples) { count = (psf->sf.samples - psf->current) * psf->sf.channels ; extra = frames * psf->sf.channels - count ; memset (ptr + count, 0, extra * sizeof (short)) ; psf->current = psf->sf.samples ; } ; psf->current += count / psf->sf.channels ; return count / psf->sf.channels ;} /* sf_readf_short *//*------------------------------------------------------------------------------*/size_t sf_read_int (SNDFILE *sndfile, int *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 0 ; } ; if (len % psf->sf.channels) return (psf->error = SFE_BAD_READ_ALIGN) ; if (psf->current >= psf->sf.samples) { memset (ptr, 0, len * sizeof (int)) ; return 0 ; } ; if (! psf->read_int) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->read_int (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 (int)) ; psf->current = psf->sf.samples ; } ; psf->current += count / psf->sf.channels ; return count ;} /* sf_read_int */size_t sf_readf_int (SNDFILE *sndfile, int *ptr, size_t frames){ 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 0 ; } ; if (psf->current >= psf->sf.samples) { memset (ptr, 0, frames * psf->sf.channels * sizeof (int)) ; return 0 ; } ; if (! psf->read_int) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->read_int (psf, ptr, frames * psf->sf.channels) ; if (psf->current + count / psf->sf.channels > psf->sf.samples) { count = (psf->sf.samples - psf->current) * psf->sf.channels ; extra = frames * psf->sf.channels - count ; memset (ptr + count, 0, extra * sizeof (int)) ; psf->current = psf->sf.samples ; } ; psf->current += count / psf->sf.channels ; return count / psf->sf.channels ;} /* sf_readf_int *//*------------------------------------------------------------------------------*/size_t sf_read_float (SNDFILE *sndfile, float *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 0 ; } ; if (len % psf->sf.channels) return (psf->error = SFE_BAD_READ_ALIGN) ; if (psf->current >= psf->sf.samples) { memset (ptr, 0, len * sizeof (float)) ; return 0 ; } ; if (! psf->read_float) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->read_float (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 (float)) ; psf->current = psf->sf.samples ; } ; psf->current += count / psf->sf.channels ; return count ;} /* sf_read_float */size_t sf_readf_float (SNDFILE *sndfile, float *ptr, size_t frames){ 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 0 ; } ; if (psf->current >= psf->sf.samples) { memset (ptr, 0, frames * psf->sf.channels * sizeof (float)) ; return 0 ; } ; if (! psf->read_float) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -