flac alpha

This commit is contained in:
badaix 2015-01-05 23:33:45 +01:00
parent d99c3cb9a0
commit 05f096a333
2 changed files with 27 additions and 17 deletions

View file

@ -19,6 +19,7 @@ static unsigned channels = 0;
static unsigned bps = 0; static unsigned bps = 0;
static msg::Header* flacHeader = NULL; static msg::Header* flacHeader = NULL;
static msg::PcmChunk* flacChunk = NULL; static msg::PcmChunk* flacChunk = NULL;
static msg::PcmChunk* pcmChunk = NULL;
static FLAC__StreamDecoder *decoder = 0; static FLAC__StreamDecoder *decoder = 0;
@ -34,13 +35,17 @@ FlacDecoder::~FlacDecoder()
bool FlacDecoder::decode(msg::PcmChunk* chunk) bool FlacDecoder::decode(msg::PcmChunk* chunk)
{ {
flacChunk = chunk; pcmChunk = chunk;
//logO << "Decode start: " << chunk->payloadSize << endl; //logO << "Decode start: " << chunk->payloadSize << endl;
// flacChunk->payload = (char*)realloc(flacChunk->payload, chunk->payloadSize); flacChunk->payload = (char*)realloc(flacChunk->payload, chunk->payloadSize);
// memcpy(flacChunk->payload, chunk->payload, chunk->payloadSize); memcpy(flacChunk->payload, chunk->payload, chunk->payloadSize);
// flacChunk->payloadSize = chunk->payloadSize; flacChunk->payloadSize = chunk->payloadSize;
FLAC__stream_decoder_process_single(decoder);
pcmChunk->payload = (char*)realloc(pcmChunk->payload, 0);
pcmChunk->payloadSize = 0;
FLAC__stream_decoder_process_single(decoder); FLAC__stream_decoder_process_single(decoder);
if (flacChunk->payloadSize > 0)
FLAC__stream_decoder_process_single(decoder);
//logO << "Decode end\n" << endl; //logO << "Decode end\n" << endl;
return true; return true;
} }
@ -49,6 +54,7 @@ bool FlacDecoder::decode(msg::PcmChunk* chunk)
bool FlacDecoder::setHeader(msg::Header* chunk) bool FlacDecoder::setHeader(msg::Header* chunk)
{ {
flacHeader = chunk; flacHeader = chunk;
flacChunk = new msg::PcmChunk();
FLAC__bool ok = true; FLAC__bool ok = true;
FLAC__StreamDecoderInitStatus init_status; FLAC__StreamDecoderInitStatus init_status;
@ -84,11 +90,14 @@ FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder,
else if (flacChunk != NULL) else if (flacChunk != NULL)
{ {
//logO << "Read: " << *bytes << "\t" << flacChunk->payloadSize << "\n"; //logO << "Read: " << *bytes << "\t" << flacChunk->payloadSize << "\n";
FLAC__StreamDecoderReadStatus result = FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
if (*bytes > flacChunk->payloadSize) if (*bytes > flacChunk->payloadSize)
*bytes = flacChunk->payloadSize; *bytes = flacChunk->payloadSize;
// else
// result = FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
if (flacChunk->payloadSize == 0) // if (flacChunk->payloadSize == 0)
return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; // return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
memcpy(buffer, flacChunk->payload, *bytes); memcpy(buffer, flacChunk->payload, *bytes);
memmove(flacChunk->payload, flacChunk->payload + *bytes, flacChunk->payloadSize - *bytes); memmove(flacChunk->payload, flacChunk->payload + *bytes, flacChunk->payloadSize - *bytes);
@ -96,6 +105,7 @@ FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder,
flacChunk->payload = (char*)realloc(flacChunk->payload, flacChunk->payloadSize); flacChunk->payload = (char*)realloc(flacChunk->payload, flacChunk->payloadSize);
//logO << "Read end\n"; //logO << "Read end\n";
// return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; // return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
return result;
} }
return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
} }
@ -123,20 +133,20 @@ FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder
return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
} }
if (flacChunk != NULL) if (pcmChunk != NULL)
{ {
size_t bytes = frame->header.blocksize * 4; size_t bytes = frame->header.blocksize * 4;
//logO << "blocksize: " << frame->header.blocksize << "\tframe_number: " << frame->header.number.frame_number << "\tsample_number: " << frame->header.number.sample_number << "\n"; //logO << "blocksize: " << frame->header.blocksize << "\tframe_number: " << frame->header.number.frame_number << "\tsample_number: " << frame->header.number.sample_number << "\n";
//logO << "Write: " << bytes << "\n"; //logO << "Write: " << bytes << "\tpayloadSize: " << pcmChunk->payloadSize + bytes << "\n";
//flacChunk->payloadSize = 0; //flacChunk->payloadSize = 0;
flacChunk->payload = (char*)realloc(flacChunk->payload, flacChunk->payloadSize + bytes); pcmChunk->payload = (char*)realloc(pcmChunk->payload, pcmChunk->payloadSize + bytes);
for(size_t i = 0; i < frame->header.blocksize; i++) for(size_t i = 0; i < frame->header.blocksize; i++)
{ {
memcpy(flacChunk->payload + flacChunk->payloadSize + 4*i, (char*)(buffer[0] + i), 2); memcpy(pcmChunk->payload + pcmChunk->payloadSize + 4*i, (char*)(buffer[0] + i), 2);
memcpy(flacChunk->payload + flacChunk->payloadSize + 4*i+2, (char*)(buffer[1] + i), 2); memcpy(pcmChunk->payload + pcmChunk->payloadSize + 4*i+2, (char*)(buffer[1] + i), 2);
//logO << 4*i+2 << "\t" << bytes << "\n";
} }
flacChunk->payloadSize += bytes; pcmChunk->payloadSize += bytes;
//logO << "Write end: " << flacChunk->payloadSize << "\n"; //logO << "Write end: " << flacChunk->payloadSize << "\n";
} }

View file

@ -37,7 +37,7 @@ logD << "payload: " << chunk->payloadSize << "\tsamples: " << chunk->payloadSize
double res = encodedSamples / ((double)sampleFormat.rate / 1000.); double res = encodedSamples / ((double)sampleFormat.rate / 1000.);
if (encodedSamples > 0) if (encodedSamples > 0)
{ {
logD << "encoded: " << chunk->payloadSize << "\tsamples: " << encodedSamples << "\tres: " << res << "\n"; logO << "encoded: " << chunk->payloadSize << "\tsamples: " << encodedSamples << "\tres: " << res << "\n";
encodedSamples = 0; encodedSamples = 0;
chunk->payloadSize = encodedChunk->payloadSize; chunk->payloadSize = encodedChunk->payloadSize;
chunk->payload = (char*)realloc(chunk->payload, encodedChunk->payloadSize); chunk->payload = (char*)realloc(chunk->payload, encodedChunk->payloadSize);
@ -57,7 +57,7 @@ FLAC__StreamEncoderWriteStatus write_callback(const FLAC__StreamEncoder *encoder
unsigned current_frame, unsigned current_frame,
void *client_data) void *client_data)
{ {
logD << "write_callback: " << bytes << ", " << samples << ", " << current_frame << "\n"; logO << "write_callback: " << bytes << ", " << samples << ", " << current_frame << "\n";
FlacEncoder* flacEncoder = (FlacEncoder*)client_data; FlacEncoder* flacEncoder = (FlacEncoder*)client_data;
if ((current_frame == 0) && (bytes > 0) && (samples == 0)) if ((current_frame == 0) && (bytes > 0) && (samples == 0))
{ {
@ -96,7 +96,7 @@ void FlacEncoder::initEncoder()
} }
ok &= FLAC__stream_encoder_set_verify(encoder, true); ok &= FLAC__stream_encoder_set_verify(encoder, true);
ok &= FLAC__stream_encoder_set_compression_level(encoder, 8); ok &= FLAC__stream_encoder_set_compression_level(encoder, 1);
ok &= FLAC__stream_encoder_set_channels(encoder, sampleFormat.channels); ok &= FLAC__stream_encoder_set_channels(encoder, sampleFormat.channels);
ok &= FLAC__stream_encoder_set_bits_per_sample(encoder, sampleFormat.bits); ok &= FLAC__stream_encoder_set_bits_per_sample(encoder, sampleFormat.bits);
ok &= FLAC__stream_encoder_set_sample_rate(encoder, sampleFormat.rate); ok &= FLAC__stream_encoder_set_sample_rate(encoder, sampleFormat.rate);