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__DECODER_H Chris@1: 00033 #define FLACPP__DECODER_H Chris@1: 00034 Chris@1: 00035 #include "export.h" Chris@1: 00036 Chris@1: 00037 #include <string> Chris@1: 00038 #include "FLAC/stream_decoder.h" Chris@1: 00039 Chris@1: 00040 Chris@1: 00077 namespace FLAC { Chris@1: 00078 namespace Decoder { Chris@1: 00079 Chris@1: 00099 class FLACPP_API Stream { Chris@1: 00100 public: Chris@1: 00103 class FLACPP_API State { Chris@1: 00104 public: Chris@1: 00105 inline State(::FLAC__StreamDecoderState state): state_(state) { } Chris@1: 00106 inline operator ::FLAC__StreamDecoderState() const { return state_; } Chris@1: 00107 inline const char *as_cstring() const { return ::FLAC__StreamDecoderStateString[state_]; } Chris@1: 00108 inline const char *resolved_as_cstring(const Stream &decoder) const { return ::FLAC__stream_decoder_get_resolved_state_string(decoder.decoder_); } Chris@1: 00109 protected: Chris@1: 00110 ::FLAC__StreamDecoderState state_; Chris@1: 00111 }; Chris@1: 00112 Chris@1: 00113 Stream(); Chris@1: 00114 virtual ~Stream(); Chris@1: 00115 Chris@1: 00117 Chris@1: 00120 virtual bool is_valid() const; Chris@1: 00121 inline operator bool() const { return is_valid(); } Chris@1: 00122 Chris@1: 00123 Chris@1: 00124 virtual bool set_ogg_serial_number(long value); Chris@1: 00125 virtual bool set_md5_checking(bool value); Chris@1: 00126 virtual bool set_metadata_respond(::FLAC__MetadataType type); Chris@1: 00127 virtual bool set_metadata_respond_application(const FLAC__byte id[4]); Chris@1: 00128 virtual bool set_metadata_respond_all(); Chris@1: 00129 virtual bool set_metadata_ignore(::FLAC__MetadataType type); Chris@1: 00130 virtual bool set_metadata_ignore_application(const FLAC__byte id[4]); Chris@1: 00131 virtual bool set_metadata_ignore_all(); Chris@1: 00132 Chris@1: 00133 /* get_state() is not virtual since we want subclasses to be able to return their own state */ Chris@1: 00134 State get_state() const; Chris@1: 00135 virtual bool get_md5_checking() const; Chris@1: 00136 virtual FLAC__uint64 get_total_samples() const; Chris@1: 00137 virtual unsigned get_channels() const; Chris@1: 00138 virtual ::FLAC__ChannelAssignment get_channel_assignment() const; Chris@1: 00139 virtual unsigned get_bits_per_sample() const; Chris@1: 00140 virtual unsigned get_sample_rate() const; Chris@1: 00141 virtual unsigned get_blocksize() const; Chris@1: 00142 virtual bool get_decode_position(FLAC__uint64 *position) const; Chris@1: 00143 Chris@1: 00144 virtual ::FLAC__StreamDecoderInitStatus init(); Chris@1: 00145 virtual ::FLAC__StreamDecoderInitStatus init_ogg(); Chris@1: 00146 Chris@1: 00147 virtual bool finish(); Chris@1: 00148 Chris@1: 00149 virtual bool flush(); Chris@1: 00150 virtual bool reset(); Chris@1: 00151 Chris@1: 00152 virtual bool process_single(); Chris@1: 00153 virtual bool process_until_end_of_metadata(); Chris@1: 00154 virtual bool process_until_end_of_stream(); Chris@1: 00155 virtual bool skip_single_frame(); Chris@1: 00156 Chris@1: 00157 virtual bool seek_absolute(FLAC__uint64 sample); Chris@1: 00158 protected: Chris@1: 00160 virtual ::FLAC__StreamDecoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes) = 0; Chris@1: 00161 Chris@1: 00163 virtual ::FLAC__StreamDecoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset); Chris@1: 00164 Chris@1: 00166 virtual ::FLAC__StreamDecoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset); Chris@1: 00167 Chris@1: 00169 virtual ::FLAC__StreamDecoderLengthStatus length_callback(FLAC__uint64 *stream_length); Chris@1: 00170 Chris@1: 00172 virtual bool eof_callback(); Chris@1: 00173 Chris@1: 00175 virtual ::FLAC__StreamDecoderWriteStatus write_callback(const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[]) = 0; Chris@1: 00176 Chris@1: 00178 virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata); Chris@1: 00179 Chris@1: 00181 virtual void error_callback(::FLAC__StreamDecoderErrorStatus status) = 0; Chris@1: 00182 Chris@1: 00183 #if (defined _MSC_VER) || (defined __BORLANDC__) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC) Chris@1: 00184 // lame hack: some MSVC/GCC versions can't see a protected decoder_ from nested State::resolved_as_cstring() Chris@1: 00185 friend State; Chris@1: 00186 #endif Chris@1: 00187 ::FLAC__StreamDecoder *decoder_; Chris@1: 00188 Chris@1: 00189 static ::FLAC__StreamDecoderReadStatus read_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); Chris@1: 00190 static ::FLAC__StreamDecoderSeekStatus seek_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); Chris@1: 00191 static ::FLAC__StreamDecoderTellStatus tell_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); Chris@1: 00192 static ::FLAC__StreamDecoderLengthStatus length_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); Chris@1: 00193 static FLAC__bool eof_callback_(const ::FLAC__StreamDecoder *decoder, void *client_data); Chris@1: 00194 static ::FLAC__StreamDecoderWriteStatus write_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); Chris@1: 00195 static void metadata_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__StreamMetadata *metadata, void *client_data); Chris@1: 00196 static void error_callback_(const ::FLAC__StreamDecoder *decoder, ::FLAC__StreamDecoderErrorStatus status, void *client_data); Chris@1: 00197 private: Chris@1: 00198 // Private and undefined so you can't use them: Chris@1: 00199 Stream(const Stream &); Chris@1: 00200 void operator=(const Stream &); Chris@1: 00201 }; Chris@1: 00202 Chris@1: 00222 class FLACPP_API File: public Stream { Chris@1: 00223 public: Chris@1: 00224 File(); Chris@1: 00225 virtual ~File(); Chris@1: 00226 Chris@1: 00227 virtual ::FLAC__StreamDecoderInitStatus init(FILE *file); Chris@1: 00228 virtual ::FLAC__StreamDecoderInitStatus init(const char *filename); Chris@1: 00229 virtual ::FLAC__StreamDecoderInitStatus init(const std::string &filename); Chris@1: 00230 virtual ::FLAC__StreamDecoderInitStatus init_ogg(FILE *file); Chris@1: 00231 virtual ::FLAC__StreamDecoderInitStatus init_ogg(const char *filename); Chris@1: 00232 virtual ::FLAC__StreamDecoderInitStatus init_ogg(const std::string &filename); Chris@1: 00233 protected: Chris@1: 00234 // this is a dummy implementation to satisfy the pure virtual in Stream that is actually supplied internally by the C layer Chris@1: 00235 virtual ::FLAC__StreamDecoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes); Chris@1: 00236 private: Chris@1: 00237 // Private and undefined so you can't use them: Chris@1: 00238 File(const File &); Chris@1: 00239 void operator=(const File &); Chris@1: 00240 }; Chris@1: 00241 Chris@1: 00242 } Chris@1: 00243 } Chris@1: 00244 Chris@1: 00245 #endif Chris@1: