Chris@1: Chris@1:
Chris@1:00001 /* libFLAC++ - Free Lossless Audio Codec library Chris@1: 00002 * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson Chris@1: 00003 * Chris@1: 00004 * Redistribution and use in source and binary forms, with or without Chris@1: 00005 * modification, are permitted provided that the following conditions Chris@1: 00006 * are met: Chris@1: 00007 * Chris@1: 00008 * - Redistributions of source code must retain the above copyright Chris@1: 00009 * notice, this list of conditions and the following disclaimer. Chris@1: 00010 * Chris@1: 00011 * - Redistributions in binary form must reproduce the above copyright Chris@1: 00012 * notice, this list of conditions and the following disclaimer in the Chris@1: 00013 * documentation and/or other materials provided with the distribution. Chris@1: 00014 * Chris@1: 00015 * - Neither the name of the Xiph.org Foundation nor the names of its Chris@1: 00016 * contributors may be used to endorse or promote products derived from Chris@1: 00017 * this software without specific prior written permission. Chris@1: 00018 * Chris@1: 00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS Chris@1: 00020 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT Chris@1: 00021 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR Chris@1: 00022 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR Chris@1: 00023 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, Chris@1: 00024 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, Chris@1: 00025 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR Chris@1: 00026 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF Chris@1: 00027 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING Chris@1: 00028 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS Chris@1: 00029 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Chris@1: 00030 */ Chris@1: 00031 Chris@1: 00032 #ifndef FLACPP__ENCODER_H Chris@1: 00033 #define FLACPP__ENCODER_H Chris@1: 00034 Chris@1: 00035 #include "export.h" Chris@1: 00036 Chris@1: 00037 #include "FLAC/stream_encoder.h" Chris@1: 00038 #include "decoder.h" Chris@1: 00039 #include "metadata.h" Chris@1: 00040 Chris@1: 00041 Chris@1: 00078 namespace FLAC { Chris@1: 00079 namespace Encoder { Chris@1: 00080 Chris@1: 00101 class FLACPP_API Stream { Chris@1: 00102 public: Chris@1: 00105 class FLACPP_API State { Chris@1: 00106 public: Chris@1: 00107 inline State(::FLAC__StreamEncoderState state): state_(state) { } Chris@1: 00108 inline operator ::FLAC__StreamEncoderState() const { return state_; } Chris@1: 00109 inline const char *as_cstring() const { return ::FLAC__StreamEncoderStateString[state_]; } Chris@1: 00110 inline const char *resolved_as_cstring(const Stream &encoder) const { return ::FLAC__stream_encoder_get_resolved_state_string(encoder.encoder_); } Chris@1: 00111 protected: Chris@1: 00112 ::FLAC__StreamEncoderState state_; Chris@1: 00113 }; Chris@1: 00114 Chris@1: 00115 Stream(); Chris@1: 00116 virtual ~Stream(); Chris@1: 00117 Chris@1: 00119 Chris@1: 00123 virtual bool is_valid() const; Chris@1: 00124 inline operator bool() const { return is_valid(); } Chris@1: 00125 Chris@1: 00126 Chris@1: 00127 virtual bool set_ogg_serial_number(long value); Chris@1: 00128 virtual bool set_verify(bool value); Chris@1: 00129 virtual bool set_streamable_subset(bool value); Chris@1: 00130 virtual bool set_channels(unsigned value); Chris@1: 00131 virtual bool set_bits_per_sample(unsigned value); Chris@1: 00132 virtual bool set_sample_rate(unsigned value); Chris@1: 00133 virtual bool set_compression_level(unsigned value); Chris@1: 00134 virtual bool set_blocksize(unsigned value); Chris@1: 00135 virtual bool set_do_mid_side_stereo(bool value); Chris@1: 00136 virtual bool set_loose_mid_side_stereo(bool value); Chris@1: 00137 virtual bool set_apodization(const char *specification); Chris@1: 00138 virtual bool set_max_lpc_order(unsigned value); Chris@1: 00139 virtual bool set_qlp_coeff_precision(unsigned value); Chris@1: 00140 virtual bool set_do_qlp_coeff_prec_search(bool value); Chris@1: 00141 virtual bool set_do_escape_coding(bool value); Chris@1: 00142 virtual bool set_do_exhaustive_model_search(bool value); Chris@1: 00143 virtual bool set_min_residual_partition_order(unsigned value); Chris@1: 00144 virtual bool set_max_residual_partition_order(unsigned value); Chris@1: 00145 virtual bool set_rice_parameter_search_dist(unsigned value); Chris@1: 00146 virtual bool set_total_samples_estimate(FLAC__uint64 value); Chris@1: 00147 virtual bool set_metadata(::FLAC__StreamMetadata **metadata, unsigned num_blocks); Chris@1: 00148 virtual bool set_metadata(FLAC::Metadata::Prototype **metadata, unsigned num_blocks); Chris@1: 00149 Chris@1: 00150 /* get_state() is not virtual since we want subclasses to be able to return their own state */ Chris@1: 00151 State get_state() const; Chris@1: 00152 virtual Decoder::Stream::State get_verify_decoder_state() const; Chris@1: 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); Chris@1: 00154 virtual bool get_verify() const; Chris@1: 00155 virtual bool get_streamable_subset() const; Chris@1: 00156 virtual bool get_do_mid_side_stereo() const; Chris@1: 00157 virtual bool get_loose_mid_side_stereo() const; Chris@1: 00158 virtual unsigned get_channels() const; Chris@1: 00159 virtual unsigned get_bits_per_sample() const; Chris@1: 00160 virtual unsigned get_sample_rate() const; Chris@1: 00161 virtual unsigned get_blocksize() const; Chris@1: 00162 virtual unsigned get_max_lpc_order() const; Chris@1: 00163 virtual unsigned get_qlp_coeff_precision() const; Chris@1: 00164 virtual bool get_do_qlp_coeff_prec_search() const; Chris@1: 00165 virtual bool get_do_escape_coding() const; Chris@1: 00166 virtual bool get_do_exhaustive_model_search() const; Chris@1: 00167 virtual unsigned get_min_residual_partition_order() const; Chris@1: 00168 virtual unsigned get_max_residual_partition_order() const; Chris@1: 00169 virtual unsigned get_rice_parameter_search_dist() const; Chris@1: 00170 virtual FLAC__uint64 get_total_samples_estimate() const; Chris@1: 00171 Chris@1: 00172 virtual ::FLAC__StreamEncoderInitStatus init(); Chris@1: 00173 virtual ::FLAC__StreamEncoderInitStatus init_ogg(); Chris@1: 00174 Chris@1: 00175 virtual bool finish(); Chris@1: 00176 Chris@1: 00177 virtual bool process(const FLAC__int32 * const buffer[], unsigned samples); Chris@1: 00178 virtual bool process_interleaved(const FLAC__int32 buffer[], unsigned samples); Chris@1: 00179 protected: Chris@1: 00181 virtual ::FLAC__StreamEncoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes); Chris@1: 00182 Chris@1: 00184 virtual ::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame) = 0; Chris@1: 00185 Chris@1: 00187 virtual ::FLAC__StreamEncoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset); Chris@1: 00188 Chris@1: 00190 virtual ::FLAC__StreamEncoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset); Chris@1: 00191 Chris@1: 00193 virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata); Chris@1: 00194 Chris@1: 00195 #if (defined _MSC_VER) || (defined __BORLANDC__) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC) Chris@1: 00196 // lame hack: some MSVC/GCC versions can't see a protected encoder_ from nested State::resolved_as_cstring() Chris@1: 00197 friend State; Chris@1: 00198 #endif Chris@1: 00199 ::FLAC__StreamEncoder *encoder_; Chris@1: 00200 Chris@1: 00201 static ::FLAC__StreamEncoderReadStatus read_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); Chris@1: 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); Chris@1: 00203 static ::FLAC__StreamEncoderSeekStatus seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); Chris@1: 00204 static ::FLAC__StreamEncoderTellStatus tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); Chris@1: 00205 static void metadata_callback_(const ::FLAC__StreamEncoder *encoder, const ::FLAC__StreamMetadata *metadata, void *client_data); Chris@1: 00206 private: Chris@1: 00207 // Private and undefined so you can't use them: Chris@1: 00208 Stream(const Stream &); Chris@1: 00209 void operator=(const Stream &); Chris@1: 00210 }; Chris@1: 00211 Chris@1: 00232 class FLACPP_API File: public Stream { Chris@1: 00233 public: Chris@1: 00234 File(); Chris@1: 00235 virtual ~File(); Chris@1: 00236 Chris@1: 00237 virtual ::FLAC__StreamEncoderInitStatus init(FILE *file); Chris@1: 00238 virtual ::FLAC__StreamEncoderInitStatus init(const char *filename); Chris@1: 00239 virtual ::FLAC__StreamEncoderInitStatus init(const std::string &filename); Chris@1: 00240 virtual ::FLAC__StreamEncoderInitStatus init_ogg(FILE *file); Chris@1: 00241 virtual ::FLAC__StreamEncoderInitStatus init_ogg(const char *filename); Chris@1: 00242 virtual ::FLAC__StreamEncoderInitStatus init_ogg(const std::string &filename); Chris@1: 00243 protected: Chris@1: 00245 virtual void progress_callback(FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate); Chris@1: 00246 Chris@1: 00248 virtual ::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame); Chris@1: 00249 private: Chris@1: 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); Chris@1: 00251 Chris@1: 00252 // Private and undefined so you can't use them: Chris@1: 00253 File(const Stream &); Chris@1: 00254 void operator=(const Stream &); Chris@1: 00255 }; Chris@1: 00256 Chris@1: 00257 } Chris@1: 00258 } Chris@1: 00259 Chris@1: 00260 #endif Chris@1: