kplayobjectfactory.cc00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <kio/kmimetype.h>
00023 #include "kplayobject.h"
00024 #include "artskde.h"
00025 #include "kplayobjectfactory.h"
00026 #include "kplayobjectfactory_p.h"
00027 #include "kplayobjectcreator.h"
00028 #include "kioinputstream_impl.h"
00029 #include "kartsdispatcher.h"
00030 #include "kartsserver.h"
00031
00032 #include <qfile.h>
00033 #include <kdebug.h>
00034 #include "kaudiomanagerplay.h"
00035 #include <flowsystem.h>
00036 #include <kio/netaccess.h>
00037
00038 using namespace std;
00039
00040 KPlayObjectFactory::KPlayObjectFactory(Arts::SoundServerV2 server)
00041 {
00042 m_server = server;
00043 m_allowStreaming = true;
00044 m_stream = false;
00045 }
00046
00047 KPlayObjectFactory::KPlayObjectFactory(KArtsServer* server)
00048 {
00049 m_server = server->server();
00050 m_allowStreaming = true;
00051 m_stream = false;
00052 }
00053
00054 KPlayObjectFactory::~KPlayObjectFactory()
00055 {
00056 }
00057
00058 KPlayObject *KPlayObjectFactory::createPlayObject(const KURL& url, bool createBUS)
00059 {
00060 KMimeType::Ptr mimetype = KMimeType::findByURL(url);
00061 return createPlayObject(url, mimetype->name(), createBUS);
00062 }
00063
00064
00065 KPlayObject *KPlayObjectFactory::createPlayObject(const KURL& _url, const QString &mimetype, bool createBUS)
00066 {
00067
00068
00069
00070
00071
00072 KURL url = KIO::NetAccess::mostLocalURL(_url, 0);
00073
00074 if(!m_server.isNull())
00075 {
00076 if(mimetype == "application/octet-stream" && m_allowStreaming)
00077 {
00078 Arts::KIOInputStream instream;
00079 instream.openURL(url.url().latin1());
00080
00081 m_stream = true;
00082
00083
00084 return new KPlayObject(m_server.createPlayObjectForStream(instream, string("audio/x-mp3"), createBUS), true);
00085 }
00086 else
00087 return new KPlayObject(m_server.createPlayObjectForURL(string(QFile::encodeName(url.path())), string(mimetype.latin1()), createBUS), false);
00088 }
00089 else
00090 return new KPlayObject();
00091 }
00092
00093
00094
00095
00096
00097 KDE::PlayObjectFactory::PlayObjectFactory(Arts::SoundServerV2 server)
00098 {
00099 d = new PrivateData;
00100 d->server = server;
00101 d->amanPlay = 0;
00102 d->helper = 0;
00103 d->allowStreaming = true;
00104 d->isStream = false;
00105 }
00106
00107 KDE::PlayObjectFactory::PlayObjectFactory(KArtsServer* server)
00108 {
00109 d = new PrivateData;
00110 d->server = server->server();
00111 d->amanPlay = 0;
00112 d->helper = 0;
00113 d->allowStreaming = true;
00114 d->isStream = false;
00115 }
00116
00117 KDE::PlayObjectFactory::~PlayObjectFactory()
00118 {
00119 delete d->helper;
00120 delete d;
00121 }
00122
00123 void KDE::PlayObjectFactory::setAudioManagerPlay( KAudioManagerPlay * amanPlay )
00124 {
00125 d->amanPlay = amanPlay;
00126 if( ! d->helper )
00127 d->helper = new POFHelper;
00128 }
00129
00130 KDE::PlayObject *KDE::PlayObjectFactory::createPlayObject(const KURL& url, bool createBUS)
00131 {
00132 KMimeType::Ptr mimetype = KMimeType::findByURL(url);
00133 return createPlayObject(url, mimetype->name(), createBUS);
00134 }
00135
00136 KDE::PlayObject *KDE::PlayObjectFactory::createPlayObject(const KURL& _url, const QString &mimetype, bool createBUS)
00137 {
00138
00139
00140
00141
00142
00143 KURL url = KIO::NetAccess::mostLocalURL(_url, 0);
00144
00145
00146 if ( d->server.isNull() || url.isEmpty() )
00147 return new KDE::PlayObject();
00148
00149
00150
00151 if( d->amanPlay && createBUS )
00152 {
00153 kdWarning( 400 ) << "KDE::PlayObjectFactory was instructed to use a Synth_AMAN_PLAY for output but the program also asked for a Synth_BUS_UPLINK" << endl;
00154 createBUS = false;
00155 }
00156
00157
00158 if ( url.isLocalFile() || !d->allowStreaming || (url.protocol() == "audiocd" && mimetype == "application/x-cda" && mimeTypes().contains( "application/x-cda" ) ) )
00159 {
00160
00161 d->playObj = new KDE::PlayObject( d->server.createPlayObjectForURL( string( QFile::encodeName( url.path() ) ), string( mimetype.latin1() ), createBUS ), false );
00162 }
00163 else
00164 {
00165
00166
00167 d->playObj = new KDE::PlayObject( d->server, url, true, createBUS );
00168 }
00169
00170 if( d->playObj->isNull() )
00171 {
00172 delete d->playObj;
00173 d->playObj = 0;
00174 return new KDE::PlayObject();
00175 }
00176
00177 if( d->amanPlay )
00178 {
00179 d->helper->po = d->playObj;
00180 d->helper->ap = d->amanPlay;
00181 if( d->playObj->object().isNull() && d->amanPlay )
00182 QObject::connect( d->playObj, SIGNAL( playObjectCreated() ), d->helper, SLOT( connectAmanPlay() ) );
00183 else
00184 d->helper->connectAmanPlay();
00185 }
00186
00187 return d->playObj;
00188 }
00189
00190 QStringList KDE::PlayObjectFactory::mimeTypes(void)
00191 {
00192 KArtsDispatcher dispatcher;
00193 Arts::TraderQuery query;
00194 vector<Arts::TraderOffer> *offers = query.query();
00195
00196 QStringList results;
00197 for(vector<Arts::TraderOffer>::iterator offer = offers->begin();
00198 offer != offers->end(); ++offer)
00199 {
00200 vector<string> *mimetypes = (*offer).getProperty("MimeType");
00201
00202 for(vector<string>::iterator mimetype = mimetypes->begin();
00203 mimetype != mimetypes->end(); ++mimetype)
00204 {
00205 QString name = QString::fromLocal8Bit((*mimetype).c_str()).stripWhiteSpace();
00206 if(KMimeType::mimeType(name))
00207 results.append(name);
00208 }
00209
00210 delete mimetypes;
00211 }
00212 delete offers;
00213
00214
00215 results.sort();
00216 for(QStringList::iterator result = results.begin(); result != results.end(); )
00217 {
00218 QStringList::iterator previous = result;
00219 ++result;
00220 if(result != results.end() && *result == *previous)
00221 {
00222 results.remove(result);
00223 result = previous;
00224 }
00225 }
00226
00227 return results;
00228 }
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244 void KDE::POFHelper::connectAmanPlay()
00245 {
00246 kdDebug( 400 ) << k_funcinfo << endl;
00247 if( po->object().isNull() )
00248 return;
00249
00250 ap->start();
00251 po->object()._node()->start();
00252 Arts::connect( po->object(), "left" , ap->amanPlay(), "left" );
00253 Arts::connect( po->object(), "right", ap->amanPlay(), "right" );
00254 }
00255
00256 #include "kplayobjectfactory_p.moc"
00257
00258
|