annotate osx/include/FLAC++/decoder.h @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents cc5d363db385
children
rev   line source
Chris@2 1 /* libFLAC++ - Free Lossless Audio Codec library
Chris@2 2 * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson
Chris@2 3 *
Chris@2 4 * Redistribution and use in source and binary forms, with or without
Chris@2 5 * modification, are permitted provided that the following conditions
Chris@2 6 * are met:
Chris@2 7 *
Chris@2 8 * - Redistributions of source code must retain the above copyright
Chris@2 9 * notice, this list of conditions and the following disclaimer.
Chris@2 10 *
Chris@2 11 * - Redistributions in binary form must reproduce the above copyright
Chris@2 12 * notice, this list of conditions and the following disclaimer in the
Chris@2 13 * documentation and/or other materials provided with the distribution.
Chris@2 14 *
Chris@2 15 * - Neither the name of the Xiph.org Foundation nor the names of its
Chris@2 16 * contributors may be used to endorse or promote products derived from
Chris@2 17 * this software without specific prior written permission.
Chris@2 18 *
Chris@2 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Chris@2 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Chris@2 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Chris@2 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
Chris@2 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
Chris@2 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
Chris@2 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
Chris@2 26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Chris@2 27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Chris@2 28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Chris@2 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Chris@2 30 */
Chris@2 31
Chris@2 32 #ifndef FLACPP__DECODER_H
Chris@2 33 #define FLACPP__DECODER_H
Chris@2 34
Chris@2 35 #include "export.h"
Chris@2 36
Chris@2 37 #include <string>
Chris@2 38 #include "FLAC/stream_decoder.h"
Chris@2 39
Chris@2 40
Chris@2 41 /** \file include/FLAC++/decoder.h
Chris@2 42 *
Chris@2 43 * \brief
Chris@2 44 * This module contains the classes which implement the various
Chris@2 45 * decoders.
Chris@2 46 *
Chris@2 47 * See the detailed documentation in the
Chris@2 48 * \link flacpp_decoder decoder \endlink module.
Chris@2 49 */
Chris@2 50
Chris@2 51 /** \defgroup flacpp_decoder FLAC++/decoder.h: decoder classes
Chris@2 52 * \ingroup flacpp
Chris@2 53 *
Chris@2 54 * \brief
Chris@2 55 * This module describes the decoder layers provided by libFLAC++.
Chris@2 56 *
Chris@2 57 * The libFLAC++ decoder classes are object wrappers around their
Chris@2 58 * counterparts in libFLAC. All decoding layers available in
Chris@2 59 * libFLAC are also provided here. The interface is very similar;
Chris@2 60 * make sure to read the \link flac_decoder libFLAC decoder module \endlink.
Chris@2 61 *
Chris@2 62 * There are only two significant differences here. First, instead of
Chris@2 63 * passing in C function pointers for callbacks, you inherit from the
Chris@2 64 * decoder class and provide implementations for the callbacks in your
Chris@2 65 * derived class; because of this there is no need for a 'client_data'
Chris@2 66 * property.
Chris@2 67 *
Chris@2 68 * Second, there are two stream decoder classes. FLAC::Decoder::Stream
Chris@2 69 * is used for the same cases that FLAC__stream_decoder_init_stream() /
Chris@2 70 * FLAC__stream_decoder_init_ogg_stream() are used, and FLAC::Decoder::File
Chris@2 71 * is used for the same cases that
Chris@2 72 * FLAC__stream_decoder_init_FILE() and FLAC__stream_decoder_init_file() /
Chris@2 73 * FLAC__stream_decoder_init_ogg_FILE() and FLAC__stream_decoder_init_ogg_file()
Chris@2 74 * are used.
Chris@2 75 */
Chris@2 76
Chris@2 77 namespace FLAC {
Chris@2 78 namespace Decoder {
Chris@2 79
Chris@2 80 /** \ingroup flacpp_decoder
Chris@2 81 * \brief
Chris@2 82 * This class wraps the ::FLAC__StreamDecoder. If you are
Chris@2 83 * decoding from a file, FLAC::Decoder::File may be more
Chris@2 84 * convenient.
Chris@2 85 *
Chris@2 86 * The usage of this class is similar to FLAC__StreamDecoder,
Chris@2 87 * except instead of providing callbacks to
Chris@2 88 * FLAC__stream_decoder_init*_stream(), you will inherit from this
Chris@2 89 * class and override the virtual callback functions with your
Chris@2 90 * own implementations, then call init() or init_ogg(). The rest
Chris@2 91 * of the calls work the same as in the C layer.
Chris@2 92 *
Chris@2 93 * Only the read, write, and error callbacks are mandatory. The
Chris@2 94 * others are optional; this class provides default
Chris@2 95 * implementations that do nothing. In order for seeking to work
Chris@2 96 * you must overide seek_callback(), tell_callback(),
Chris@2 97 * length_callback(), and eof_callback().
Chris@2 98 */
Chris@2 99 class FLACPP_API Stream {
Chris@2 100 public:
Chris@2 101 /** This class is a wrapper around FLAC__StreamDecoderState.
Chris@2 102 */
Chris@2 103 class FLACPP_API State {
Chris@2 104 public:
Chris@2 105 inline State(::FLAC__StreamDecoderState state): state_(state) { }
Chris@2 106 inline operator ::FLAC__StreamDecoderState() const { return state_; }
Chris@2 107 inline const char *as_cstring() const { return ::FLAC__StreamDecoderStateString[state_]; }
Chris@2 108 inline const char *resolved_as_cstring(const Stream &decoder) const { return ::FLAC__stream_decoder_get_resolved_state_string(decoder.decoder_); }
Chris@2 109 protected:
Chris@2 110 ::FLAC__StreamDecoderState state_;
Chris@2 111 };
Chris@2 112
Chris@2 113 Stream();
Chris@2 114 virtual ~Stream();
Chris@2 115
Chris@2 116 //@{
Chris@2 117 /** Call after construction to check the that the object was created
Chris@2 118 * successfully. If not, use get_state() to find out why not.
Chris@2 119 */
Chris@2 120 virtual bool is_valid() const;
Chris@2 121 inline operator bool() const { return is_valid(); } ///< See is_valid()
Chris@2 122 //@}
Chris@2 123
Chris@2 124 virtual bool set_ogg_serial_number(long value); ///< See FLAC__stream_decoder_set_ogg_serial_number()
Chris@2 125 virtual bool set_md5_checking(bool value); ///< See FLAC__stream_decoder_set_md5_checking()
Chris@2 126 virtual bool set_metadata_respond(::FLAC__MetadataType type); ///< See FLAC__stream_decoder_set_metadata_respond()
Chris@2 127 virtual bool set_metadata_respond_application(const FLAC__byte id[4]); ///< See FLAC__stream_decoder_set_metadata_respond_application()
Chris@2 128 virtual bool set_metadata_respond_all(); ///< See FLAC__stream_decoder_set_metadata_respond_all()
Chris@2 129 virtual bool set_metadata_ignore(::FLAC__MetadataType type); ///< See FLAC__stream_decoder_set_metadata_ignore()
Chris@2 130 virtual bool set_metadata_ignore_application(const FLAC__byte id[4]); ///< See FLAC__stream_decoder_set_metadata_ignore_application()
Chris@2 131 virtual bool set_metadata_ignore_all(); ///< See FLAC__stream_decoder_set_metadata_ignore_all()
Chris@2 132
Chris@2 133 /* get_state() is not virtual since we want subclasses to be able to return their own state */
Chris@2 134 State get_state() const; ///< See FLAC__stream_decoder_get_state()
Chris@2 135 virtual bool get_md5_checking() const; ///< See FLAC__stream_decoder_get_md5_checking()
Chris@2 136 virtual FLAC__uint64 get_total_samples() const; ///< See FLAC__stream_decoder_get_total_samples()
Chris@2 137 virtual unsigned get_channels() const; ///< See FLAC__stream_decoder_get_channels()
Chris@2 138 virtual ::FLAC__ChannelAssignment get_channel_assignment() const; ///< See FLAC__stream_decoder_get_channel_assignment()
Chris@2 139 virtual unsigned get_bits_per_sample() const; ///< See FLAC__stream_decoder_get_bits_per_sample()
Chris@2 140 virtual unsigned get_sample_rate() const; ///< See FLAC__stream_decoder_get_sample_rate()
Chris@2 141 virtual unsigned get_blocksize() const; ///< See FLAC__stream_decoder_get_blocksize()
Chris@2 142 virtual bool get_decode_position(FLAC__uint64 *position) const; ///< See FLAC__stream_decoder_get_decode_position()
Chris@2 143
Chris@2 144 virtual ::FLAC__StreamDecoderInitStatus init(); ///< Seek FLAC__stream_decoder_init_stream()
Chris@2 145 virtual ::FLAC__StreamDecoderInitStatus init_ogg(); ///< Seek FLAC__stream_decoder_init_ogg_stream()
Chris@2 146
Chris@2 147 virtual bool finish(); ///< See FLAC__stream_decoder_finish()
Chris@2 148
Chris@2 149 virtual bool flush(); ///< See FLAC__stream_decoder_flush()
Chris@2 150 virtual bool reset(); ///< See FLAC__stream_decoder_reset()
Chris@2 151
Chris@2 152 virtual bool process_single(); ///< See FLAC__stream_decoder_process_single()
Chris@2 153 virtual bool process_until_end_of_metadata(); ///< See FLAC__stream_decoder_process_until_end_of_metadata()
Chris@2 154 virtual bool process_until_end_of_stream(); ///< See FLAC__stream_decoder_process_until_end_of_stream()
Chris@2 155 virtual bool skip_single_frame(); ///< See FLAC__stream_decoder_skip_single_frame()
Chris@2 156
Chris@2 157 virtual bool seek_absolute(FLAC__uint64 sample); ///< See FLAC__stream_decoder_seek_absolute()
Chris@2 158 protected:
Chris@2 159 /// see FLAC__StreamDecoderReadCallback
Chris@2 160 virtual ::FLAC__StreamDecoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes) = 0;
Chris@2 161
Chris@2 162 /// see FLAC__StreamDecoderSeekCallback
Chris@2 163 virtual ::FLAC__StreamDecoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset);
Chris@2 164
Chris@2 165 /// see FLAC__StreamDecoderTellCallback
Chris@2 166 virtual ::FLAC__StreamDecoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset);
Chris@2 167
Chris@2 168 /// see FLAC__StreamDecoderLengthCallback
Chris@2 169 virtual ::FLAC__StreamDecoderLengthStatus length_callback(FLAC__uint64 *stream_length);
Chris@2 170
Chris@2 171 /// see FLAC__StreamDecoderEofCallback
Chris@2 172 virtual bool eof_callback();
Chris@2 173
Chris@2 174 /// see FLAC__StreamDecoderWriteCallback
Chris@2 175 virtual ::FLAC__StreamDecoderWriteStatus write_callback(const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[]) = 0;
Chris@2 176
Chris@2 177 /// see FLAC__StreamDecoderMetadataCallback
Chris@2 178 virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata);
Chris@2 179
Chris@2 180 /// see FLAC__StreamDecoderErrorCallback
Chris@2 181 virtual void error_callback(::FLAC__StreamDecoderErrorStatus status) = 0;
Chris@2 182
Chris@2 183 #if (defined _MSC_VER) || (defined __BORLANDC__) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC)
Chris@2 184 // lame hack: some MSVC/GCC versions can't see a protected decoder_ from nested State::resolved_as_cstring()
Chris@2 185 friend State;
Chris@2 186 #endif
Chris@2 187 ::FLAC__StreamDecoder *decoder_;
Chris@2 188
Chris@2 189 static ::FLAC__StreamDecoderReadStatus read_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
Chris@2 190 static ::FLAC__StreamDecoderSeekStatus seek_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data);
Chris@2 191 static ::FLAC__StreamDecoderTellStatus tell_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
Chris@2 192 static ::FLAC__StreamDecoderLengthStatus length_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data);
Chris@2 193 static FLAC__bool eof_callback_(const ::FLAC__StreamDecoder *decoder, void *client_data);
Chris@2 194 static ::FLAC__StreamDecoderWriteStatus write_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
Chris@2 195 static void metadata_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__StreamMetadata *metadata, void *client_data);
Chris@2 196 static void error_callback_(const ::FLAC__StreamDecoder *decoder, ::FLAC__StreamDecoderErrorStatus status, void *client_data);
Chris@2 197 private:
Chris@2 198 // Private and undefined so you can't use them:
Chris@2 199 Stream(const Stream &);
Chris@2 200 void operator=(const Stream &);
Chris@2 201 };
Chris@2 202
Chris@2 203 /** \ingroup flacpp_decoder
Chris@2 204 * \brief
Chris@2 205 * This class wraps the ::FLAC__StreamDecoder. If you are
Chris@2 206 * not decoding from a file, you may need to use
Chris@2 207 * FLAC::Decoder::Stream.
Chris@2 208 *
Chris@2 209 * The usage of this class is similar to FLAC__StreamDecoder,
Chris@2 210 * except instead of providing callbacks to
Chris@2 211 * FLAC__stream_decoder_init*_FILE() or
Chris@2 212 * FLAC__stream_decoder_init*_file(), you will inherit from this
Chris@2 213 * class and override the virtual callback functions with your
Chris@2 214 * own implementations, then call init() or init_off(). The rest
Chris@2 215 * of the calls work the same as in the C layer.
Chris@2 216 *
Chris@2 217 * Only the write, and error callbacks from FLAC::Decoder::Stream
Chris@2 218 * are mandatory. The others are optional; this class provides
Chris@2 219 * full working implementations for all other callbacks and
Chris@2 220 * supports seeking.
Chris@2 221 */
Chris@2 222 class FLACPP_API File: public Stream {
Chris@2 223 public:
Chris@2 224 File();
Chris@2 225 virtual ~File();
Chris@2 226
Chris@2 227 virtual ::FLAC__StreamDecoderInitStatus init(FILE *file); ///< See FLAC__stream_decoder_init_FILE()
Chris@2 228 virtual ::FLAC__StreamDecoderInitStatus init(const char *filename); ///< See FLAC__stream_decoder_init_file()
Chris@2 229 virtual ::FLAC__StreamDecoderInitStatus init(const std::string &filename); ///< See FLAC__stream_decoder_init_file()
Chris@2 230 virtual ::FLAC__StreamDecoderInitStatus init_ogg(FILE *file); ///< See FLAC__stream_decoder_init_ogg_FILE()
Chris@2 231 virtual ::FLAC__StreamDecoderInitStatus init_ogg(const char *filename); ///< See FLAC__stream_decoder_init_ogg_file()
Chris@2 232 virtual ::FLAC__StreamDecoderInitStatus init_ogg(const std::string &filename); ///< See FLAC__stream_decoder_init_ogg_file()
Chris@2 233 protected:
Chris@2 234 // this is a dummy implementation to satisfy the pure virtual in Stream that is actually supplied internally by the C layer
Chris@2 235 virtual ::FLAC__StreamDecoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes);
Chris@2 236 private:
Chris@2 237 // Private and undefined so you can't use them:
Chris@2 238 File(const File &);
Chris@2 239 void operator=(const File &);
Chris@2 240 };
Chris@2 241
Chris@2 242 }
Chris@2 243 }
Chris@2 244
Chris@2 245 #endif