decoder.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:14k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* libFLAC++ - Free Lossless Audio Codec library
  2.  * Copyright (C) 2002,2003,2004,2005  Josh Coalson
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * - Redistributions of source code must retain the above copyright
  9.  * notice, this list of conditions and the following disclaimer.
  10.  *
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  * notice, this list of conditions and the following disclaimer in the
  13.  * documentation and/or other materials provided with the distribution.
  14.  *
  15.  * - Neither the name of the Xiph.org Foundation nor the names of its
  16.  * contributors may be used to endorse or promote products derived from
  17.  * this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20.  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22.  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
  23.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29.  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30.  */
  31. #ifndef FLACPP__DECODER_H
  32. #define FLACPP__DECODER_H
  33. #include "export.h"
  34. #include "FLAC/file_decoder.h"
  35. #include "FLAC/seekable_stream_decoder.h"
  36. #include "FLAC/stream_decoder.h"
  37. /** file include/FLAC++/decoder.h
  38.  *
  39.  *  brief
  40.  *  This module contains the classes which implement the various
  41.  *  decoders.
  42.  *
  43.  *  See the detailed documentation in the
  44.  *  link flacpp_decoder decoder endlink module.
  45.  */
  46. /** defgroup flacpp_decoder FLAC++/decoder.h: decoder classes
  47.  *  ingroup flacpp
  48.  *
  49.  *  brief
  50.  *  This module describes the three decoder layers provided by libFLAC++.
  51.  *
  52.  * The libFLAC++ decoder classes are object wrappers around their
  53.  * counterparts in libFLAC.  All three decoding layers available in
  54.  * libFLAC are also provided here.  The interface is very similar;
  55.  * make sure to read the link flac_decoder libFLAC decoder module endlink.
  56.  *
  57.  * The only real difference here is that instead of passing in C function
  58.  * pointers for callbacks, you inherit from the decoder class and provide
  59.  * implementations for the callbacks in the derived class; because of this
  60.  * there is no need for a 'client_data' property.
  61.  */
  62. namespace FLAC {
  63. namespace Decoder {
  64. // ============================================================
  65. //
  66. //  Equivalent: FLAC__StreamDecoder
  67. //
  68. // ============================================================
  69. /** defgroup flacpp_stream_decoder FLAC++/decoder.h: stream decoder class
  70.  *  ingroup flacpp_decoder
  71.  *
  72.  *  brief
  73.  *  This class wraps the ::FLAC__StreamDecoder.
  74.  *
  75.  * See the link flac_stream_decoder libFLAC stream decoder module endlink.
  76.  *
  77.  * {
  78.  */
  79. /** This class wraps the ::FLAC__StreamDecoder.
  80.  */
  81. class FLACPP_API Stream {
  82. public:
  83. class FLACPP_API State {
  84. public:
  85. inline State(::FLAC__StreamDecoderState state): state_(state) { }
  86. inline operator ::FLAC__StreamDecoderState() const { return state_; }
  87. inline const char *as_cstring() const { return ::FLAC__StreamDecoderStateString[state_]; }
  88. inline const char *resolved_as_cstring(const Stream &decoder) const { return ::FLAC__stream_decoder_get_resolved_state_string(decoder.decoder_); }
  89. protected:
  90. ::FLAC__StreamDecoderState state_;
  91. };
  92. Stream();
  93. virtual ~Stream();
  94. bool is_valid() const;
  95. inline operator bool() const { return is_valid(); }
  96. bool set_metadata_respond(::FLAC__MetadataType type);
  97. bool set_metadata_respond_application(const FLAC__byte id[4]);
  98. bool set_metadata_respond_all();
  99. bool set_metadata_ignore(::FLAC__MetadataType type);
  100. bool set_metadata_ignore_application(const FLAC__byte id[4]);
  101. bool set_metadata_ignore_all();
  102. State get_state() const;
  103. unsigned get_channels() const;
  104. ::FLAC__ChannelAssignment get_channel_assignment() const;
  105. unsigned get_bits_per_sample() const;
  106. unsigned get_sample_rate() const;
  107. unsigned get_blocksize() const;
  108. /** Initialize the instance; as with the C interface,
  109.  *  init() should be called after construction and 'set'
  110.  *  calls but before any of the 'process' calls.
  111.  */
  112. State init();
  113. void finish();
  114. bool flush();
  115. bool reset();
  116. bool process_single();
  117. bool process_until_end_of_metadata();
  118. bool process_until_end_of_stream();
  119. bool skip_single_frame();
  120. protected:
  121. virtual ::FLAC__StreamDecoderReadStatus read_callback(FLAC__byte buffer[], unsigned *bytes) = 0;
  122. virtual ::FLAC__StreamDecoderWriteStatus write_callback(const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[]) = 0;
  123. virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata) = 0;
  124. virtual void error_callback(::FLAC__StreamDecoderErrorStatus status) = 0;
  125. #if (defined _MSC_VER) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC)
  126. // lame hack: some MSVC/GCC versions can't see a protected decoder_ from nested State::resolved_as_cstring()
  127. friend State;
  128. #endif
  129. ::FLAC__StreamDecoder *decoder_;
  130. private:
  131. static ::FLAC__StreamDecoderReadStatus read_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data);
  132. static ::FLAC__StreamDecoderWriteStatus write_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
  133. static void metadata_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__StreamMetadata *metadata, void *client_data);
  134. static void error_callback_(const ::FLAC__StreamDecoder *decoder, ::FLAC__StreamDecoderErrorStatus status, void *client_data);
  135. // Private and undefined so you can't use them:
  136. Stream(const Stream &);
  137. void operator=(const Stream &);
  138. };
  139. /* } */
  140. // ============================================================
  141. //
  142. //  Equivalent: FLAC__SeekableStreamDecoder
  143. //
  144. // ============================================================
  145. /** defgroup flacpp_seekable_stream_decoder FLAC++/decoder.h: seekable stream decoder class
  146.  *  ingroup flacpp_decoder
  147.  *
  148.  *  brief
  149.  *  This class wraps the ::FLAC__SeekableStreamDecoder.
  150.  *
  151.  * See the link flac_seekable_stream_decoder libFLAC seekable stream decoder module endlink.
  152.  *
  153.  * {
  154.  */
  155. /** This class wraps the ::FLAC__SeekableStreamDecoder.
  156.  */
  157. class FLACPP_API SeekableStream {
  158. public:
  159. class FLACPP_API State {
  160. public:
  161. inline State(::FLAC__SeekableStreamDecoderState state): state_(state) { }
  162. inline operator ::FLAC__SeekableStreamDecoderState() const { return state_; }
  163. inline const char *as_cstring() const { return ::FLAC__SeekableStreamDecoderStateString[state_]; }
  164. inline const char *resolved_as_cstring(const SeekableStream &decoder) const { return ::FLAC__seekable_stream_decoder_get_resolved_state_string(decoder.decoder_); }
  165. protected:
  166. ::FLAC__SeekableStreamDecoderState state_;
  167. };
  168. SeekableStream();
  169. virtual ~SeekableStream();
  170. bool is_valid() const;
  171. inline operator bool() const { return is_valid(); }
  172. bool set_md5_checking(bool value);
  173. bool set_metadata_respond(::FLAC__MetadataType type);
  174. bool set_metadata_respond_application(const FLAC__byte id[4]);
  175. bool set_metadata_respond_all();
  176. bool set_metadata_ignore(::FLAC__MetadataType type);
  177. bool set_metadata_ignore_application(const FLAC__byte id[4]);
  178. bool set_metadata_ignore_all();
  179. State get_state() const;
  180. Stream::State get_stream_decoder_state() const;
  181. bool get_md5_checking() const;
  182. unsigned get_channels() const;
  183. ::FLAC__ChannelAssignment get_channel_assignment() const;
  184. unsigned get_bits_per_sample() const;
  185. unsigned get_sample_rate() const;
  186. unsigned get_blocksize() const;
  187. State init();
  188. bool finish();
  189. bool flush();
  190. bool reset();
  191. bool process_single();
  192. bool process_until_end_of_metadata();
  193. bool process_until_end_of_stream();
  194. bool skip_single_frame();
  195. bool seek_absolute(FLAC__uint64 sample);
  196. protected:
  197. virtual ::FLAC__SeekableStreamDecoderReadStatus read_callback(FLAC__byte buffer[], unsigned *bytes) = 0;
  198. virtual ::FLAC__SeekableStreamDecoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset) = 0;
  199. virtual ::FLAC__SeekableStreamDecoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset) = 0;
  200. virtual ::FLAC__SeekableStreamDecoderLengthStatus length_callback(FLAC__uint64 *stream_length) = 0;
  201. virtual bool eof_callback() = 0;
  202. virtual ::FLAC__StreamDecoderWriteStatus write_callback(const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[]) = 0;
  203. virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata) = 0;
  204. virtual void error_callback(::FLAC__StreamDecoderErrorStatus status) = 0;
  205. #if (defined _MSC_VER) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC)
  206. // lame hack: some MSVC/GCC versions can't see a protected decoder_ from nested State::resolved_as_cstring()
  207. friend State;
  208. #endif
  209. ::FLAC__SeekableStreamDecoder *decoder_;
  210. private:
  211. static ::FLAC__SeekableStreamDecoderReadStatus read_callback_(const ::FLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data);
  212. static ::FLAC__SeekableStreamDecoderSeekStatus seek_callback_(const ::FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data);
  213. static ::FLAC__SeekableStreamDecoderTellStatus tell_callback_(const ::FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
  214. static ::FLAC__SeekableStreamDecoderLengthStatus length_callback_(const ::FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data);
  215. static FLAC__bool eof_callback_(const ::FLAC__SeekableStreamDecoder *decoder, void *client_data);
  216. static ::FLAC__StreamDecoderWriteStatus write_callback_(const ::FLAC__SeekableStreamDecoder *decoder, const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
  217. static void metadata_callback_(const ::FLAC__SeekableStreamDecoder *decoder, const ::FLAC__StreamMetadata *metadata, void *client_data);
  218. static void error_callback_(const ::FLAC__SeekableStreamDecoder *decoder, ::FLAC__StreamDecoderErrorStatus status, void *client_data);
  219. // Private and undefined so you can't use them:
  220. SeekableStream(const SeekableStream &);
  221. void operator=(const SeekableStream &);
  222. };
  223. /* } */
  224. // ============================================================
  225. //
  226. //  Equivalent: FLAC__FileDecoder
  227. //
  228. // ============================================================
  229. /** defgroup flacpp_file_decoder FLAC++/decoder.h: file decoder class
  230.  *  ingroup flacpp_decoder
  231.  *
  232.  *  brief
  233.  *  This class wraps the ::FLAC__FileDecoder.
  234.  *
  235.  * See the link flac_file_decoder libFLAC file decoder module endlink.
  236.  *
  237.  * {
  238.  */
  239. /** This class wraps the ::FLAC__FileDecoder.
  240.  */
  241. class FLACPP_API File {
  242. public:
  243. class FLACPP_API State {
  244. public:
  245. inline State(::FLAC__FileDecoderState state): state_(state) { }
  246. inline operator ::FLAC__FileDecoderState() const { return state_; }
  247. inline const char *as_cstring() const { return ::FLAC__FileDecoderStateString[state_]; }
  248. inline const char *resolved_as_cstring(const File &decoder) const { return ::FLAC__file_decoder_get_resolved_state_string(decoder.decoder_); }
  249. protected:
  250. ::FLAC__FileDecoderState state_;
  251. };
  252. File();
  253. virtual ~File();
  254. bool is_valid() const;
  255. inline operator bool() const { return is_valid(); }
  256. bool set_md5_checking(bool value);
  257. bool set_filename(const char *value); //!< 'value' may not be c NULL; use "-" for stdin
  258. bool set_metadata_respond(::FLAC__MetadataType type);
  259. bool set_metadata_respond_application(const FLAC__byte id[4]);
  260. bool set_metadata_respond_all();
  261. bool set_metadata_ignore(::FLAC__MetadataType type);
  262. bool set_metadata_ignore_application(const FLAC__byte id[4]);
  263. bool set_metadata_ignore_all();
  264. State get_state() const;
  265. SeekableStream::State get_seekable_stream_decoder_state() const;
  266. Stream::State get_stream_decoder_state() const;
  267. bool get_md5_checking() const;
  268. unsigned get_channels() const;
  269. ::FLAC__ChannelAssignment get_channel_assignment() const;
  270. unsigned get_bits_per_sample() const;
  271. unsigned get_sample_rate() const;
  272. unsigned get_blocksize() const;
  273. State init();
  274. bool finish();
  275. bool process_single();
  276. bool process_until_end_of_metadata();
  277. bool process_until_end_of_file();
  278. bool skip_single_frame();
  279. bool seek_absolute(FLAC__uint64 sample);
  280. protected:
  281. virtual ::FLAC__StreamDecoderWriteStatus write_callback(const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[]) = 0;
  282. virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata) = 0;
  283. virtual void error_callback(::FLAC__StreamDecoderErrorStatus status) = 0;
  284. #if (defined _MSC_VER) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC)
  285. // lame hack: some MSVC/GCC versions can't see a protected decoder_ from nested State::resolved_as_cstring()
  286. friend State;
  287. #endif
  288. ::FLAC__FileDecoder *decoder_;
  289. private:
  290. static ::FLAC__StreamDecoderWriteStatus write_callback_(const ::FLAC__FileDecoder *decoder, const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
  291. static void metadata_callback_(const ::FLAC__FileDecoder *decoder, const ::FLAC__StreamMetadata *metadata, void *client_data);
  292. static void error_callback_(const ::FLAC__FileDecoder *decoder, ::FLAC__StreamDecoderErrorStatus status, void *client_data);
  293. // Private and undefined so you can't use them:
  294. File(const File &);
  295. void operator=(const File &);
  296. };
  297. /* } */
  298. }
  299. }
  300. #endif