📄 sds.c
字号:
unsigned int sample ; int k ; psds->read_block ++ ; psds->read_count = 0 ; if (psds->read_block * psds->samplesperblock > psds->frames) { memset (psds->read_samples, 0, psds->samplesperblock * sizeof (int)) ; return 1 ; } ; if ((k = psf_fread (psds->read_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, SDS_BLOCK_SIZE) ; if (psds->read_data [0] != 0xF0) { printf ("Error A : %02X\n", psds->read_data [0] & 0xFF) ; } ; checksum = psds->read_data [1] ; if (checksum != 0x7E) { printf ("Error 1 : %02X\n", checksum & 0xFF) ; } for (k = 2 ; k < SDS_BLOCK_SIZE - 3 ; k ++) checksum ^= psds->read_data [k] ; checksum &= 0x7F ; if (checksum != psds->read_data [SDS_BLOCK_SIZE - 2]) { psf_log_printf (psf, "Block %d : checksum is %02X should be %02X\n", psds->read_data [4], checksum, psds->read_data [SDS_BLOCK_SIZE - 2]) ; } ; ucptr = psds->read_data + 5 ; for (k = 0 ; k < 120 ; k += 4) { sample = (ucptr [k] << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) + (ucptr [k + 3] << 4) ; psds->read_samples [k / 4] = (int) (sample - 0x80000000) ; } ; return 1 ;} /* sds_4byte_read */static sf_count_tsds_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len){ SDS_PRIVATE *psds ; int *iptr ; int k, bufferlen, readcount, count ; sf_count_t total = 0 ; if (psf->fdata == NULL) return 0 ; psds = (SDS_PRIVATE*) psf->fdata ; iptr = psf->u.ibuf ; bufferlen = ARRAY_LEN (psf->u.ibuf) ; while (len > 0) { readcount = (len >= bufferlen) ? bufferlen : len ; count = sds_read (psf, psds, iptr, readcount) ; for (k = 0 ; k < readcount ; k++) ptr [total + k] = iptr [k] >> 16 ; total += count ; len -= readcount ; } ; return total ;} /* sds_read_s */static sf_count_tsds_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len){ SDS_PRIVATE *psds ; int total ; if (psf->fdata == NULL) return 0 ; psds = (SDS_PRIVATE*) psf->fdata ; total = sds_read (psf, psds, ptr, len) ; return total ;} /* sds_read_i */static sf_count_tsds_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len){ SDS_PRIVATE *psds ; int *iptr ; int k, bufferlen, readcount, count ; sf_count_t total = 0 ; float normfact ; if (psf->fdata == NULL) return 0 ; psds = (SDS_PRIVATE*) psf->fdata ; if (psf->norm_float == SF_TRUE) normfact = 1.0 / 0x80000000 ; else normfact = 1.0 / (1 << psds->bitwidth) ; iptr = psf->u.ibuf ; bufferlen = ARRAY_LEN (psf->u.ibuf) ; while (len > 0) { readcount = (len >= bufferlen) ? bufferlen : len ; count = sds_read (psf, psds, iptr, readcount) ; for (k = 0 ; k < readcount ; k++) ptr [total + k] = normfact * iptr [k] ; total += count ; len -= readcount ; } ; return total ;} /* sds_read_f */static sf_count_tsds_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len){ SDS_PRIVATE *psds ; int *iptr ; int k, bufferlen, readcount, count ; sf_count_t total = 0 ; double normfact ; if (psf->fdata == NULL) return 0 ; psds = (SDS_PRIVATE*) psf->fdata ; if (psf->norm_double == SF_TRUE) normfact = 1.0 / 0x80000000 ; else normfact = 1.0 / (1 << psds->bitwidth) ; iptr = psf->u.ibuf ; bufferlen = ARRAY_LEN (psf->u.ibuf) ; while (len > 0) { readcount = (len >= bufferlen) ? bufferlen : len ; count = sds_read (psf, psds, iptr, readcount) ; for (k = 0 ; k < readcount ; k++) ptr [total + k] = normfact * iptr [k] ; total += count ; len -= readcount ; } ; return total ;} /* sds_read_d */static intsds_read (SF_PRIVATE *psf, SDS_PRIVATE *psds, int *ptr, int len){ int count, total = 0 ; while (total < len) { if (psds->read_block * psds->samplesperblock >= psds->frames) { memset (&(ptr [total]), 0, (len - total) * sizeof (int)) ; return total ; } ; if (psds->read_count >= psds->samplesperblock) psds->reader (psf, psds) ; count = (psds->samplesperblock - psds->read_count) ; count = (len - total > count) ? count : len - total ; memcpy (&(ptr [total]), &(psds->read_samples [psds->read_count]), count * sizeof (int)) ; total += count ; psds->read_count += count ; } ; return total ;} /* sds_read *//*==============================================================================*/static sf_count_tsds_seek (SF_PRIVATE *psf, int mode, sf_count_t seek_from_start){ SDS_PRIVATE *psds ; sf_count_t file_offset ; int newblock, newsample ; if ((psds = psf->fdata) == NULL) { psf->error = SFE_INTERNAL ; return SF_SEEK_ERROR ; } ; if (psf->datalength < 0 || psf->dataoffset < 0) { psf->error = SFE_BAD_SEEK ; return SF_SEEK_ERROR ; } ; if (seek_from_start < 0 || seek_from_start > psf->sf.frames) { psf->error = SFE_BAD_SEEK ; return SF_SEEK_ERROR ; } ; if (mode == SFM_READ && psds->write_count > 0) psds->writer (psf, psds) ; newblock = seek_from_start / psds->samplesperblock ; newsample = seek_from_start % psds->samplesperblock ; switch (mode) { case SFM_READ : if (newblock > psds->total_blocks) { psf->error = SFE_BAD_SEEK ; return SF_SEEK_ERROR ; } ; file_offset = psf->dataoffset + newblock * SDS_BLOCK_SIZE ; if (psf_fseek (psf, file_offset, SEEK_SET) != file_offset) { psf->error = SFE_SEEK_FAILED ; return SF_SEEK_ERROR ; } ; psds->read_block = newblock ; psds->reader (psf, psds) ; psds->read_count = newsample ; break ; case SFM_WRITE : if (newblock > psds->total_blocks) { psf->error = SFE_BAD_SEEK ; return SF_SEEK_ERROR ; } ; file_offset = psf->dataoffset + newblock * SDS_BLOCK_SIZE ; if (psf_fseek (psf, file_offset, SEEK_SET) != file_offset) { psf->error = SFE_SEEK_FAILED ; return SF_SEEK_ERROR ; } ; psds->write_block = newblock ; psds->reader (psf, psds) ; psds->write_count = newsample ; break ; default : psf->error = SFE_BAD_SEEK ; return SF_SEEK_ERROR ; break ; } ; return seek_from_start ;} /* sds_seek *//*==============================================================================*/static intsds_2byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds){ unsigned char *ucptr, checksum ; unsigned int sample ; int k ; psds->write_data [0] = 0xF0 ; psds->write_data [1] = 0x7E ; psds->write_data [2] = 0 ; /* Channel number */ psds->write_data [3] = psds->write_block & 0x7F ; /* Packet number */ ucptr = psds->write_data + 5 ; for (k = 0 ; k < 120 ; k += 2) { sample = psds->write_samples [k / 2] ; sample += 0x80000000 ; ucptr [k] = (sample >> 25) & 0x7F ; ucptr [k + 1] = (sample >> 18) & 0x7F ; } ; checksum = psds->write_data [1] ; for (k = 2 ; k < SDS_BLOCK_SIZE - 3 ; k ++) checksum ^= psds->write_data [k] ; checksum &= 0x7F ; psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ; psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ; if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ; psds->write_block ++ ; psds->write_count = 0 ; if (psds->write_block > psds->total_blocks) psds->total_blocks = psds->write_block ; psds->frames = psds->total_blocks * psds->samplesperblock ; return 1 ;} /* sds_2byte_write */static intsds_3byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds){ unsigned char *ucptr, checksum ; unsigned int sample ; int k ; psds->write_data [0] = 0xF0 ; psds->write_data [1] = 0x7E ; psds->write_data [2] = 0 ; /* Channel number */ psds->write_data [3] = psds->write_block & 0x7F ; /* Packet number */ ucptr = psds->write_data + 5 ; for (k = 0 ; k < 120 ; k += 3) { sample = psds->write_samples [k / 3] ; sample += 0x80000000 ; ucptr [k] = (sample >> 25) & 0x7F ; ucptr [k + 1] = (sample >> 18) & 0x7F ; ucptr [k + 2] = (sample >> 11) & 0x7F ; } ; checksum = psds->write_data [1] ; for (k = 2 ; k < SDS_BLOCK_SIZE - 3 ; k ++) checksum ^= psds->write_data [k] ; checksum &= 0x7F ; psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ; psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ; if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ; psds->write_block ++ ; psds->write_count = 0 ; if (psds->write_block > psds->total_blocks) psds->total_blocks = psds->write_block ; psds->frames = psds->total_blocks * psds->samplesperblock ; return 1 ;} /* sds_3byte_write */static intsds_4byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds){ unsigned char *ucptr, checksum ; unsigned int sample ; int k ; psds->write_data [0] = 0xF0 ; psds->write_data [1] = 0x7E ; psds->write_data [2] = 0 ; /* Channel number */ psds->write_data [3] = psds->write_block & 0x7F ; /* Packet number */ ucptr = psds->write_data + 5 ; for (k = 0 ; k < 120 ; k += 4) { sample = psds->write_samples [k / 4] ; sample += 0x80000000 ; ucptr [k] = (sample >> 25) & 0x7F ; ucptr [k + 1] = (sample >> 18) & 0x7F ; ucptr [k + 2] = (sample >> 11) & 0x7F ; ucptr [k + 3] = (sample >> 4) & 0x7F ; } ; checksum = psds->write_data [1] ; for (k = 2 ; k < SDS_BLOCK_SIZE - 3 ; k ++) checksum ^= psds->write_data [k] ; checksum &= 0x7F ; psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ; psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ; if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ; psds->write_block ++ ; psds->write_count = 0 ; if (psds->write_block > psds->total_blocks) psds->total_blocks = psds->write_block ; psds->frames = psds->total_blocks * psds->samplesperblock ; return 1 ;} /* sds_4byte_write */static sf_count_tsds_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len){ SDS_PRIVATE *psds ; int *iptr ; int k, bufferlen, writecount, count ; sf_count_t total = 0 ; if (psf->fdata == NULL) return 0 ; psds = (SDS_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 = sds_write (psf, psds, iptr, writecount) ; total += count ; len -= writecount ; } ; return total ;} /* sds_write_s */static sf_count_tsds_write_i (SF_PRIVATE *psf, int *ptr, sf_count_t len){ SDS_PRIVATE *psds ; int total ; if (psf->fdata == NULL) return 0 ; psds = (SDS_PRIVATE*) psf->fdata ; total = sds_write (psf, psds, ptr, len) ; return total ;} /* sds_write_i */static sf_count_tsds_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len){ SDS_PRIVATE *psds ; int *iptr ; int k, bufferlen, writecount, count ; sf_count_t total = 0 ; float normfact ; if (psf->fdata == NULL) return 0 ; psds = (SDS_PRIVATE*) psf->fdata ; if (psf->norm_float == SF_TRUE) normfact = 1.0 * 0x80000000 ; else normfact = 1.0 * (1 << psds->bitwidth) ; 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] = normfact * ptr [total + k] ; count = sds_write (psf, psds, iptr, writecount) ; total += count ; len -= writecount ; } ; return total ;} /* sds_write_f */static sf_count_tsds_write_d (SF_PRIVATE *psf, double *ptr, sf_count_t len){ SDS_PRIVATE *psds ; int *iptr ; int k, bufferlen, writecount, count ; sf_count_t total = 0 ; double normfact ; if (psf->fdata == NULL) return 0 ; psds = (SDS_PRIVATE*) psf->fdata ; if (psf->norm_double == SF_TRUE) normfact = 1.0 * 0x80000000 ; else normfact = 1.0 * (1 << psds->bitwidth) ; 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] = normfact * ptr [total + k] ; count = sds_write (psf, psds, iptr, writecount) ; total += count ; len -= writecount ; } ; return total ;} /* sds_write_d */static intsds_write (SF_PRIVATE *psf, SDS_PRIVATE *psds, int *ptr, int len){ int count, total = 0 ; while (total < len) { count = psds->samplesperblock - psds->write_count ; if (count > len - total) count = len - total ; memcpy (&(psds->write_samples [psds->write_count]), &(ptr [total]), count * sizeof (int)) ; total += count ; psds->write_count += count ; if (psds->write_count >= psds->samplesperblock) psds->writer (psf, psds) ; } ; return total ;} /* sds_write *//*** 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: d5d26aa3-368c-4ca6-bb85-377e5a2578cc*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -