From 2d622fd9bcb8da9dd3f3206e296cd6a701fc9d12 Mon Sep 17 00:00:00 2001 From: vovanec Date: Sat, 23 Jun 2007 16:48:01 +0000 Subject: moved into qmmp dir git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@12 90c681e8-e032-0410-971d-27865f9a5e38 --- lib/output.cpp | 192 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 lib/output.cpp (limited to 'lib/output.cpp') diff --git a/lib/output.cpp b/lib/output.cpp new file mode 100644 index 000000000..0d0e4de99 --- /dev/null +++ b/lib/output.cpp @@ -0,0 +1,192 @@ +// Copyright (c) 2000-2001 Brad Hughes +// +// Use, modification and distribution is allowed without limitation, +// warranty, or liability of any kind. +// + +#include +#include +#include +#include +#include + +#include "output.h" +#include "visualization.h" + +#include + +// static methods + +static QList *factories = 0; +static QStringList files; +static QTimer *timer = 0; + +static void checkFactories() +{ + if ( ! factories ) + { + files.clear(); + factories = new QList; + + QDir pluginsDir ( qApp->applicationDirPath() ); + pluginsDir.cdUp(); + pluginsDir.cd ( "lib/qmmp/Output" ); + foreach ( QString fileName, pluginsDir.entryList ( QDir::Files ) ) + { + QPluginLoader loader ( pluginsDir.absoluteFilePath ( fileName ) ); + QObject *plugin = loader.instance(); + if ( loader.isLoaded() ) + { + qDebug ( "Output: plugin loaded - %s", qPrintable ( fileName ) ); + } + OutputFactory *factory = 0; + if ( plugin ) + factory = qobject_cast ( plugin ); + + if ( factory ) + { + Output::registerFactory ( factory ); + files << pluginsDir.absoluteFilePath(fileName); + } + } + } +} + +void Output::registerFactory ( OutputFactory *fact ) +{ + factories->append ( fact ); +} + +Output *Output::create ( QObject *parent ) +{ + Output *output = 0; + + checkFactories(); + if ( factories->isEmpty () ) + { + qDebug("Output: unable to find output plugins"); + return output; + } + QSettings settings ( QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat ); + QString pluginFileName = + settings.value("Output/plugin_file","libalsa.so").toString(); + int j = 0; + for (int i = 0; i < factories->size(); ++i) + { + if (files.at(i).section('/',-1) == pluginFileName) + j = i; + } + OutputFactory *fact = factories->at ( j ); + if ( fact ) + { + output = fact->create ( parent ); + } + switch ((int) output->volumeControl()) + { + case Output::Standard: + { + break; + } + case Output::Custom: + { + timer = new QTimer(output); + connect(timer, SIGNAL(timeout()), output, SLOT(checkVolume())); + timer->start(125); + break; + } + case Output::Disabled: + { + break; + } + } + return output; +} + +QList *Output::outputFactories() +{ + checkFactories(); + return factories; +} + +QStringList Output::outputFiles() +{ + checkFactories(); + return files; +} + +Output::Output ( QObject* parent, VolumeType vt) : QThread (parent), r (stackSize()) +{ + qRegisterMetaType("OutputState"); + m_vol = vt; +} + + +Output::~Output() +{} + +void Output::error ( const QString &e ) +{ + emit stateChanged ( OutputState ( e ) ); +} + + +void Output::addVisual ( Visualization *v ) +{ + if ( visuals.indexOf ( v ) == -1 ) + { + visuals.append ( v ); + } +} + + +void Output::removeVisual ( Visualization *v ) +{ + visuals.removeAll ( v ); +} + +void Output::dispatchVisual ( Buffer *buffer, unsigned long written, + int chan, int prec ) +{ + if ( ! buffer || !visuals.size()) + return; + Visualization *visual = 0; + foreach (visual , visuals ); + { + visual->mutex()->lock (); + visual->add ( buffer, written, chan, prec ); + visual->mutex()->unlock(); + } +} + + +void Output::prepareVisuals() +{ + //Visual *visual = visuals.first(); + /*while (visual) { + visual->mutex()->lock(); + visual->prepare(); + visual->mutex()->unlock(); + + visual = visuals.next(); + }*/ +} + +void Output::dispatch(OutputState::Type st) +{ + emit stateChanged ( OutputState(st) ); +} + +void Output::dispatch(long s, unsigned long w, int b, int f, int p, int c) +{ + emit stateChanged ( OutputState(s, w, b, f, p, c) ); +} + +void Output::dispatch ( const OutputState &st ) +{ + emit stateChanged ( st ); +} + +void Output::dispatchVolume(int L, int R) +{ + emit stateChanged ( OutputState(L, R) ); +} -- cgit v1.2.3-13-gbd6f