Lines Matching refs:pms
92 static int msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
93 static sf_count_t msadpcm_read_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) ;
95 static int msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
96 static sf_count_t msadpcm_write_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, const short *ptr, int len) ;
119 { MSADPCM_PRIVATE *pms ;
146 pms = (MSADPCM_PRIVATE*) psf->codec_data ;
148 pms->sync_error = 0 ;
149 pms->samples = pms->dummydata ;
150 pms->block = (unsigned char*) (pms->dummydata + psf->sf.channels * samplesperblock) ;
152 pms->channels = psf->sf.channels ;
153 pms->blocksize = blockalign ;
154 pms->samplesperblock = samplesperblock ;
156 if (pms->blocksize <= 0)
157 { psf_log_printf (psf, "*** Error : pms->blocksize should be > 0.\n") ;
162 { pms->dataremaining = psf->datalength ;
164 if (psf->datalength % pms->blocksize)
165 pms->blocks = psf->datalength / pms->blocksize + 1 ;
167 pms->blocks = psf->datalength / pms->blocksize ;
169 count = 2 * (pms->blocksize - 6 * pms->channels) / pms->channels ;
170 if (pms->samplesperblock != count)
175 psf->sf.frames = (psf->datalength / pms->blocksize) * pms->samplesperblock ;
177 msadpcm_decode_block (psf, pms) ;
186 { pms->samples = pms->dummydata ;
188 pms->samplecount = 0 ;
204 msadpcm_get_bpred (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, unsigned char value)
206 { if (pms->sync_error == 0)
207 { pms->sync_error = 1 ;
217 msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
225 pms->blockcount ++ ;
226 pms->samplecount = 0 ;
228 if (pms->blockcount > pms->blocks)
229 { memset (pms->samples, 0, pms->samplesperblock * pms->channels) ;
233 if ((k = (int) psf_fread (pms->block, 1, pms->blocksize, psf)) != pms->blocksize)
234 { psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pms->blocksize) ;
241 if (pms->channels == 1)
242 { bpred [0] = msadpcm_get_bpred (psf, pms, pms->block [0]) ;
244 chan_idelta [0] = pms->block [1] | (pms->block [2] << 8) ;
247 pms->samples [1] = pms->block [3] | (pms->block [4] << 8) ;
248 pms->samples [0] = pms->block [5] | (pms->block [6] << 8) ;
252 { bpred [0] = msadpcm_get_bpred (psf, pms, pms->block [0]) ;
253 bpred [1] = msadpcm_get_bpred (psf, pms, pms->block [1]) ;
255 chan_idelta [0] = pms->block [2] | (pms->block [3] << 8) ;
256 chan_idelta [1] = pms->block [4] | (pms->block [5] << 8) ;
258 pms->samples [2] = pms->block [6] | (pms->block [7] << 8) ;
259 pms->samples [3] = pms->block [8] | (pms->block [9] << 8) ;
261 pms->samples [0] = pms->block [10] | (pms->block [11] << 8) ;
262 pms->samples [1] = pms->block [12] | (pms->block [13] << 8) ;
282 sampleindx = 2 * pms->channels ;
283 while (blockindx < pms->blocksize)
284 { bytecode = pms->block [blockindx++] ;
285 pms->samples [sampleindx++] = (bytecode >> 4) & 0x0F ;
286 pms->samples [sampleindx++] = bytecode & 0x0F ;
291 for (k = 2 * pms->channels ; k < (pms->samplesperblock * pms->channels) ; k ++)
292 { chan = (pms->channels > 1) ? (k % 2) : 0 ;
294 bytecode = pms->samples [k] & 0xF ;
304 predict = ((pms->samples [k - pms->channels] * AdaptCoeff1 [bpred [chan]])
305 + (pms->samples [k - 2 * pms->channels] * AdaptCoeff2 [bpred [chan]])) >> 8 ; /* => / 256 => FIXED_POINT_COEFF_BASE == 256 */
313 pms->samples [k] = current ;
320 msadpcm_read_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
324 { if (pms->blockcount >= pms->blocks && pms->samplecount >= pms->samplesperblock)
329 if (pms->samplecount >= pms->samplesperblock)
330 if (msadpcm_decode_block (psf, pms) != 0)
333 count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
336 memcpy (&(ptr [indx]), &(pms->samples [pms->samplecount * pms->channels]), count * sizeof (short)) ;
338 pms->samplecount += count / pms->channels ;
347 { MSADPCM_PRIVATE *pms ;
353 pms = (MSADPCM_PRIVATE*) psf->codec_data ;
358 if ((count = (int) msadpcm_read_block (psf, pms, ptr, readcount)) <= 0)
372 { MSADPCM_PRIVATE *pms ;
380 pms = (MSADPCM_PRIVATE*) psf->codec_data ;
387 if ((count = (int) msadpcm_read_block (psf, pms, sptr, readcount)) <= 0)
402 { MSADPCM_PRIVATE *pms ;
411 pms = (MSADPCM_PRIVATE*) psf->codec_data ;
419 if ((count = (int) msadpcm_read_block (psf, pms, sptr, readcount)) <= 0)
434 { MSADPCM_PRIVATE *pms ;
443 pms = (MSADPCM_PRIVATE*) psf->codec_data ;
451 if ((count = (int) msadpcm_read_block (psf, pms, sptr, readcount)) <= 0)
467 { MSADPCM_PRIVATE *pms ;
472 pms = (MSADPCM_PRIVATE*) psf->codec_data ;
481 pms->blockcount = 0 ;
482 msadpcm_decode_block (psf, pms) ;
483 pms->samplecount = 0 ;
487 if (offset < 0 || offset > pms->blocks * pms->samplesperblock)
492 newblock = offset / pms->samplesperblock ;
493 newsample = offset % pms->samplesperblock ;
496 { psf_fseek (psf, psf->dataoffset + newblock * pms->blocksize, SEEK_SET) ;
497 pms->blockcount = newblock ;
498 msadpcm_decode_block (psf, pms) ;
499 pms->samplecount = newsample ;
507 return newblock * pms->samplesperblock + newsample ;
526 msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
532 choose_predictor (pms->channels, pms->samples, bpred, idelta) ;
536 if (pms->channels == 1)
537 { pms->block [0] = bpred [0] ;
538 pms->block [1] = idelta [0] & 0xFF ;
539 pms->block [2] = idelta [0] >> 8 ;
540 pms->block [3] = pms->samples [1] & 0xFF ;
541 pms->block [4] = pms->samples [1] >> 8 ;
542 pms->block [5] = pms->samples [0] & 0xFF ;
543 pms->block [6] = pms->samples [0] >> 8 ;
550 for (k = 2 ; k < pms->samplesperblock ; k++)
551 { predict = (pms->samples [k-1] * AdaptCoeff1 [bpred [0]] + pms->samples [k-2] * AdaptCoeff2 [bpred [0]]) >> 8 ;
552 errordelta = (pms->samples [k] - predict) / idelta [0] ;
567 { pms->block [blockindx++] = byte ;
574 pms->samples [k] = newsamp ;
579 pms->block [0] = bpred [0] ;
580 pms->block [1] = bpred [1] ;
582 pms->block [2] = idelta [0] & 0xFF ;
583 pms->block [3] = idelta [0] >> 8 ;
584 pms->block [4] = idelta [1] & 0xFF ;
585 pms->block [5] = idelta [1] >> 8 ;
587 pms->block [6] = pms->samples [2] & 0xFF ;
588 pms->block [7] = pms->samples [2] >> 8 ;
589 pms->block [8] = pms->samples [3] & 0xFF ;
590 pms->block [9] = pms->samples [3] >> 8 ;
592 pms->block [10] = pms->samples [0] & 0xFF ;
593 pms->block [11] = pms->samples [0] >> 8 ;
594 pms->block [12] = pms->samples [1] & 0xFF ;
595 pms->block [13] = pms->samples [1] >> 8 ;
601 for (k = 4 ; k < 2 * pms->samplesperblock ; k++)
604 predict = (pms->samples [k-2] * AdaptCoeff1 [bpred [chan]] + pms->samples [k-4] * AdaptCoeff2 [bpred [chan]]) >> 8 ;
605 errordelta = (pms->samples [k] - predict) / idelta [chan] ;
623 { pms->block [blockindx++] = byte ;
630 pms->samples [k] = newsamp ;
636 if ((k = (int) psf_fwrite (pms->block, 1, pms->blocksize, psf)) != pms->blocksize)
637 psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pms->blocksize) ;
639 memset (pms->samples, 0, pms->samplesperblock * sizeof (short)) ;
641 pms->blockcount ++ ;
642 pms->samplecount = 0 ;
648 msadpcm_write_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, const short *ptr, int len)
652 { count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
657 memcpy (&(pms->samples [pms->samplecount * pms->channels]), &(ptr [total]), count * sizeof (short)) ;
659 pms->samplecount += count / pms->channels ;
662 if (pms->samplecount >= pms->samplesperblock)
663 msadpcm_encode_block (psf, pms) ;
671 { MSADPCM_PRIVATE *pms ;
677 pms = (MSADPCM_PRIVATE*) psf->codec_data ;
682 count = (int) msadpcm_write_block (psf, pms, ptr, writecount) ;
695 { MSADPCM_PRIVATE *pms ;
703 pms = (MSADPCM_PRIVATE*) psf->codec_data ;
711 count = (int) msadpcm_write_block (psf, pms, sptr, writecount) ;
722 { MSADPCM_PRIVATE *pms ;
731 pms = (MSADPCM_PRIVATE*) psf->codec_data ;
741 count = (int) msadpcm_write_block (psf, pms, sptr, writecount) ;
752 { MSADPCM_PRIVATE *pms ;
763 pms = (MSADPCM_PRIVATE*) psf->codec_data ;
771 count = (int) msadpcm_write_block (psf, pms, sptr, writecount) ;
785 { MSADPCM_PRIVATE *pms ;
787 pms = (MSADPCM_PRIVATE*) psf->codec_data ;
794 if (pms->samplecount && pms->samplecount < pms->samplesperblock)
795 msadpcm_encode_block (psf, pms) ;