sweet speex.. at least for mono

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6428 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
shatty
2004-01-30 08:27:32 +00:00
parent 1f82f2a416
commit 82175b7177
@@ -250,7 +250,7 @@ SpeexDecoder::Decode(void *buffer, int64 *frameCount,
media_header *mediaHeader, media_decode_info *info /* = 0 */) media_header *mediaHeader, media_decode_info *info /* = 0 */)
{ {
// TRACE("SpeexDecoder::Decode\n"); // TRACE("SpeexDecoder::Decode\n");
uint8 * out_buffer = static_cast<uint8 *>(buffer); float * out_buffer = static_cast<float *>(buffer);
int32 out_bytes_needed = fOutputBufferSize; int32 out_bytes_needed = fOutputBufferSize;
mediaHeader->start_time = fStartTime; mediaHeader->start_time = fStartTime;
@@ -277,7 +277,7 @@ SpeexDecoder::Decode(void *buffer, int64 *frameCount,
ogg_packet * packet = static_cast<ogg_packet*>(chunkBuffer); ogg_packet * packet = static_cast<ogg_packet*>(chunkBuffer);
speex_bits_read_from(&fBits, (char*)packet->packet, packet->bytes); speex_bits_read_from(&fBits, (char*)packet->packet, packet->bytes);
for (int frame = 0 ; frame < fHeader->frames_per_packet ; frame++) { for (int frame = 0 ; frame < fHeader->frames_per_packet ; frame++) {
int ret = speex_decode(fDecoderState, &fBits, (float*)out_buffer); int ret = speex_decode(fDecoderState, &fBits, out_buffer);
if (ret == -1) { if (ret == -1) {
break; break;
} }
@@ -290,19 +290,18 @@ SpeexDecoder::Decode(void *buffer, int64 *frameCount,
break; break;
} }
if (fHeader->nb_channels == 2) { if (fHeader->nb_channels == 2) {
speex_decode_stereo((float*)out_buffer, fHeader->frame_size, fStereoState); speex_decode_stereo(out_buffer, fHeader->frame_size, fStereoState);
} }
for (int i = 0 ; i < fSpeexOutputLength/fFrameSize ; i++) { for (int i = 0 ; i < fHeader->frame_size ; i++) {
*((float*)out_buffer) /= 32000; out_buffer[i] /= 32000.0;
out_buffer += fFrameSize;
} }
out_buffer += fSpeexOutputLength; out_buffer += fHeader->frame_size;
out_bytes_needed -= fSpeexOutputLength; out_bytes_needed -= fHeader->frame_size*fFrameSize;
} }
} }
done: done:
uint samples = (out_buffer - (uint8*)buffer) / fFrameSize; uint samples = ((uint8*)out_buffer - (uint8*)buffer) / fFrameSize;
fStartTime += (1000000LL * samples) / fHeader->rate; fStartTime += (1000000LL * samples) / fHeader->rate;
//TRACE("SpeexDecoder: fStartTime inc'd to %.6f\n", fStartTime / 1000000.0); //TRACE("SpeexDecoder: fStartTime inc'd to %.6f\n", fStartTime / 1000000.0);
*frameCount = (fOutputBufferSize - out_bytes_needed) / fFrameSize; *frameCount = (fOutputBufferSize - out_bytes_needed) / fFrameSize;