1 // 2 // C++ Interface: pluginloader 3 // 4 // Description: 5 // 6 // 7 // Author: Daniel Faust <hessijames@gmail.com>, (C) 2007 8 // 9 // Copyright: See COPYING file that comes with this distribution 10 // 11 // 12 #ifndef PLUGINLOADER_H 13 #define PLUGINLOADER_H 14 15 #include "core/codecplugin.h" 16 #include "core/filterplugin.h" 17 #include "core/replaygainplugin.h" 18 #include "core/ripperplugin.h" 19 20 #include <QStringList> 21 #include <KUrl> 22 23 class Logger; 24 class Config; 25 class QFile; 26 27 28 struct ConversionPipe 29 { 30 QList<ConversionPipeTrunk> trunks; 31 32 bool operator==( const ConversionPipe& other ) 33 { 34 if( trunks.count() != other.trunks.count() ) 35 return false; 36 37 for( int i=0; i<trunks.count(); i++ ) 38 { 39 ConversionPipeTrunk a = trunks.at(i); 40 ConversionPipeTrunk b = other.trunks.at(i); 41 if( !(a == b) ) 42 return false; 43 } 44 45 return true; 46 } 47 }; 48 49 50 /** 51 @author Daniel Faust <hessijames@gmail.com> 52 */ 53 class PluginLoader : public QObject 54 { 55 Q_OBJECT 56 57 friend class Config; 58 59 public: 60 PluginLoader( Logger *_logger, Config *_config ); 61 ~PluginLoader(); 62 63 // enum Possibilities { EncAble, DecAble, EncOrDecAble, ReplayGain }; // TODO make or'ed list 64 // enum CompressionType { Lossy, Lossless, Hybrid, LossyOrLossless, LossyOrLosslessOrHybrid }; // TODO make or'ed list 65 enum Possibilities { Encode = 1, Decode = 2, ReplayGain = 4 }; 66 enum CompressionType { InferiorQuality = 1, Lossy = 2, Lossless = 4, Hybrid = 8 }; 67 68 void load(); 69 70 QStringList formatList( Possibilities, CompressionType ); 71 72 /** returns a list of encoder plugins for the given format (mime type or extension) 73 the first value is the default encoder */ 74 QList<CodecPlugin*> encodersForCodec( const QString& codecName ); 75 // QList<CodecPlugin*> decodersForCodec( const QString& codecName ); 76 // QList<ReplayGainPlugin*> replaygainForCodec( const QString& codecName ); 77 78 /** returns the codec plugin with the specified name */ 79 BackendPlugin *backendPluginByName( const QString& name ); 80 81 /** returns a list of possible conversion pipes */ 82 QList<ConversionPipe> getConversionPipes( const QString& codecFrom, const QString& codecTo, QList<FilterOptions*> filterOptions = QList<FilterOptions*>(), const QString& preferredPlugin = "" ); // TODO change name ? 83 /** returns a list of possible replay gain pipes for the codec */ 84 QList<ReplayGainPipe> getReplayGainPipes( const QString& codecName, const QString& preferredPlugin = "" ); 85 //** returns a list of possible rippers */ 86 // QList<RipperInfo> getRipperInfos( bool mustRipEntireCd = false, const QString& preferredPlugin = "" ); 87 88 QString getCodecFromM4aFile( QFile *file ); 89 QString getCodecFromFile( const KUrl& filename, QString *mimeType = 0, bool checkM4a = true ); 90 91 bool canDecode( const QString& codecName, QStringList *errorList = 0 ); 92 bool canReplayGain( const QString& codecName, CodecPlugin *plugin, QStringList *errorList = 0 ); 93 bool canRipEntireCd( QStringList *errorList = 0 ); 94 QMap<QString,QStringList> decodeProblems( bool detailed = false ); 95 QMap<QString,QStringList> encodeProblems( bool detailed = false ); 96 QMap<QString,QStringList> replaygainProblems( bool detailed = false ); 97 QString pluginDecodeProblems( const QString& pluginName, const QString& codecName ); 98 QString pluginEncodeProblems( const QString& pluginName, const QString& codecName ); 99 QString pluginReplayGainProblems( const QString& pluginName, const QString& codecName ); 100 bool isCodecLossless( const QString& codecName ); 101 bool isCodecInferiorQuality( const QString& codecName ); 102 bool isCodecHybrid( const QString& codecName ); 103 bool hasCodecInternalReplayGain( const QString& codecName ); 104 QStringList codecExtensions( const QString& codecName ); 105 QStringList codecMimeTypes( const QString& codecName ); 106 QString codecDescription( const QString& codecName ); 107 108 /** returns a list of all plugins e.g. for connecting their signals */ getAllCodecPlugins()109 QList<CodecPlugin*> getAllCodecPlugins() { return codecPlugins; } 110 /** returns a list of all plugins e.g. for connecting their signals */ getAllFilterPlugins()111 QList<FilterPlugin*> getAllFilterPlugins() { return filterPlugins; } 112 /** returns a list of all plugins e.g. for connecting their signals */ getAllReplayGainPlugins()113 QList<ReplayGainPlugin*> getAllReplayGainPlugins() { return replaygainPlugins; } 114 /** returns a list of all plugins e.g. for connecting their signals */ getAllRipperPlugins()115 QList<RipperPlugin*> getAllRipperPlugins() { return ripperPlugins; } 116 117 private: 118 Logger *logger; 119 Config *config; 120 121 // for determining the codec of an m4a file 122 QStringList atomPath; 123 124 // void addCodecItem( ConversionPipeTrunk trunk ); 125 // void addReplayGainItem( ReplayGainPipe pipe ); 126 void addFormatInfo( const QString& codecName, BackendPlugin *plugin ); 127 128 /** holds all known codec plugins */ 129 QList<CodecPlugin*> codecPlugins; 130 /** holds all known filter plugins */ 131 QList<FilterPlugin*> filterPlugins; 132 /** holds all known replay gain plugins */ 133 QList<ReplayGainPlugin*> replaygainPlugins; 134 /** holds all known ripper plugins */ 135 QList<RipperPlugin*> ripperPlugins; 136 137 /** holds all known conversion pipe trunks */ 138 QList<ConversionPipeTrunk> conversionPipeTrunks; 139 /** holds all known filter items */ 140 QList<ConversionPipeTrunk> filterPipeTrunks; 141 /** holds all known conversion pipe trunks and filter items */ 142 QList<ConversionPipeTrunk> conversionFilterPipeTrunks; 143 /** holds all known replay gain items */ 144 QList<ReplayGainPipe> replaygainPipes; 145 146 /** holds all known format infos */ 147 QList<BackendPlugin::FormatInfo> formatInfos; 148 }; 149 150 #endif 151