00001 #ifndef FLACDECODER_H_
00002 #define FLACDECODER_H_
00003
00004 #define HAVE_INTTYPES_H
00005 #include <FLAC/all.h>
00006 #include <FLAC/export.h>
00007 #if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7
00008
00009 #define StreamDecoderReadStatus FLAC__SeekableStreamDecoderReadStatus
00010 #define StreamDecoder FLAC__SeekableStreamDecoder
00011 #define STREAM_DECODER_READ_STATUS_ERROR FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR
00012 #define STREAM_DECODER_READ_STATUS_OK FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK
00013 #define StreamDecoderSeekStatus FLAC__SeekableStreamDecoderSeekStatus
00014 #define STREAM_DECODER_SEEK_STATUS_ERROR FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR
00015 #define STREAM_DECODER_SEEK_STATUS_OK FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK
00016 #define StreamDecoderTellStatus FLAC__SeekableStreamDecoderTellStatus
00017 #define STREAM_DECODER_TELL_STATUS_OK FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK
00018 #define StreamDecoderLengthStatus FLAC__SeekableStreamDecoderLengthStatus
00019 #define STREAM_DECODER_LENGTH_STATUS_OK FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK
00020 #define FileDecoder FLAC__FileDecoder
00021 #define decoder_new() FLAC__seekable_stream_decoder_new()
00022 #define decoder_set_md5_checking(dec, op) \
00023 FLAC__seekable_stream_decoder_set_md5_checking(dec, op)
00024 #define decoder_setup(dec, read, seek, tell, length, \
00025 eof, write, metadata, error, data) \
00026 { \
00027 FLAC__seekable_stream_decoder_set_read_callback(dec, read); \
00028 FLAC__seekable_stream_decoder_set_seek_callback(dec, seek); \
00029 FLAC__seekable_stream_decoder_set_tell_callback(dec, tell); \
00030 FLAC__seekable_stream_decoder_set_length_callback(dec, length); \
00031 FLAC__seekable_stream_decoder_set_eof_callback(dec, eof); \
00032 FLAC__seekable_stream_decoder_set_write_callback(dec, write); \
00033 FLAC__seekable_stream_decoder_set_metadata_callback(dec, metadata); \
00034 FLAC__seekable_stream_decoder_set_error_callback(dec, error); \
00035 FLAC__seekable_stream_decoder_set_client_data(dec, data); \
00036 }
00037 #define decoder_process_metadata FLAC__seekable_stream_decoder_process_until_end_of_metadata
00038 #define decoder_finish FLAC__seekable_stream_decoder_finish
00039 #define decoder_delete FLAC__seekable_stream_decoder_delete
00040 #define DecoderState FLAC__SeekableStreamDecoderState
00041 #define decoder_seek_absolute FLAC__seekable_stream_decoder_seek_absolute
00042 #define decoder_process_single FLAC__seekable_stream_decoder_process_single
00043 #define decoder_get_state FLAC__seekable_stream_decoder_get_state
00044 #define bytesSize unsigned
00045 #define STREAM_DECODER_SEARCH_FOR_METADATA FLAC__SEEKABLE_STREAM_DECODER_OK
00046 #define STREAM_DECODER_READ_METADATA FLAC__SEEKABLE_STREAM_DECODER_OK
00047 #define STREAM_DECODER_SEARCH_FOR_FRAME_SYNC FLAC__SEEKABLE_STREAM_DECODER_OK
00048 #define STREAM_DECODER_READ_FRAME FLAC__SEEKABLE_STREAM_DECODER_OK
00049 #else
00050
00051 #define NEWFLAC
00052 #define StreamDecoderReadStatus FLAC__StreamDecoderReadStatus
00053 #define StreamDecoder FLAC__StreamDecoder
00054 #define STREAM_DECODER_READ_STATUS_ERROR FLAC__STREAM_DECODER_READ_STATUS_ABORT
00055 #define STREAM_DECODER_READ_STATUS_OK FLAC__STREAM_DECODER_READ_STATUS_CONTINUE
00056 #define StreamDecoderSeekStatus FLAC__StreamDecoderSeekStatus
00057 #define STREAM_DECODER_SEEK_STATUS_ERROR FLAC__STREAM_DECODER_SEEK_STATUS_ERROR
00058 #define STREAM_DECODER_SEEK_STATUS_OK FLAC__STREAM_DECODER_SEEK_STATUS_OK
00059 #define StreamDecoderTellStatus FLAC__StreamDecoderTellStatus
00060 #define STREAM_DECODER_TELL_STATUS_OK FLAC__STREAM_DECODER_TELL_STATUS_OK
00061 #define StreamDecoderLengthStatus FLAC__StreamDecoderLengthStatus
00062 #define STREAM_DECODER_LENGTH_STATUS_OK FLAC__STREAM_DECODER_LENGTH_STATUS_OK
00063 #define FileDecoder FLAC__StreamDecoder
00064 #define decoder_new() FLAC__stream_decoder_new()
00065 #define decoder_set_md5_checking(dec, op) \
00066 FLAC__stream_decoder_set_md5_checking(dec, op)
00067 #define decoder_setup(decoder, read, seek, tell, length, eof, write, metadata, error, data) \
00068 FLAC__stream_decoder_init_stream(decoder, read, seek, tell, length, \
00069 eof, write, metadata, error, data)
00070 #define decoder_process_metadata FLAC__stream_decoder_process_until_end_of_metadata
00071 #define decoder_finish FLAC__stream_decoder_finish
00072 #define decoder_delete FLAC__stream_decoder_delete
00073 #define DecoderState FLAC__StreamDecoderState
00074 #define decoder_seek_absolute FLAC__stream_decoder_seek_absolute
00075 #define decoder_process_single FLAC__stream_decoder_process_single
00076 #define decoder_get_state FLAC__stream_decoder_get_state
00077 #define bytesSize size_t
00078 #define STREAM_DECODER_SEARCH_FOR_METADATA FLAC__STREAM_DECODER_SEARCH_FOR_METADATA
00079 #define STREAM_DECODER_READ_METADATA FLAC__STREAM_DECODER_READ_METADATA
00080 #define STREAM_DECODER_SEARCH_FOR_FRAME_SYNC FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC
00081 #define STREAM_DECODER_READ_FRAME FLAC__STREAM_DECODER_READ_FRAME
00082 #endif
00083
00084 #include "decoder.h"
00085
00086 class Metadata;
00087
00088 class FlacDecoder : public Decoder
00089 {
00090 public:
00091 FlacDecoder(const QString &file, DecoderFactory *, QIODevice *, AudioOutput *);
00092 virtual ~FlacDecoder(void);
00093
00094 bool initialize();
00095 double lengthInSeconds();
00096 void seek(double);
00097 void stop();
00098
00099 void doWrite(const FLAC__Frame *frame, const FLAC__int32 * const buffer[]);
00100 void setFlacMetadata(const FLAC__StreamMetadata *metadata);
00101
00102 MetaIO *doCreateTagger(void);
00103
00104 private:
00105 void run();
00106
00107 void flush(bool = FALSE);
00108 void deinit();
00109
00110 bool inited, user_stop;
00111 int stat;
00112 char *output_buf;
00113 ulong output_bytes, output_at;
00114
00115 StreamDecoder *decoder;
00116
00117 unsigned int bks;
00118 bool done, finish;
00119 long len, freq, bitrate;
00120 int chan;
00121 int bitspersample;
00122 double totalTime, seekTime;
00123 unsigned long totalsamples;
00124
00125
00126 };
00127
00128 #endif
00129