📄 paf.c
字号:
return SF_SEEK_ERROR ; } ; ppaf24 = (PAF24_PRIVATE*) psf->fdata ; if (mode == SFM_READ && ppaf24->write_count > 0) paf24_write_block (psf, ppaf24) ; newblock = offset / ppaf24->samplesperblock ; newsample = offset % ppaf24->samplesperblock ; switch (mode) { case SFM_READ : if (offset > ppaf24->read_block * ppaf24->samplesperblock + ppaf24->read_count) { psf->error = SFE_BAD_SEEK ; return SF_SEEK_ERROR ; } ; if (psf->last_op == SFM_WRITE && ppaf24->write_count) paf24_write_block (psf, ppaf24) ; psf_fseek (psf, psf->dataoffset + newblock * ppaf24->blocksize, SEEK_SET) ; ppaf24->read_block = newblock ; paf24_read_block (psf, ppaf24) ; ppaf24->read_count = newsample ; break ; case SFM_WRITE : if (offset > ppaf24->sample_count) { psf->error = SFE_BAD_SEEK ; return SF_SEEK_ERROR ; } ; if (psf->last_op == SFM_WRITE && ppaf24->write_count) paf24_write_block (psf, ppaf24) ; psf_fseek (psf, psf->dataoffset + newblock * ppaf24->blocksize, SEEK_SET) ; ppaf24->write_block = newblock ; paf24_read_block (psf, ppaf24) ; ppaf24->write_count = newsample ; break ; default : psf->error = SFE_BAD_SEEK ; return SF_SEEK_ERROR ; } ; return newblock * ppaf24->samplesperblock + newsample ;} /* paf24_seek */static intpaf24_close (SF_PRIVATE *psf){ PAF24_PRIVATE *ppaf24 ; if (psf->fdata == NULL) return 0 ; ppaf24 = (PAF24_PRIVATE*) psf->fdata ; if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR) { if (ppaf24->write_count > 0) paf24_write_block (psf, ppaf24) ; } ; return 0 ;} /* paf24_close *//*---------------------------------------------------------------------------*/static intpaf24_read_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24){ int k, channel ; unsigned char *cptr ; ppaf24->read_block ++ ; ppaf24->read_count = 0 ; if (ppaf24->read_block * ppaf24->samplesperblock > ppaf24->sample_count) { memset (ppaf24->samples, 0, ppaf24->samplesperblock * ppaf24->channels) ; return 1 ; } ; /* Read the block. */ if ((k = psf_fread (ppaf24->block, 1, ppaf24->blocksize, psf)) != ppaf24->blocksize) psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, ppaf24->blocksize) ; if (CPU_IS_LITTLE_ENDIAN) { /* Do endian swapping if necessary. */ if (psf->endian == SF_ENDIAN_BIG) endswap_int_array (ppaf24->data, 8 * ppaf24->channels) ; /* Unpack block. */ for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++) { channel = k % ppaf24->channels ; cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ; ppaf24->samples [k] = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ; } ; } else { /* Do endian swapping if necessary. */ if (psf->endian == SF_ENDIAN_BIG) endswap_int_array (ppaf24->data, 8 * ppaf24->channels) ; /* Unpack block. */ for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++) { channel = k % ppaf24->channels ; cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ; ppaf24->samples [k] = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ; } ; } ; return 1 ;} /* paf24_read_block */static intpaf24_read (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len){ int count, total = 0 ; while (total < len) { if (ppaf24->read_block * ppaf24->samplesperblock >= ppaf24->sample_count) { memset (&(ptr [total]), 0, (len - total) * sizeof (int)) ; return total ; } ; if (ppaf24->read_count >= ppaf24->samplesperblock) paf24_read_block (psf, ppaf24) ; count = (ppaf24->samplesperblock - ppaf24->read_count) * ppaf24->channels ; count = (len - total > count) ? count : len - total ; memcpy (&(ptr [total]), &(ppaf24->samples [ppaf24->read_count * ppaf24->channels]), count * sizeof (int)) ; total += count ; ppaf24->read_count += count / ppaf24->channels ; } ; return total ;} /* paf24_read */static sf_count_tpaf24_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len){ PAF24_PRIVATE *ppaf24 ; int *iptr ; int k, bufferlen, readcount, count ; sf_count_t total = 0 ; if (psf->fdata == NULL) return 0 ; ppaf24 = (PAF24_PRIVATE*) psf->fdata ; iptr = psf->u.ibuf ; bufferlen = ARRAY_LEN (psf->u.ibuf) ; while (len > 0) { readcount = (len >= bufferlen) ? bufferlen : len ; count = paf24_read (psf, ppaf24, iptr, readcount) ; for (k = 0 ; k < readcount ; k++) ptr [total + k] = iptr [k] >> 16 ; total += count ; len -= readcount ; } ; return total ;} /* paf24_read_s */static sf_count_tpaf24_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len){ PAF24_PRIVATE *ppaf24 ; int total ; if (psf->fdata == NULL) return 0 ; ppaf24 = (PAF24_PRIVATE*) psf->fdata ; total = paf24_read (psf, ppaf24, ptr, len) ; return total ;} /* paf24_read_i */static sf_count_tpaf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len){ PAF24_PRIVATE *ppaf24 ; int *iptr ; int k, bufferlen, readcount, count ; sf_count_t total = 0 ; float normfact ; if (psf->fdata == NULL) return 0 ; ppaf24 = (PAF24_PRIVATE*) psf->fdata ; normfact = (psf->norm_float == SF_TRUE) ? (1.0 / 0x80000000) : (1.0 / 0x100) ; iptr = psf->u.ibuf ; bufferlen = ARRAY_LEN (psf->u.ibuf) ; while (len > 0) { readcount = (len >= bufferlen) ? bufferlen : len ; count = paf24_read (psf, ppaf24, iptr, readcount) ; for (k = 0 ; k < readcount ; k++) ptr [total + k] = normfact * iptr [k] ; total += count ; len -= readcount ; } ; return total ;} /* paf24_read_f */static sf_count_tpaf24_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len){ PAF24_PRIVATE *ppaf24 ; int *iptr ; int k, bufferlen, readcount, count ; sf_count_t total = 0 ; double normfact ; if (psf->fdata == NULL) return 0 ; ppaf24 = (PAF24_PRIVATE*) psf->fdata ; normfact = (psf->norm_double == SF_TRUE) ? (1.0 / 0x80000000) : (1.0 / 0x100) ; iptr = psf->u.ibuf ; bufferlen = ARRAY_LEN (psf->u.ibuf) ; while (len > 0) { readcount = (len >= bufferlen) ? bufferlen : len ; count = paf24_read (psf, ppaf24, iptr, readcount) ; for (k = 0 ; k < readcount ; k++) ptr [total + k] = normfact * iptr [k] ; total += count ; len -= readcount ; } ; return total ;} /* paf24_read_d *//*---------------------------------------------------------------------------*/static intpaf24_write_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24){ int k, nextsample, channel ; unsigned char *cptr ; /* First pack block. */ if (CPU_IS_LITTLE_ENDIAN) { for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++) { channel = k % ppaf24->channels ; cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ; nextsample = ppaf24->samples [k] >> 8 ; cptr [0] = nextsample ; cptr [1] = nextsample >> 8 ; cptr [2] = nextsample >> 16 ; } ; /* Do endian swapping if necessary. */ if (psf->endian == SF_ENDIAN_BIG) endswap_int_array (ppaf24->data, 8 * ppaf24->channels) ; } else if (CPU_IS_BIG_ENDIAN) { /* This is correct. */ for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++) { channel = k % ppaf24->channels ; cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ; nextsample = ppaf24->samples [k] >> 8 ; cptr [0] = nextsample ; cptr [1] = nextsample >> 8 ; cptr [2] = nextsample >> 16 ; } ; if (psf->endian == SF_ENDIAN_BIG) endswap_int_array (ppaf24->data, 8 * ppaf24->channels) ; } ; /* Write block to disk. */ if ((k = psf_fwrite (ppaf24->block, 1, ppaf24->blocksize, psf)) != ppaf24->blocksize) psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, ppaf24->blocksize) ; if (ppaf24->sample_count < ppaf24->write_block * ppaf24->samplesperblock + ppaf24->write_count) ppaf24->sample_count = ppaf24->write_block * ppaf24->samplesperblock + ppaf24->write_count ; if (ppaf24->write_count == ppaf24->samplesperblock) { ppaf24->write_block ++ ; ppaf24->write_count = 0 ; } ; return 1 ;} /* paf24_write_block */static intpaf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len){ int count, total = 0 ; while (total < len) { count = (ppaf24->samplesperblock - ppaf24->write_count) * ppaf24->channels ; if (count > len - total) count = len - total ; memcpy (&(ppaf24->samples [ppaf24->write_count * ppaf24->channels]), &(ptr [total]), count * sizeof (int)) ; total += count ; ppaf24->write_count += count / ppaf24->channels ; if (ppaf24->write_count >= ppaf24->samplesperblock) paf24_write_block (psf, ppaf24) ; } ; return total ;} /* paf24_write */static sf_count_tpaf24_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len){ PAF24_PRIVATE *ppaf24 ; int *iptr ; int k, bufferlen, writecount = 0, count ; sf_count_t total = 0 ; if (psf->fdata == NULL) return 0 ; ppaf24 = (PAF24_PRIVATE*) psf->fdata ; iptr = psf->u.ibuf ; bufferlen = ARRAY_LEN (psf->u.ibuf) ; while (len > 0) { writecount = (len >= bufferlen) ? bufferlen : len ; for (k = 0 ; k < writecount ; k++) iptr [k] = ptr [total + k] << 16 ; count = paf24_write (psf, ppaf24, iptr, writecount) ; total += count ; len -= writecount ; if (count != writecount) break ; } ; return total ;} /* paf24_write_s */static sf_count_tpaf24_write_i (SF_PRIVATE *psf, int *ptr, sf_count_t len){ PAF24_PRIVATE *ppaf24 ; int writecount, count ; sf_count_t total = 0 ; if (psf->fdata == NULL) return 0 ; ppaf24 = (PAF24_PRIVATE*) psf->fdata ; while (len > 0) { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; count = paf24_write (psf, ppaf24, ptr, writecount) ; total += count ; len -= count ; if (count != writecount) break ; } ; return total ;} /* paf24_write_i */static sf_count_tpaf24_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len){ PAF24_PRIVATE *ppaf24 ; int *iptr ; int k, bufferlen, writecount = 0, count ; sf_count_t total = 0 ; float normfact ; if (psf->fdata == NULL) return 0 ; ppaf24 = (PAF24_PRIVATE*) psf->fdata ; normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : (1.0 / 0x100) ; iptr = psf->u.ibuf ; bufferlen = ARRAY_LEN (psf->u.ibuf) ; while (len > 0) { writecount = (len >= bufferlen) ? bufferlen : len ; for (k = 0 ; k < writecount ; k++) iptr [k] = lrintf (normfact * ptr [total + k]) ; count = paf24_write (psf, ppaf24, iptr, writecount) ; total += count ; len -= writecount ; if (count != writecount) break ; } ; return total ;} /* paf24_write_f */static sf_count_tpaf24_write_d (SF_PRIVATE *psf, double *ptr, sf_count_t len){ PAF24_PRIVATE *ppaf24 ; int *iptr ; int k, bufferlen, writecount = 0, count ; sf_count_t total = 0 ; double normfact ; if (psf->fdata == NULL) return 0 ; ppaf24 = (PAF24_PRIVATE*) psf->fdata ; normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : (1.0 / 0x100) ; iptr = psf->u.ibuf ; bufferlen = ARRAY_LEN (psf->u.ibuf) ; while (len > 0) { writecount = (len >= bufferlen) ? bufferlen : len ; for (k = 0 ; k < writecount ; k++) iptr [k] = lrint (normfact * ptr [total+k]) ; count = paf24_write (psf, ppaf24, iptr, writecount) ; total += count ; len -= writecount ; if (count != writecount) break ; } ; return total ;} /* paf24_write_d *//*** Do not edit or modify anything in this comment block.** The arch-tag line is a file identity tag for the GNU Arch ** revision control system.**** arch-tag: 477a5308-451e-4bbd-bab4-fab6caa4e884*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -