summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/wavplugin
Side-by-side diff
Diffstat (limited to 'core/multimedia/opieplayer/wavplugin') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/wavplugin/.cvsignore2
-rw-r--r--core/multimedia/opieplayer/wavplugin/Makefile.in112
-rw-r--r--core/multimedia/opieplayer/wavplugin/qpe-wavplugin.control9
-rw-r--r--core/multimedia/opieplayer/wavplugin/wavplugin.cpp334
-rw-r--r--core/multimedia/opieplayer/wavplugin/wavplugin.h97
-rw-r--r--core/multimedia/opieplayer/wavplugin/wavplugin.pro10
-rw-r--r--core/multimedia/opieplayer/wavplugin/wavpluginimpl.cpp70
-rw-r--r--core/multimedia/opieplayer/wavplugin/wavpluginimpl.h53
8 files changed, 687 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/wavplugin/.cvsignore b/core/multimedia/opieplayer/wavplugin/.cvsignore
new file mode 100644
index 0000000..6fe2396
--- a/dev/null
+++ b/core/multimedia/opieplayer/wavplugin/.cvsignore
@@ -0,0 +1,2 @@
+moc_*
+Makefile
diff --git a/core/multimedia/opieplayer/wavplugin/Makefile.in b/core/multimedia/opieplayer/wavplugin/Makefile.in
new file mode 100644
index 0000000..c9203f8
--- a/dev/null
+++ b/core/multimedia/opieplayer/wavplugin/Makefile.in
@@ -0,0 +1,112 @@
+#############################################################################
+
+####### Compiler, tools and options
+
+CXX = $(SYSCONF_CXX) $(QT_CXX_MT)
+CXXFLAGS= $(SYSCONF_CXXFLAGS_QT) $(SYSCONF_CXXFLAGS) $(SYSCONF_CXXFLAGS_LIB) -DQCONFIG=\"qpe\"
+CC = $(SYSCONF_CC) $(QT_C_MT)
+CFLAGS = $(SYSCONF_CFLAGS) $(SYSCONF_CFLAGS_LIB) -DQCONFIG=\"qpe\"
+INCPATH = -I$(QPEDIR)/include -I..
+LFLAGS = $(SYSCONF_LFLAGS_QT) $(SYSCONF_RPATH_QT) $(SYSCONF_LFLAGS) $(QT_LFLAGS_MT)
+LIBS = $(SUBLIBS) -lqpe $(SYSCONF_LIBS_QT) $(SYSCONF_LIBS_QTAPP)
+MOC = $(SYSCONF_MOC)
+UIC = $(SYSCONF_UIC)
+
+####### Target
+
+DESTDIR = ../../plugins/codecs/
+VER_MAJ = 1
+VER_MIN = 0
+VER_PATCH = 0
+TARGET = wavplugin
+TARGET1 = lib$(TARGET).so.$(VER_MAJ)
+
+####### Files
+
+HEADERS = wavplugin.h \
+ wavpluginimpl.h
+SOURCES = wavplugin.cpp \
+ wavpluginimpl.cpp
+OBJECTS = wavplugin.o \
+ wavpluginimpl.o
+INTERFACES =
+UICDECLS =
+UICIMPLS =
+SRCMOC =
+OBJMOC =
+
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .C .c
+
+.cpp.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.cxx.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.cc.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.C.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+
+####### Build rules
+
+
+all: $(DESTDIR)$(SYSCONF_LINK_TARGET)
+
+$(DESTDIR)$(SYSCONF_LINK_TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(SUBLIBS)
+ $(SYSCONF_LINK_LIB)
+
+moc: $(SRCMOC)
+
+tmake:
+ tmake wavplugin.pro
+
+clean:
+ -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS)
+ -rm -f *~ core
+ -rm -f allmoc.cpp
+
+####### Extension Modules
+
+listpromodules:
+ @echo
+
+listallmodules:
+ @echo
+
+listaddonpromodules:
+ @echo
+
+listaddonentmodules:
+ @echo
+
+
+REQUIRES=
+
+####### Sub-libraries
+
+
+###### Combined headers
+
+
+
+####### Compile
+
+wavplugin.o: wavplugin.cpp \
+ wavplugin.h \
+ ../mediaplayerplugininterface.h
+
+wavpluginimpl.o: wavpluginimpl.cpp \
+ wavplugin.h \
+ ../mediaplayerplugininterface.h \
+ wavpluginimpl.h \
+ ../mediaplayerplugininterface.h
+
+
diff --git a/core/multimedia/opieplayer/wavplugin/qpe-wavplugin.control b/core/multimedia/opieplayer/wavplugin/qpe-wavplugin.control
new file mode 100644
index 0000000..8e7eedb
--- a/dev/null
+++ b/core/multimedia/opieplayer/wavplugin/qpe-wavplugin.control
@@ -0,0 +1,9 @@
+Files: plugins/codecs/libwavplugin.so.1.0.0 plugins/codecs/libwavplugin.so.1.0 plugins/codecs/libwavplugin.so.1 plugins/codecs/libwavplugin.so
+Priority: optional
+Section: qpe/plugins
+Maintainer: John Ryland <jryland@trolltech.com>
+Architecture: arm
+Version: $QPE_VERSION-3
+Depends: qpe-base ($QPE_VERSION)
+Description: WAV file plugin
+ Plugin to play WAV files with the mediaplayer in the Qtopia environment.
diff --git a/core/multimedia/opieplayer/wavplugin/wavplugin.cpp b/core/multimedia/opieplayer/wavplugin/wavplugin.cpp
new file mode 100644
index 0000000..60a0024
--- a/dev/null
+++ b/core/multimedia/opieplayer/wavplugin/wavplugin.cpp
@@ -0,0 +1,334 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+#include <qfile.h>
+#include "wavplugin.h"
+
+
+//#define debugMsg(a) qDebug(a)
+#define debugMsg(a)
+
+
+struct RiffChunk {
+ char id[4];
+ Q_UINT32 size;
+ char data[4];
+};
+
+
+struct ChunkData {
+ Q_INT16 formatTag;
+ Q_INT16 channels;
+ Q_INT32 samplesPerSec;
+ Q_INT32 avgBytesPerSec;
+ Q_INT16 blockAlign;
+ Q_INT16 wBitsPerSample;
+};
+
+
+const int sound_buffer_size = 4096;
+
+
+class WavPluginData {
+public:
+ QFile *input;
+
+ int wavedata_remaining;
+ ChunkData chunkdata;
+ RiffChunk chunk;
+ uchar data[sound_buffer_size+32]; // +32 to handle badly aligned input data
+ int out,max;
+ int samples_due;
+ int samples;
+
+ WavPluginData() {
+ max = out = sound_buffer_size;
+ wavedata_remaining = 0;
+ samples_due = 0;
+ samples = -1;
+ }
+
+ // expands out samples to the frequency of 44kHz
+ bool add( short *output, long count, long& done, bool stereo )
+ {
+ done = 0;
+
+ if ( input == 0 ) {
+ qDebug("no input");
+ return FALSE;
+ }
+
+ while ( count ) {
+ int l,r;
+ if ( getSample(l, r) == FALSE ) {
+ qDebug("didn't get sample");
+ return FALSE;
+ }
+ samples_due += 44100;
+ while ( count && (samples_due > chunkdata.samplesPerSec) ) {
+ *output++ = l;
+ if ( stereo )
+ *output++ = r;
+ samples_due -= chunkdata.samplesPerSec;
+ count--;
+ done++;
+ }
+ }
+
+ return TRUE;
+ }
+
+ bool initialise() {
+ if ( input == 0 )
+ return FALSE;
+
+ wavedata_remaining = -1;
+
+ while ( wavedata_remaining == -1 ) {
+ // Keep reading chunks...
+ const int n = sizeof(chunk) - sizeof(chunk.data);
+ int t = input->readBlock( (char*)&chunk, n );
+ if ( t != n ) {
+ if ( t == -1 )
+ return FALSE;
+ return TRUE;
+ }
+ if ( qstrncmp(chunk.id,"data",4) == 0 ) {
+ samples = wavedata_remaining = chunk.size;
+ } else if ( qstrncmp(chunk.id,"RIFF",4) == 0 ) {
+ char d[4];
+ if ( input->readBlock(d,4) != 4 ) {
+ return FALSE;
+ }
+ if ( qstrncmp(d,"WAVE",4) != 0 ) {
+ // skip
+ if ( chunk.size > 1000000000 || !input->at(input->at()+chunk.size-4) ) {
+ return FALSE;
+ }
+ }
+ } else if ( qstrncmp(chunk.id,"fmt ",4) == 0 ) {
+ if ( input->readBlock((char*)&chunkdata,sizeof(chunkdata)) != sizeof(chunkdata) ) {
+ return FALSE;
+ }
+#define WAVE_FORMAT_PCM 1
+ if ( chunkdata.formatTag != WAVE_FORMAT_PCM ) {
+ qDebug("WAV file: UNSUPPORTED FORMAT %d",chunkdata.formatTag);
+ return FALSE;
+ }
+ } else {
+ // ignored chunk
+ if ( chunk.size > 1000000000 || !input->at(input->at()+chunk.size) ) {
+ return FALSE;
+ }
+ }
+ } // while
+
+ return TRUE;
+ }
+
+
+ // gets a sample from the file
+ bool getSample(int& l, int& r)
+ {
+ l = r = 0;
+
+ if ( input == 0 )
+ return FALSE;
+
+ if ( (wavedata_remaining < 0) || !max )
+ return FALSE;
+
+ if ( out >= max ) {
+ max = input->readBlock( (char*)data, (uint)QMIN(sound_buffer_size,wavedata_remaining) );
+
+ wavedata_remaining -= max;
+
+ out = 0;
+ if ( max <= 0 ) {
+ max = 0;
+ return TRUE;
+ }
+ }
+ if ( chunkdata.wBitsPerSample == 8 ) {
+ l = (data[out++] - 128) * 128;
+ } else {
+ l = ((short*)data)[out/2];
+ out += 2;
+ }
+ if ( chunkdata.channels == 1 ) {
+ r = l;
+ } else {
+ if ( chunkdata.wBitsPerSample == 8 ) {
+ r = (data[out++] - 128) * 128;
+ } else {
+ r = ((short*)data)[out/2];
+ out += 2;
+ }
+ }
+ return TRUE;
+ } // getSample
+
+};
+
+
+WavPlugin::WavPlugin() {
+ d = new WavPluginData;
+ d->input = 0;
+}
+
+
+WavPlugin::~WavPlugin() {
+ close();
+ delete d;
+}
+
+
+bool WavPlugin::isFileSupported( const QString& path ) {
+ debugMsg( "WavPlugin::isFileSupported" );
+
+ char *ext = strrchr( path.latin1(), '.' );
+
+ // Test file extension
+ if ( ext ) {
+ if ( strncasecmp(ext, ".raw", 4) == 0 )
+ return TRUE;
+ if ( strncasecmp(ext, ".wav", 4) == 0 )
+ return TRUE;
+ if ( strncasecmp(ext, ".wave", 4) == 0 )
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+bool WavPlugin::open( const QString& path ) {
+ debugMsg( "WavPlugin::open" );
+
+ d->max = d->out = sound_buffer_size;
+ d->wavedata_remaining = 0;
+ d->samples_due = 0;
+
+ d->input = new QFile( path );
+ if ( d->input->open(IO_ReadOnly) == FALSE ) {
+ qDebug("couldn't open file");
+ delete d->input;
+ d->input = 0;
+ return FALSE;
+ }
+
+ d->initialise();
+
+ return TRUE;
+}
+
+
+bool WavPlugin::close() {
+ debugMsg( "WavPlugin::close" );
+
+ d->input->close();
+ delete d->input;
+ d->input = 0;
+ return TRUE;
+}
+
+
+bool WavPlugin::isOpen() {
+ debugMsg( "WavPlugin::isOpen" );
+ return ( d->input != 0 );
+}
+
+
+int WavPlugin::audioStreams() {
+ debugMsg( "WavPlugin::audioStreams" );
+ return 1;
+}
+
+
+int WavPlugin::audioChannels( int ) {
+ debugMsg( "WavPlugin::audioChannels" );
+ return 2; // ### Always scale audio to stereo samples
+}
+
+
+int WavPlugin::audioFrequency( int ) {
+ debugMsg( "WavPlugin::audioFrequency" );
+ return 44100; // ### Always scale to frequency of 44100
+}
+
+
+int WavPlugin::audioSamples( int ) {
+ debugMsg( "WavPlugin::audioSamples" );
+ return d->samples * 2 / d->chunkdata.channels; // ### Scaled samples will be made stereo,
+ // Therefore if source is mono we will double the number of samples
+}
+
+
+bool WavPlugin::audioSetSample( long, int ) {
+ debugMsg( "WavPlugin::audioSetSample" );
+ return FALSE;
+}
+
+
+long WavPlugin::audioGetSample( int ) {
+ debugMsg( "WavPlugin::audioGetSample" );
+ return 0;
+}
+
+/*
+bool WavPlugin::audioReadSamples( short *, int, long, int ) {
+ debugMsg( "WavPlugin::audioReadSamples" );
+ return FALSE;
+}
+
+
+bool WavPlugin::audioReReadSamples( short *, int, long, int ) {
+ debugMsg( "WavPlugin::audioReReadSamples" );
+ return FALSE;
+}
+
+
+bool WavPlugin::audioReadMonoSamples( short *output, long samples, long& samplesMade, int ) {
+ debugMsg( "WavPlugin::audioReadMonoSamples" );
+ return !d->add( output, samples, samplesMade, FALSE );
+}
+
+
+bool WavPlugin::audioReadStereoSamples( short *output, long samples, long& samplesMade, int ) {
+ debugMsg( "WavPlugin::audioReadStereoSamples" );
+ return !d->add( output, samples, samplesMade, TRUE );
+}
+*/
+
+bool WavPlugin::audioReadSamples( short *output, int channels, long samples, long& samplesMade, int ) {
+ debugMsg( "WavPlugin::audioReadSamples" );
+ return !d->add( output, samples, samplesMade, channels != 1 );
+}
+
+double WavPlugin::getTime() {
+ debugMsg( "WavPlugin::getTime" );
+ return 0.0;
+}
+
+
diff --git a/core/multimedia/opieplayer/wavplugin/wavplugin.h b/core/multimedia/opieplayer/wavplugin/wavplugin.h
new file mode 100644
index 0000000..64635ca
--- a/dev/null
+++ b/core/multimedia/opieplayer/wavplugin/wavplugin.h
@@ -0,0 +1,97 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+#ifndef WAV_PLUGIN_H
+#define WAV_PLUGIN_H
+
+
+#include <qstring.h>
+#include <qapplication.h>
+#include "mediaplayerplugininterface.h"
+
+
+class WavPluginData;
+
+
+class WavPlugin : public MediaPlayerDecoder {
+
+public:
+ WavPlugin();
+ ~WavPlugin();
+
+ const char *pluginName() { return "WavPlugin"; }
+ const char *pluginComment() { return "This is a simple plugin for playing wav files"; }
+ double pluginVersion() { return 1.0; }
+
+ bool isFileSupported( const QString& );
+ bool open( const QString& );
+ bool close();
+ bool isOpen();
+ //const QString &fileInfo() { return strInfo = qApp->translate( "MediaPlayer", "No Information Available", "media plugin text" ); }
+ const QString &fileInfo() { return strInfo = QString(""); }
+
+ // If decoder doesn't support audio then return 0 here
+ int audioStreams();
+ int audioChannels( int stream );
+ int audioFrequency( int stream );
+ int audioSamples( int stream );
+ bool audioSetSample( long sample, int stream );
+ long audioGetSample( int stream );
+ //bool audioReadMonoSamples( short *output, long samples, long& samplesRead, int stream );
+ //bool audioReadStereoSamples( short *output, long samples, long& samplesRead, int stream );
+ bool audioReadSamples( short *output, int channels, long samples, long& samplesRead, int stream );
+ //bool audioReadSamples( short *output, int channel, long samples, int stream );
+ //bool audioReReadSamples( short *output, int channel, long samples, int stream );
+
+ // If decoder doesn't support video then return 0 here
+ int videoStreams() { return 0; }
+ int videoWidth( int ) { return 0; }
+ int videoHeight( int ) { return 0; }
+ double videoFrameRate( int ) { return 0.0; }
+ int videoFrames( int ) { return 0; }
+ bool videoSetFrame( long, int ) { return FALSE; }
+ long videoGetFrame( int ) { return 0; }
+ bool videoReadFrame( unsigned char **, int, int, int, int, ColorFormat, int ) { return FALSE; }
+ bool videoReadScaledFrame( unsigned char **, int, int, int, int, int, int, ColorFormat, int ) { return FALSE; }
+ bool videoReadYUVFrame( char *, char *, char *, int, int, int, int, int ) { return FALSE; }
+
+ // Profiling
+ double getTime();
+
+ // Ignore if these aren't supported
+ bool setSMP( int ) { return FALSE; }
+ bool setMMX( bool ) { return FALSE; }
+
+ // Capabilities
+ bool supportsAudio() { return TRUE; }
+ bool supportsVideo() { return FALSE; }
+ bool supportsYUV() { return FALSE; }
+ bool supportsMMX() { return TRUE; }
+ bool supportsSMP() { return FALSE; }
+ bool supportsStereo() { return TRUE; }
+ bool supportsScaling() { return FALSE; }
+
+private:
+ WavPluginData *d;
+ QString strInfo;
+
+};
+
+
+#endif
diff --git a/core/multimedia/opieplayer/wavplugin/wavplugin.pro b/core/multimedia/opieplayer/wavplugin/wavplugin.pro
new file mode 100644
index 0000000..4663813
--- a/dev/null
+++ b/core/multimedia/opieplayer/wavplugin/wavplugin.pro
@@ -0,0 +1,10 @@
+TEMPLATE = lib
+CONFIG += qt warn_on release
+HEADERS = wavplugin.h wavpluginimpl.h
+SOURCES = wavplugin.cpp wavpluginimpl.cpp
+TARGET = wavplugin
+DESTDIR = ../../plugins/codecs
+INCLUDEPATH += $(QPEDIR)/include ..
+DEPENDPATH += ../$(QPEDIR)/include ..
+LIBS += -lqpe
+VERSION = 1.0.0
diff --git a/core/multimedia/opieplayer/wavplugin/wavpluginimpl.cpp b/core/multimedia/opieplayer/wavplugin/wavpluginimpl.cpp
new file mode 100644
index 0000000..1f7b85b
--- a/dev/null
+++ b/core/multimedia/opieplayer/wavplugin/wavpluginimpl.cpp
@@ -0,0 +1,70 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+#include "wavplugin.h"
+#include "wavpluginimpl.h"
+
+
+WavPluginImpl::WavPluginImpl()
+ : libmadplugin(0), ref(0)
+{
+}
+
+
+WavPluginImpl::~WavPluginImpl()
+{
+ if ( libmadplugin )
+ delete libmadplugin;
+}
+
+
+MediaPlayerDecoder *WavPluginImpl::decoder()
+{
+ if ( !libmadplugin )
+ libmadplugin = new WavPlugin;
+ return libmadplugin;
+}
+
+
+MediaPlayerEncoder *WavPluginImpl::encoder()
+{
+ return NULL;
+}
+
+
+#ifndef QT_NO_COMPONENT
+
+
+QRESULT WavPluginImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
+{
+ *iface = 0;
+ if ( ( uuid == IID_QUnknown ) || ( uuid == IID_MediaPlayerPlugin ) )
+ *iface = this, (*iface)->addRef();
+ return QS_OK;
+}
+
+
+Q_EXPORT_INTERFACE()
+{
+ Q_CREATE_INSTANCE( WavPluginImpl )
+}
+
+
+#endif
+
diff --git a/core/multimedia/opieplayer/wavplugin/wavpluginimpl.h b/core/multimedia/opieplayer/wavplugin/wavpluginimpl.h
new file mode 100644
index 0000000..ee32f54
--- a/dev/null
+++ b/core/multimedia/opieplayer/wavplugin/wavpluginimpl.h
@@ -0,0 +1,53 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+#ifndef WAV_PLUGIN_IMPL_H
+#define WAV_PLUGIN_IMPL_H
+
+
+#include "../mediaplayerplugininterface.h"
+
+
+class WavPlugin;
+
+
+class WavPluginImpl : public MediaPlayerPluginInterface
+{
+public:
+ WavPluginImpl();
+ virtual ~WavPluginImpl();
+
+#ifndef QT_NO_COMPONENT
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface** );
+ Q_REFCOUNT
+
+#endif
+
+ virtual MediaPlayerDecoder *decoder();
+ virtual MediaPlayerEncoder *encoder();
+
+private:
+ WavPlugin *libmadplugin;
+ ulong ref;
+};
+
+
+#endif
+