1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
/*************************************************************************
FlacDecoder.h - decoder for FLAC data
-------------------
begin : Tue Feb 28 2004
copyright : (C) 2004 by Thomas Eschenbacher
email : Thomas.Eschenbacher@gmx.de
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef FLAC_DECODER_H
#define FLAC_DECODER_H
#include "config.h"
#include <QList>
#include <QMap>
#include <QObject>
#include <QString>
#include <QStringList>
#include <FLAC++/decoder.h>
#include <FLAC++/metadata.h>
#include <FLAC/format.h>
#include "libkwave/Decoder.h"
#include "libkwave/FileInfo.h"
#include "libkwave/VorbisCommentMap.h"
class QWidget;
class QIODevice;
namespace Kwave
{
class FlacDecoder: public Kwave::Decoder,
protected FLAC::Decoder::Stream
{
public:
/** Constructor */
FlacDecoder();
/** Destructor */
~FlacDecoder() override;
/** Returns a new instance of the decoder */
Kwave::Decoder *instance() override;
/**
* Opens the source and decodes the header information.
* @param widget a widget that can be used for displaying
* message boxes or dialogs
* @param source file or other source with a stream of bytes
* @return true if succeeded, false on errors
*/
bool open(QWidget *widget, QIODevice &source) override;
/**
* Decodes a stream of bytes into a MultiWriter
* @param widget a widget that can be used for displaying
* message boxes or dialogs
* @param dst MultiWriter that receives the audio data
* @return true if succeeded, false on errors
*/
virtual bool decode(QWidget *widget, Kwave::MultiWriter &dst)
override;
/**
* Closes the source.
*/
void close() override;
protected:
/**
* Parse information about the stream, like sample rate, resolution,
* channels etc...
*
* @param stream_info FLAC metadata with stream information
*/
void parseStreamInfo(const FLAC::Metadata::StreamInfo &stream_info);
/**
* Parse vorbis comments
*
* @param vorbis_comments list of vorbis comments, can be empty
*/
void parseVorbisComments(
const FLAC::Metadata::VorbisComment &vorbis_comments);
/**
* FLAC decoder interface: read callback.
*
* @param buffer the byte buffer to be filled
* @param bytes pointer with the number of bytes to be read,
* can be modified
* @return read state
*/
virtual ::FLAC__StreamDecoderReadStatus read_callback(
FLAC__byte buffer[], size_t *bytes) override;
/**
* FLAC decoder interface: write callback.
*
* @param frame a FLAC frame structure
* @param buffer a buffer that contains the decoded samples
* @return FLAC stream decoder write state
*/
virtual ::FLAC__StreamDecoderWriteStatus write_callback(
const ::FLAC__Frame *frame,
const FLAC__int32 *const buffer[]) override;
/**
* FLAC decoder interface: callback for processing meta data.
*
* @param metadata the FLAC meta data to be parsed
*/
virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata)
override;
/**
* FLAC decoder interface: error callback.
*
* @param status the FLAC status
*/
virtual void error_callback(::FLAC__StreamDecoderErrorStatus status)
override;
private:
/** source of the audio data */
QIODevice *m_source;
/** destination of the audio data */
Kwave::MultiWriter *m_dest;
/** map for translating vorbis comments to FileInfo properties */
Kwave::VorbisCommentMap m_vorbis_comment_map;
};
}
#endif /* FLAC_DECODER_H */
//***************************************************************************
//***************************************************************************
|