Browse Source

Stereo 16 bit, 44.1 kHz WAV file support

dds
PaulStoffregen 11 years ago
parent
commit
b51edd8d8c
1 changed files with 51 additions and 5 deletions
  1. +51
    -5
      Audio.cpp

+ 51
- 5
Audio.cpp View File

// below will depend upon this and fail if not even. // below will depend upon this and fail if not even.
leftover_bytes = 0; leftover_bytes = 0;
state = state_play; state = state_play;
if (state & 1) {
// if we're going to start stereo
// better allocate another output block
block_right = allocate();
if (!block_right) return false;
}
} else { } else {
state = STATE_PARSE4; state = STATE_PARSE4;
} }


// playing mono at native sample rate // playing mono at native sample rate
case STATE_DIRECT_16BIT_MONO: case STATE_DIRECT_16BIT_MONO:
if (size > data_length) {
size = data_length;
}
if (size > data_length) size = data_length;
data_length -= size; data_length -= size;

while (1) { while (1) {
lsb = *p++; lsb = *p++;
msb = *p++; msb = *p++;
state = STATE_STOP; state = STATE_STOP;
return false; return false;



// playing stereo at native sample rate // playing stereo at native sample rate
case STATE_DIRECT_16BIT_STEREO: case STATE_DIRECT_16BIT_STEREO:
if (size > data_length) size = data_length;
data_length -= size;
if (leftover_bytes) {
block_left->data[block_offset] = header[0];
goto right16;
}
while (1) {
lsb = *p++;
msb = *p++;
size -= 2;
if (size == 0) {
if (data_length == 0) break;
header[0] = (msb << 8) | lsb;
leftover_bytes = 2;
return false;
}
block_left->data[block_offset] = (msb << 8) | lsb;
right16:
lsb = *p++;
msb = *p++;
size -= 2;
block_right->data[block_offset++] = (msb << 8) | lsb;
if (block_offset >= AUDIO_BLOCK_SAMPLES) {
transmit(block_left, 0);
release(block_left);
block_left = NULL;
transmit(block_right, 1);
release(block_right);
block_right = NULL;
data_length += size;
buffer_remaining = size;
return true;
}
if (size == 0) {
if (data_length == 0) break;
leftover_bytes = 0;
return false;
}
}
// end of file reached
if (block_offset > 0) {
// TODO: fill remainder of last block with zero and transmit
}
state = STATE_STOP;
return false; return false;


// playing mono, converting sample rate // playing mono, converting sample rate

Loading…
Cancel
Save