📄 sndfile.c
字号:
if (len % psf->sf.channels) { psf->error = SFE_BAD_WRITE_ALIGN ; return 0 ; } ; if (! psf->write_float || psf->seek == NULL) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; if (psf->last_op != SFM_WRITE) if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) return 0 ; if (psf->have_written == SF_FALSE && psf->write_header != NULL) psf->write_header (psf, SF_FALSE) ; psf->have_written = SF_TRUE ; count = psf->write_float (psf, ptr, len) ; psf->write_current += count / psf->sf.channels ; psf->last_op = SFM_WRITE ; if (psf->auto_header) psf->write_header (psf, SF_TRUE) ; if (psf->write_current > psf->sf.frames) psf->sf.frames = psf->write_current ; return count ;} /* sf_write_float */sf_count_tsf_writef_float (SNDFILE *sndfile, float *ptr, sf_count_t frames){ SF_PRIVATE *psf ; sf_count_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; if (psf->mode == SFM_READ) { psf->error = SFE_NOT_WRITEMODE ; return 0 ; } ; if (! psf->write_float || psf->seek == NULL) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; if (psf->last_op != SFM_WRITE) if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) return 0 ; if (psf->have_written == SF_FALSE && psf->write_header != NULL) psf->write_header (psf, SF_FALSE) ; psf->have_written = SF_TRUE ; count = psf->write_float (psf, ptr, frames * psf->sf.channels) ; psf->write_current += count / psf->sf.channels ; psf->last_op = SFM_WRITE ; if (psf->auto_header) psf->write_header (psf, SF_TRUE) ; if (psf->write_current > psf->sf.frames) psf->sf.frames = psf->write_current ; return count / psf->sf.channels ;} /* sf_writef_float *//*------------------------------------------------------------------------------*/sf_count_tsf_write_double (SNDFILE *sndfile, double *ptr, sf_count_t len){ SF_PRIVATE *psf ; sf_count_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; if (psf->mode == SFM_READ) { 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->seek == NULL) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; if (psf->last_op != SFM_WRITE) if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) return 0 ; if (psf->have_written == SF_FALSE && psf->write_header != NULL) psf->write_header (psf, SF_FALSE) ; psf->have_written = SF_TRUE ; count = psf->write_double (psf, ptr, len) ; psf->write_current += count / psf->sf.channels ; psf->last_op = SFM_WRITE ; if (psf->auto_header) psf->write_header (psf, SF_TRUE) ; if (psf->write_current > psf->sf.frames) psf->sf.frames = psf->write_current ; return count ;} /* sf_write_double */sf_count_tsf_writef_double (SNDFILE *sndfile, double *ptr, sf_count_t frames){ SF_PRIVATE *psf ; sf_count_t count ; VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; if (psf->mode == SFM_READ) { psf->error = SFE_NOT_WRITEMODE ; return 0 ; } ; if (! psf->write_double || psf->seek == NULL) { psf->error = SFE_UNIMPLEMENTED ; return 0 ; } ; if (psf->last_op != SFM_WRITE) if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) return 0 ; if (psf->have_written == SF_FALSE && psf->write_header != NULL) psf->write_header (psf, SF_FALSE) ; psf->have_written = SF_TRUE ; count = psf->write_double (psf, ptr, frames * psf->sf.channels) ; psf->write_current += count / psf->sf.channels ; psf->last_op = SFM_WRITE ; if (psf->auto_header) psf->write_header (psf, SF_TRUE) ; if (psf->write_current > psf->sf.frames) psf->sf.frames = psf->write_current ; return count / psf->sf.channels ;} /* sf_writef_double *//*=========================================================================** Private functions.*/static inttry_resource_fork (SF_PRIVATE * psf, int mode){ if (psf_open_rsrc (psf, mode) != 0) return 0 ; /* More checking here. */ psf_log_printf (psf, "Resource fork : %s\n", psf->rsrcpath) ; return SF_FORMAT_SD2 ;} /* try_resource_fork */static intformat_from_extension (const char *filename){ char *cptr ; char buffer [16] ; if (filename == NULL) return 0 ; if ((cptr = strrchr (filename, '.')) == NULL) return 0 ; cptr ++ ; if (strlen (cptr) > sizeof (buffer) - 1) return 0 ; strncpy (buffer, cptr, sizeof (buffer)) ; buffer [sizeof (buffer) - 1] = 0 ; /* Convert everything in the buffer to lower case. */ cptr = buffer ; while (*cptr) { *cptr = tolower (*cptr) ; cptr ++ ; } ; cptr = buffer ; if (strcmp (cptr, "au") == 0) return SF_FORMAT_AU | SF_FORMAT_ULAW ; if (strcmp (cptr, "snd") == 0) return SF_FORMAT_AU | SF_FORMAT_ULAW ; if (strcmp (cptr, "vox") == 0) return SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ; return 0 ;} /* format_from_extension */static intguess_file_type (SF_PRIVATE *psf, const char *filename){ int buffer [3], format ; if (psf_binheader_readf (psf, "b", &buffer, SIGNED_SIZEOF (buffer)) != SIGNED_SIZEOF (buffer)) { psf->error = SFE_BAD_FILE_READ ; return 0 ; } ; 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 ('C', 'r', 'e', 'a') && buffer [1] == MAKE_MARKER ('t', 'i', 'v', 'e')) return SF_FORMAT_VOC ; if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0xF8, 0xFF)) == MAKE_MARKER (0x64, 0xA3, 0x00, 0x00) || (buffer [0] & MAKE_MARKER (0xFF, 0xF8, 0xFF, 0xFF)) == MAKE_MARKER (0x00, 0x00, 0xA3, 0x64)) return SF_FORMAT_IRCAM ; if (buffer [0] == MAKE_MARKER ('r', 'i', 'f', 'f')) return SF_FORMAT_W64 ; if (buffer [0] == MAKE_MARKER (0, 0, 0x03, 0xE8) && buffer [1] == MAKE_MARKER (0, 0, 0, 1) && buffer [2] == MAKE_MARKER (0, 0, 0, 1)) return SF_FORMAT_MAT4 ; if (buffer [0] == MAKE_MARKER (0, 0, 0, 0) && buffer [1] == MAKE_MARKER (1, 0, 0, 0) && buffer [2] == MAKE_MARKER (1, 0, 0, 0)) return SF_FORMAT_MAT4 ; if (buffer [0] == MAKE_MARKER ('M', 'A', 'T', 'L') && buffer [1] == MAKE_MARKER ('A', 'B', ' ', '5')) return SF_FORMAT_MAT5 ; if (buffer [0] == MAKE_MARKER ('P', 'V', 'F', '1')) return SF_FORMAT_PVF ; if (buffer [0] == MAKE_MARKER ('E', 'x', 't', 'e') && buffer [1] == MAKE_MARKER ('n', 'd', 'e', 'd') && buffer [2] == MAKE_MARKER (' ', 'I', 'n', 's')) return SF_FORMAT_XI ; if (ENABLE_EXPERIMENTAL_CODE && buffer [0] == MAKE_MARKER ('O', 'g', 'g', 'S')) return SF_FORMAT_OGG ; if (buffer [0] == MAKE_MARKER ('A', 'L', 'a', 'w') && buffer [1] == MAKE_MARKER ('S', 'o', 'u', 'n') && buffer [2] == MAKE_MARKER ('d', 'F', 'i', 'l')) return SF_FORMAT_WVE ; if (buffer [0] == MAKE_MARKER ('D', 'i', 'a', 'm') && buffer [1] == MAKE_MARKER ('o', 'n', 'd', 'W') && buffer [2] == MAKE_MARKER ('a', 'r', 'e', ' ')) return SF_FORMAT_DWD ; if (buffer [0] == MAKE_MARKER ('L', 'M', '8', '9') || buffer [0] == MAKE_MARKER ('5', '3', 0, 0)) return SF_FORMAT_TXW ; if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0x80, 0xFF)) == MAKE_MARKER (0xF0, 0x7E, 0, 0x01)) return SF_FORMAT_SDS ; 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 0 /*-SF_FORMAT_WMA-*/ ; /* HMM (Hidden Markov Model) Tool Kit. */ if (2 * BEI2H_INT (buffer [0]) + 12 == psf->filelength && buffer [2] == MAKE_MARKER (0, 2, 0, 0)) return SF_FORMAT_HTK ; if (buffer [0] == MAKE_MARKER ('f', 'L', 'a', 'C')) return 0 /*-SF_FORMAT_FLAC-*/ ; /* Turtle Beach SMP 16-bit */ if (buffer [0] == MAKE_MARKER ('S', 'O', 'U', 'N') && buffer [1] == MAKE_MARKER ('D', ' ', 'S', 'A')) return 0 ; if (buffer [0] == MAKE_MARKER ('S', 'Y', '8', '0') || buffer [0] == MAKE_MARKER ('S', 'Y', '8', '5')) return 0 ; if (buffer [0] == MAKE_MARKER ('a', 'j', 'k', 'g')) return 0 /*-SF_FORMAT_SHN-*/ ; if (buffer [0] == MAKE_MARKER ('2', 'B', 'I', 'T')) return SF_FORMAT_AVR ; /* This must be the second last one. */ if (psf->filelength > 0 && (format = try_resource_fork (psf, SFM_READ)) != 0) return format ; /* This must be the last one. */ if ((format = format_from_extension (filename)) != 0) return format ; /* Default to header-less RAW PCM file type. */ return SF_FORMAT_RAW ;} /* guess_file_type */static intvalidate_sfinfo (SF_INFO *sfinfo){ if (sfinfo->samplerate < 1) return 0 ; if (sfinfo->frames < 0) return 0 ; if (sfinfo->channels < 1) return 0 ; if ((sfinfo->format & SF_FORMAT_TYPEMASK) == 0) return 0 ; if ((sfinfo->format & SF_FORMAT_SUBMASK) == 0) return 0 ; if (sfinfo->sections < 1) return 0 ; return 1 ;} /* validate_sfinfo */static intvalidate_psf (SF_PRIVATE *psf){ if (psf->datalength < 0) { psf_log_printf (psf, "Invalid SF_PRIVATE field : datalength == %D.\n", psf->datalength) ; return 0 ; } ; if (psf->dataoffset < 0) { psf_log_printf (psf, "Invalid SF_PRIVATE field : dataoffset == %D.\n", psf->dataoffset) ; return 0 ; } ; if (psf->blockwidth && psf->blockwidth != psf->sf.channels * psf->bytewidth) { psf_log_printf (psf, "Invalid SF_PRIVATE field : channels * bytewidth == %d.\n", psf->sf.channels * psf->bytewidth) ; return 0 ; } ; return 1 ;} /* validate_psf */static voidsave_header_info (SF_PRIVATE *psf){ LSF_SNPRINTF (sf_logbuffer, sizeof (sf_logbuffer), "%s", psf->logbuffer) ;} /* save_header_info */static voidcopy_filename (SF_PRIVATE *psf, const char *path){ const char *cptr ; LSF_SNPRINTF (psf->filepath, sizeof (psf->filepath), "%s", path) ; if ((cptr = strrchr (path, '/')) || (cptr = strrchr (path, '\\'))) cptr ++ ; else cptr = path ; memset (psf->filename, 0, sizeof (psf->filename)) ; LSF_SNPRINTF (psf->filename, sizeof (psf->filename), "%s", cptr) ;} /* copy_filename *//*==============================================================================*/static intpsf_close (SF_PRIVATE *psf){ int error ; if (psf->close) error = psf->close (psf) ; psf_fclose (psf) ; if (psf->rsrcdes >= 0) psf_close_rsrc (psf) ; if (psf->fdata) free (psf->fdata) ; if (psf->interleave) free (psf->interleave) ; if (psf->dither) free (psf->dither) ; if (psf->pchunk) free (psf->pchunk) ; if (psf->format_desc) { memset (psf->format_desc, 0, strlen (psf->format_desc)) ; free (psf->format_desc) ; } ; memset (psf, 0, sizeof (SF_PRIVATE)) ; free (psf) ; return 0 ;} /* psf_close */static intpsf_open_file (SF_PRIVATE *psf, int mode, SF_INFO *sfinfo){ int error, format ; if (mode != SFM_READ && mode != SFM_WRITE && mode != SFM_RDWR) return SFE_BAD_OPEN_MODE ; if (sfinfo == NULL) return SFE_BAD_SF_INFO_PTR ; /* Zero out these fields. */ sfinfo->frames = 0 ; sfinfo->sections = 0 ; sfinfo->seekable = 0 ; if (mode == SFM_READ) { if ((sfinfo->format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -