src/3rdparty/phonon/waveout/mediaobject.h
changeset 0 1918ee327afb
child 30 5dc02b23752f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/3rdparty/phonon/waveout/mediaobject.h	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,162 @@
+/*  This file is part of the KDE project.
+
+Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+
+This library is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 2.1 or 3 of the License.
+
+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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this library.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef PHONON_MEDIAOBJECT_H
+#define PHONON_MEDIAOBJECT_H
+
+#include <phonon/mediaobjectinterface.h>
+
+#include <QtCore/QHash>
+#include <QtCore/QObject>
+#include <QtCore/QQueue>
+#include <QtCore/QBasicTimer>
+#include <QtCore/QWaitCondition>
+#include <QtCore/QMutex>
+#include <QtCore/QThread>
+#include <QFile>
+#include <QIODevice>
+
+#include <windows.h>
+
+
+QT_BEGIN_NAMESPACE
+
+namespace Phonon
+{
+    class MediaSource;
+
+    namespace WaveOut
+    {
+        class WorkerThread;
+        class AudioOutput;
+
+        class MediaObject : public QObject, public Phonon::MediaObjectInterface
+        {
+        Q_OBJECT
+        Q_INTERFACES(Phonon::MediaObjectInterface)
+
+        public:
+            MediaObject(QObject *parent);
+            ~MediaObject();
+            Phonon::State state() const;
+            bool hasVideo() const;
+            bool isSeekable() const;
+            qint64 currentTime() const;
+            qint32 tickInterval() const;
+
+            void setTickInterval(qint32 newTickInterval);
+            void play();
+            void pause();
+            void stop();
+            void seek(qint64 time);
+
+            QString errorString() const;
+            Phonon::ErrorType errorType() const;
+            qint64 totalTime() const;
+            qint32 prefinishMark() const;
+            void setPrefinishMark(qint32 newPrefinishMark);
+            qint32 transitionTime() const;
+            void setTransitionTime(qint32);
+            qint64 remainingTime() const;
+            MediaSource source() const;
+            void setSource(const MediaSource &source);
+            void setNextSource(const MediaSource &source);
+         
+
+         Q_SIGNALS:
+            void stateChanged(Phonon::State newstate, Phonon::State oldstate);
+            void tick(qint64 time);
+            void metaDataChanged(QMultiMap<QString, QString>);
+            void seekableChanged(bool);
+            void hasVideoChanged(bool);
+            void bufferStatus(int);
+            void finished();
+            void prefinishMarkReached(qint32);
+            void aboutToFinish();
+            void totalTimeChanged(qint64 length) const;
+            void currentSourceChanged(const MediaSource &);
+            void outOfData(QIODevice *ioStream, QByteArray *buffer, bool *m_bufferingFinshed);
+
+        protected:
+            void setAudioOutput(QObject *audioOutput);
+
+        private Q_SLOTS:
+            void setVolume(qreal newVolume);
+
+        private:
+            bool m_nextBufferIndex;
+            bool prepareBuffers();
+            void unPrepareBuffers();
+            bool getWaveOutDevice();
+            bool openWaveFile(QString fileName);
+            bool readHeader();
+            bool boolUpdateBuffer();
+            bool fillBuffers();
+            void swapBuffers();
+            void setState(Phonon::State newState);
+            void setError(ErrorType errorType, QString errorMessage);
+            void deleteValidWaveOutDevice();
+            void playBuffer(WAVEHDR *waveHeader);
+
+            static void CALLBACK WaveOutCallBack(HWAVEOUT hWaveOut, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
+
+             struct {
+            WAVEHDR  *waveHeader;
+            QByteArray data;
+            } m_soundBuffer1, m_soundBuffer2;
+
+            WAVEFORMATEX m_waveFormatEx;
+            HWAVEOUT m_hWaveOut;
+
+            QFile *m_file;
+            QIODevice *m_stream;
+            QString m_errorString;
+
+            WorkerThread *m_thread;
+
+            MediaSource m_source;
+            MediaSource m_nextSource;
+            AudioOutput *m_audioOutput;
+            ErrorType m_errorType;
+
+            qreal m_volume;
+            qint64 m_mediaSize;
+            qint64 m_totalTime;
+            qint64 m_currentTime;
+            qint64 m_transitionTime;
+            qint64 m_prefinishMark;
+            qint64 m_tickIntervalResolution;
+            qint32 m_tickInterval;
+            qint32 m_tick;
+            Phonon::State m_state;
+
+            bool m_bufferingFinished;
+            bool m_paused;
+            bool m_stopped;            
+            bool m_hasNextSource; 
+            bool m_hasSource;
+            bool m_sourceIsValid;
+            bool m_bufferPrepared;
+
+        friend class Backend;
+        };
+    }
+}
+
+QT_END_NAMESPACE
+
+#endif // PHONON_MEDIAOBJECT_H