00001
00002
00003
00004
00005
00006
00007
00008 #ifndef OUTPUT_H
00009 #define OUTPUT_H
00010
00011 #include <QObject>
00012 #include <QThread>
00013 #include <QEvent>
00014 #include <QList>
00015 #include <QHash>
00016 #include <QIODevice>
00017 #include "visual.h"
00018 #include "outputfactory.h"
00019 #include "visualfactory.h"
00020 #include "statehandler.h"
00021 #include "audioparameters.h"
00022 #include "recycler.h"
00023
00024 class QTimer;
00025 class QmmpSettings;
00026
00031 class Output : public QThread
00032 {
00033 Q_OBJECT
00034 public:
00039 Output(QObject * parent = 0);
00043 ~Output();
00052 virtual bool initialize(quint32 freq, int chan, Qmmp::AudioFormat format) = 0;
00056 virtual qint64 latency() = 0;
00061 void pause();
00065 void stop();
00069 void finish();
00073 qint64 written();
00079 void seek(qint64 pos, bool reset = false);
00083 Recycler *recycler();
00087 QMutex *mutex();
00092 void setStateHandler(StateHandler *handler);
00096 AudioParameters audioParameters() const;
00100 quint32 sampleRate();
00104 int channels();
00108 Qmmp::AudioFormat format() const;
00112 int sampleSize() const;
00116 qint64 bufferSize() const;
00122 static Output *create(QObject *parent = 0);
00126 static QList<OutputFactory*> *factories();
00131 static QString file(OutputFactory *factory);
00135 static void setCurrentFactory(OutputFactory* factory);
00139 static OutputFactory *currentFactory();
00140
00141 protected:
00147 virtual qint64 writeAudio(unsigned char *data, qint64 maxSize) = 0;
00152 virtual void drain() = 0;
00157 virtual void reset() = 0;
00161 virtual void suspend();
00165 virtual void resume();
00172 void configure(quint32 freq, int chan, Qmmp::AudioFormat format);
00173
00174 private slots:
00175 void updateEqSettings();
00176
00177 private:
00178 void run();
00179 void status();
00180 void dispatch(qint64 elapsed,
00181 int bitrate,
00182 int frequency,
00183 int bits,
00184 int channels);
00185 void dispatch(const Qmmp::State &state);
00186 void dispatchVisual(Buffer *buffer);
00187 void clearVisuals();
00188 bool m_skip;
00189 QMutex m_mutex;
00190 Recycler m_recycler;
00191 StateHandler *m_handler;
00192 quint32 m_frequency;
00193 int m_channels, m_kbps;
00194 Qmmp::AudioFormat m_format;
00195 qint64 m_bytesPerMillisecond;
00196 bool m_userStop, m_pause;
00197 bool m_prev_pause;
00198 bool m_finish;
00199 bool m_useEq, m_eqEnabled;
00200 qint64 m_totalWritten, m_currentMilliseconds;
00201 unsigned char *m_visBuffer;
00202 qint64 m_visBufferSize;
00203 QmmpSettings *m_settings;
00204 static void checkFactories();
00205 static QList<OutputFactory*> *m_factories;
00206 static QHash <OutputFactory*, QString> *m_files;
00207 };
00208
00209
00210 #endif // OUTPUT_H