📄 sndfile.c
字号:
count = psf->read_float (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 (float)) ; psf->current = psf->sf.samples ; } ; psf->current += count / psf->sf.channels ; return count / psf->sf.channels ;} /* sf_readf_float *//*------------------------------------------------------------------------------*/size_t sf_read_double (SNDFILE *sndfile, double *ptr, size_t len, int normalize){ 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 (double)) ; return 0 ; } ; if (! psf->read_double) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->read_double (psf, ptr, len, normalize) ; 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 (double)) ; psf->current = psf->sf.samples ; } ; psf->current += count / psf->sf.channels ; return count ;} /* sf_read_double */size_t sf_readf_double (SNDFILE *sndfile, double *ptr, size_t frames, int normalize){ 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 (double)) ; return 0 ; } ; if (! psf->read_double) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->read_double (psf, ptr, frames * psf->sf.channels, normalize) ; 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 (double)) ; psf->current = psf->sf.samples ; } ; psf->current += count / psf->sf.channels ; return count / psf->sf.channels ;} /* sf_readf_double *//*------------------------------------------------------------------------------*/size_t sf_write_raw (SNDFILE *sndfile, void *ptr, size_t len){ SF_PRIVATE *psf ; size_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ; if (psf->mode != SF_MODE_WRITE) { psf->error = SFE_NOT_WRITEMODE ; return 0 ; } ; if (len % (psf->sf.channels * psf->bytewidth)) { psf->error = SFE_BAD_WRITE_ALIGN ; return 0 ; } ; count = fwrite (ptr, 1, len, psf->file) ; psf->current += count / psf->blockwidth ; return count ;} /* sf_write_raw *//*------------------------------------------------------------------------------*/size_t sf_write_short (SNDFILE *sndfile, short *ptr, size_t len){ SF_PRIVATE *psf ; size_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ; if (psf->mode != SF_MODE_WRITE) { psf->error = SFE_NOT_WRITEMODE ; return 0 ; } ; if (len % psf->sf.channels) { psf->error = SFE_BAD_WRITE_ALIGN ; return 0 ; } ; if (! psf->write_short) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->write_short (sndfile, ptr, len) ; psf->current += count / psf->sf.channels ; return count ;} /* sf_write_short */size_t sf_writef_short (SNDFILE *sndfile, short *ptr, size_t frames){ SF_PRIVATE *psf ; size_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ; if (psf->mode != SF_MODE_WRITE) { psf->error = SFE_NOT_WRITEMODE ; return 0 ; } ; if (! psf->write_short) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->write_short (sndfile, ptr, frames * psf->sf.channels) ; psf->current += count / psf->sf.channels ; return count / psf->sf.channels ;} /* sf_writef_short *//*------------------------------------------------------------------------------*/size_t sf_write_int (SNDFILE *sndfile, int *ptr, size_t len){ SF_PRIVATE *psf ; size_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ; if (psf->mode != SF_MODE_WRITE) { psf->error = SFE_NOT_WRITEMODE ; return 0 ; } ; if (len % psf->sf.channels) { psf->error = SFE_BAD_WRITE_ALIGN ; return 0 ; } ; if (! psf->write_int) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->write_int (sndfile, ptr, len) ; psf->current += count / psf->sf.channels ; return count ;} /* sf_write_int */size_t sf_writef_int (SNDFILE *sndfile, int *ptr, size_t frames){ SF_PRIVATE *psf ; size_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ; if (psf->mode != SF_MODE_WRITE) { psf->error = SFE_NOT_WRITEMODE ; return 0 ; } ; if (! psf->write_int) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->write_int (sndfile, ptr, frames * psf->sf.channels) ; psf->current += count / psf->sf.channels ; return count / psf->sf.channels ;} /* sf_writef_int *//*------------------------------------------------------------------------------*/size_t sf_write_float (SNDFILE *sndfile, float *ptr, size_t len){ SF_PRIVATE *psf ; size_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ; if (psf->mode != SF_MODE_WRITE) { psf->error = SFE_NOT_WRITEMODE ; return 0 ; } ; if (len % psf->sf.channels) { psf->error = SFE_BAD_WRITE_ALIGN ; return 0 ; } ; if (! psf->write_float) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->write_float (sndfile, ptr, len) ; psf->current += count / psf->sf.channels ; return count ;} /* sf_write_float */size_t sf_writef_float (SNDFILE *sndfile, float *ptr, size_t frames){ SF_PRIVATE *psf ; size_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ; if (psf->mode != SF_MODE_WRITE) { psf->error = SFE_NOT_WRITEMODE ; return 0 ; } ; if (! psf->write_float) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->write_float (sndfile, ptr, frames * psf->sf.channels) ; psf->current += count / psf->sf.channels ; return count / psf->sf.channels ;} /* sf_writef_float *//*------------------------------------------------------------------------------*/size_t sf_write_double (SNDFILE *sndfile, double *ptr, size_t len, int normalize){ SF_PRIVATE *psf ; size_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ; if (psf->mode != SF_MODE_WRITE) { psf->error = SFE_NOT_WRITEMODE ; return 0 ; } ; if (len % psf->sf.channels) { psf->error = SFE_BAD_WRITE_ALIGN ; return 0 ; } ; if (! psf->write_double) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->write_double (sndfile, ptr, len, normalize) ; psf->current += count / psf->sf.channels ; return count ;} /* sf_write_double */size_t sf_writef_double (SNDFILE *sndfile, double *ptr, size_t frames, int normalize){ SF_PRIVATE *psf ; size_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ; if (psf->mode != SF_MODE_WRITE) { psf->error = SFE_NOT_WRITEMODE ; return 0 ; } ; if (! psf->write_double) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; count = psf->write_double (sndfile, ptr, frames * psf->sf.channels, normalize) ; psf->current += count / psf->sf.channels ; return count / psf->sf.channels ;} /* sf_writef_double *//*------------------------------------------------------------------------------*/int sf_close (SNDFILE *sndfile){ SF_PRIVATE *psf ; int error ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ; if (psf->close) error = psf->close (psf) ; fclose (psf->file) ; memset (psf, 0, sizeof (SF_PRIVATE)) ; free (psf) ; return 0 ;} /* sf_close *//*=========================================================================** Private functions.*/static int does_extension_match (const char *ext, const char *test){ char c1, c2 ; if ((! ext) || (! test)) return 0 ; if (strlen (ext) != strlen (test)) return 0 ; while (*ext && *test) { c1 = tolower (*ext) ; c2 = tolower (*test) ; if (c1 > c2) return 0 ; if (c1 < c2) return 0 ; ext ++ ; test ++ ; } return 1 ;} /* does_extension_match */static int is_au_snd_file (const char *filename){ const char *cptr ; if (! (cptr = strrchr (filename, '.'))) return 0 ; cptr ++ ; if (does_extension_match (cptr, "au")) return 1 ; if (does_extension_match (cptr, "snd")) return 1 ; return 0 ;} /* is_au_snd_file */static int guess_file_type (SF_PRIVATE *psf, const char *filename){ unsigned int buffer [3] ; psf_binheader_readf (psf, "B", &buffer, sizeof (buffer)) ; if (buffer [0] == MAKE_MARKER ('R','I','F','F') && buffer [2] == MAKE_MARKER ('W','A','V','E')) return SF_FORMAT_WAV ; if (buffer [0] == MAKE_MARKER ('F','O','R','M')) { if (buffer [2] == MAKE_MARKER ('A','I','F','F') || buffer [2] == MAKE_MARKER ('A','I','F','C')) return SF_FORMAT_AIFF ; if (buffer [2] == MAKE_MARKER ('8','S','V','X') || buffer [2] == MAKE_MARKER ('1','6','S','V')) return SF_FORMAT_SVX ; return 0 ; } ; if ((buffer [0] == MAKE_MARKER ('.','s','n','d') || buffer [0] == MAKE_MARKER ('d','n','s','.'))) return SF_FORMAT_AU ; if ((buffer [0] == MAKE_MARKER ('f','a','p',' ') || buffer [0] == MAKE_MARKER (' ','p','a','f'))) return SF_FORMAT_PAF ; if (buffer [0] == MAKE_MARKER ('N','I','S','T')) return SF_FORMAT_NIST ; if (buffer [0] == MAKE_MARKER ('S','E','K','D') && buffer [1] == MAKE_MARKER ('S','A','M','R')) return SF_FORMAT_SMPLTD ; if (buffer [0] == MAKE_MARKER ('C','r','e','a') && buffer [1] == MAKE_MARKER ('t','i','v','e')) return SF_FORMAT_VOC ; if (buffer [0] == MAKE_MARKER ('C', 'A', 'T', ' ') && buffer [2] == MAKE_MARKER ('R', 'E', 'X', '2')) return SF_FORMAT_REX2 ; if (buffer [0] == MAKE_MARKER (0x30, 0x26, 0xB2, 0x75) && buffer [1] == MAKE_MARKER (0x8E, 0x66, 0xCF, 0x11)) return SF_FORMAT_WMA ; /* This is be the last one. */ if (filename && is_au_snd_file (filename)) return SF_FORMAT_AU | SF_FORMAT_ULAW ; /* Default to header-less RAW PCM file type. */ return SF_FORMAT_RAW ;} /* guess_file_type */static int validate_sfinfo (SF_INFO *sfinfo){ if (! sfinfo->samplerate) return 0 ; if (! sfinfo->samples) return 0 ; if (! sfinfo->channels) return 0 ; if (! sfinfo->pcmbitwidth) return 0 ; if (! sfinfo->format & SF_FORMAT_TYPEMASK) return 0 ; if (! sfinfo->format & SF_FORMAT_SUBMASK) return 0 ; if (! sfinfo->sections) return 0 ; return 1 ;} /* validate_sfinfo */static intvalidate_psf (SF_PRIVATE *psf){ if (! psf->blockwidth) return 0 ; if (! psf->bytewidth) return 0 ; if (! psf->datalength) return 0 ; if (psf->blockwidth != psf->sf.channels * psf->bytewidth) return 0 ; return 1 ;} /* validate_psf */static void save_header_info (SF_PRIVATE *psf){ memset (sf_logbuffer, 0, sizeof (sf_logbuffer)) ; strncpy (sf_logbuffer, psf->logbuffer, sizeof (sf_logbuffer)) ;} /* save_header_info */static void copy_filename (SF_PRIVATE *psf, const char *path){ const char *cptr ; if ((cptr = strrchr (path, '/')) || (cptr = strrchr (path, '\\'))) cptr ++ ; else cptr = path ; memset (psf->filename, 0, SF_FILENAME_LEN) ; strncpy (psf->filename, cptr, SF_FILENAME_LEN - 1) ; psf->filename [SF_FILENAME_LEN - 1] = 0 ;} /* copy_filename */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -