📄 encode.c
字号:
else { if(0 != e->encoder.ogg.file) { OggFLAC__file_encoder_delete(e->encoder.ogg.file); e->encoder.ogg.file = 0; } } } else#endif if(e->is_stdout) { if(0 != e->encoder.flac.stream) { FLAC__stream_encoder_delete(e->encoder.flac.stream); e->encoder.flac.stream = 0; } } else { if(0 != e->encoder.flac.file) { FLAC__file_encoder_delete(e->encoder.flac.file); e->encoder.flac.file = 0; } } if(0 != e->seek_table_template) { FLAC__metadata_object_delete(e->seek_table_template); e->seek_table_template = 0; }}int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero){ FLAC__StreamEncoderState fse_state = FLAC__STREAM_ENCODER_OK; int ret = 0;#ifdef FLAC__HAS_OGG if(e->use_ogg) { if(e->is_stdout) { if(e->encoder.ogg.stream) { fse_state = OggFLAC__stream_encoder_get_FLAC_stream_encoder_state(e->encoder.ogg.stream); OggFLAC__stream_encoder_finish(e->encoder.ogg.stream); } } else { if(e->encoder.ogg.file) { fse_state = OggFLAC__file_encoder_get_FLAC_stream_encoder_state(e->encoder.ogg.file); OggFLAC__file_encoder_finish(e->encoder.ogg.file); } } } else#endif if(e->is_stdout) { if(e->encoder.flac.stream) { fse_state = FLAC__stream_encoder_get_state(e->encoder.flac.stream); FLAC__stream_encoder_finish(e->encoder.flac.stream); } } else { if(e->encoder.flac.file) { fse_state = FLAC__file_encoder_get_stream_encoder_state(e->encoder.flac.file); FLAC__file_encoder_finish(e->encoder.flac.file); } } if(e->total_samples_to_encode > 0) { print_stats(e); flac__utils_printf(stderr, 2, "\n"); } if(fse_state == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA) { print_verify_error(e); ret = 1; } else { if(info_align_carry >= 0) { flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d samples to be carried over\n", e->inbasefilename, info_align_carry); } if(info_align_zero >= 0) { flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d zero samples to be appended\n", e->inbasefilename, info_align_zero); } } EncoderSession_destroy(e); return ret;}int EncoderSession_finish_error(EncoderSession *e){ FLAC__StreamEncoderState fse_state; if(e->total_samples_to_encode > 0) flac__utils_printf(stderr, 2, "\n");#ifdef FLAC__HAS_OGG if(e->use_ogg) { if(e->is_stdout) { fse_state = OggFLAC__stream_encoder_get_FLAC_stream_encoder_state(e->encoder.ogg.stream); } else { fse_state = OggFLAC__file_encoder_get_FLAC_stream_encoder_state(e->encoder.ogg.file); } } else#endif if(e->is_stdout) { fse_state = FLAC__stream_encoder_get_state(e->encoder.flac.stream); } else { fse_state = FLAC__file_encoder_get_stream_encoder_state(e->encoder.flac.file); } if(fse_state == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA) print_verify_error(e); else unlink(e->outfilename); EncoderSession_destroy(e); return 1;}FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options, unsigned channels, unsigned bps, unsigned sample_rate){ unsigned num_metadata; FLAC__StreamMetadata padding, *cuesheet = 0; FLAC__StreamMetadata *metadata[4]; const FLAC__bool is_cdda = (channels == 1 || channels == 2) && (bps == 16) && (sample_rate == 44100); e->replay_gain = options.replay_gain; e->channels = channels; e->bits_per_sample = bps; e->sample_rate = sample_rate; if(e->replay_gain) { if(channels != 1 && channels != 2) { flac__utils_printf(stderr, 1, "%s: ERROR, number of channels (%u) must be 1 or 2 for --replay-gain\n", e->inbasefilename, channels); return false; } if(!grabbag__replaygain_is_valid_sample_frequency(sample_rate)) { flac__utils_printf(stderr, 1, "%s: ERROR, invalid sample rate (%u) for --replay-gain\n", e->inbasefilename, sample_rate); return false; } if(options.is_first_file) { if(!grabbag__replaygain_init(sample_rate)) { flac__utils_printf(stderr, 1, "%s: ERROR initializing ReplayGain stage\n", e->inbasefilename); return false; } } } if(channels != 2) options.do_mid_side = options.loose_mid_side = false; if(!parse_cuesheet_(&cuesheet, options.cuesheet_filename, e->inbasefilename, is_cdda, e->total_samples_to_encode)) return false; if(!convert_to_seek_table_template(options.requested_seek_points, options.num_requested_seek_points, options.cued_seekpoints? cuesheet : 0, e)) { flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for seek table\n", e->inbasefilename); if(0 != cuesheet) FLAC__metadata_object_delete(cuesheet); return false; } num_metadata = 0; if(e->seek_table_template->data.seek_table.num_points > 0) { e->seek_table_template->is_last = false; /* the encoder will set this for us */ metadata[num_metadata++] = e->seek_table_template; } if(0 != cuesheet) metadata[num_metadata++] = cuesheet; metadata[num_metadata++] = options.vorbis_comment; if(options.padding > 0) { padding.is_last = false; /* the encoder will set this for us */ padding.type = FLAC__METADATA_TYPE_PADDING; padding.length = (unsigned)options.padding; metadata[num_metadata++] = &padding; } e->blocksize = options.blocksize; e->stats_mask = (options.do_exhaustive_model_search || options.do_qlp_coeff_prec_search)? 0x0f : 0x3f;#ifdef FLAC__HAS_OGG if(e->use_ogg) { if(e->is_stdout) { OggFLAC__stream_encoder_set_serial_number(e->encoder.ogg.stream, options.serial_number); OggFLAC__stream_encoder_set_verify(e->encoder.ogg.stream, options.verify); OggFLAC__stream_encoder_set_streamable_subset(e->encoder.ogg.stream, !options.lax); OggFLAC__stream_encoder_set_do_mid_side_stereo(e->encoder.ogg.stream, options.do_mid_side); OggFLAC__stream_encoder_set_loose_mid_side_stereo(e->encoder.ogg.stream, options.loose_mid_side); OggFLAC__stream_encoder_set_channels(e->encoder.ogg.stream, channels); OggFLAC__stream_encoder_set_bits_per_sample(e->encoder.ogg.stream, bps); OggFLAC__stream_encoder_set_sample_rate(e->encoder.ogg.stream, sample_rate); OggFLAC__stream_encoder_set_blocksize(e->encoder.ogg.stream, options.blocksize); OggFLAC__stream_encoder_set_max_lpc_order(e->encoder.ogg.stream, options.max_lpc_order); OggFLAC__stream_encoder_set_qlp_coeff_precision(e->encoder.ogg.stream, options.qlp_coeff_precision); OggFLAC__stream_encoder_set_do_qlp_coeff_prec_search(e->encoder.ogg.stream, options.do_qlp_coeff_prec_search); OggFLAC__stream_encoder_set_do_escape_coding(e->encoder.ogg.stream, options.do_escape_coding); OggFLAC__stream_encoder_set_do_exhaustive_model_search(e->encoder.ogg.stream, options.do_exhaustive_model_search); OggFLAC__stream_encoder_set_min_residual_partition_order(e->encoder.ogg.stream, options.min_residual_partition_order); OggFLAC__stream_encoder_set_max_residual_partition_order(e->encoder.ogg.stream, options.max_residual_partition_order); OggFLAC__stream_encoder_set_rice_parameter_search_dist(e->encoder.ogg.stream, options.rice_parameter_search_dist); OggFLAC__stream_encoder_set_total_samples_estimate(e->encoder.ogg.stream, e->total_samples_to_encode); OggFLAC__stream_encoder_set_metadata(e->encoder.ogg.stream, (num_metadata > 0)? metadata : 0, num_metadata); OggFLAC__stream_encoder_set_write_callback(e->encoder.ogg.stream, ogg_stream_encoder_write_callback); OggFLAC__stream_encoder_set_metadata_callback(e->encoder.ogg.stream, ogg_stream_encoder_metadata_callback); OggFLAC__stream_encoder_set_client_data(e->encoder.ogg.stream, e); OggFLAC__stream_encoder_disable_constant_subframes(e->encoder.ogg.stream, options.debug.disable_constant_subframes); OggFLAC__stream_encoder_disable_fixed_subframes(e->encoder.ogg.stream, options.debug.disable_fixed_subframes); OggFLAC__stream_encoder_disable_verbatim_subframes(e->encoder.ogg.stream, options.debug.disable_verbatim_subframes); if(OggFLAC__stream_encoder_init(e->encoder.ogg.stream) != FLAC__STREAM_ENCODER_OK) { print_error_with_state(e, "ERROR initializing encoder"); if(0 != cuesheet) FLAC__metadata_object_delete(cuesheet); return false; } } else { OggFLAC__file_encoder_set_serial_number(e->encoder.ogg.file, options.serial_number); OggFLAC__file_encoder_set_filename(e->encoder.ogg.file, e->outfilename); OggFLAC__file_encoder_set_verify(e->encoder.ogg.file, options.verify); OggFLAC__file_encoder_set_streamable_subset(e->encoder.ogg.file, !options.lax); OggFLAC__file_encoder_set_do_mid_side_stereo(e->encoder.ogg.file, options.do_mid_side); OggFLAC__file_encoder_set_loose_mid_side_stereo(e->encoder.ogg.file, options.loose_mid_side); OggFLAC__file_encoder_set_channels(e->encoder.ogg.file, channels); OggFLAC__file_encoder_set_bits_per_sample(e->encoder.ogg.file, bps); OggFLAC__file_encoder_set_sample_rate(e->encoder.ogg.file, sample_rate); OggFLAC__file_encoder_set_blocksize(e->encoder.ogg.file, options.blocksize); OggFLAC__file_encoder_set_max_lpc_order(e->encoder.ogg.file, options.max_lpc_order); OggFLAC__file_encoder_set_qlp_coeff_precision(e->encoder.ogg.file, options.qlp_coeff_precision); OggFLAC__file_encoder_set_do_qlp_coeff_prec_search(e->encoder.ogg.file, options.do_qlp_coeff_prec_search); OggFLAC__file_encoder_set_do_escape_coding(e->encoder.ogg.file, options.do_escape_coding); OggFLAC__file_encoder_set_do_exhaustive_model_search(e->encoder.ogg.file, options.do_exhaustive_model_search); OggFLAC__file_encoder_set_min_residual_partition_order(e->encoder.ogg.file, options.min_residual_partition_order); OggFLAC__file_encoder_set_max_residual_partition_order(e->encoder.ogg.file, options.max_residual_partition_order); OggFLAC__file_encoder_set_rice_parameter_search_dist(e->encoder.ogg.file, options.rice_parameter_search_dist); OggFLAC__file_encoder_set_total_samples_estimate(e->encoder.ogg.file, e->total_samples_to_encode); OggFLAC__file_encoder_set_metadata(e->encoder.ogg.file, (num_metadata > 0)? metadata : 0, num_metadata); OggFLAC__file_encoder_set_progress_callback(e->encoder.ogg.file, ogg_file_encoder_progress_callback); OggFLAC__file_encoder_set_client_data(e->encoder.ogg.file, e); OggFLAC__file_encoder_disable_constant_subframes(e->encoder.ogg.file, options.debug.disable_constant_subframes); OggFLAC__file_encoder_disable_fixed_subframes(e->encoder.ogg.file, options.debug.disable_fixed_subframes); OggFLAC__file_encoder_disable_verbatim_subframes(e->encoder.ogg.file, options.debug.disable_verbatim_subframes); if(OggFLAC__file_encoder_init(e->encoder.ogg.file) != OggFLAC__FILE_ENCODER_OK) { print_error_with_state(e, "ERROR initializing encoder"); if(0 != cuesheet) FLAC__metadata_object_delete(cuesheet); return false; } } } else#endif if(e->is_stdout) { FLAC__stream_encoder_set_verify(e->encoder.flac.stream, options.verify); FLAC__stream_encoder_set_streamable_subset(e->encoder.flac.stream, !options.lax); FLAC__stream_encoder_set_do_mid_side_stereo(e->encoder.flac.stream, options.do_mid_side); FLAC__stream_encoder_set_loose_mid_side_stereo(e->encoder.flac.stream, options.loose_mid_side); FLAC__stream_encoder_set_channels(e->encoder.flac.stream, channels); FLAC__stream_encoder_set_bits_per_sample(e->encoder.flac.stream, bps); FLAC__stream_encoder_set_sample_rate(e->encoder.flac.stream, sample_rate); FLAC__stream_encoder_set_blocksize(e->encoder.flac.stream, options.blocksize); FLAC__stream_encoder_set_max_lpc_order(e->encoder.flac.stream, options.max_lpc_order); FLAC__stream_encoder_set_qlp_coeff_precision(e->encoder.flac.stream, options.qlp_coeff_precision); FLAC__stream_encoder_set_do_qlp_coeff_prec_search(e->encoder.flac.stream, options.do_qlp_coeff_prec_search); FLAC__stream_encoder_set_do_escape_coding(e->encoder.flac.stream, options.do_escape_coding); FLAC__stream_encoder_set_do_exhaustive_model_search(e->encoder.flac.stream, options.do_exhaustive_model_search); FLAC__stream_encoder_set_min_residual_partition_order(e->encoder.flac.stream, options.min_residual_partition_order); FLAC__stream_encoder_set_max_residual_partition_order(e->encoder.flac.stream, options.max_residual_partition_order); FLAC__stream_encoder_set_rice_parameter_search_dist(e->encoder.flac.stream, options.rice_parameter_search_dist); FLAC__stream_encoder_set_total_samples_estimate(e->encoder.flac.stream, e->total_samples_to_encode); FLAC__stream_encoder_set_metadata(e->encoder.flac.stream, (num_metadata > 0)? metadata : 0, num_metadata); FLAC__stream_encoder_set_write_callback(e->encoder.flac.stream, flac_stream_encoder_write_callback); FLAC__stream_encoder_set_metadata_callback(e->encoder.flac.stream, flac_stream_encoder_metadata_callback); FLAC__stream_encoder_set_client_data(e->encoder.flac.stream, e); FLAC__stream_encoder_disable_constant_subframes(e->encoder.flac.stream, options.debug.disable_constant_subframes); FLAC__stream_encoder_disable_fixed_subframes(e->encoder.flac.stream, options.debug.disable_fixed_subframes); FLAC__stream_encoder_disable_verbatim_subframes(e->encoder.flac.stream, options.debug.disable_verbatim_subframes); if(FLAC__stream_encoder_init(e->encoder.flac.stream) != FLAC__STREAM_ENCODER_OK) { print_error_with_state(e, "ERROR initializing encoder"); if(0 != cuesheet) FLAC__metadata_object_delete(cuesheet); return false; } } else { FLAC__file_encoder_set_filename(e->encoder.flac.file, e->outfilename); FLAC__file_encoder_set_verify(e->encoder.flac.file, options.verify); FLAC__file_encoder_set_streamable_subset(e->encoder.flac.file, !options.lax); FLAC__file_encoder_set_do_mid_side_stereo(e->encoder.flac.file, options.do_mid_side); FLAC__file_encoder_set_loose_mid_side_stereo(e->encoder.flac.file, options.loose_mid_side); FLAC__file_encoder_set_channels(e->encoder.flac.file, channels); FLAC__file_encoder_set_bits_per_sample(e->encoder.flac.file, bps); FLAC__file_encoder_set_sample_rate(e->encoder.flac.file, sample_rate); FLAC__file_encoder_set_blocksize(e->encoder.flac.file, options.blocksize); FLAC__file_encoder_set_max_lpc_order(e->encoder.flac.file, options.max_lpc_order); FLAC__file_encoder_set_qlp_coeff_precision(e->encoder.flac.file, options.qlp_coeff_precision); FLAC__file_encoder_set_do_qlp_coeff_prec_searc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -