cannam@86: cannam@86:
cannam@86:00001 /* libFLAC++ - Free Lossless Audio Codec library cannam@86: 00002 * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson cannam@86: 00003 * cannam@86: 00004 * Redistribution and use in source and binary forms, with or without cannam@86: 00005 * modification, are permitted provided that the following conditions cannam@86: 00006 * are met: cannam@86: 00007 * cannam@86: 00008 * - Redistributions of source code must retain the above copyright cannam@86: 00009 * notice, this list of conditions and the following disclaimer. cannam@86: 00010 * cannam@86: 00011 * - Redistributions in binary form must reproduce the above copyright cannam@86: 00012 * notice, this list of conditions and the following disclaimer in the cannam@86: 00013 * documentation and/or other materials provided with the distribution. cannam@86: 00014 * cannam@86: 00015 * - Neither the name of the Xiph.org Foundation nor the names of its cannam@86: 00016 * contributors may be used to endorse or promote products derived from cannam@86: 00017 * this software without specific prior written permission. cannam@86: 00018 * cannam@86: 00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS cannam@86: 00020 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT cannam@86: 00021 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR cannam@86: 00022 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR cannam@86: 00023 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, cannam@86: 00024 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, cannam@86: 00025 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR cannam@86: 00026 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF cannam@86: 00027 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING cannam@86: 00028 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS cannam@86: 00029 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. cannam@86: 00030 */ cannam@86: 00031 cannam@86: 00032 #ifndef FLACPP__DECODER_H cannam@86: 00033 #define FLACPP__DECODER_H cannam@86: 00034 cannam@86: 00035 #include "export.h" cannam@86: 00036 cannam@86: 00037 #include <string> cannam@86: 00038 #include "FLAC/stream_decoder.h" cannam@86: 00039 cannam@86: 00040 cannam@86: 00077 namespace FLAC { cannam@86: 00078 namespace Decoder { cannam@86: 00079 cannam@86: 00099 class FLACPP_API Stream { cannam@86: 00100 public: cannam@86: 00103 class FLACPP_API State { cannam@86: 00104 public: cannam@86: 00105 inline State(::FLAC__StreamDecoderState state): state_(state) { } cannam@86: 00106 inline operator ::FLAC__StreamDecoderState() const { return state_; } cannam@86: 00107 inline const char *as_cstring() const { return ::FLAC__StreamDecoderStateString[state_]; } cannam@86: 00108 inline const char *resolved_as_cstring(const Stream &decoder) const { return ::FLAC__stream_decoder_get_resolved_state_string(decoder.decoder_); } cannam@86: 00109 protected: cannam@86: 00110 ::FLAC__StreamDecoderState state_; cannam@86: 00111 }; cannam@86: 00112 cannam@86: 00113 Stream(); cannam@86: 00114 virtual ~Stream(); cannam@86: 00115 cannam@86: 00117 cannam@86: 00120 virtual bool is_valid() const; cannam@86: 00121 inline operator bool() const { return is_valid(); } cannam@86: 00122 cannam@86: 00123 cannam@86: 00124 virtual bool set_ogg_serial_number(long value); cannam@86: 00125 virtual bool set_md5_checking(bool value); cannam@86: 00126 virtual bool set_metadata_respond(::FLAC__MetadataType type); cannam@86: 00127 virtual bool set_metadata_respond_application(const FLAC__byte id[4]); cannam@86: 00128 virtual bool set_metadata_respond_all(); cannam@86: 00129 virtual bool set_metadata_ignore(::FLAC__MetadataType type); cannam@86: 00130 virtual bool set_metadata_ignore_application(const FLAC__byte id[4]); cannam@86: 00131 virtual bool set_metadata_ignore_all(); cannam@86: 00132 cannam@86: 00133 /* get_state() is not virtual since we want subclasses to be able to return their own state */ cannam@86: 00134 State get_state() const; cannam@86: 00135 virtual bool get_md5_checking() const; cannam@86: 00136 virtual FLAC__uint64 get_total_samples() const; cannam@86: 00137 virtual unsigned get_channels() const; cannam@86: 00138 virtual ::FLAC__ChannelAssignment get_channel_assignment() const; cannam@86: 00139 virtual unsigned get_bits_per_sample() const; cannam@86: 00140 virtual unsigned get_sample_rate() const; cannam@86: 00141 virtual unsigned get_blocksize() const; cannam@86: 00142 virtual bool get_decode_position(FLAC__uint64 *position) const; cannam@86: 00143 cannam@86: 00144 virtual ::FLAC__StreamDecoderInitStatus init(); cannam@86: 00145 virtual ::FLAC__StreamDecoderInitStatus init_ogg(); cannam@86: 00146 cannam@86: 00147 virtual bool finish(); cannam@86: 00148 cannam@86: 00149 virtual bool flush(); cannam@86: 00150 virtual bool reset(); cannam@86: 00151 cannam@86: 00152 virtual bool process_single(); cannam@86: 00153 virtual bool process_until_end_of_metadata(); cannam@86: 00154 virtual bool process_until_end_of_stream(); cannam@86: 00155 virtual bool skip_single_frame(); cannam@86: 00156 cannam@86: 00157 virtual bool seek_absolute(FLAC__uint64 sample); cannam@86: 00158 protected: cannam@86: 00160 virtual ::FLAC__StreamDecoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes) = 0; cannam@86: 00161 cannam@86: 00163 virtual ::FLAC__StreamDecoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset); cannam@86: 00164 cannam@86: 00166 virtual ::FLAC__StreamDecoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset); cannam@86: 00167 cannam@86: 00169 virtual ::FLAC__StreamDecoderLengthStatus length_callback(FLAC__uint64 *stream_length); cannam@86: 00170 cannam@86: 00172 virtual bool eof_callback(); cannam@86: 00173 cannam@86: 00175 virtual ::FLAC__StreamDecoderWriteStatus write_callback(const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[]) = 0; cannam@86: 00176 cannam@86: 00178 virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata); cannam@86: 00179 cannam@86: 00181 virtual void error_callback(::FLAC__StreamDecoderErrorStatus status) = 0; cannam@86: 00182 cannam@86: 00183 #if (defined _MSC_VER) || (defined __BORLANDC__) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC) cannam@86: 00184 // lame hack: some MSVC/GCC versions can't see a protected decoder_ from nested State::resolved_as_cstring() cannam@86: 00185 friend State; cannam@86: 00186 #endif cannam@86: 00187 ::FLAC__StreamDecoder *decoder_; cannam@86: 00188 cannam@86: 00189 static ::FLAC__StreamDecoderReadStatus read_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); cannam@86: 00190 static ::FLAC__StreamDecoderSeekStatus seek_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); cannam@86: 00191 static ::FLAC__StreamDecoderTellStatus tell_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); cannam@86: 00192 static ::FLAC__StreamDecoderLengthStatus length_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); cannam@86: 00193 static FLAC__bool eof_callback_(const ::FLAC__StreamDecoder *decoder, void *client_data); cannam@86: 00194 static ::FLAC__StreamDecoderWriteStatus write_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); cannam@86: 00195 static void metadata_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__StreamMetadata *metadata, void *client_data); cannam@86: 00196 static void error_callback_(const ::FLAC__StreamDecoder *decoder, ::FLAC__StreamDecoderErrorStatus status, void *client_data); cannam@86: 00197 private: cannam@86: 00198 // Private and undefined so you can't use them: cannam@86: 00199 Stream(const Stream &); cannam@86: 00200 void operator=(const Stream &); cannam@86: 00201 }; cannam@86: 00202 cannam@86: 00222 class FLACPP_API File: public Stream { cannam@86: 00223 public: cannam@86: 00224 File(); cannam@86: 00225 virtual ~File(); cannam@86: 00226 cannam@86: 00227 virtual ::FLAC__StreamDecoderInitStatus init(FILE *file); cannam@86: 00228 virtual ::FLAC__StreamDecoderInitStatus init(const char *filename); cannam@86: 00229 virtual ::FLAC__StreamDecoderInitStatus init(const std::string &filename); cannam@86: 00230 virtual ::FLAC__StreamDecoderInitStatus init_ogg(FILE *file); cannam@86: 00231 virtual ::FLAC__StreamDecoderInitStatus init_ogg(const char *filename); cannam@86: 00232 virtual ::FLAC__StreamDecoderInitStatus init_ogg(const std::string &filename); cannam@86: 00233 protected: cannam@86: 00234 // this is a dummy implementation to satisfy the pure virtual in Stream that is actually supplied internally by the C layer cannam@86: 00235 virtual ::FLAC__StreamDecoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes); cannam@86: 00236 private: cannam@86: 00237 // Private and undefined so you can't use them: cannam@86: 00238 File(const File &); cannam@86: 00239 void operator=(const File &); cannam@86: 00240 }; cannam@86: 00241 cannam@86: 00242 } cannam@86: 00243 } cannam@86: 00244 cannam@86: 00245 #endif cannam@86: