summaryrefslogtreecommitdiffstats
path: root/arts/kde/kaudioplaystream.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commitce4a32fe52ef09d8f5ff1dd22c001110902b60a2 (patch)
tree5ac38a06f3dde268dc7927dc155896926aaf7012 /arts/kde/kaudioplaystream.cpp
downloadtdelibs-ce4a32fe52ef09d8f5ff1dd22c001110902b60a2.tar.gz
tdelibs-ce4a32fe52ef09d8f5ff1dd22c001110902b60a2.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'arts/kde/kaudioplaystream.cpp')
-rw-r--r--arts/kde/kaudioplaystream.cpp210
1 files changed, 210 insertions, 0 deletions
diff --git a/arts/kde/kaudioplaystream.cpp b/arts/kde/kaudioplaystream.cpp
new file mode 100644
index 000000000..200128ffc
--- /dev/null
+++ b/arts/kde/kaudioplaystream.cpp
@@ -0,0 +1,210 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Arnold Krille <arnold@arnoldarts.de>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+
+#include "kaudioplaystream.h"
+#include "kaudioplaystream_p.h"
+
+#include <kartsserver.h>
+#include <kaudiomanagerplay.h>
+
+#include <artsflow.h>
+#include <soundserver.h>
+
+#include <kglobal.h>
+#include <kdebug.h>
+
+#include <qstring.h>
+//#include <qptrqueue.h>
+//#include <qcstring.h> //QByteArray
+
+#include <string.h> // for strncpy
+
+//#include <assert.h>
+
+KAudioPlayStreamPrivate::KAudioPlayStreamPrivate( KArtsServer* server, const QString title, QObject* p, const char* n )
+ : QObject( p,n )
+ , _server( server )
+ , _play( new KAudioManagerPlay( _server, title ) )
+ , _effectrack( Arts::StereoEffectStack::null() )
+ , _polling( true ), _attached( false ), _effects( true )
+{
+kdDebug( 400 ) << k_funcinfo << endl;
+ initaRts();
+}
+
+KAudioPlayStreamPrivate::~KAudioPlayStreamPrivate()
+{
+ kdDebug( 400 ) << k_funcinfo << endl;
+ _play->stop();
+ if ( _effects ) _effectrack.stop();
+ _bs2a.stop();
+}
+
+void KAudioPlayStreamPrivate::initaRts() {
+ kdDebug( 400 ) << k_funcinfo << endl;
+
+ _effectrack = Arts::DynamicCast( _server->server().createObject( "Arts::StereoEffectStack" ) );
+ if ( _effectrack.isNull() )
+ {
+ kdWarning( 400 ) << "Couldn't create EffectStack!" << endl;
+ _effects = false;
+ }
+
+ _bs2a = Arts::DynamicCast( _server->server().createObject( "Arts::ByteStreamToAudio" ) );
+ if ( _bs2a.isNull() )
+ kdFatal( 400 ) << "Couldn't create ByteStreamToAudio" << endl;
+
+ if ( _effects )
+ {
+ Arts::connect( _effectrack, _play->amanPlay() );
+ Arts::connect( _bs2a, _effectrack );
+ } else {
+ Arts::connect( _bs2a, _play->amanPlay() );
+ }
+
+ _play->start();
+ if ( _effects ) _effectrack.start();
+}
+
+KAudioPlayStream::KAudioPlayStream( KArtsServer* server, const QString title, QObject* p, const char* n )
+ : QObject( p,n )
+ , d( new KAudioPlayStreamPrivate( server, title, this ) )
+{
+ kdDebug( 400 ) << k_funcinfo << endl;
+}
+KAudioPlayStream::~KAudioPlayStream()
+{
+ kdDebug( 400 ) << k_funcinfo << endl;
+}
+
+void KAudioPlayStream::setPolling( bool n ) { d->_polling = n; }
+bool KAudioPlayStream::polling() const { return d->_polling; }
+
+bool KAudioPlayStream::running() const { return d->_attached; }
+
+Arts::StereoEffectStack KAudioPlayStream::effectStack() const {
+ return d->_effectrack;
+}
+
+void KAudioPlayStream::start( int samplingRate, int bits, int channels )
+{
+ kdDebug( 400 ) << k_funcinfo << "samplingRate: " << samplingRate << " bits: " << bits << " channels: " << channels << endl;
+ if ( !d->_attached )
+ {
+ d->_bs2a.samplingRate( samplingRate );
+ d->_bs2a.channels( channels );
+ d->_bs2a.bits( bits );
+
+ d->_sender = new KByteSoundProducer( this, d->_server->server().minStreamBufferTime(), samplingRate, bits, channels, "PS" );
+ d->_artssender = Arts::ByteSoundProducerV2::_from_base( d->_sender );
+ Arts::connect( d->_artssender, "outdata", d->_bs2a, "indata" );
+
+ d->_bs2a.start();
+ d->_artssender.start();
+
+// // Needed?
+ Arts::Dispatcher::the()->ioManager()->processOneEvent( false );
+
+ d->_attached = true;
+ emit running( d->_attached );
+ }
+}
+void KAudioPlayStream::stop()
+{
+ kdDebug( 400 ) << k_funcinfo << endl;
+ if ( d->_attached )
+ {
+ d->_attached = false;
+
+ d->_bs2a.stop();
+ d->_artssender.stop();
+
+ // Shortly stop the play so we dont get clicks and artefacts
+ d->_play->stop();
+ d->_play->start();
+
+ Arts::disconnect( d->_artssender, d->_bs2a );
+ d->_artssender = Arts::ByteSoundProducerV2::null();
+ d->_sender = 0;
+
+ emit running( d->_attached );
+ }
+}
+
+void KAudioPlayStream::write( QByteArray& )
+{
+}
+
+void KAudioPlayStream::fillData( Arts::DataPacket<Arts::mcopbyte> *packet )
+{
+ //kdDebug( 400 ) << k_funcinfo << "packet->size=" << packet->size << endl;
+ if ( d->_polling )
+ {
+ QByteArray bytearray( packet->size );
+ bytearray.setRawData( ( char* )packet->contents, packet->size );
+ bytearray.fill( 0 );
+ emit requestData( bytearray );
+ bytearray.resetRawData( ( char* )packet->contents, packet->size );
+
+ //for ( int i=0; i<10; i++ )
+ // kdDebug() << packet->contents[ i ] << " : " << bytearray.data()[ i ] << endl;
+ } else {
+ /// TODO: Implement a queue and fetching from it...
+ }
+}
+
+// * * * KByteSoundProducer * * *
+
+KByteSoundProducer::KByteSoundProducer( KAudioPlayStream* impl, float minBufferTime, int rate, int bits, int channels, const char * title )
+ : _samplingRate( rate )
+ , _channels( channels )
+ , _bits( bits )
+ , _packets( 7 )
+ , _title( title )
+ , _impl( impl )
+{
+ // Calculate packet count (packetsize is fixed to packetCapacity = 4096
+ float streamBufferTime;
+ do {
+ _packets++;
+ streamBufferTime = ( float )( _packets * packetCapacity * 1000 )
+ / ( float )( _samplingRate * _channels * 2 );
+ } while ( streamBufferTime < minBufferTime );
+ //kdDebug( 400 ) << k_funcinfo << "_packets:" << _packets << " packetCapacity:" << packetCapacity << endl;
+}
+
+KByteSoundProducer::~KByteSoundProducer()
+{
+}
+
+void KByteSoundProducer::streamStart() { outdata.setPull( _packets, packetCapacity ); }
+void KByteSoundProducer::streamEnd() { outdata.endPull(); }
+
+void KByteSoundProducer::request_outdata( Arts::DataPacket<Arts::mcopbyte> *packet )
+{
+ if ( _impl->running() ) {
+ _impl->fillData( packet );
+ packet->send();
+ }
+}
+
+// vim: sw=4 ts=4 tw=80
+
+#include "kaudioplaystream.moc"
+#include "kaudioplaystream_p.moc"