Diffstat (limited to 'core/multimedia/opieplayer/wavplugin') (more/less context) (ignore whitespace changes)
-rw-r--r-- | core/multimedia/opieplayer/wavplugin/.cvsignore | 2 | ||||
-rw-r--r-- | core/multimedia/opieplayer/wavplugin/Makefile.in | 112 | ||||
-rw-r--r-- | core/multimedia/opieplayer/wavplugin/qpe-wavplugin.control | 9 | ||||
-rw-r--r-- | core/multimedia/opieplayer/wavplugin/wavplugin.cpp | 334 | ||||
-rw-r--r-- | core/multimedia/opieplayer/wavplugin/wavplugin.h | 97 | ||||
-rw-r--r-- | core/multimedia/opieplayer/wavplugin/wavplugin.pro | 10 | ||||
-rw-r--r-- | core/multimedia/opieplayer/wavplugin/wavpluginimpl.cpp | 70 | ||||
-rw-r--r-- | core/multimedia/opieplayer/wavplugin/wavpluginimpl.h | 53 |
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 + |