diff --git a/lib-src/libsndfile/src/ima_adpcm.c b/lib-src/libsndfile/src/ima_adpcm.c index fdebbe906..e749f8ca8 100644 --- a/lib-src/libsndfile/src/ima_adpcm.c +++ b/lib-src/libsndfile/src/ima_adpcm.c @@ -320,76 +320,62 @@ count ++ ; static int aiff_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) -{ int chan, k, step, diff, vpdiff, blockindx, indx ; +{ int chan, k, step, diff, vpdiff, blockindx, indx, nib ; short bytecode, mask ; - /* Encode the block header. */ + k = 0; + nib = 0; for (chan = 0 ; chan < pima->channels ; chan ++) { blockindx = chan * pima->blocksize ; + /* Encode the block header. */ + pima->block [blockindx++] = (pima->previous [chan] >> 8) & 0xFF ; + pima->block [blockindx++] = (pima->previous [chan] & 0x80) + (pima->stepindx [chan] & 0x7F) ; - pima->block [blockindx] = (pima->samples [chan] >> 8) & 0xFF ; - pima->block [blockindx + 1] = (pima->samples [chan] & 0x80) + (pima->stepindx [chan] & 0x7F) ; + /* Encode the samples as 4 bit. */ + for (indx = 0 ; indx < pima->samplesperblock ; indx ++) + { diff = pima->samples [k++] - pima->previous [chan] ; - pima->previous [chan] = pima->samples [chan] ; - } ; - - /* Encode second and later samples for every block as a 4 bit value. */ - for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++) - { chan = (pima->channels > 1) ? (k % 2) : 0 ; - - diff = pima->samples [k] - pima->previous [chan] ; - - bytecode = 0 ; - step = ima_step_size [pima->stepindx [chan]] ; - vpdiff = step >> 3 ; - if (diff < 0) - { bytecode = 8 ; - diff = -diff ; - } ; - mask = 4 ; - while (mask) - { if (diff >= step) - { bytecode |= mask ; - diff -= step ; - vpdiff += step ; + bytecode = 0 ; + step = ima_step_size [pima->stepindx [chan]] ; + vpdiff = step >> 3 ; + if (diff < 0) + { bytecode = 8 ; + diff = -diff ; + } ; + mask = 4 ; + while (mask) + { if (diff >= step) + { bytecode |= mask ; + diff -= step ; + vpdiff += step ; + } ; + step >>= 1 ; + mask >>= 1 ; } ; - step >>= 1 ; - mask >>= 1 ; - } ; - if (bytecode & 8) - pima->previous [chan] -= vpdiff ; - else + if (bytecode & 8) + vpdiff = -vpdiff ; pima->previous [chan] += vpdiff ; - if (pima->previous [chan] > 32767) - pima->previous [chan] = 32767 ; - else if (pima->previous [chan] < -32768) - pima->previous [chan] = -32768 ; + if (pima->previous [chan] > 32767) + pima->previous [chan] = 32767 ; + else if (pima->previous [chan] < -32768) + pima->previous [chan] = -32768 ; - pima->stepindx [chan] += ima_indx_adjust [bytecode] ; + pima->stepindx [chan] += ima_indx_adjust [bytecode] ; - pima->stepindx [chan] = clamp_ima_step_index (pima->stepindx [chan]) ; - pima->samples [k] = bytecode ; - } ; - - /* Pack the 4 bit encoded samples. */ - - for (chan = 0 ; chan < pima->channels ; chan ++) - { for (indx = pima->channels ; indx < pima->channels * pima->samplesperblock ; indx += 2 * pima->channels) - { blockindx = chan * pima->blocksize + 2 + indx / 2 ; - - pima->block [blockindx] = pima->samples [indx] & 0x0F ; - pima->block [blockindx] |= (pima->samples [indx + chan] << 4) & 0xF0 ; + pima->stepindx [chan] = clamp_ima_step_index (pima->stepindx [chan]) ; + pima->block [blockindx] = (bytecode << (4 * nib)) | pima->block [blockindx]; + blockindx += nib ; + nib = 1 - nib ; } ; } ; /* Write the block to disk. */ - if ((k = psf_fwrite (pima->block, 1, pima->channels * pima->blocksize, psf)) != pima->channels * pima->blocksize) psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pima->channels * pima->blocksize) ; - memset (pima->samples, 0, pima->channels * pima->samplesperblock * sizeof (short)) ; + memset (pima->block, 0, pima->channels * pima->blocksize) ; pima->samplecount = 0 ; pima->blockcount ++ ; @@ -769,7 +755,20 @@ ima_writer_init (SF_PRIVATE *psf, int blockalign) if (psf->file.mode != SFM_WRITE) return SFE_BAD_MODE_RW ; - samplesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ; + switch (SF_CONTAINER (psf->sf.format)) + { case SF_FORMAT_WAV : + case SF_FORMAT_W64 : + samplesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ; + break ; + + case SF_FORMAT_AIFF : + samplesperblock = 2 * (blockalign - 2 * psf->sf.channels) / psf->sf.channels ; + break ; + + default : + psf_log_printf (psf, "ima_reader_init: bad psf->sf.format\n") ; + return SFE_INTERNAL ; + } ; pimasize = sizeof (IMA_ADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ;