1 /*****************************************************************************
2 * adpcm.c : adpcm variant audio decoder
3 *****************************************************************************
4 * Copyright (C) 2001, 2002 the VideoLAN team
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8 * RĂ©mi Denis-Courmont <rem # videolan.org>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 /*****************************************************************************
28 * Documentation: http://www.pcisys.net/~melanson/codecs/adpcm.txt
29 *****************************************************************************/
34 #include <vlc_common.h>
35 #include <vlc_plugin.h>
37 #include <vlc_codec.h>
39 /*****************************************************************************
41 *****************************************************************************/
42 static int OpenDecoder( vlc_object_t
* );
43 static void CloseDecoder( vlc_object_t
* );
45 static aout_buffer_t
*DecodeBlock( decoder_t
*, block_t
** );
48 set_description( N_("ADPCM audio decoder") )
49 set_capability( "decoder", 50 )
50 set_category( CAT_INPUT
)
51 set_subcategory( SUBCAT_INPUT_ACODEC
)
52 set_callbacks( OpenDecoder
, CloseDecoder
)
55 /*****************************************************************************
57 *****************************************************************************/
70 enum adpcm_codec_e codec
;
73 size_t i_samplesperblock
;
78 static void DecodeAdpcmMs ( decoder_t
*, int16_t *, uint8_t * );
79 static void DecodeAdpcmImaWav( decoder_t
*, int16_t *, uint8_t * );
80 static void DecodeAdpcmImaQT ( decoder_t
*, int16_t *, uint8_t * );
81 static void DecodeAdpcmDk4 ( decoder_t
*, int16_t *, uint8_t * );
82 static void DecodeAdpcmDk3 ( decoder_t
*, int16_t *, uint8_t * );
83 static void DecodeAdpcmEA ( decoder_t
*, int16_t *, uint8_t * );
85 static const int pi_channels_maps
[6] =
89 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
,
90 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_CENTER
,
91 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_REARLEFT
| AOUT_CHAN_REARLEFT
,
92 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_CENTER
93 | AOUT_CHAN_REARLEFT
| AOUT_CHAN_REARLEFT
96 /* Various table from http://www.pcisys.net/~melanson/codecs/adpcm.txt */
97 static const int i_index_table
[16] =
99 -1, -1, -1, -1, 2, 4, 6, 8,
100 -1, -1, -1, -1, 2, 4, 6, 8
103 static const int i_step_table
[89] =
105 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
106 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
107 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
108 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
109 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
110 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
111 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
112 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
113 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
116 static const int i_adaptation_table
[16] =
118 230, 230, 230, 230, 307, 409, 512, 614,
119 768, 614, 512, 409, 307, 230, 230, 230
122 static const int i_adaptation_coeff1
[7] =
124 256, 512, 0, 192, 240, 460, 392
127 static const int i_adaptation_coeff2
[7] =
129 0, -256, 0, 64, 0, -208, -232
132 /*****************************************************************************
133 * OpenDecoder: probe the decoder and return score
134 *****************************************************************************/
135 static int OpenDecoder( vlc_object_t
*p_this
)
137 decoder_t
*p_dec
= (decoder_t
*)p_this
;
138 decoder_sys_t
*p_sys
;
140 switch( p_dec
->fmt_in
.i_codec
)
142 case VLC_FOURCC('i','m','a', '4'): /* IMA ADPCM */
143 case VLC_FOURCC('m','s',0x00,0x02): /* MS ADPCM */
144 case VLC_FOURCC('m','s',0x00,0x11): /* IMA ADPCM */
145 case VLC_FOURCC('m','s',0x00,0x61): /* Duck DK4 ADPCM */
146 case VLC_FOURCC('m','s',0x00,0x62): /* Duck DK3 ADPCM */
147 case VLC_FOURCC('X','A','J', 0): /* EA ADPCM */
153 if( p_dec
->fmt_in
.audio
.i_channels
<= 0 ||
154 p_dec
->fmt_in
.audio
.i_channels
> 5 )
156 msg_Err( p_dec
, "invalid number of channel (not between 1 and 5): %i",
157 p_dec
->fmt_in
.audio
.i_channels
);
161 if( p_dec
->fmt_in
.audio
.i_rate
<= 0 )
163 msg_Err( p_dec
, "bad samplerate" );
167 /* Allocate the memory needed to store the decoder's structure */
168 if( ( p_dec
->p_sys
= p_sys
=
169 (decoder_sys_t
*)malloc(sizeof(decoder_sys_t
)) ) == NULL
)
172 switch( p_dec
->fmt_in
.i_codec
)
174 case VLC_FOURCC('i','m','a', '4'): /* IMA ADPCM */
175 p_sys
->codec
= ADPCM_IMA_QT
;
177 case VLC_CODEC_ADPCM_IMA_WAV
: /* IMA ADPCM */
178 p_sys
->codec
= ADPCM_IMA_WAV
;
180 case VLC_CODEC_ADPCM_MS
: /* MS ADPCM */
181 p_sys
->codec
= ADPCM_MS
;
183 case VLC_FOURCC('m','s',0x00,0x61): /* Duck DK4 ADPCM */
184 p_sys
->codec
= ADPCM_DK4
;
186 case VLC_FOURCC('m','s',0x00,0x62): /* Duck DK3 ADPCM */
187 p_sys
->codec
= ADPCM_DK3
;
189 case VLC_FOURCC('X','A','J', 0): /* EA ADPCM */
190 p_sys
->codec
= ADPCM_EA
;
191 p_dec
->fmt_in
.p_extra
= calloc( 2 * p_dec
->fmt_in
.audio
.i_channels
,
193 if( p_dec
->fmt_in
.p_extra
== NULL
)
201 if( p_dec
->fmt_in
.audio
.i_blockalign
<= 0 )
203 p_sys
->i_block
= (p_sys
->codec
== ADPCM_IMA_QT
) ?
204 34 * p_dec
->fmt_in
.audio
.i_channels
: 1024;
205 msg_Warn( p_dec
, "block size undefined, using %zu", p_sys
->i_block
);
209 p_sys
->i_block
= p_dec
->fmt_in
.audio
.i_blockalign
;
212 /* calculate samples per block */
213 switch( p_sys
->codec
)
216 p_sys
->i_samplesperblock
= 64;
219 p_sys
->i_samplesperblock
=
220 2 * ( p_sys
->i_block
- 4 * p_dec
->fmt_in
.audio
.i_channels
) /
221 p_dec
->fmt_in
.audio
.i_channels
;
224 p_sys
->i_samplesperblock
=
225 2 * (p_sys
->i_block
- 7 * p_dec
->fmt_in
.audio
.i_channels
) /
226 p_dec
->fmt_in
.audio
.i_channels
+ 2;
229 p_sys
->i_samplesperblock
=
230 2 * (p_sys
->i_block
- 4 * p_dec
->fmt_in
.audio
.i_channels
) /
231 p_dec
->fmt_in
.audio
.i_channels
+ 1;
234 p_dec
->fmt_in
.audio
.i_channels
= 2;
235 p_sys
->i_samplesperblock
= ( 4 * ( p_sys
->i_block
- 16 ) + 2 )/ 3;
238 p_sys
->i_samplesperblock
=
239 2 * (p_sys
->i_block
- p_dec
->fmt_in
.audio
.i_channels
) /
240 p_dec
->fmt_in
.audio
.i_channels
;
243 msg_Dbg( p_dec
, "format: samplerate:%d Hz channels:%d bits/sample:%d "
244 "blockalign:%zu samplesperblock:%zu",
245 p_dec
->fmt_in
.audio
.i_rate
, p_dec
->fmt_in
.audio
.i_channels
,
246 p_dec
->fmt_in
.audio
.i_bitspersample
, p_sys
->i_block
,
247 p_sys
->i_samplesperblock
);
249 p_dec
->fmt_out
.i_cat
= AUDIO_ES
;
250 p_dec
->fmt_out
.i_codec
= VLC_CODEC_S16N
;
251 p_dec
->fmt_out
.audio
.i_rate
= p_dec
->fmt_in
.audio
.i_rate
;
252 p_dec
->fmt_out
.audio
.i_channels
= p_dec
->fmt_in
.audio
.i_channels
;
253 p_dec
->fmt_out
.audio
.i_physical_channels
=
254 p_dec
->fmt_out
.audio
.i_original_channels
=
255 pi_channels_maps
[p_dec
->fmt_in
.audio
.i_channels
];
257 date_Init( &p_sys
->end_date
, p_dec
->fmt_out
.audio
.i_rate
, 1 );
258 date_Set( &p_sys
->end_date
, 0 );
260 p_dec
->pf_decode_audio
= DecodeBlock
;
265 /*****************************************************************************
267 *****************************************************************************/
268 static aout_buffer_t
*DecodeBlock( decoder_t
*p_dec
, block_t
**pp_block
)
270 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
273 if( !pp_block
|| !*pp_block
) return NULL
;
277 if( p_block
->i_pts
> VLC_TS_INVALID
&&
278 p_block
->i_pts
!= date_Get( &p_sys
->end_date
) )
280 date_Set( &p_sys
->end_date
, p_block
->i_pts
);
282 else if( !date_Get( &p_sys
->end_date
) )
284 /* We've just started the stream, wait for the first PTS. */
285 block_Release( p_block
);
289 /* Don't re-use the same pts twice */
290 p_block
->i_pts
= VLC_TS_INVALID
;
292 if( p_block
->i_buffer
>= p_sys
->i_block
)
294 aout_buffer_t
*p_out
;
296 p_out
= decoder_NewAudioBuffer( p_dec
, p_sys
->i_samplesperblock
);
299 block_Release( p_block
);
303 p_out
->i_pts
= date_Get( &p_sys
->end_date
);
304 p_out
->i_length
= date_Increment( &p_sys
->end_date
,
305 p_sys
->i_samplesperblock
) - p_out
->i_pts
;
307 switch( p_sys
->codec
)
310 DecodeAdpcmImaQT( p_dec
, (int16_t*)p_out
->p_buffer
,
314 DecodeAdpcmImaWav( p_dec
, (int16_t*)p_out
->p_buffer
,
318 DecodeAdpcmMs( p_dec
, (int16_t*)p_out
->p_buffer
,
322 DecodeAdpcmDk4( p_dec
, (int16_t*)p_out
->p_buffer
,
326 DecodeAdpcmDk3( p_dec
, (int16_t*)p_out
->p_buffer
,
330 DecodeAdpcmEA( p_dec
, (int16_t*)p_out
->p_buffer
,
336 p_block
->p_buffer
+= p_sys
->i_block
;
337 p_block
->i_buffer
-= p_sys
->i_block
;
341 block_Release( p_block
);
345 /*****************************************************************************
347 *****************************************************************************/
348 static void CloseDecoder( vlc_object_t
*p_this
)
350 decoder_t
*p_dec
= (decoder_t
*)p_this
;
351 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
353 if( p_sys
->codec
== ADPCM_EA
)
354 free( p_dec
->fmt_in
.p_extra
);
358 /*****************************************************************************
360 *****************************************************************************/
361 #define CLAMP( v, min, max ) \
362 if( (v) < (min) ) (v) = (min); \
363 if( (v) > (max) ) (v) = (max)
365 #define GetByte( v ) \
366 (v) = *p_buffer; p_buffer++;
368 #define GetWord( v ) \
369 (v) = *p_buffer; p_buffer++; \
370 (v) |= ( *p_buffer ) << 8; p_buffer++; \
371 if( (v)&0x8000 ) (v) -= 0x010000;
376 typedef struct adpcm_ms_channel_s
379 int i_sample1
, i_sample2
;
380 int i_coeff1
, i_coeff2
;
382 } adpcm_ms_channel_t
;
385 static int AdpcmMsExpandNibble(adpcm_ms_channel_t
*p_channel
,
392 i_snibble
= i_nibble
- ( i_nibble
&0x08 ? 0x10 : 0 );
394 i_predictor
= ( p_channel
->i_sample1
* p_channel
->i_coeff1
+
395 p_channel
->i_sample2
* p_channel
->i_coeff2
) / 256 +
396 i_snibble
* p_channel
->i_idelta
;
398 CLAMP( i_predictor
, -32768, 32767 );
400 p_channel
->i_sample2
= p_channel
->i_sample1
;
401 p_channel
->i_sample1
= i_predictor
;
403 p_channel
->i_idelta
= ( i_adaptation_table
[i_nibble
] *
404 p_channel
->i_idelta
) / 256;
405 if( p_channel
->i_idelta
< 16 )
407 p_channel
->i_idelta
= 16;
409 return( i_predictor
);
412 static void DecodeAdpcmMs( decoder_t
*p_dec
, int16_t *p_sample
,
415 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
416 adpcm_ms_channel_t channel
[2];
419 int i_block_predictor
;
421 b_stereo
= p_dec
->fmt_in
.audio
.i_channels
== 2 ? 1 : 0;
423 GetByte( i_block_predictor
);
424 CLAMP( i_block_predictor
, 0, 6 );
425 channel
[0].i_coeff1
= i_adaptation_coeff1
[i_block_predictor
];
426 channel
[0].i_coeff2
= i_adaptation_coeff2
[i_block_predictor
];
430 GetByte( i_block_predictor
);
431 CLAMP( i_block_predictor
, 0, 6 );
432 channel
[1].i_coeff1
= i_adaptation_coeff1
[i_block_predictor
];
433 channel
[1].i_coeff2
= i_adaptation_coeff2
[i_block_predictor
];
435 GetWord( channel
[0].i_idelta
);
438 GetWord( channel
[1].i_idelta
);
441 GetWord( channel
[0].i_sample1
);
444 GetWord( channel
[1].i_sample1
);
447 GetWord( channel
[0].i_sample2
);
450 GetWord( channel
[1].i_sample2
);
455 *p_sample
++ = channel
[0].i_sample2
;
456 *p_sample
++ = channel
[1].i_sample2
;
457 *p_sample
++ = channel
[0].i_sample1
;
458 *p_sample
++ = channel
[1].i_sample1
;
462 *p_sample
++ = channel
[0].i_sample2
;
463 *p_sample
++ = channel
[0].i_sample1
;
466 for( i_nibbles
= 2 * (p_sys
->i_block
- 7 * p_dec
->fmt_in
.audio
.i_channels
);
467 i_nibbles
> 0; i_nibbles
-= 2, p_buffer
++ )
469 *p_sample
++ = AdpcmMsExpandNibble( &channel
[0], (*p_buffer
) >> 4);
470 *p_sample
++ = AdpcmMsExpandNibble( &channel
[b_stereo
? 1 : 0],
478 typedef struct adpcm_ima_wav_channel_s
483 } adpcm_ima_wav_channel_t
;
485 static int AdpcmImaWavExpandNibble(adpcm_ima_wav_channel_t
*p_channel
,
490 i_diff
= i_step_table
[p_channel
->i_step_index
] >> 3;
491 if( i_nibble
&0x04 ) i_diff
+= i_step_table
[p_channel
->i_step_index
];
492 if( i_nibble
&0x02 ) i_diff
+= i_step_table
[p_channel
->i_step_index
]>>1;
493 if( i_nibble
&0x01 ) i_diff
+= i_step_table
[p_channel
->i_step_index
]>>2;
495 p_channel
->i_predictor
-= i_diff
;
497 p_channel
->i_predictor
+= i_diff
;
499 CLAMP( p_channel
->i_predictor
, -32768, 32767 );
501 p_channel
->i_step_index
+= i_index_table
[i_nibble
];
503 CLAMP( p_channel
->i_step_index
, 0, 88 );
505 return( p_channel
->i_predictor
);
508 static void DecodeAdpcmImaWav( decoder_t
*p_dec
, int16_t *p_sample
,
511 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
512 adpcm_ima_wav_channel_t channel
[2];
516 b_stereo
= p_dec
->fmt_in
.audio
.i_channels
== 2 ? 1 : 0;
518 GetWord( channel
[0].i_predictor
);
519 GetByte( channel
[0].i_step_index
);
520 CLAMP( channel
[0].i_step_index
, 0, 88 );
525 GetWord( channel
[1].i_predictor
);
526 GetByte( channel
[1].i_step_index
);
527 CLAMP( channel
[1].i_step_index
, 0, 88 );
533 for( i_nibbles
= 2 * (p_sys
->i_block
- 8);
539 for( i
= 0; i
< 4; i
++ )
542 AdpcmImaWavExpandNibble(&channel
[0],p_buffer
[i
]&0x0f);
543 p_sample
[i
* 4 + 2] =
544 AdpcmImaWavExpandNibble(&channel
[0],p_buffer
[i
] >> 4);
548 for( i
= 0; i
< 4; i
++ )
550 p_sample
[i
* 4 + 1] =
551 AdpcmImaWavExpandNibble(&channel
[1],p_buffer
[i
]&0x0f);
552 p_sample
[i
* 4 + 3] =
553 AdpcmImaWavExpandNibble(&channel
[1],p_buffer
[i
] >> 4);
564 for( i_nibbles
= 2 * (p_sys
->i_block
- 4);
566 i_nibbles
-= 2, p_buffer
++ )
568 *p_sample
++ =AdpcmImaWavExpandNibble( &channel
[0], (*p_buffer
)&0x0f );
569 *p_sample
++ =AdpcmImaWavExpandNibble( &channel
[0], (*p_buffer
) >> 4 );
577 static void DecodeAdpcmImaQT( decoder_t
*p_dec
, int16_t *p_sample
,
580 adpcm_ima_wav_channel_t channel
[2];
585 i_step
= p_dec
->fmt_in
.audio
.i_channels
;
587 for( i_ch
= 0; i_ch
< p_dec
->fmt_in
.audio
.i_channels
; i_ch
++ )
590 channel
[i_ch
].i_predictor
= (int16_t)((( ( p_buffer
[0] << 1 )|( p_buffer
[1] >> 7 ) ))<<7);
591 channel
[i_ch
].i_step_index
= p_buffer
[1]&0x7f;
593 CLAMP( channel
[i_ch
].i_step_index
, 0, 88 );
596 for( i_nibbles
= 0; i_nibbles
< 64; i_nibbles
+=2 )
598 *p_sample
= AdpcmImaWavExpandNibble( &channel
[i_ch
], (*p_buffer
)&0x0f);
601 *p_sample
= AdpcmImaWavExpandNibble( &channel
[i_ch
], (*p_buffer
>> 4)&0x0f);
608 p_sample
+= 1 - 64 * i_step
;
615 static void DecodeAdpcmDk4( decoder_t
*p_dec
, int16_t *p_sample
,
618 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
619 adpcm_ima_wav_channel_t channel
[2];
623 b_stereo
= p_dec
->fmt_in
.audio
.i_channels
== 2 ? 1 : 0;
625 GetWord( channel
[0].i_predictor
);
626 GetByte( channel
[0].i_step_index
);
627 CLAMP( channel
[0].i_step_index
, 0, 88 );
632 GetWord( channel
[1].i_predictor
);
633 GetByte( channel
[1].i_step_index
);
634 CLAMP( channel
[1].i_step_index
, 0, 88 );
638 /* first output predictor */
639 *p_sample
++ = channel
[0].i_predictor
;
642 *p_sample
++ = channel
[1].i_predictor
;
646 i_nibbles
< p_sys
->i_block
- 4 * (b_stereo
? 2:1 );
649 *p_sample
++ = AdpcmImaWavExpandNibble( &channel
[0],
651 *p_sample
++ = AdpcmImaWavExpandNibble( &channel
[b_stereo
? 1 : 0],
661 static void DecodeAdpcmDk3( decoder_t
*p_dec
, int16_t *p_sample
,
664 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
665 uint8_t *p_end
= &p_buffer
[p_sys
->i_block
];
666 adpcm_ima_wav_channel_t sum
;
667 adpcm_ima_wav_channel_t diff
;
672 GetWord( sum
.i_predictor
);
673 GetWord( diff
.i_predictor
);
674 GetByte( sum
.i_step_index
);
675 GetByte( diff
.i_step_index
);
677 i_diff_value
= diff
.i_predictor
;
678 /* we process 6 nibbles at once */
679 while( p_buffer
+ 1 <= p_end
)
681 /* first 3 nibbles */
682 AdpcmImaWavExpandNibble( &sum
,
685 AdpcmImaWavExpandNibble( &diff
,
688 i_diff_value
= ( i_diff_value
+ diff
.i_predictor
) / 2;
690 *p_sample
++ = sum
.i_predictor
+ i_diff_value
;
691 *p_sample
++ = sum
.i_predictor
- i_diff_value
;
695 AdpcmImaWavExpandNibble( &sum
,
698 *p_sample
++ = sum
.i_predictor
+ i_diff_value
;
699 *p_sample
++ = sum
.i_predictor
- i_diff_value
;
701 /* now last 3 nibbles */
702 AdpcmImaWavExpandNibble( &sum
,
705 if( p_buffer
< p_end
)
707 AdpcmImaWavExpandNibble( &diff
,
710 i_diff_value
= ( i_diff_value
+ diff
.i_predictor
) / 2;
712 *p_sample
++ = sum
.i_predictor
+ i_diff_value
;
713 *p_sample
++ = sum
.i_predictor
- i_diff_value
;
715 AdpcmImaWavExpandNibble( &sum
,
719 *p_sample
++ = sum
.i_predictor
+ i_diff_value
;
720 *p_sample
++ = sum
.i_predictor
- i_diff_value
;
730 static void DecodeAdpcmEA( decoder_t
*p_dec
, int16_t *p_sample
,
733 static const uint32_t EATable
[]=
735 0x00000000, 0x000000F0, 0x000001CC, 0x00000188,
736 0x00000000, 0x00000000, 0xFFFFFF30, 0xFFFFFF24,
737 0x00000000, 0x00000001, 0x00000003, 0x00000004,
738 0x00000007, 0x00000008, 0x0000000A, 0x0000000B,
739 0x00000000, 0xFFFFFFFF, 0xFFFFFFFD, 0xFFFFFFFC
741 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
743 unsigned i_channels
, c
;
745 int32_t c1
[MAX_CHAN
], c2
[MAX_CHAN
];
748 i_channels
= p_dec
->fmt_in
.audio
.i_channels
;
749 p_end
= &p_buffer
[p_sys
->i_block
];
751 prev
= (int16_t *)p_dec
->fmt_in
.p_extra
;
752 cur
= prev
+ i_channels
;
754 for (c
= 0; c
< i_channels
; c
++)
759 c1
[c
] = EATable
[input
>> 4];
760 c2
[c
] = EATable
[(input
>> 4) + 4];
761 d
[c
] = (input
& 0xf) + 8;
764 for( p_buffer
+= i_channels
; p_buffer
< p_end
; p_buffer
+= i_channels
)
766 for (c
= 0; c
< i_channels
; c
++)
770 spl
= (p_buffer
[c
] >> 4) & 0xf;
771 spl
= (spl
<< 0x1c) >> d
[c
];
772 spl
= (spl
+ cur
[c
] * c1
[c
] + prev
[c
] * c2
[c
] + 0x80) >> 8;
773 CLAMP( spl
, -32768, 32767 );
780 for (c
= 0; c
< i_channels
; c
++)
784 spl
= p_buffer
[c
] & 0xf;
785 spl
= (spl
<< 0x1c) >> d
[c
];
786 spl
= (spl
+ cur
[c
] * c1
[c
] + prev
[c
] * c2
[c
] + 0x80) >> 8;
787 CLAMP( spl
, -32768, 32767 );