[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