1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-02 17:09:26 +02:00

Bug 2163 - Continuous error state importing AIFF / IMA ADPCM

Will send patch to upstream.
This commit is contained in:
Leland Lucius 2020-03-16 09:55:52 -05:00
parent b0f629c4df
commit 4ac45bb5f8

View File

@ -320,76 +320,62 @@ count ++ ;
static int static int
aiff_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) 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 ; short bytecode, mask ;
/* Encode the block header. */ k = 0;
nib = 0;
for (chan = 0 ; chan < pima->channels ; chan ++) for (chan = 0 ; chan < pima->channels ; chan ++)
{ blockindx = chan * pima->blocksize ; { 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 ; /* Encode the samples as 4 bit. */
pima->block [blockindx + 1] = (pima->samples [chan] & 0x80) + (pima->stepindx [chan] & 0x7F) ; for (indx = 0 ; indx < pima->samplesperblock ; indx ++)
{ diff = pima->samples [k++] - pima->previous [chan] ;
pima->previous [chan] = pima->samples [chan] ; bytecode = 0 ;
} ; step = ima_step_size [pima->stepindx [chan]] ;
vpdiff = step >> 3 ;
/* Encode second and later samples for every block as a 4 bit value. */ if (diff < 0)
for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++) { bytecode = 8 ;
{ chan = (pima->channels > 1) ? (k % 2) : 0 ; diff = -diff ;
} ;
diff = pima->samples [k] - pima->previous [chan] ; mask = 4 ;
while (mask)
bytecode = 0 ; { if (diff >= step)
step = ima_step_size [pima->stepindx [chan]] ; { bytecode |= mask ;
vpdiff = step >> 3 ; diff -= step ;
if (diff < 0) vpdiff += step ;
{ bytecode = 8 ; } ;
diff = -diff ; step >>= 1 ;
} ; mask >>= 1 ;
mask = 4 ;
while (mask)
{ if (diff >= step)
{ bytecode |= mask ;
diff -= step ;
vpdiff += step ;
} ; } ;
step >>= 1 ;
mask >>= 1 ;
} ;
if (bytecode & 8) if (bytecode & 8)
pima->previous [chan] -= vpdiff ; vpdiff = -vpdiff ;
else
pima->previous [chan] += vpdiff ; pima->previous [chan] += vpdiff ;
if (pima->previous [chan] > 32767) if (pima->previous [chan] > 32767)
pima->previous [chan] = 32767 ; pima->previous [chan] = 32767 ;
else if (pima->previous [chan] < -32768) else if (pima->previous [chan] < -32768)
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->stepindx [chan] = clamp_ima_step_index (pima->stepindx [chan]) ;
pima->samples [k] = bytecode ; pima->block [blockindx] = (bytecode << (4 * nib)) | pima->block [blockindx];
} ; blockindx += nib ;
nib = 1 - nib ;
/* 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 ;
} ; } ;
} ; } ;
/* Write the block to disk. */ /* Write the block to disk. */
if ((k = psf_fwrite (pima->block, 1, pima->channels * pima->blocksize, psf)) != pima->channels * pima->blocksize) 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) ; 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->samplecount = 0 ;
pima->blockcount ++ ; pima->blockcount ++ ;
@ -769,7 +755,20 @@ ima_writer_init (SF_PRIVATE *psf, int blockalign)
if (psf->file.mode != SFM_WRITE) if (psf->file.mode != SFM_WRITE)
return SFE_BAD_MODE_RW ; 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 ; pimasize = sizeof (IMA_ADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ;