summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libxineadec/adpcm.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/libxineadec/adpcm.c b/src/libxineadec/adpcm.c
index e08507a95..f7785274d 100644
--- a/src/libxineadec/adpcm.c
+++ b/src/libxineadec/adpcm.c
@@ -24,7 +24,7 @@
* formats can be found here:
* http://www.pcisys.net/~melanson/codecs/
*
- * $Id: adpcm.c,v 1.4 2002/06/08 19:45:19 tmmm Exp $
+ * $Id: adpcm.c,v 1.5 2002/06/10 06:27:40 tmmm Exp $
*/
#include <stdio.h>
@@ -196,7 +196,7 @@ static void dk3_adpcm_decode_block(adpcm_decoder_t *this, buf_element_t *buf) {
int sum_index;
int diff_index;
int diff_channel;
- int out_ptr = 0;
+ int out_ptr;
unsigned char last_byte = 0;
unsigned char nibble;
@@ -226,7 +226,10 @@ static void dk3_adpcm_decode_block(adpcm_decoder_t *this, buf_element_t *buf) {
sum_index = this->buf[i + 14];
diff_index = this->buf[i + 15];
- j = i + DK3_ADPCM_PREAMBLE_SIZE;
+ j = DK3_ADPCM_PREAMBLE_SIZE; /* start past the preamble */
+ out_ptr = 0;
+ last_byte = 0;
+ decode_top_nibble_next = 0;
while (j < this->in_block_size) {
// process the first predictor of the sum channel
@@ -317,7 +320,7 @@ static void dk3_adpcm_decode_block(adpcm_decoder_t *this, buf_element_t *buf) {
return;
}
- /* out_ptr and j are samples counts, mem_size is a byte count */
+ /* out_ptr and j are sample counts, mem_size is a byte count */
if (((out_ptr - j) * 2) > audio_buffer->mem_size)
bytes_to_send = audio_buffer->mem_size;
else
@@ -362,6 +365,8 @@ static void dk4_adpcm_decode_block(adpcm_decoder_t *this, buf_element_t *buf) {
/* iterate through each block in the in buffer */
for (i = 0; i < this->size; i += this->in_block_size) {
+ out_ptr = 0;
+
/* the first predictor value goes straight to the output */
predictor_l = this->decode_buffer[0] = LE_16(&this->buf[i + 0]);
SE_16BIT(predictor_l);
@@ -396,7 +401,7 @@ static void dk4_adpcm_decode_block(adpcm_decoder_t *this, buf_element_t *buf) {
return;
}
- /* out_ptr and j are samples counts, mem_size is a byte count */
+ /* out_ptr and j are sample counts, mem_size is a byte count */
if (((out_ptr - j) * 2) > audio_buffer->mem_size)
bytes_to_send = audio_buffer->mem_size;
else
@@ -446,6 +451,8 @@ static void ms_ima_adpcm_decode_block(adpcm_decoder_t *this,
/* iterate through each block in the in buffer */
for (i = 0; i < this->size; i += this->in_block_size) {
+ out_ptr = 0;
+
/* initialize algorithm for this block */
predictor_l = LE_16(&this->buf[i + 0]);
SE_16BIT(predictor_l);
@@ -507,7 +514,7 @@ static void ms_ima_adpcm_decode_block(adpcm_decoder_t *this,
return;
}
- /* out_ptr and j are samples counts, mem_size is a byte count */
+ /* out_ptr and j are sample counts, mem_size is a byte count */
if (((out_ptr - j) * 2) > audio_buffer->mem_size)
bytes_to_send = audio_buffer->mem_size;
else
@@ -665,6 +672,9 @@ static void ms_adpcm_decode_block(adpcm_decoder_t *this, buf_element_t *buf) {
// fetch the header information, in stereo if both channels are present
j = i;
+ upper_nibble = 1;
+ current_channel = 0;
+ out_ptr = 0;
if (this->buf[j] > 6)
printf(
"MS ADPCM: coefficient (%d) out of range (should be [0..6])\n",
@@ -746,7 +756,7 @@ static void ms_adpcm_decode_block(adpcm_decoder_t *this, buf_element_t *buf) {
return;
}
- /* out_ptr and j are samples counts, mem_size is a byte count */
+ /* out_ptr and j are sample counts, mem_size is a byte count */
if (((out_ptr - j) * 2) > audio_buffer->mem_size)
bytes_to_send = audio_buffer->mem_size;
else