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