📄 stream_decoder.c
字号:
if(decoder->protected_->state != OggFLAC__STREAM_DECODER_UNINITIALIZED) return false; return FLAC__stream_decoder_set_metadata_respond_all(decoder->private_->FLAC_stream_decoder);}OggFLAC_API FLAC__bool OggFLAC__stream_decoder_set_metadata_ignore(OggFLAC__StreamDecoder *decoder, FLAC__MetadataType type){ FLAC__ASSERT(0 != decoder); FLAC__ASSERT(0 != decoder->private_); FLAC__ASSERT(0 != decoder->protected_); if(decoder->protected_->state != OggFLAC__STREAM_DECODER_UNINITIALIZED) return false; return FLAC__stream_decoder_set_metadata_ignore(decoder->private_->FLAC_stream_decoder, type);}OggFLAC_API FLAC__bool OggFLAC__stream_decoder_set_metadata_ignore_application(OggFLAC__StreamDecoder *decoder, const FLAC__byte id[4]){ FLAC__ASSERT(0 != decoder); FLAC__ASSERT(0 != decoder->private_); FLAC__ASSERT(0 != decoder->protected_); if(decoder->protected_->state != OggFLAC__STREAM_DECODER_UNINITIALIZED) return false; return FLAC__stream_decoder_set_metadata_ignore_application(decoder->private_->FLAC_stream_decoder, id);}OggFLAC_API FLAC__bool OggFLAC__stream_decoder_set_metadata_ignore_all(OggFLAC__StreamDecoder *decoder){ FLAC__ASSERT(0 != decoder); FLAC__ASSERT(0 != decoder->private_); FLAC__ASSERT(0 != decoder->protected_); if(decoder->protected_->state != OggFLAC__STREAM_DECODER_UNINITIALIZED) return false; return FLAC__stream_decoder_set_metadata_ignore_all(decoder->private_->FLAC_stream_decoder);}OggFLAC_API OggFLAC__StreamDecoderState OggFLAC__stream_decoder_get_state(const OggFLAC__StreamDecoder *decoder){ FLAC__ASSERT(0 != decoder); FLAC__ASSERT(0 != decoder->protected_); return decoder->protected_->state;}OggFLAC_API FLAC__StreamDecoderState OggFLAC__stream_decoder_get_FLAC_stream_decoder_state(const OggFLAC__StreamDecoder *decoder){ FLAC__ASSERT(0 != decoder); FLAC__ASSERT(0 != decoder->private_); return FLAC__stream_decoder_get_state(decoder->private_->FLAC_stream_decoder);}OggFLAC_API const char *OggFLAC__stream_decoder_get_resolved_state_string(const OggFLAC__StreamDecoder *decoder){ if(decoder->protected_->state != OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR) return OggFLAC__StreamDecoderStateString[decoder->protected_->state]; else return FLAC__stream_decoder_get_resolved_state_string(decoder->private_->FLAC_stream_decoder);}OggFLAC_API unsigned OggFLAC__stream_decoder_get_channels(const OggFLAC__StreamDecoder *decoder){ FLAC__ASSERT(0 != decoder); FLAC__ASSERT(0 != decoder->private_); return FLAC__stream_decoder_get_channels(decoder->private_->FLAC_stream_decoder);}OggFLAC_API FLAC__ChannelAssignment OggFLAC__stream_decoder_get_channel_assignment(const OggFLAC__StreamDecoder *decoder){ FLAC__ASSERT(0 != decoder); FLAC__ASSERT(0 != decoder->private_); return FLAC__stream_decoder_get_channel_assignment(decoder->private_->FLAC_stream_decoder);}OggFLAC_API unsigned OggFLAC__stream_decoder_get_bits_per_sample(const OggFLAC__StreamDecoder *decoder){ FLAC__ASSERT(0 != decoder); FLAC__ASSERT(0 != decoder->private_); return FLAC__stream_decoder_get_bits_per_sample(decoder->private_->FLAC_stream_decoder);}OggFLAC_API unsigned OggFLAC__stream_decoder_get_sample_rate(const OggFLAC__StreamDecoder *decoder){ FLAC__ASSERT(0 != decoder); FLAC__ASSERT(0 != decoder->private_); return FLAC__stream_decoder_get_sample_rate(decoder->private_->FLAC_stream_decoder);}OggFLAC_API unsigned OggFLAC__stream_decoder_get_blocksize(const OggFLAC__StreamDecoder *decoder){ FLAC__ASSERT(0 != decoder); FLAC__ASSERT(0 != decoder->private_); return FLAC__stream_decoder_get_blocksize(decoder->private_->FLAC_stream_decoder);}OggFLAC_API FLAC__bool OggFLAC__stream_decoder_flush(OggFLAC__StreamDecoder *decoder){ FLAC__ASSERT(0 != decoder); FLAC__ASSERT(0 != decoder->private_); FLAC__ASSERT(0 != decoder->protected_); OggFLAC__ogg_decoder_aspect_flush(&decoder->protected_->ogg_decoder_aspect); if(!FLAC__stream_decoder_flush(decoder->private_->FLAC_stream_decoder)) { decoder->protected_->state = OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR; return false; } decoder->protected_->state = OggFLAC__STREAM_DECODER_OK; return true;}OggFLAC_API FLAC__bool OggFLAC__stream_decoder_reset(OggFLAC__StreamDecoder *decoder){ FLAC__ASSERT(0 != decoder); FLAC__ASSERT(0 != decoder->private_); FLAC__ASSERT(0 != decoder->protected_); if(!OggFLAC__stream_decoder_flush(decoder)) { decoder->protected_->state = OggFLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; return false; } OggFLAC__ogg_decoder_aspect_reset(&decoder->protected_->ogg_decoder_aspect); if(!FLAC__stream_decoder_reset(decoder->private_->FLAC_stream_decoder)) { decoder->protected_->state = OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR; return false; } decoder->protected_->state = OggFLAC__STREAM_DECODER_OK; return true;}OggFLAC_API FLAC__bool OggFLAC__stream_decoder_process_single(OggFLAC__StreamDecoder *decoder){ FLAC__bool ret; FLAC__ASSERT(0 != decoder); if(FLAC__stream_decoder_get_state(decoder->private_->FLAC_stream_decoder) == FLAC__STREAM_DECODER_END_OF_STREAM) decoder->protected_->state = OggFLAC__STREAM_DECODER_END_OF_STREAM; if(decoder->protected_->state == OggFLAC__STREAM_DECODER_END_OF_STREAM) return true; FLAC__ASSERT(decoder->protected_->state == OggFLAC__STREAM_DECODER_OK); ret = FLAC__stream_decoder_process_single(decoder->private_->FLAC_stream_decoder); if(!ret) decoder->protected_->state = OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR; return ret;}OggFLAC_API FLAC__bool OggFLAC__stream_decoder_process_until_end_of_metadata(OggFLAC__StreamDecoder *decoder){ FLAC__bool ret; FLAC__ASSERT(0 != decoder); if(FLAC__stream_decoder_get_state(decoder->private_->FLAC_stream_decoder) == FLAC__STREAM_DECODER_END_OF_STREAM) decoder->protected_->state = OggFLAC__STREAM_DECODER_END_OF_STREAM; if(decoder->protected_->state == OggFLAC__STREAM_DECODER_END_OF_STREAM) return true; FLAC__ASSERT(decoder->protected_->state == OggFLAC__STREAM_DECODER_OK); ret = FLAC__stream_decoder_process_until_end_of_metadata(decoder->private_->FLAC_stream_decoder); if(!ret) decoder->protected_->state = OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR; return ret;}OggFLAC_API FLAC__bool OggFLAC__stream_decoder_process_until_end_of_stream(OggFLAC__StreamDecoder *decoder){ FLAC__bool ret; FLAC__ASSERT(0 != decoder); if(FLAC__stream_decoder_get_state(decoder->private_->FLAC_stream_decoder) == FLAC__STREAM_DECODER_END_OF_STREAM) decoder->protected_->state = OggFLAC__STREAM_DECODER_END_OF_STREAM; if(decoder->protected_->state == OggFLAC__STREAM_DECODER_END_OF_STREAM) return true; FLAC__ASSERT(decoder->protected_->state == OggFLAC__STREAM_DECODER_OK); ret = FLAC__stream_decoder_process_until_end_of_stream(decoder->private_->FLAC_stream_decoder); if(!ret) decoder->protected_->state = OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR; return ret;}/*********************************************************************** * * Private class methods * ***********************************************************************/void set_defaults_(OggFLAC__StreamDecoder *decoder){ decoder->private_->read_callback = 0; decoder->private_->write_callback = 0; decoder->private_->metadata_callback = 0; decoder->private_->error_callback = 0; decoder->private_->client_data = 0; OggFLAC__ogg_decoder_aspect_set_defaults(&decoder->protected_->ogg_decoder_aspect);}FLAC__StreamDecoderReadStatus read_callback_(const FLAC__StreamDecoder *unused, FLAC__byte buffer[], unsigned *bytes, void *client_data){ OggFLAC__StreamDecoder *decoder = (OggFLAC__StreamDecoder*)client_data; (void)unused; switch(OggFLAC__ogg_decoder_aspect_read_callback_wrapper(&decoder->protected_->ogg_decoder_aspect, buffer, bytes, read_callback_proxy_, decoder, decoder->private_->client_data)) { case OggFLAC__OGG_DECODER_ASPECT_READ_STATUS_OK: return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; /* we don't really have a way to handle lost sync via read * callback so we'll let it pass and let the underlying * FLAC decoder catch the error */ case OggFLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC: return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; case OggFLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM: return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; case OggFLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC: case OggFLAC__OGG_DECODER_ASPECT_READ_STATUS_UNSUPPORTED_MAPPING_VERSION: case OggFLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT: case OggFLAC__OGG_DECODER_ASPECT_READ_STATUS_ERROR: decoder->protected_->state = OggFLAC__STREAM_DECODER_READ_ERROR; return FLAC__STREAM_DECODER_READ_STATUS_ABORT; case OggFLAC__OGG_DECODER_ASPECT_READ_STATUS_MEMORY_ALLOCATION_ERROR: decoder->protected_->state = OggFLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; return FLAC__STREAM_DECODER_READ_STATUS_ABORT; default: FLAC__ASSERT(0); /* double protection */ return FLAC__STREAM_DECODER_READ_STATUS_ABORT; }}FLAC__StreamDecoderWriteStatus write_callback_(const FLAC__StreamDecoder *unused, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data){ OggFLAC__StreamDecoder *decoder = (OggFLAC__StreamDecoder*)client_data; (void)unused; return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data);}void metadata_callback_(const FLAC__StreamDecoder *unused, const FLAC__StreamMetadata *metadata, void *client_data){ OggFLAC__StreamDecoder *decoder = (OggFLAC__StreamDecoder*)client_data; (void)unused; decoder->private_->metadata_callback(decoder, metadata, decoder->private_->client_data);}void error_callback_(const FLAC__StreamDecoder *unused, FLAC__StreamDecoderErrorStatus status, void *client_data){ OggFLAC__StreamDecoder *decoder = (OggFLAC__StreamDecoder*)client_data; (void)unused; decoder->private_->error_callback(decoder, status, decoder->private_->client_data);}OggFLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data){ OggFLAC__StreamDecoder *decoder = (OggFLAC__StreamDecoder*)void_decoder; switch(decoder->private_->read_callback(decoder, buffer, bytes, client_data)) { case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE: return OggFLAC__OGG_DECODER_ASPECT_READ_STATUS_OK; case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM: return OggFLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM; case FLAC__STREAM_DECODER_READ_STATUS_ABORT: return OggFLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; default: /* double protection: */ FLAC__ASSERT(0); return OggFLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -