void SampleBuffer::loadFromBase64( const QString & _data ) { char * dst = NULL; int dsize = 0; base64::decode( _data, &dst, &dsize ); #ifdef LMMS_HAVE_FLAC_STREAM_DECODER_H QByteArray orig_data = QByteArray::fromRawData( dst, dsize ); QBuffer ba_reader( &orig_data ); ba_reader.open( QBuffer::ReadOnly ); QBuffer ba_writer; ba_writer.open( QBuffer::WriteOnly ); flacStreamDecoderClientData cdata = { &ba_reader, &ba_writer } ; FLAC__StreamDecoder * flac_dec = FLAC__stream_decoder_new(); FLAC__stream_decoder_set_read_callback( flac_dec, flacStreamDecoderReadCallback ); FLAC__stream_decoder_set_write_callback( flac_dec, flacStreamDecoderWriteCallback ); FLAC__stream_decoder_set_error_callback( flac_dec, flacStreamDecoderErrorCallback ); FLAC__stream_decoder_set_metadata_callback( flac_dec, flacStreamDecoderMetadataCallback ); FLAC__stream_decoder_set_client_data( flac_dec, &cdata ); FLAC__stream_decoder_init( flac_dec ); FLAC__stream_decoder_process_until_end_of_stream( flac_dec ); FLAC__stream_decoder_finish( flac_dec ); FLAC__stream_decoder_delete( flac_dec ); ba_reader.close(); orig_data = ba_writer.buffer(); printf("%d\n", (int) orig_data.size() ); m_origFrames = orig_data.size() / sizeof( sampleFrame ); MM_FREE( m_origData ); m_origData = MM_ALLOC( sampleFrame, m_origFrames ); memcpy( m_origData, orig_data.data(), orig_data.size() ); #else /* LMMS_HAVE_FLAC_STREAM_DECODER_H */ m_origFrames = dsize / sizeof( sampleFrame ); MM_FREE( m_origData ); m_origData = MM_ALLOC( sampleFrame, m_origFrames ); memcpy( m_origData, dst, dsize ); #endif delete[] dst; m_audioFile = QString(); update(); }
OggFLAC__StreamDecoderState OggFLAC__stream_decoder_init(OggFLAC__StreamDecoder *decoder) { FLAC__ASSERT(0 != decoder); if(decoder->protected_->state != OggFLAC__STREAM_DECODER_UNINITIALIZED) return decoder->protected_->state = OggFLAC__STREAM_DECODER_ALREADY_INITIALIZED; if(0 == decoder->private_->read_callback || 0 == decoder->private_->write_callback || 0 == decoder->private_->metadata_callback || 0 == decoder->private_->error_callback) return decoder->protected_->state = OggFLAC__STREAM_DECODER_INVALID_CALLBACK; decoder->private_->ogg.need_serial_number = decoder->protected_->use_first_serial_number; /* we will determine the serial number later if necessary */ if(ogg_stream_init(&decoder->private_->ogg.stream_state, decoder->protected_->serial_number) != 0) return decoder->protected_->state = OggFLAC__STREAM_DECODER_OGG_ERROR; if(ogg_sync_init(&decoder->private_->ogg.sync_state) != 0) return decoder->protected_->state = OggFLAC__STREAM_DECODER_OGG_ERROR; FLAC__stream_decoder_set_read_callback(decoder->private_->FLAC_stream_decoder, read_callback_); FLAC__stream_decoder_set_write_callback(decoder->private_->FLAC_stream_decoder, write_callback_); FLAC__stream_decoder_set_metadata_callback(decoder->private_->FLAC_stream_decoder, metadata_callback_); FLAC__stream_decoder_set_error_callback(decoder->private_->FLAC_stream_decoder, error_callback_); FLAC__stream_decoder_set_client_data(decoder->private_->FLAC_stream_decoder, decoder); if(FLAC__stream_decoder_init(decoder->private_->FLAC_stream_decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA) return decoder->protected_->state = OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR; return decoder->protected_->state = OggFLAC__STREAM_DECODER_OK; }
FLAC__StreamDecoderState EasyFLAC__init(EasyFLAC__StreamDecoder *decoder) { if (decoder->is_oggflac) { OggFLAC__stream_decoder_init(decoder->oggflac); return OggFLAC__stream_decoder_get_FLAC_stream_decoder_state(decoder->oggflac); } else return FLAC__stream_decoder_init(decoder->flac); }
FLAC_API FLAC__SeekableStreamDecoderState FLAC__seekable_stream_decoder_init(FLAC__SeekableStreamDecoder *decoder) { FLAC__ASSERT(0 != decoder); if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED) return decoder->protected_->state = FLAC__SEEKABLE_STREAM_DECODER_ALREADY_INITIALIZED; if(0 == decoder->private_->read_callback || 0 == decoder->private_->seek_callback || 0 == decoder->private_->tell_callback || 0 == decoder->private_->length_callback || 0 == decoder->private_->eof_callback) return decoder->protected_->state = FLAC__SEEKABLE_STREAM_DECODER_INVALID_CALLBACK; if(0 == decoder->private_->write_callback || 0 == decoder->private_->metadata_callback || 0 == decoder->private_->error_callback) return decoder->protected_->state = FLAC__SEEKABLE_STREAM_DECODER_INVALID_CALLBACK; decoder->private_->seek_table = 0; decoder->private_->do_md5_checking = decoder->protected_->md5_checking; /* We initialize the FLAC__MD5Context even though we may never use it. This * is because md5 checking may be turned on to start and then turned off if * a seek occurs. So we always init the context here and finalize it in * FLAC__seekable_stream_decoder_finish() to make sure things are always * cleaned up properly. */ FLAC__MD5Init(&decoder->private_->md5context); FLAC__stream_decoder_set_read_callback(decoder->private_->stream_decoder, read_callback_); FLAC__stream_decoder_set_write_callback(decoder->private_->stream_decoder, write_callback_); FLAC__stream_decoder_set_metadata_callback(decoder->private_->stream_decoder, metadata_callback_); FLAC__stream_decoder_set_error_callback(decoder->private_->stream_decoder, error_callback_); FLAC__stream_decoder_set_client_data(decoder->private_->stream_decoder, decoder); /* We always want to see these blocks. Whether or not we pass them up * through the metadata callback will be determined by flags set in our * implementation of ..._set_metadata_respond/ignore...() */ FLAC__stream_decoder_set_metadata_respond(decoder->private_->stream_decoder, FLAC__METADATA_TYPE_STREAMINFO); FLAC__stream_decoder_set_metadata_respond(decoder->private_->stream_decoder, FLAC__METADATA_TYPE_SEEKTABLE); if(FLAC__stream_decoder_init(decoder->private_->stream_decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA) return decoder->protected_->state = FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR; return decoder->protected_->state = FLAC__SEEKABLE_STREAM_DECODER_OK; }