[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/work/kdelibs-phonon/phonon/tests/fakebackend
From:       Matthias Kretz <kretz () kde ! org>
Date:       2006-01-17 22:34:21
Message-ID: 1137537261.434061.21906.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 499494 by mkretz:

fake QTimer based ByteStream implementation


 M  +143 -6    bytestream.cpp  
 M  +36 -13    bytestream.h  


--- branches/work/kdelibs-phonon/phonon/tests/fakebackend/bytestream.cpp #499493:499494
@@ -18,36 +18,173 @@
 */
 
 #include "bytestream.h"
+#include <QTimer>
 
+/* Fake bytestream:
+ * Tries to reach a ratio of 4MB = 4min
+ * => 4 000 000 Byte = 240 000 msec
+ * => 50 Byte = 3 msec
+ */
+
 namespace Phonon
 {
 namespace Fake
 {
 ByteStream::ByteStream( QObject* parent )
 	: AbstractMediaProducer( parent )
+	, m_bufferSize( 0 )
+	, m_streamPosition( 0 )
+	, m_eof( false )
+	, m_aboutToFinishEmitted( false )
+	, m_streamConsumeTimer( new QTimer( this ) )
 {
+	connect( m_streamConsumeTimer, SIGNAL( timeout() ), SLOT( consumeStream() ) );
 }
 
 ByteStream::~ByteStream()
 {
 }
 
-/*
-void ByteStream::writeBuffer( const QByteArray& buffer )
+long ByteStream::currentTime() const
 {
+	return m_streamPosition * 3 / 50;
 }
 
+long ByteStream::totalTime() const
+{
+	if( m_streamSize >= 0 )
+		return m_streamSize * 3 / 50;
+	return 1000*60*3; // 3 minutes
+}
+
+long ByteStream::aboutToFinishTime() const
+{
+	return m_aboutToFinishBytes * 3 / 50;
+}
+
+long ByteStream::streamSize() const
+{
+	return m_streamSize;
+}
+
+bool ByteStream::streamSeekable() const
+{
+	return m_streamSeekable;
+}
+
+void ByteStream::setStreamSeekable( bool s )
+{
+	m_streamSeekable = s;
+}
+
+void ByteStream::writeData( const QByteArray& data )
+{
+	Q_ASSERT( ! m_eof );
+	m_bufferSize += data.size();
+}
+
+void ByteStream::setStreamSize( long s )
+{
+	m_streamSize = s;
+	emit length( totalTime() );
+}
+
 void ByteStream::endOfData()
 {
+	m_eof = true;
 }
 
-void ByteStream::toBeWritten()
+void ByteStream::setAboutToFinishTime( long t )
 {
+	m_aboutToFinishBytes = t * 50 / 3;
 }
 
-		signals:
-			void bufferUnderrun();
-			*/
+void ByteStream::play()
+{
+	m_streamConsumeTimer->start( 300 );
+	AbstractMediaProducer::play();
+}
+
+void ByteStream::pause()
+{
+	AbstractMediaProducer::pause();
+	m_streamConsumeTimer->stop();
+}
+
+void ByteStream::stop()
+{
+	AbstractMediaProducer::stop();
+	m_streamConsumeTimer->stop();
+}
+
+bool ByteStream::seekable() const
+{
+	return m_streamSeekable;
+}
+
+void ByteStream::seek( long time )
+{
+	if( ! seekable() )
+		return;
+
+	const long dataStart = m_streamPosition;
+	const long dataEnd = dataStart + m_bufferSize;
+	long newDataPosition = time * 50 / 3;
+	m_streamPosition = newDataPosition;
+	if( newDataPosition < dataStart || newDataPosition > dataEnd )
+	{
+		m_bufferSize = 0;
+		setState( Phonon::BufferingState );
+		emit seekStream( newDataPosition );
+	}
+	else
+		m_bufferSize = dataEnd - newDataPosition;
+	m_aboutToFinishEmitted = false;
+
+	AbstractMediaProducer::seek( currentTime() );
+}
+
+void ByteStream::consumeStream()
+{
+	long bytes = m_streamConsumeTimer->interval() * 50 / 3;
+	if( m_bufferSize < bytes )
+	{
+		m_streamPosition += m_bufferSize;
+		m_bufferSize = 0;
+	}
+	else
+	{
+		m_streamPosition += bytes;
+		m_bufferSize -= bytes;
+	}
+	if( m_eof )
+	{
+		if( m_bufferSize == 0 )
+		{
+			emit finished();
+			stop();
+		}
+		else if( !m_aboutToFinishEmitted && m_bufferSize <= m_aboutToFinishBytes )
+		{
+			m_aboutToFinishEmitted = true;
+			emit aboutToFinish( remainingTime() );
+		}
+	}
+	else
+	{
+		if( m_streamSize >= 0 && !m_aboutToFinishEmitted
+				&& m_streamSize - m_streamPosition <= m_aboutToFinishBytes )
+		{
+			m_aboutToFinishEmitted = true;
+			emit aboutToFinish( remainingTime() );
+		}
+		if( m_bufferSize < 50 / 3 * 5000 ) // try to keep a buffer of more than 5s
+			emit needData();
+		else if( m_bufferSize > 50 / 3 * 10000 ) // and don't let it grow too big (max 10s)
+			emit enoughData();
+	}
+}
+
 }} //namespace Phonon::Fake
 
 #include "bytestream.moc"
--- branches/work/kdelibs-phonon/phonon/tests/fakebackend/bytestream.h #499493:499494
@@ -21,6 +21,7 @@
 
 #include "abstractmediaproducer.h"
 #include "../../ifaces/bytestream.h"
+class QTimer;
 
 namespace Phonon
 {
@@ -33,24 +34,46 @@
 			ByteStream( QObject* parent );
 			virtual ~ByteStream();
 
-			//virtual void writeBuffer( const QByteArray& buffer );
+			virtual long currentTime() const;
+			virtual long totalTime() const;
+			virtual long aboutToFinishTime() const;
+			virtual long streamSize() const;
+			virtual bool streamSeekable() const;
+			virtual bool seekable() const;
 
-			/**
-			 * Called when there will be no more calls to writeBuffer
-			 */
-			//virtual void endOfData();
+			virtual void setStreamSeekable( bool );
+			virtual void writeData( const QByteArray& data );
+			virtual void setStreamSize( long );
+			virtual void endOfData();
+			virtual void setAboutToFinishTime( long );
 
-			/**
-			 * Sets the total number of bytes that will be streamed via
-			 * writeBuffer
-			 */
-			//virtual void toBeWritten();
+			virtual void play();
+			virtual void pause();
+			virtual void seek( long time );
 
-		//signals:
-			//void bufferUnderrun();
+		public slots:
+			virtual void stop();
 
+		signals:
+			void finished();
+			void aboutToFinish( long );
+			void length( long );
+			void needData();
+			void enoughData();
+			void seekStream( long );
+
+		private slots:
+			void consumeStream();
+
 		private:
-			//QTimer* m_decBufferTimer;
+			long m_aboutToFinishBytes;
+			long m_streamSize;
+			long m_bufferSize;
+			long m_streamPosition;
+			bool m_streamSeekable;
+			bool m_eof;
+			bool m_aboutToFinishEmitted;
+			QTimer* m_streamConsumeTimer;
 	};
 }} //namespace Phonon::Fake
 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic