kaudioconverter.cc00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023 #include "artskde.h"
00024 #include "connect.h"
00025 #include "flowsystem.h"
00026 #include "audiosubsys.h"
00027 #include "dynamicrequest.h"
00028 #include "kdatarequest_impl.h"
00029 #include "kioinputstream_impl.h"
00030 #include "kaudioconverter.moc"
00031
00032 #include <iostream>
00033
00034 #include <qfile.h>
00035 #include <qtimer.h>
00036
00037 #include <kurl.h>
00038 #include <kdebug.h>
00039 #include <kmimetype.h>
00040 #include <kapplication.h>
00041
00042 using namespace std;
00043
00044 KAudioConverter::KAudioConverter()
00045 {
00046 m_incoming = 0;
00047 m_started = false;
00048 }
00049
00050 KAudioConverter::~KAudioConverter()
00051 {
00052 delete m_incoming;
00053 }
00054
00055 bool KAudioConverter::setup(int samplingRate)
00056 {
00057 string backupAudioIO = Arts::AudioSubSystem::the()->audioIO();
00058 int backupSamplingRate = Arts::AudioSubSystem::the()->samplingRate();
00059
00060 Arts::AudioSubSystem::the()->audioIO("null");
00061 Arts::AudioSubSystem::the()->samplingRate(samplingRate);
00062
00063 if(!Arts::AudioSubSystem::the()->open())
00064 {
00065 Arts::AudioSubSystem::the()->audioIO(backupAudioIO);
00066 Arts::AudioSubSystem::the()->samplingRate(backupSamplingRate);
00067
00068 return false;
00069 }
00070
00071 return true;
00072 }
00073
00074 void KAudioConverter::slotMimeType(const QString &mimeType)
00075 {
00076 m_mimeType = mimeType;
00077 kapp->exit_loop();
00078 }
00079
00080 void KAudioConverter::requestPlayObject(const KURL &url)
00081 {
00082 string queryInterface = "Arts::PlayObject";
00083
00084 Arts::KIOInputStream inputStream;
00085
00086 if(!url.isLocalFile())
00087 {
00088 Arts::KIOInputStream_impl *inputStreamImpl = new Arts::KIOInputStream_impl();
00089 inputStream = Arts::KIOInputStream::_from_base(inputStreamImpl);
00090
00091 QObject::connect(inputStreamImpl, SIGNAL(mimeTypeFound(const QString &)), SLOT(slotMimeType(const QString &)));
00092
00093 inputStream.openURL(url.url().latin1());
00094 inputStream.streamStart();
00095
00096
00097 kapp->enter_loop();
00098
00099 queryInterface = "Arts::StreamPlayObject";
00100 }
00101 else
00102 {
00103 KMimeType::Ptr mimetype = KMimeType::findByURL(url);
00104 m_mimeType = mimetype->name();
00105 }
00106
00107 Arts::TraderQuery query;
00108 query.supports("Interface", queryInterface);
00109 query.supports("MimeType", string(m_mimeType.latin1()));
00110
00111 string objectType;
00112
00113 vector<Arts::TraderOffer> *offers = query.query();
00114 if(!offers->empty())
00115 objectType = offers->front().interfaceName();
00116
00117 delete offers;
00118
00119 if(objectType.empty())
00120 {
00121 m_incoming = 0;
00122 return;
00123 }
00124
00125 if(!url.isLocalFile())
00126 {
00127 Arts::StreamPlayObject result = Arts::SubClass(objectType);
00128 result.streamMedia(inputStream);
00129 result._node()->start();
00130
00131 m_incoming = new KPlayObject(result, true);
00132 }
00133 else
00134 {
00135 Arts::PlayObject result = Arts::SubClass(objectType);
00136
00137 if(result.loadMedia(string(QFile::encodeName(url.path()))))
00138 {
00139 result._node()->start();
00140 m_incoming = new KPlayObject(result, false);
00141 }
00142 else
00143 m_incoming = 0;
00144 }
00145 }
00146
00147 void KAudioConverter::start()
00148 {
00149 if(m_started || !m_incoming)
00150 return;
00151
00152 m_started = true;
00153
00154 emit rawStreamStart();
00155
00156 m_incoming->play();
00157
00158 Arts::KDataRequest_impl *requestImpl = new Arts::KDataRequest_impl();
00159 m_request = Arts::KDataRequest::_from_base(requestImpl);
00160
00161 Arts::connect(m_incoming->object(), "left", m_request, "left");
00162 Arts::connect(m_incoming->object(), "right", m_request, "right");
00163
00164 QObject::connect(requestImpl, SIGNAL(newBlockSize(long)), SIGNAL(newBlockSize(long)));
00165 QObject::connect(requestImpl, SIGNAL(newBlockPointer(long)), SIGNAL(newBlockPointer(long)));
00166 QObject::connect(requestImpl, SIGNAL(newData()), SIGNAL(newData()));
00167
00168
00169
00170 usleep(100000);
00171 if(m_incoming->object()._base()->_isCompatibleWith("DecoderBaseObject"))
00172 if(!Arts::DynamicRequest(m_incoming->object()).method("_set_blocking").param(true).invoke())
00173 cerr << "mpeglib, and blocking attribute can't be changed?" << endl;
00174
00175 m_request.start();
00176
00177
00178
00179
00180
00181 while(m_incoming->state() != Arts::posIdle)
00182 m_request.goOn();
00183
00184 stop();
00185 }
00186
00187 void KAudioConverter::stop()
00188 {
00189 if(!m_started || !m_incoming)
00190 return;
00191
00192 m_incoming->halt();
00193 m_request.streamEnd();
00194
00195 m_started = false;
00196
00197 emit rawStreamFinished();
00198 }
|