Lines Matching defs:pima

31 {	int 			(*decode_block) (SF_PRIVATE *psf, struct IMA_ADPCM_PRIVATE_tag *pima) ;
32 int (*encode_block) (SF_PRIVATE *psf, struct IMA_ADPCM_PRIVATE_tag *pima) ;
67 static int ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) ;
68 static int ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, const short *ptr, int len) ;
85 static int wavlike_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
86 static int wavlike_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
89 static int aiff_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
90 static int aiff_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
156 { IMA_ADPCM_PRIVATE *pima ;
158 pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
164 if (pima->samplecount && pima->samplecount < pima->samplesperblock)
165 pima->encode_block (psf, pima) ;
167 psf->sf.frames = pima->samplesperblock * pima->blockcount / psf->sf.channels ;
179 { IMA_ADPCM_PRIVATE *pima ;
192 if (! (pima = calloc (1, pimasize)))
195 psf->codec_data = (void*) pima ;
197 pima->samples = pima->data ;
198 pima->block = (unsigned char*) (pima->data + samplesperblock * psf->sf.channels) ;
200 pima->channels = psf->sf.channels ;
201 pima->blocksize = blockalign ;
202 pima->samplesperblock = samplesperblock ;
208 if (pima->blocksize <= 0)
209 { psf_log_printf (psf, "*** Error : pima->blocksize should be > 0.\n") ;
213 if (pima->samplesperblock <= 0)
214 { psf_log_printf (psf, "*** Error : pima->samplesperblock should be > 0.\n") ;
218 if (psf->datalength % pima->blocksize)
219 pima->blocks = psf->datalength / pima->blocksize + 1 ;
221 pima->blocks = psf->datalength / pima->blocksize ;
226 count = 2 * (pima->blocksize - 4 * pima->channels) / pima->channels + 1 ;
228 if (pima->samplesperblock != count)
233 pima->decode_block = wavlike_ima_decode_block ;
235 psf->sf.frames = pima->samplesperblock * pima->blocks ;
240 pima->decode_block = aiff_ima_decode_block ;
241 psf->sf.frames = pima->samplesperblock * pima->blocks / pima->channels ;
249 pima->decode_block (psf, pima) ; /* Read first block. */
260 aiff_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
268 pima->blockcount += pima->channels ;
269 pima->samplecount = 0 ;
271 if (pima->blockcount > pima->blocks)
272 { memset (pima->samples, 0, pima->samplesperblock * pima->channels * sizeof (short)) ;
276 if ((k = (int) psf_fread (pima->block, 1, pima->blocksize * pima->channels, psf)) != pima->blocksize * pima->channels)
277 psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ;
280 for (chan = 0 ; chan < pima->channels ; chan++)
281 { blockdata = pima->block + chan * 34 ;
282 sampledata = pima->samples + chan ;
294 for (k = 0 ; k < pima->blocksize - 2 ; k++)
296 sampledata [pima->channels * (2 * k + 0)] = bytecode & 0xF ;
297 sampledata [pima->channels * (2 * k + 1)] = (bytecode >> 4) & 0xF ;
301 for (k = 0 ; k < pima->samplesperblock ; k ++)
304 bytecode = pima->samples [pima->channels * k + chan] ;
321 pima->samples [pima->channels * k + chan] = predictor ;
329 aiff_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
334 for (chan = 0 ; chan < pima->channels ; chan ++)
335 { blockindx = chan * pima->blocksize ;
337 pima->block [blockindx++] = (pima->previous [chan] >> 8) & 0xFF ;
338 pima->block [blockindx++] = (pima->previous [chan] & 0x80) + (pima->stepindx [chan] & 0x7F) ;
341 for (indx = chan ; indx < pima->samplesperblock * pima->channels ; indx += pima->channels)
342 { diff = pima->samples [indx] - pima->previous [chan] ;
345 step = ima_step_size [pima->stepindx [chan]] ;
364 pima->previous [chan] += vpdiff ;
366 if (pima->previous [chan] > 32767)
367 pima->previous [chan] = 32767 ;
368 else if (pima->previous [chan] < -32768)
369 pima->previous [chan] = -32768 ;
371 pima->stepindx [chan] += ima_indx_adjust [bytecode] ;
373 pima->stepindx [chan] = clamp_ima_step_index (pima->stepindx [chan]) ;
374 pima->block [blockindx] = (bytecode << (4 * k)) | pima->block [blockindx] ;
381 if ((k = (int) psf_fwrite (pima->block, 1, pima->channels * pima->blocksize, psf)) != pima->channels * pima->blocksize)
382 psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pima->channels * pima->blocksize) ;
384 memset (pima->block, 0, pima->channels * pima->blocksize) ;
385 pima->samplecount = 0 ;
386 pima->blockcount ++ ;
392 wavlike_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
396 pima->blockcount ++ ;
397 pima->samplecount = 0 ;
399 if (pima->blockcount > pima->blocks)
400 { memset (pima->samples, 0, pima->samplesperblock * pima->channels * sizeof (short)) ;
404 if ((k = (int) psf_fread (pima->block, 1, pima->blocksize, psf)) != pima->blocksize)
405 psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ;
409 for (chan = 0 ; chan < pima->channels ; chan++)
410 { predictor = pima->block [chan*4] | (pima->block [chan*4+1] << 8) ;
414 stepindx [chan] = pima->block [chan*4+2] ;
418 if (pima->block [chan*4+3] != 0)
421 pima->samples [chan] = predictor ;
429 blockindx = 4 * pima->channels ;
431 indxstart = pima->channels ;
432 while (blockindx < pima->blocksize)
433 { for (chan = 0 ; chan < pima->channels ; chan++)
436 { bytecode = pima->block [blockindx++] ;
437 pima->samples [indx] = bytecode & 0x0F ;
438 indx += pima->channels ;
439 pima->samples [indx] = (bytecode >> 4) & 0x0F ;
440 indx += pima->channels ;
443 indxstart += 8 * pima->channels ;
448 for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++)
449 { chan = (pima->channels > 1) ? (k % 2) : 0 ;
451 bytecode = pima->samples [k] & 0xF ;
454 predictor = pima->samples [k - pima->channels] ;
476 pima->samples [k] = predictor ;
483 wavlike_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
488 for (chan = 0 ; chan < pima->channels ; chan++)
489 { pima->block [chan*4] = pima->samples [chan] & 0xFF ;
490 pima->block [chan*4+1] = (pima->samples [chan] >> 8) & 0xFF ;
492 pima->block [chan*4+2] = pima->stepindx [chan] ;
493 pima->block [chan*4+3] = 0 ;
495 pima->previous [chan] = pima->samples [chan] ;
500 for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++)
501 { chan = (pima->channels > 1) ? (k % 2) : 0 ;
503 diff = pima->samples [k] - pima->previous [chan] ;
506 step = ima_step_size [pima->stepindx [chan]] ;
524 pima->previous [chan] -= vpdiff ;
526 pima->previous [chan] += vpdiff ;
528 if (pima->previous [chan] > 32767)
529 pima->previous [chan] = 32767 ;
530 else if (pima->previous [chan] < -32768)
531 pima->previous [chan] = -32768 ;
533 pima->stepindx [chan] += ima_indx_adjust [bytecode] ;
534 pima->stepindx [chan] = clamp_ima_step_index (pima->stepindx [chan]) ;
536 pima->samples [k] = bytecode ;
541 blockindx = 4 * pima->channels ;
543 indxstart = pima->channels ;
544 while (blockindx < pima->blocksize)
545 { for (chan = 0 ; chan < pima->channels ; chan++)
548 { pima->block [blockindx] = pima->samples [indx] & 0x0F ;
549 indx += pima->channels ;
550 pima->block [blockindx] |= (pima->samples [indx] << 4) & 0xF0 ;
551 indx += pima->channels ;
555 indxstart += 8 * pima->channels ;
560 if ((k = (int) psf_fwrite (pima->block, 1, pima->blocksize, psf)) != pima->blocksize)
561 psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pima->blocksize) ;
563 memset (pima->samples, 0, pima->samplesperblock * sizeof (short)) ;
564 pima->samplecount = 0 ;
565 pima->blockcount ++ ;
571 ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len)
575 { if (pima->blockcount >= pima->blocks && pima->samplecount >= pima->samplesperblock)
580 if (pima->samplecount >= pima->samplesperblock)
581 pima->decode_block (psf, pima) ;
583 count = (pima->samplesperblock - pima->samplecount) * pima->channels ;
586 memcpy (&(ptr [indx]), &(pima->samples [pima->samplecount * pima->channels]), count * sizeof (short)) ;
588 pima->samplecount += count / pima->channels ;
597 { IMA_ADPCM_PRIVATE *pima ;
603 pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
608 count = ima_read_block (psf, pima, ptr, readcount) ;
621 { IMA_ADPCM_PRIVATE *pima ;
629 pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
635 count = ima_read_block (psf, pima, sptr, readcount) ;
649 { IMA_ADPCM_PRIVATE *pima ;
658 pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
666 count = ima_read_block (psf, pima, sptr, readcount) ;
680 { IMA_ADPCM_PRIVATE *pima ;
689 pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
697 count = ima_read_block (psf, pima, sptr, readcount) ;
711 { IMA_ADPCM_PRIVATE *pima ;
716 pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
725 pima->blockcount = 0 ;
726 pima->decode_block (psf, pima) ;
727 pima->samplecount = 0 ;
731 if (offset < 0 || offset > pima->blocks * pima->samplesperblock)
736 newblock = offset / pima->samplesperblock ;
737 newsample = offset % pima->samplesperblock ;
741 { psf_fseek (psf, psf->dataoffset + newblockaiff * pima->blocksize, SEEK_SET) ;
742 pima->blockcount = newblockaiff ;
743 pima->decode_block (psf, pima) ;
744 pima->samplecount = newsample ;
752 return newblock * pima->samplesperblock + newsample ;
757 { IMA_ADPCM_PRIVATE *pima ;
762 pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
771 pima->blockcount = 0 ;
772 if (!pima->decode_block)
775 pima->decode_block (psf, pima) ;
776 pima->samplecount = 0 ;
780 if (offset < 0 || offset > pima->blocks * pima->samplesperblock)
785 newblock = offset / pima->samplesperblock ;
786 newsample = offset % pima->samplesperblock ;
789 { psf_fseek (psf, psf->dataoffset + newblock * pima->blocksize, SEEK_SET) ;
790 pima->blockcount = newblock ;
791 pima->decode_block (psf, pima) ;
792 pima->samplecount = newsample ;
800 return newblock * pima->samplesperblock + newsample ;
809 { IMA_ADPCM_PRIVATE *pima ;
833 if ((pima = calloc (1, pimasize)) == NULL)
836 psf->codec_data = (void*) pima ;
838 pima->channels = psf->sf.channels ;
839 pima->blocksize = blockalign ;
840 pima->samplesperblock = samplesperblock ;
842 pima->block = (unsigned char*) pima->data ;
843 pima->samples = (short*) (pima->data + blockalign) ;
845 pima->samplecount = 0 ;
850 pima->encode_block = wavlike_ima_encode_block ;
854 pima->encode_block = aiff_ima_encode_block ;
874 ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, const short *ptr, int len)
878 { count = (pima->samplesperblock - pima->samplecount) * pima->channels ;
883 memcpy (&(pima->samples [pima->samplecount * pima->channels]), &(ptr [total]), count * sizeof (short)) ;
885 pima->samplecount += count / pima->channels ;
888 if (pima->samplecount >= pima->samplesperblock)
889 pima->encode_block (psf, pima) ;
897 { IMA_ADPCM_PRIVATE *pima ;
903 pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
908 count = ima_write_block (psf, pima, ptr, writecount) ;
921 { IMA_ADPCM_PRIVATE *pima ;
929 pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
937 count = ima_write_block (psf, pima, sptr, writecount) ;
949 { IMA_ADPCM_PRIVATE *pima ;
958 pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
968 count = ima_write_block (psf, pima, sptr, writecount) ;
980 { IMA_ADPCM_PRIVATE *pima ;
989 pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
999 count = ima_write_block (psf, pima, sptr, writecount) ;