diff options
Diffstat (limited to 'plugins/decoder/libsndfile')
-rw-r--r-- | plugins/decoder/libsndfile/Makefile.am | 14 | ||||
-rw-r--r-- | plugins/decoder/libsndfile/configure.in.bot | 11 | ||||
-rw-r--r-- | plugins/decoder/libsndfile/configure.in.in | 52 | ||||
-rw-r--r-- | plugins/decoder/libsndfile/k3blibsndfiledecoder.cpp | 254 | ||||
-rw-r--r-- | plugins/decoder/libsndfile/k3blibsndfiledecoder.h | 69 | ||||
-rw-r--r-- | plugins/decoder/libsndfile/k3blibsndfiledecoder.plugin | 9 |
6 files changed, 409 insertions, 0 deletions
diff --git a/plugins/decoder/libsndfile/Makefile.am b/plugins/decoder/libsndfile/Makefile.am new file mode 100644 index 0000000..2af9911 --- /dev/null +++ b/plugins/decoder/libsndfile/Makefile.am @@ -0,0 +1,14 @@ +AM_CPPFLAGS = -I$(srcdir)/../../../libk3b/core -I$(srcdir)/../../../libk3b/plugin -I$(srcdir)/../../../libk3bdevice $(all_includes) + +kde_module_LTLIBRARIES = libk3blibsndfiledecoder.la + +libk3blibsndfiledecoder_la_SOURCES = k3blibsndfiledecoder.cpp + +libk3blibsndfiledecoder_la_LIBADD = ../../../libk3b/libk3b.la $(LIB_KDEUI) -lsndfile +libk3blibsndfiledecoder_la_LDFLAGS = -avoid-version -module -no-undefined $(all_libraries) + +pluginsdir = $(kde_datadir)/k3b/plugins +plugins_DATA = k3blibsndfiledecoder.plugin + +METASOURCES = AUTO + diff --git a/plugins/decoder/libsndfile/configure.in.bot b/plugins/decoder/libsndfile/configure.in.bot new file mode 100644 index 0000000..cf1e4e9 --- /dev/null +++ b/plugins/decoder/libsndfile/configure.in.bot @@ -0,0 +1,11 @@ +echo "" + +if $av_cv_sndfile; then + echo "K3b - libsndfile audio decoding support: yes" +else + echo "K3b - libsndfile audio decoding support: no" +if test "$ac_cv_use_sndfile" = "yes"; then + echo "K3b - You are missing the libsndfile headers and libraries." + echo "K3b - The libsndfile audio decoding plugin won't be compiled." +fi +fi diff --git a/plugins/decoder/libsndfile/configure.in.in b/plugins/decoder/libsndfile/configure.in.in new file mode 100644 index 0000000..e0efcc5 --- /dev/null +++ b/plugins/decoder/libsndfile/configure.in.in @@ -0,0 +1,52 @@ +dnl === test for libsndfile - begin === +dnl +dnl Don't use PKG_CHECK, since if there is no pkg-config installed, +dnl then there is no auto* magic for it either. +dnl +dnl Tests copied from kdebase/kioslave/thumbnail/ +dnl +if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) +fi + +AC_ARG_WITH( + sndfile, + AS_HELP_STRING([--without-sndfile], + [build K3b without libsndfile support (default=no)]), + [ac_cv_use_sndfile=$withval], + [ac_cv_use_sndfile=yes] +) + +if test "$ac_cv_use_sndfile" = "yes"; then + SNDFILE_CFLAGS="" + SNDFILE_LIBS="" + if test "$PKG_CONFIG" = "no" ; then + ac_cv_sndfile=0 + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + if !(`$PKG_CONFIG --exists sndfile`) ; then + echo "*** sndfile is not installed." + ac_cv_sndfile=0 + else + if !(`$PKG_CONFIG --atleast-version="1.0.2" sndfile`) ; then + echo "*** You need at least version 1.0.2 of sndfile." + ac_cv_sndfile=0 + else + ac_cv_sndfile=1 + SNDFILE_CFLAGS=`$PKG_CONFIG --cflags sndfile` + SNDFILE_LIBS=`$PKG_CONFIG --libs sndfile` + fi + fi + fi + + AC_DEFINE_UNQUOTED([HAVE_SNDFILE],${ac_cv_sndfile}, + [Set to 1 if you have libsndfile.]) + AC_SUBST(SNDFILE_CFLAGS) + AC_SUBST(SNDFILE_LIBS) +fi + +AM_CONDITIONAL(include_AIFF, [test x$ac_cv_sndfile = x1]) +dnl === test for libsndfile - end === diff --git a/plugins/decoder/libsndfile/k3blibsndfiledecoder.cpp b/plugins/decoder/libsndfile/k3blibsndfiledecoder.cpp new file mode 100644 index 0000000..ea3d014 --- /dev/null +++ b/plugins/decoder/libsndfile/k3blibsndfiledecoder.cpp @@ -0,0 +1,254 @@ +/* + * + * $Id: k3blibsndfiledecoder.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Matthieu Bedouet <mbedouet@no-log.org> + * Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org> + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include <config.h> + +#include "k3blibsndfiledecoder.h" + +#include <k3bpluginfactory.h> + +#include <qfile.h> +#include <qstringlist.h> + +#include <kurl.h> +#include <kdebug.h> +#include <klocale.h> +#include <kinstance.h> + + +#include <math.h> +#include <stdio.h> +#include <sndfile.h> + + +K_EXPORT_COMPONENT_FACTORY( libk3blibsndfiledecoder, K3bPluginFactory<K3bLibsndfileDecoderFactory>( "libk3blibsndfiledecoder" ) ) + + +class K3bLibsndfileDecoder::Private +{ +public: + Private(): + isOpen(false), + buffer(0), + bufferSize(0) { + format_info.name = 0; + } + + SNDFILE *sndfile; + SF_INFO sndinfo; + SF_FORMAT_INFO format_info; + bool isOpen; + float* buffer; + int bufferSize; +}; + + + +K3bLibsndfileDecoder::K3bLibsndfileDecoder( QObject* parent, const char* name ) + : K3bAudioDecoder( parent, name ) +{ + d = new Private(); +} + + +K3bLibsndfileDecoder::~K3bLibsndfileDecoder() +{ + delete d; +} + + +QString K3bLibsndfileDecoder::fileType() const +{ + if( d->format_info.name ) + return QString::fromLocal8Bit(d->format_info.name); + else + return "-"; +} + + + +bool K3bLibsndfileDecoder::openFile() +{ + if( !d->isOpen ) { + + cleanup(); + + d->sndinfo.format = 0; + d->sndfile = sf_open (QFile::encodeName(filename()), SFM_READ, &d->sndinfo); + if ( !d->sndfile ) { + kdDebug() << "(K3bLibsndfileDecoder::openLibsndfileFile) : " << sf_strerror(d->sndfile) << endl; + return false; + } + else { + //retrieve infos (name, extension) about the format: + d->format_info.format = d->sndinfo.format & SF_FORMAT_TYPEMASK ; + sf_command (d->sndfile, SFC_GET_FORMAT_INFO, &d->format_info, sizeof (SF_FORMAT_INFO)) ; + + d->isOpen = true; + kdDebug() << "(K3bLibsndfileDecoder::openLibsndfileFile) " << d->format_info.name << " file opened " << endl; + return true; + } + } + + return d->isOpen; +} + + +bool K3bLibsndfileDecoder::analyseFileInternal( K3b::Msf& frames, int& samplerate, int& ch ) +{ + cleanup(); + + if( openFile() ) { + // check length of track + if ( d->sndinfo.frames <= 0 ) { + kdDebug() << "(K3bLibsndfileDecoder::analyseFileInternal) Could not determine length of file " + << filename() << endl; + cleanup(); + return false; + } + else { + addMetaInfo( META_TITLE, sf_get_string(d->sndfile, SF_STR_TITLE) ); + addMetaInfo( META_ARTIST, sf_get_string(d->sndfile, SF_STR_ARTIST) ); + addMetaInfo( META_COMMENT, sf_get_string(d->sndfile, SF_STR_COMMENT) ); + + addTechnicalInfo( i18n("Channels"), QString::number(d->sndinfo.channels) ); + addTechnicalInfo( i18n("Sampling Rate"), i18n("%1 Hz").arg(d->sndinfo.samplerate) ); + + frames = (unsigned long)ceil(d->sndinfo.frames / d->sndinfo.samplerate * 75.0); + samplerate = d->sndinfo.samplerate; + ch = d->sndinfo.channels; + + kdDebug() << "(K3bLibsndfileDecoder) successfully analysed file: " << frames << " frames." << endl; + + cleanup(); + return true; + } + } + else + return false; +} + + + +bool K3bLibsndfileDecoder::initDecoderInternal() +{ + cleanup(); + return openFile(); +} + + + +int K3bLibsndfileDecoder::decodeInternal( char* data, int maxLen ) +{ + if( !d->buffer ) { + d->buffer = new float[maxLen]; + d->bufferSize = maxLen/2; + } + + int read = (int) sf_read_float(d->sndfile, d->buffer,d->bufferSize) ; + fromFloatTo16BitBeSigned( d->buffer, data, read ); + read = read * 2; + + if( read < 0 ) { + kdDebug() << "(K3bLibsndfileDecoder::decodeInternal) Error: " << read << endl; + return -1; + } + else if( read == 0 ) { + kdDebug() << "(K3bLibsndfileDecoder::decodeInternal) successfully finished decoding." << endl; + return 0; + } + else if( read != maxLen ) { + kdDebug() << "(K3bLibsndfileDecoder::decodeInternal) read:" << read << " expected:" << maxLen << endl; + return -1; + } + else + return read; + } + + + +bool K3bLibsndfileDecoder::seekInternal( const K3b::Msf& pos) +{ + return ( sf_seek( d->sndfile, pos.pcmSamples(), SEEK_SET ) == 0 ); +} + + + + +void K3bLibsndfileDecoder::cleanup() +{ + if( d->isOpen ) { + kdDebug() << "(K3bLibsndfileDecoder) cleaning up." << endl; + sf_close( d->sndfile ); + d->isOpen = false; + } +} + + + +/********************************************************/ + + +K3bLibsndfileDecoderFactory::K3bLibsndfileDecoderFactory( QObject* parent, const char* name ) + : K3bAudioDecoderFactory( parent, name ) +{ +} + + +K3bLibsndfileDecoderFactory::~K3bLibsndfileDecoderFactory() +{ +} + + +K3bAudioDecoder* K3bLibsndfileDecoderFactory::createDecoder( QObject* parent, + const char* name ) const +{ + return new K3bLibsndfileDecoder( parent, name ); +} + + +bool K3bLibsndfileDecoderFactory::canDecode( const KURL& url ) +{ + SF_INFO infos; + infos.format = 0; + SNDFILE* sndfile = sf_open (QFile::encodeName(url.path()), SFM_READ, &infos); + + //is it supported by libsndfile? + if ( !sndfile ) { + kdDebug() << "(K3bLibsndfileDecoder) " << sf_strerror(sndfile) << endl; + return false; + } + //we exclude only WAVE as there is another plugin for this + else if ( infos.format && ((infos.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_WAV) ) { + + //retrieve infos (name) about the format: + SF_FORMAT_INFO format_info; + format_info.format = infos.format & SF_FORMAT_TYPEMASK ; + sf_command (sndfile, SFC_GET_FORMAT_INFO, &format_info, sizeof (format_info)) ; + + kdDebug() << "(K3bLibsndfileDecoder) " << format_info.name << " file === OK === " << endl; + sf_close( sndfile ); + return true; + } + else { + kdDebug() << "(K3bLibsndfileDecoder) " << url.path() << "not supported" << endl; + sf_close( sndfile ); + return false; + } + return false; +} + +#include "k3blibsndfiledecoder.moc" diff --git a/plugins/decoder/libsndfile/k3blibsndfiledecoder.h b/plugins/decoder/libsndfile/k3blibsndfiledecoder.h new file mode 100644 index 0000000..7ffbe2d --- /dev/null +++ b/plugins/decoder/libsndfile/k3blibsndfiledecoder.h @@ -0,0 +1,69 @@ +/* + * + * $Id: k3blibsndfiledecoder.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Matthieu Bedouet <mbedouet@no-log.org> + * Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org> + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AIFF_DECODER_H_ +#define _K3B_AIFF_DECODER_H_ + +#include <k3baudiodecoder.h> + +class KURL; + + +class K3bLibsndfileDecoderFactory : public K3bAudioDecoderFactory +{ + Q_OBJECT + + public: + K3bLibsndfileDecoderFactory( QObject* parent = 0, const char* name = 0 ); + ~K3bLibsndfileDecoderFactory(); + + bool canDecode( const KURL& filename ); + + int pluginSystemVersion() const { return 3; } + + bool multiFormatDecoder() const { return true; } + + K3bAudioDecoder* createDecoder( QObject* parent = 0, + const char* name = 0 ) const; +}; + + +class K3bLibsndfileDecoder : public K3bAudioDecoder +{ + Q_OBJECT + + public: + K3bLibsndfileDecoder( QObject* parent = 0, const char* name = 0 ); + ~K3bLibsndfileDecoder(); + void cleanup(); + QString fileType() const; + + protected: + bool analyseFileInternal( K3b::Msf& frames, int& samplerate, int& ch ); + bool initDecoderInternal(); + bool seekInternal( const K3b::Msf& ); + + int decodeInternal( char* _data, int maxLen ); + + private: + bool openFile(); + + class Private; + Private* d; + +}; + +#endif diff --git a/plugins/decoder/libsndfile/k3blibsndfiledecoder.plugin b/plugins/decoder/libsndfile/k3blibsndfiledecoder.plugin new file mode 100644 index 0000000..7ae05f1 --- /dev/null +++ b/plugins/decoder/libsndfile/k3blibsndfiledecoder.plugin @@ -0,0 +1,9 @@ +[K3b Plugin] +Lib=libk3blibsndfiledecoder +Group=AudioDecoder +Name=K3b Libsndfile Decoder +Author=Matthieu Bedouet +Email=mbedouet@no-log.org +Version=1.0 +Comment=Decoding module to decode audio files supported by libsndfile +License=GPL |