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