00001
00002
00003
00004
00005
00006
00007
00008 #ifndef OUTPUT_H
00009 #define OUTPUT_H
00010
00011 class Output;
00012
00013 #include <QObject>
00014 #include <QThread>
00015 #include <QEvent>
00016 #include <QList>
00017 #include <QIODevice>
00018 #include "visual.h"
00019 #include "outputfactory.h"
00020 #include "visualfactory.h"
00021 #include "statehandler.h"
00022
00023 #include "recycler.h"
00024
00025 class QTimer;
00026
00031 class Output : public QThread
00032 {
00033 Q_OBJECT
00034 public:
00039 Output(QObject * parent = 0);
00043 ~Output();
00049 virtual bool initialize() = 0;
00053 virtual qint64 latency() = 0;
00060 virtual void configure(quint32 freq, int chan, Qmmp::AudioFormat format);
00065 virtual void pause();
00069 void stop();
00073 void finish();
00077 qint64 written();
00081 void seek(qint64 pos);
00085 Recycler *recycler();
00089 QMutex *mutex();
00094 void setStateHandler(StateHandler *handler);
00098 quint32 sampleRate();
00102 int numChannels();
00106 Qmmp::AudioFormat format() const;
00110 int sampleSize() const;
00116 static Output *create(QObject *parent = 0);
00120 static QList<OutputFactory*> *factories();
00124 static QStringList files();
00128 static void setCurrentFactory(OutputFactory* factory);
00132 static OutputFactory *currentFactory();
00133
00134 protected:
00140 virtual qint64 writeAudio(unsigned char *data, qint64 maxSize) = 0;
00145 virtual void flush() = 0;
00146
00147 private:
00148 void run();
00149 void status();
00150 void dispatch(qint64 elapsed,
00151 int bitrate,
00152 int frequency,
00153 int bits,
00154 int channels);
00155 void dispatch(const Qmmp::State &state);
00156 void dispatchVisual(Buffer *buffer);
00157 void clearVisuals();
00158 QMutex m_mutex;
00159 Recycler m_recycler;
00160 StateHandler *m_handler;
00161 quint32 m_frequency;
00162 int m_channels, m_kbps;
00163 Qmmp::AudioFormat m_format;
00164 qint64 m_bytesPerMillisecond;
00165 bool m_userStop, m_pause;
00166 bool m_finish;
00167 qint64 m_totalWritten, m_currentMilliseconds;
00168 unsigned char *m_visBuffer;
00169 qint64 m_visBufferSize;
00170
00171
00172 static void checkFactories();
00173 static void registerFactory(OutputFactory *);
00174
00175 static QList<OutputFactory*> *m_factories;
00176 static QStringList m_files;
00177 };
00178
00179
00180 #endif // OUTPUT_H