00001
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
00037
using namespace std;
00038
00039 KPlayObjectFactory::KPlayObjectFactory(Arts::SoundServerV2 server)
00040 {
00041 m_server = server;
00042 m_allowStreaming =
true;
00043 m_stream =
false;
00044 }
00045
00046 KPlayObjectFactory::KPlayObjectFactory(
KArtsServer* server)
00047 {
00048 m_server = server->
server();
00049 m_allowStreaming =
true;
00050 m_stream =
false;
00051 }
00052
00053 KPlayObjectFactory::~KPlayObjectFactory()
00054 {
00055 }
00056
00057 KPlayObject *KPlayObjectFactory::createPlayObject(
const KURL& url,
bool createBUS)
00058 {
00059
KMimeType::Ptr mimetype =
KMimeType::findByURL(url);
00060
return createPlayObject(url,
mimetype->name(), createBUS);
00061 }
00062
00063 KPlayObject *KPlayObjectFactory::createPlayObject(
const KURL& url,
const QString &mimetype,
bool createBUS)
00064 {
00065
if(!m_server.isNull())
00066 {
00067
if(
mimetype ==
"application/octet-stream" && m_allowStreaming)
00068 {
00069 Arts::KIOInputStream instream;
00070 instream.openURL(url.
url().latin1());
00071
00072 m_stream =
true;
00073
00074
00075
return new KPlayObject(m_server.createPlayObjectForStream(instream, string(
"audio/x-mp3"), createBUS),
true);
00076 }
00077
else
00078
return new KPlayObject(m_server.createPlayObjectForURL(string(QFile::encodeName(url.
path())), string(
mimetype.latin1()), createBUS),
false);
00079 }
00080
else
00081
return new KPlayObject();
00082 }
00083
00084
00085
00086
00087
00088 KDE::PlayObjectFactory::PlayObjectFactory(Arts::SoundServerV2 server)
00089 {
00090 d =
new PrivateData;
00091 d->server = server;
00092 d->amanPlay = 0;
00093 d->helper = 0;
00094 d->allowStreaming =
true;
00095 d->isStream =
false;
00096 }
00097
00098 KDE::PlayObjectFactory::PlayObjectFactory(
KArtsServer* server)
00099 {
00100 d =
new PrivateData;
00101 d->server = server->
server();
00102 d->amanPlay = 0;
00103 d->helper = 0;
00104 d->allowStreaming =
true;
00105 d->isStream =
false;
00106 }
00107
00108 KDE::PlayObjectFactory::~PlayObjectFactory()
00109 {
00110
delete d->helper;
00111
delete d;
00112 }
00113
00114 void KDE::PlayObjectFactory::setAudioManagerPlay(
KAudioManagerPlay * amanPlay )
00115 {
00116 d->amanPlay = amanPlay;
00117
if( ! d->helper )
00118 d->helper =
new POFHelper;
00119 }
00120
00121 KDE::PlayObject *
KDE::PlayObjectFactory::createPlayObject(
const KURL& url,
bool createBUS)
00122 {
00123
KMimeType::Ptr mimetype = KMimeType::findByURL(url);
00124
return createPlayObject(url, mimetype->name(), createBUS);
00125 }
00126
00127 KDE::PlayObject *
KDE::PlayObjectFactory::createPlayObject(
const KURL& url,
const QString &mimetype,
bool createBUS)
00128 {
00129
00130
if ( d->server.isNull() || url.
isEmpty() )
00131
return new KDE::PlayObject();
00132
00133
00134
00135
if( d->amanPlay && createBUS )
00136 {
00137
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;
00138 createBUS =
false;
00139 }
00140
00141
00142
if ( url.
isLocalFile() || !d->allowStreaming || (url.
protocol() ==
"audiocd" && mimetype ==
"application/x-cda" &&
mimeTypes().contains(
"application/x-cda" ) ) )
00143 {
00144
00145 d->playObj =
new KDE::PlayObject( d->server.createPlayObjectForURL( string( QFile::encodeName( url.
path() ) ), string( mimetype.latin1() ), createBUS ),
false );
00146 }
00147
else
00148 {
00149
00150
00151 d->playObj =
new KDE::PlayObject( d->server, url,
true, createBUS );
00152 }
00153
00154
if( d->playObj->isNull() )
00155 {
00156
delete d->playObj;
00157 d->playObj = 0;
00158
return new KDE::PlayObject();
00159 }
00160
00161
if( d->amanPlay )
00162 {
00163 d->helper->po = d->playObj;
00164 d->helper->ap = d->amanPlay;
00165
if( d->playObj->object().isNull() && d->amanPlay )
00166 QObject::connect( d->playObj, SIGNAL( playObjectCreated() ), d->helper, SLOT( connectAmanPlay() ) );
00167
else
00168 d->helper->connectAmanPlay();
00169 }
00170
00171
return d->playObj;
00172 }
00173
00174 QStringList KDE::PlayObjectFactory::mimeTypes(
void)
00175 {
00176
KArtsDispatcher dispatcher;
00177 Arts::TraderQuery query;
00178 vector<Arts::TraderOffer> *offers = query.query();
00179
00180
QStringList results;
00181
for(vector<Arts::TraderOffer>::iterator offer = offers->begin();
00182 offer != offers->end(); ++offer)
00183 {
00184 vector<string> *mimetypes = (*offer).getProperty(
"MimeType");
00185
00186
for(vector<string>::iterator mimetype = mimetypes->begin();
00187 mimetype != mimetypes->end(); ++mimetype)
00188 {
00189
QString name = QString::fromLocal8Bit((*mimetype).c_str()).stripWhiteSpace();
00190
if(KMimeType::mimeType(name))
00191 results.append(name);
00192 }
00193
00194
delete mimetypes;
00195 }
00196
delete offers;
00197
00198
00199 results.sort();
00200
for(QStringList::iterator result = results.begin(); result != results.end(); )
00201 {
00202 QStringList::iterator previous = result;
00203 ++result;
00204
if(result != results.end() && *result == *previous)
00205 {
00206 results.remove(result);
00207 result = previous;
00208 }
00209 }
00210
00211
return results;
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
void KDE::POFHelper::connectAmanPlay()
00229 {
00230
kdDebug( 400 ) <<
k_funcinfo <<
endl;
00231
if( po->object().isNull() )
00232
return;
00233
00234 ap->start();
00235 po->object()._node()->start();
00236 Arts::connect( po->object(),
"left" , ap->amanPlay(),
"left" );
00237 Arts::connect( po->object(),
"right", ap->amanPlay(),
"right" );
00238 }
00239
00240
#include "kplayobjectfactory_p.moc"
00241
00242