📄 decoders.cpp
字号:
return (bool)feof(file_);
}
::FLAC__StreamDecoderWriteStatus SeekableStreamDecoder::write_callback(const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[])
{
(void)buffer;
return common_write_callback_(frame);
}
void SeekableStreamDecoder::metadata_callback(const ::FLAC__StreamMetadata *metadata)
{
common_metadata_callback_(metadata);
}
void SeekableStreamDecoder::error_callback(::FLAC__StreamDecoderErrorStatus status)
{
common_error_callback_(status);
}
bool SeekableStreamDecoder::die(const char *msg) const
{
State state = get_state();
if(msg)
printf("FAILED, %s", msg);
else
printf("FAILED");
printf(", state = %u (%s)\n", (unsigned)((::FLAC__SeekableStreamDecoderState)state), state.as_cstring());
if(state == ::FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR) {
FLAC::Decoder::Stream::State state_ = get_stream_decoder_state();
printf(" stream decoder state = %u (%s)\n", (unsigned)((::FLAC__StreamDecoderState)state_), state_.as_cstring());
}
return false;
}
bool SeekableStreamDecoder::test_respond()
{
if(!set_md5_checking(true)) {
printf("FAILED at set_md5_checking(), returned false\n");
return false;
}
printf("testing init()... ");
if(init() != ::FLAC__SEEKABLE_STREAM_DECODER_OK)
return die();
printf("OK\n");
current_metadata_number_ = 0;
if(::fseek(file_, 0, SEEK_SET) < 0) {
printf("FAILED rewinding input, errno = %d\n", errno);
return false;
}
printf("testing process_until_end_of_stream()... ");
if(!process_until_end_of_stream()) {
State state = get_state();
printf("FAILED, returned false, state = %u (%s)\n", (unsigned)((::FLAC__SeekableStreamDecoderState)state), state.as_cstring());
return false;
}
printf("OK\n");
printf("testing finish()... ");
finish();
printf("OK\n");
return true;
}
static bool test_seekable_stream_decoder()
{
SeekableStreamDecoder *decoder;
printf("\n+++ libFLAC++ unit test: FLAC::Decoder::SeekableStream\n\n");
//
// test new -> delete
//
printf("allocating decoder instance... ");
decoder = new SeekableStreamDecoder();
if(0 == decoder) {
printf("FAILED, new returned NULL\n");
return false;
}
printf("OK\n");
printf("testing is_valid()... ");
if(!decoder->is_valid()) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
printf("freeing decoder instance... ");
delete decoder;
printf("OK\n");
//
// test new -> init -> delete
//
printf("allocating decoder instance... ");
decoder = new SeekableStreamDecoder();
if(0 == decoder) {
printf("FAILED, new returned NULL\n");
return false;
}
printf("OK\n");
printf("testing is_valid()... ");
if(!decoder->is_valid()) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
printf("testing init()... ");
if(decoder->init() != ::FLAC__SEEKABLE_STREAM_DECODER_OK)
return decoder->die();
printf("OK\n");
printf("freeing decoder instance... ");
delete decoder;
printf("OK\n");
//
// test normal usage
//
num_expected_ = 0;
expected_metadata_sequence_[num_expected_++] = &streaminfo_;
printf("allocating decoder instance... ");
decoder = new SeekableStreamDecoder();
if(0 == decoder) {
printf("FAILED, new returned NULL\n");
return false;
}
printf("OK\n");
printf("testing is_valid()... ");
if(!decoder->is_valid()) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
printf("testing set_md5_checking()... ");
if(!decoder->set_md5_checking(true)) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
printf("testing init()... ");
if(decoder->init() != ::FLAC__SEEKABLE_STREAM_DECODER_OK)
return decoder->die();
printf("OK\n");
printf("testing get_state()... ");
FLAC::Decoder::SeekableStream::State state = decoder->get_state();
printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__SeekableStreamDecoderState)state), state.as_cstring());
printf("testing get_stream_decoder_state()... ");
FLAC::Decoder::Stream::State state_ = decoder->get_stream_decoder_state();
printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamDecoderState)state_), state_.as_cstring());
decoder->current_metadata_number_ = 0;
decoder->ignore_errors_ = false;
decoder->error_occurred_ = false;
printf("opening FLAC file... ");
decoder->file_ = ::fopen(flacfilename_, "rb");
if(0 == decoder->file_) {
printf("ERROR\n");
return false;
}
printf("OK\n");
printf("testing get_md5_checking()... ");
if(!decoder->get_md5_checking()) {
printf("FAILED, returned false, expected true\n");
return false;
}
printf("OK\n");
printf("testing process_until_end_of_metadata()... ");
if(!decoder->process_until_end_of_metadata())
return decoder->die("returned false");
printf("OK\n");
printf("testing process_single()... ");
if(!decoder->process_single())
return decoder->die("returned false");
printf("OK\n");
printf("testing skip_single_frame()... ");
if(!decoder->skip_single_frame())
return decoder->die("returned false");
printf("OK\n");
printf("testing flush()... ");
if(!decoder->flush())
return decoder->die("returned false");
printf("OK\n");
decoder->ignore_errors_ = true;
printf("testing process_single()... ");
if(!decoder->process_single())
return decoder->die("returned false");
printf("OK\n");
decoder->ignore_errors_ = false;
printf("testing seek_absolute()... ");
if(!decoder->seek_absolute(0))
return decoder->die("returned false");
printf("OK\n");
printf("testing process_until_end_of_stream()... ");
if(!decoder->process_until_end_of_stream())
return decoder->die("returned false");
printf("OK\n");
printf("testing get_channels()... ");
{
unsigned channels = decoder->get_channels();
if(channels != streaminfo_.data.stream_info.channels) {
printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
return false;
}
}
printf("OK\n");
printf("testing get_bits_per_sample()... ");
{
unsigned bits_per_sample = decoder->get_bits_per_sample();
if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
return false;
}
}
printf("OK\n");
printf("testing get_sample_rate()... ");
{
unsigned sample_rate = decoder->get_sample_rate();
if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
return false;
}
}
printf("OK\n");
printf("testing get_blocksize()... ");
{
unsigned blocksize = decoder->get_blocksize();
/* value could be anything since we're at the last block, so accept any answer */
printf("returned %u... OK\n", blocksize);
}
printf("testing get_channel_assignment()... ");
{
::FLAC__ChannelAssignment ca = decoder->get_channel_assignment();
printf("returned %u (%s)... OK\n", (unsigned)ca, ::FLAC__ChannelAssignmentString[ca]);
}
printf("testing reset()... ");
if(!decoder->reset())
return decoder->die("returned false");
printf("OK\n");
decoder->current_metadata_number_ = 0;
printf("rewinding input... ");
if(::fseek(decoder->file_, 0, SEEK_SET) < 0) {
printf("FAILED, errno = %d\n", errno);
return false;
}
printf("OK\n");
printf("testing process_until_end_of_stream()... ");
if(!decoder->process_until_end_of_stream())
return decoder->die("returned false");
printf("OK\n");
printf("testing finish()... ");
decoder->finish();
printf("OK\n");
/*
* respond all
*/
printf("testing set_metadata_respond_all()... ");
if(!decoder->set_metadata_respond_all()) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
num_expected_ = 0;
expected_metadata_sequence_[num_expected_++] = &streaminfo_;
expected_metadata_sequence_[num_expected_++] = &padding_;
expected_metadata_sequence_[num_expected_++] = &seektable_;
expected_metadata_sequence_[num_expected_++] = &application1_;
expected_metadata_sequence_[num_expected_++] = &application2_;
expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
expected_metadata_sequence_[num_expected_++] = &cuesheet_;
expected_metadata_sequence_[num_expected_++] = &unknown_;
if(!decoder->test_respond())
return false;
/*
* ignore all
*/
printf("testing set_metadata_ignore_all()... ");
if(!decoder->set_metadata_ignore_all()) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
num_expected_ = 0;
if(!decoder->test_respond())
return false;
/*
* respond all, ignore VORBIS_COMMENT
*/
printf("testing set_metadata_respond_all()... ");
if(!decoder->set_metadata_respond_all()) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
printf("testing set_metadata_ignore(VORBIS_COMMENT)... ");
if(!decoder->set_metadata_ignore(FLAC__METADATA_TYPE_VORBIS_COMMENT)) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
num_expected_ = 0;
expected_metadata_sequence_[num_expected_++] = &streaminfo_;
expected_metadata_sequence_[num_expected_++] = &padding_;
expected_metadata_sequence_[num_expected_++] = &seektable_;
expected_metadata_sequence_[num_expected_++] = &application1_;
expected_metadata_sequence_[num_expected_++] = &application2_;
expected_metadata_sequence_[num_expected_++] = &cuesheet_;
expected_metadata_sequence_[num_expected_++] = &unknown_;
if(!decoder->test_respond())
return false;
/*
* respond all, ignore APPLICATION
*/
printf("testing set_metadata_respond_all()... ");
if(!decoder->set_metadata_respond_all()) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
printf("testing set_metadata_ignore(APPLICATION)... ");
if(!decoder->set_metadata_ignore(FLAC__METADATA_TYPE_APPLICATION)) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
num_expected_ = 0;
expected_metadata_sequence_[num_expected_++] = &streaminfo_;
expected_metadata_sequence_[num_expected_++] = &padding_;
expected_metadata_sequence_[num_expected_++] = &seektable_;
expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
expected_metadata_sequence_[num_expected_++] = &cuesheet_;
expected_metadata_sequence_[num_expected_++] = &unknown_;
if(!decoder->test_respond())
return false;
/*
* respond all, ignore APPLICATION id of app#1
*/
printf("testing set_metadata_respond_all()... ");
if(!decoder->set_metadata_respond_all()) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
printf("testing set_metadata_ignore_application(of app block #1)... ");
if(!decoder->set_metadata_ignore_application(application1_.data.application.id)) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
num_expected_ = 0;
expected_metadata_sequence_[num_expected_++] = &streaminfo_;
expected_metadata_sequence_[num_expected_++] = &padding_;
expected_metadata_sequence_[num_expected_++] = &seektable_;
expected_metadata_sequence_[num_expected_++] = &application2_;
expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
expected_metadata_sequence_[num_expected_++] = &cuesheet_;
expected_metadata_sequence_[num_expected_++] = &unknown_;
if(!decoder->test_respond())
return false;
/*
* respond all, ignore APPLICATION id of app#1 & app#2
*/
printf("testing set_metadata_respond_all()... ");
if(!decoder->set_metadata_respond_all()) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
printf("testing set_metadata_ignore_application(of app block #1)... ");
if(!decoder->set_metadata_ignore_application(application1_.data.application.id)) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -