File indexing completed on 2024-04-28 04:49:29
0001 /* 0002 SPDX-FileCopyrightText: 2010 Michal Malek <michalm@jabster.pl> 0003 SPDX-FileCopyrightText: 1998-2008 Sebastian Trueg <trueg@k3b.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #ifndef _K3B_AUDIO_ENCODER_H_ 0009 #define _K3B_AUDIO_ENCODER_H_ 0010 0011 #include "k3bplugin.h" 0012 0013 #include "k3bmsf.h" 0014 #include "k3b_export.h" 0015 0016 #include <QHash> 0017 0018 0019 namespace K3b { 0020 /** 0021 * The base class for all audio encoders. 0022 * Do not be alarmed by the number of methods since most of them 0023 * do not need to be touched. They are just there to keep the API 0024 * clean and extendable. 0025 * 0026 * see the skeleton files for further help. 0027 */ 0028 class LIBK3B_EXPORT AudioEncoder : public Plugin 0029 { 0030 Q_OBJECT 0031 0032 public: 0033 explicit AudioEncoder( QObject* parent = 0 ); 0034 ~AudioEncoder() override; 0035 0036 // TODO: if the following methods are to be activated the config methods in 0037 // PluginConfigWidget also need to be changed since they do not allow 0038 // to use an extern config object yet. 0039 // Perhaps these two methods should even go into Plugin. 0040 /** 0041 * This calls readConfig using the k3bcore config object 0042 */ 0043 // void readConfig(); 0044 0045 /** 0046 * Force the plugin to read it's configuration 0047 */ 0048 // virtual void readConfig( KConfig* ); 0049 0050 QString category() const override { return "AudioEncoder"; } 0051 0052 QString categoryName() const override; 0053 0054 /** 0055 * This should return the fileextensions supported by the filetype written in the 0056 * encoder. 0057 * May return an empty list in which case the encoder will not be usable (this may come 0058 * in handy if the encoder is based on some external program or lib which is not 0059 * available on runtime.) 0060 */ 0061 virtual QStringList extensions() const = 0; 0062 0063 /** 0064 * The filetype as presented to the user. 0065 */ 0066 virtual QString fileTypeComment( const QString& extension ) const = 0; 0067 0068 /** 0069 * Determine the filesize of the encoded file (~) 0070 * default implementation returns -1 (unknown) 0071 * First parameter is the extension to be used 0072 */ 0073 virtual long long fileSize( const QString&, const Msf& ) const { return -1; } 0074 0075 enum MetaDataField { 0076 META_TRACK_TITLE, 0077 META_TRACK_ARTIST, 0078 META_TRACK_COMMENT, 0079 META_TRACK_NUMBER, 0080 META_ALBUM_TITLE, 0081 META_ALBUM_ARTIST, 0082 META_ALBUM_COMMENT, 0083 META_YEAR, 0084 META_GENRE }; 0085 0086 typedef QHash<MetaDataField, QVariant> MetaData; 0087 0088 /** 0089 * The default implementation opens the file for writing with 0090 * writeData. Normally this does not need to be reimplemented. 0091 * @param extension the filetype to be used. 0092 * @param filename path to an output file 0093 * @param length length of the track 0094 * @param metaData meta data associated with the track 0095 */ 0096 virtual bool openFile( const QString& extension, 0097 const QString& filename, 0098 const Msf& length, 0099 const MetaData& metaData ); 0100 0101 0102 /** 0103 * The default implementation returns true if openFile (default implementation) has been 0104 * successfully called. Normally this does not need to be reimplemented but it has to be 0105 * if openFile is reimplemented. 0106 */ 0107 virtual bool isOpen() const; 0108 0109 /** 0110 * The default implementation closes the file opened by openFile 0111 * (default implementation) 0112 * Normally this does not need to be reimplemented but it has to be 0113 * if openFile is reimplemented. 0114 */ 0115 virtual void closeFile(); 0116 0117 /** 0118 * The default implementation returns the filename set in openFile 0119 * or QString() if no file has been opened. 0120 * Normally this does not need to be reimplemented but it has to be 0121 * if openFile is reimplemented. 0122 */ 0123 virtual QString filename() const; 0124 0125 /** 0126 * Returns the amount of actually written bytes or -1 if an error 0127 * occurred. 0128 * 0129 * Be aware that the returned amount of written data may very well differ 0130 * from len since the data is encoded. 0131 */ 0132 qint64 encode( const char*, qint64 len ); 0133 0134 /** 0135 * Use this signal in case of an error to provide the user with information 0136 * about the problem. 0137 */ 0138 virtual QString lastErrorString() const; 0139 0140 protected: 0141 /** 0142 * Called by the default implementation of openFile 0143 * This calls initEncoderInternal. 0144 */ 0145 bool initEncoder( const QString& extension, const Msf& length, const MetaData& metaData ); 0146 0147 /** 0148 * Called by the default implementation of openFile 0149 * This calls finishEncoderInternal. 0150 */ 0151 void finishEncoder(); 0152 0153 /** 0154 * Use this to write the data to the file when 0155 * using the default implementation of openFile 0156 * Returns the number of bytes actually written. 0157 */ 0158 qint64 writeData( const char*, qint64 len ); 0159 0160 /** 0161 * initzialize the decoder structures. 0162 * default implementation does nothing 0163 * this may already write data. 0164 */ 0165 virtual bool initEncoderInternal( const QString& extension, const Msf& length, const MetaData& metaData ); 0166 0167 /** 0168 * reimplement this if the encoder needs to do some 0169 * finishing touch. 0170 */ 0171 virtual void finishEncoderInternal(); 0172 0173 /** 0174 * encode the data and write it with writeData (when using 0175 * the default) 0176 * The data will always be 16bit 44100 Hz stereo little endian samples. 0177 * Should return the amount of actually written bytes (may be 0) and -1 0178 * on error. 0179 */ 0180 // TODO: use qint16* instead of char* 0181 // FIXME: why little endian while CDs use big endian??? 0182 virtual qint64 encodeInternal( const char*, qint64 len ) = 0; 0183 0184 /** 0185 * Use this in combination with the default implementation of lastError() 0186 */ 0187 void setLastError( const QString& ); 0188 0189 private: 0190 class Private; 0191 Private* d; 0192 }; 0193 } 0194 0195 #endif