Qmmp
|
00001 00002 // Copyright (c) 2000-2001 Brad Hughes <bhughes@trolltech.com> 00003 // 00004 // Use, modification and distribution is allowed without limitation, 00005 // warranty, or liability of any kind. 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(); //thread run function 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