00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef FLACPP__ENCODER_H
00033 #define FLACPP__ENCODER_H
00034
00035 #include "export.h"
00036
00037 #include "FLAC/stream_encoder.h"
00038 #include "decoder.h"
00039 #include "metadata.h"
00040
00041
00078 namespace FLAC {
00079 namespace Encoder {
00080
00101 class FLACPP_API Stream {
00102 public:
00105 class FLACPP_API State {
00106 public:
00107 inline State(::FLAC__StreamEncoderState state): state_(state) { }
00108 inline operator ::FLAC__StreamEncoderState() const { return state_; }
00109 inline const char *as_cstring() const { return ::FLAC__StreamEncoderStateString[state_]; }
00110 inline const char *resolved_as_cstring(const Stream &encoder) const { return ::FLAC__stream_encoder_get_resolved_state_string(encoder.encoder_); }
00111 protected:
00112 ::FLAC__StreamEncoderState state_;
00113 };
00114
00115 Stream();
00116 virtual ~Stream();
00117
00119
00123 virtual bool is_valid() const;
00124 inline operator bool() const { return is_valid(); }
00125
00126
00127 virtual bool set_ogg_serial_number(long value);
00128 virtual bool set_verify(bool value);
00129 virtual bool set_streamable_subset(bool value);
00130 virtual bool set_channels(unsigned value);
00131 virtual bool set_bits_per_sample(unsigned value);
00132 virtual bool set_sample_rate(unsigned value);
00133 virtual bool set_compression_level(unsigned value);
00134 virtual bool set_blocksize(unsigned value);
00135 virtual bool set_do_mid_side_stereo(bool value);
00136 virtual bool set_loose_mid_side_stereo(bool value);
00137 virtual bool set_apodization(const char *specification);
00138 virtual bool set_max_lpc_order(unsigned value);
00139 virtual bool set_qlp_coeff_precision(unsigned value);
00140 virtual bool set_do_qlp_coeff_prec_search(bool value);
00141 virtual bool set_do_escape_coding(bool value);
00142 virtual bool set_do_exhaustive_model_search(bool value);
00143 virtual bool set_min_residual_partition_order(unsigned value);
00144 virtual bool set_max_residual_partition_order(unsigned value);
00145 virtual bool set_rice_parameter_search_dist(unsigned value);
00146 virtual bool set_total_samples_estimate(FLAC__uint64 value);
00147 virtual bool set_metadata(::FLAC__StreamMetadata **metadata, unsigned num_blocks);
00148 virtual bool set_metadata(FLAC::Metadata::Prototype **metadata, unsigned num_blocks);
00149
00150
00151 State get_state() const;
00152 virtual Decoder::Stream::State get_verify_decoder_state() const;
00153 virtual void get_verify_decoder_error_stats(FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got);
00154 virtual bool get_verify() const;
00155 virtual bool get_streamable_subset() const;
00156 virtual bool get_do_mid_side_stereo() const;
00157 virtual bool get_loose_mid_side_stereo() const;
00158 virtual unsigned get_channels() const;
00159 virtual unsigned get_bits_per_sample() const;
00160 virtual unsigned get_sample_rate() const;
00161 virtual unsigned get_blocksize() const;
00162 virtual unsigned get_max_lpc_order() const;
00163 virtual unsigned get_qlp_coeff_precision() const;
00164 virtual bool get_do_qlp_coeff_prec_search() const;
00165 virtual bool get_do_escape_coding() const;
00166 virtual bool get_do_exhaustive_model_search() const;
00167 virtual unsigned get_min_residual_partition_order() const;
00168 virtual unsigned get_max_residual_partition_order() const;
00169 virtual unsigned get_rice_parameter_search_dist() const;
00170 virtual FLAC__uint64 get_total_samples_estimate() const;
00171
00172 virtual ::FLAC__StreamEncoderInitStatus init();
00173 virtual ::FLAC__StreamEncoderInitStatus init_ogg();
00174
00175 virtual bool finish();
00176
00177 virtual bool process(const FLAC__int32 * const buffer[], unsigned samples);
00178 virtual bool process_interleaved(const FLAC__int32 buffer[], unsigned samples);
00179 protected:
00181 virtual ::FLAC__StreamEncoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes);
00182
00184 virtual ::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame) = 0;
00185
00187 virtual ::FLAC__StreamEncoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset);
00188
00190 virtual ::FLAC__StreamEncoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset);
00191
00193 virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata);
00194
00195 #if (defined _MSC_VER) || (defined __BORLANDC__) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC)
00196
00197 friend State;
00198 #endif
00199 ::FLAC__StreamEncoder *encoder_;
00200
00201 static ::FLAC__StreamEncoderReadStatus read_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
00202 static ::FLAC__StreamEncoderWriteStatus write_callback_(const ::FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data);
00203 static ::FLAC__StreamEncoderSeekStatus seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data);
00204 static ::FLAC__StreamEncoderTellStatus tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
00205 static void metadata_callback_(const ::FLAC__StreamEncoder *encoder, const ::FLAC__StreamMetadata *metadata, void *client_data);
00206 private:
00207
00208 Stream(const Stream &);
00209 void operator=(const Stream &);
00210 };
00211
00232 class FLACPP_API File: public Stream {
00233 public:
00234 File();
00235 virtual ~File();
00236
00237 virtual ::FLAC__StreamEncoderInitStatus init(FILE *file);
00238 virtual ::FLAC__StreamEncoderInitStatus init(const char *filename);
00239 virtual ::FLAC__StreamEncoderInitStatus init(const std::string &filename);
00240 virtual ::FLAC__StreamEncoderInitStatus init_ogg(FILE *file);
00241 virtual ::FLAC__StreamEncoderInitStatus init_ogg(const char *filename);
00242 virtual ::FLAC__StreamEncoderInitStatus init_ogg(const std::string &filename);
00243 protected:
00245 virtual void progress_callback(FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate);
00246
00248 virtual ::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame);
00249 private:
00250 static void progress_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data);
00251
00252
00253 File(const Stream &);
00254 void operator=(const Stream &);
00255 };
00256
00257 }
00258 }
00259
00260 #endif