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:
parent
b0f629c4df
commit
4ac45bb5f8
@ -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 ;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user