00001 #ifndef FLACENCODER_H_
00002 #define FLACENCODER_H_
00003
00004 #include <stdint.h>
00005
00006 #include <FLAC/export.h>
00007 #if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7
00008
00009 #include <FLAC/file_encoder.h>
00010 #define encoder_new() FLAC__file_encoder_new()
00011 #define encoder_setup(enc, streamable_subset, do_mid_side_stereo, \
00012 loose_mid_side_stereo, channels, bits_per_sample, \
00013 sample_rate, blocksize, max_lpc_order, \
00014 qlp_coeff_precision, do_qlp_coeff_prec_search, \
00015 do_escape_coding, do_exhaustive_model_search, \
00016 min_residual_partition_order, max_residual_partition_order, \
00017 rice_parameter_search_dist) \
00018 { \
00019 FLAC__file_encoder_set_streamable_subset(enc, streamable_subset); \
00020 FLAC__file_encoder_set_do_mid_side_stereo(enc, do_mid_side_stereo); \
00021 FLAC__file_encoder_set_loose_mid_side_stereo(enc, loose_mid_side_stereo); \
00022 FLAC__file_encoder_set_channels(enc, channels); \
00023 FLAC__file_encoder_set_bits_per_sample(enc, bits_per_sample); \
00024 FLAC__file_encoder_set_sample_rate(enc, sample_rate); \
00025 FLAC__file_encoder_set_blocksize(enc, blocksize); \
00026 FLAC__file_encoder_set_max_lpc_order(enc, max_lpc_order); \
00027 FLAC__file_encoder_set_qlp_coeff_precision(enc, qlp_coeff_precision); \
00028 FLAC__file_encoder_set_do_qlp_coeff_prec_search(enc, do_qlp_coeff_prec_search); \
00029 FLAC__file_encoder_set_do_escape_coding(enc, do_escape_coding); \
00030 FLAC__file_encoder_set_do_exhaustive_model_search(enc, do_exhaustive_model_search); \
00031 FLAC__file_encoder_set_min_residual_partition_order(enc, min_residual_partition_order); \
00032 FLAC__file_encoder_set_max_residual_partition_order(enc, max_residual_partition_order); \
00033 FLAC__file_encoder_set_rice_parameter_search_dist(enc, rice_parameter_search_dist); \
00034 }
00035 #define encoder_finish(enc) FLAC__file_encoder_finish(enc)
00036 #define encoder_delete(enc) FLAC__file_encoder_delete(enc)
00037 #define encoder_process(enc, data, index) FLAC__file_encoder_process(enc, data, index)
00038 #define FLAC_ENCODER FLAC__FileEncoder
00039 #else
00040
00041 #define NEWFLAC
00042 #include <FLAC/stream_encoder.h>
00043 #define encoder_new() FLAC__stream_encoder_new()
00044 #define encoder_setup(enc, streamable_subset, do_mid_side_stereo, \
00045 loose_mid_side_stereo, channels, bits_per_sample, \
00046 sample_rate, blocksize, max_lpc_order, \
00047 qlp_coeff_precision, do_qlp_coeff_prec_search, \
00048 do_escape_coding, do_exhaustive_model_search, \
00049 min_residual_partition_order, max_residual_partition_order, \
00050 rice_parameter_search_dist) \
00051 { \
00052 FLAC__stream_encoder_set_streamable_subset(enc, streamable_subset); \
00053 FLAC__stream_encoder_set_do_mid_side_stereo(enc, do_mid_side_stereo); \
00054 FLAC__stream_encoder_set_loose_mid_side_stereo(enc, loose_mid_side_stereo); \
00055 FLAC__stream_encoder_set_channels(enc, channels); \
00056 FLAC__stream_encoder_set_bits_per_sample(enc, bits_per_sample); \
00057 FLAC__stream_encoder_set_sample_rate(enc, sample_rate); \
00058 FLAC__stream_encoder_set_blocksize(enc, blocksize); \
00059 FLAC__stream_encoder_set_max_lpc_order(enc, max_lpc_order); \
00060 FLAC__stream_encoder_set_qlp_coeff_precision(enc, qlp_coeff_precision); \
00061 FLAC__stream_encoder_set_do_qlp_coeff_prec_search(enc, do_qlp_coeff_prec_search); \
00062 FLAC__stream_encoder_set_do_escape_coding(enc, do_escape_coding); \
00063 FLAC__stream_encoder_set_do_exhaustive_model_search(enc, do_exhaustive_model_search); \
00064 FLAC__stream_encoder_set_min_residual_partition_order(enc, min_residual_partition_order); \
00065 FLAC__stream_encoder_set_max_residual_partition_order(enc, max_residual_partition_order); \
00066 FLAC__stream_encoder_set_rice_parameter_search_dist(enc, rice_parameter_search_dist); \
00067 }
00068 #define encoder_finish(enc) FLAC__stream_encoder_finish(enc)
00069 #define encoder_delete(enc) FLAC__stream_encoder_delete(enc)
00070 #define encoder_process(enc, data, index) FLAC__stream_encoder_process(enc, data, index)
00071 #define FLAC_ENCODER FLAC__StreamEncoder
00072 #endif
00073
00074 #include "encoder.h"
00075
00076 #define MAX_SAMPLES 588 * 4
00077 #define NUM_CHANNELS 2
00078
00079 class Metadata;
00080 class QString;
00081
00082 class FlacEncoder : public Encoder
00083 {
00084 public:
00085 FlacEncoder(const QString &outfile, int qualitylevel, Metadata *metadata);
00086 ~FlacEncoder();
00087 int addSamples(int16_t *bytes, unsigned int len);
00088
00089 private:
00090 FLAC_ENCODER *encoder;
00091 unsigned int sampleindex;
00092 FLAC__int32 inputin[NUM_CHANNELS][MAX_SAMPLES];
00093 FLAC__int32 *input[NUM_CHANNELS];
00094 };
00095
00096 #endif