rev 16145 - in trunk/packages/phonon/debian: . patches

Modestas Vainius modax-guest at alioth.debian.org
Thu Oct 15 17:07:50 UTC 2009


Author: modax-guest
Date: 2009-10-15 17:07:50 +0000 (Thu, 15 Oct 2009)
New Revision: 16145

Added:
   trunk/packages/phonon/debian/patches/06_983650_play_filenames_with_hash.diff
   trunk/packages/phonon/debian/patches/07_feature_backport_xine_equalizer.diff
Modified:
   trunk/packages/phonon/debian/changelog
   trunk/packages/phonon/debian/control
   trunk/packages/phonon/debian/patches/series
Log:
* Rename source package to phonon-backends.
* Add phonon-backends-dbg debug package.
* Add patch (06_983650_play_filenames_with_hash.diff) to fix playback of
  files with hash (#) symbol in their name (Closes: #546271).
* Backport Xine equalizer support from Phonon trunk (patch
  07_feature_backport_xine_equalizer.diff).

Modified: trunk/packages/phonon/debian/changelog
===================================================================
--- trunk/packages/phonon/debian/changelog	2009-10-15 16:32:55 UTC (rev 16144)
+++ trunk/packages/phonon/debian/changelog	2009-10-15 17:07:50 UTC (rev 16145)
@@ -1,3 +1,16 @@
+phonon-backends (4:4.3.1-5~pre6) UNRELEASED; urgency=low
+
+  +++ Changes by Modestas Vainius:
+
+  * Rename source package to phonon-backends.
+  * Add phonon-backends-dbg debug package.
+  * Add patch (06_983650_play_filenames_with_hash.diff) to fix playback of
+    files with hash (#) symbol in their name (Closes: #546271).
+  * Backport Xine equalizer support from Phonon trunk (patch
+    07_feature_backport_xine_equalizer.diff).
+
+ -- Debian Qt/KDE Maintainers <debian-qt-kde at lists.debian.org>  Thu, 15 Oct 2009 18:56:37 +0300
+
 phonon (4:4.3.1-4) unstable; urgency=low
 
   +++ Changes by Modestas Vainius:

Modified: trunk/packages/phonon/debian/control
===================================================================
--- trunk/packages/phonon/debian/control	2009-10-15 16:32:55 UTC (rev 16144)
+++ trunk/packages/phonon/debian/control	2009-10-15 17:07:50 UTC (rev 16145)
@@ -1,4 +1,4 @@
-Source: phonon
+Source: phonon-backends
 Section: sound
 Priority: optional
 Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde at lists.debian.org>
@@ -45,7 +45,7 @@
 Package: phonon-backend-null
 Architecture: all
 Provides: phonon-backend
-Depends: libphonon4 (>= ${source:Version})
+Depends: libphonon4
 Conflicts: phonon-backend
 Description: Phonon null backend (no real backend)
  Phonon is the Qt 4 multimedia API, which provides a task-oriented abstraction
@@ -54,3 +54,13 @@
  This package does not provide any real Phonon backend. It can be used to
  disable Phonon audio/video capabilities. Please note that Phonon behaviour 
  with this package installed has not been well tested.
+
+Package: phonon-backends-dbg
+Section: debug
+Priority: extra
+Architecture: any
+Depends: ${sameVersionDep:libphonon4}, phonon-dbg
+Suggests: phonon-backend-xine (= ${binary:Version}), phonon-backend-gstreamer (= ${binary:Version})
+Description: debugging symbols for Phonon backends
+ This package contains debugging files useful when investigating problems
+ (e.g. crashes) with Phonon backends.

Added: trunk/packages/phonon/debian/patches/06_983650_play_filenames_with_hash.diff
===================================================================
--- trunk/packages/phonon/debian/patches/06_983650_play_filenames_with_hash.diff	                        (rev 0)
+++ trunk/packages/phonon/debian/patches/06_983650_play_filenames_with_hash.diff	2009-10-15 17:07:50 UTC (rev 16145)
@@ -0,0 +1,16 @@
+Origin: http://websvn.kde.org/?view=revision&revision=983650
+Description: fix playback of files with hash symbols (#) in their name
+Bug: https://bugs.kde.org/show_bug.cgi?id=172242
+Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=546271
+
+--- a/xine/mediaobject.cpp
++++ b/xine/mediaobject.cpp
+@@ -321,7 +321,7 @@
+ {
+     for (int i = 0; i < mrl.size(); ++i) {
+         const unsigned char c = static_cast<unsigned char>(mrl.at(i));
+-        if (c & 0x80 || c == '\\' || c < 32 || c == '%') {
++        if (c & 0x80 || c == '\\' || c < 32 || c == '%' || c == '#') {
+             char enc[4];
+             qsnprintf(enc, 4, "%%%02X", c);
+             mrl = mrl.left(i) + QByteArray(enc, 3) + mrl.mid(i + 1);

Added: trunk/packages/phonon/debian/patches/07_feature_backport_xine_equalizer.diff
===================================================================
--- trunk/packages/phonon/debian/patches/07_feature_backport_xine_equalizer.diff	                        (rev 0)
+++ trunk/packages/phonon/debian/patches/07_feature_backport_xine_equalizer.diff	2009-10-15 17:07:50 UTC (rev 16145)
@@ -0,0 +1,536 @@
+Origin: http://websvn.kde.org/?view=revision&revision=973633
+ http://websvn.kde.org/?view=revision&revision=999575
+Description: backport Xine equalizer from Phonon trunk
+ The feature is currently used by Amarok 2.2 or higher
+
+--- /dev/null
++++ b/xine/kequalizer_plugin.cpp
+@@ -0,0 +1,496 @@
++/*  This file is part of the KDE project
++    Copyright (C) 2009 Artur Szymiec <artur.szymiec at gmail.com>
++
++    This program is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Library General Public
++    License as published by the Free Software Foundation; either
++    version 2 of the License, or (at your option) any later version.
++
++    This library is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++    Library General Public License for more details.
++
++    You should have received a copy of the GNU Library General Public License
++    along with this library; see the file COPYING.LIB.  If not, write to
++    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++    Boston, MA 02110-1301, USA.
++
++*/
++
++/* Equalizer GPL code Copyright 2001 Anders Johansson ajh at atri.curtin.edu.au
++   Equalizer filter, implementation of a 10 band time domain graphic
++   equalizer using IIR filters. The IIR filters are implemented using a
++   Direct Form II approach, but has been modified (b1 == 0 always) to
++   save computation.
++   
++   Adopted to phnon xine engine plugin by Artur Szymiec in 2009 artur.szymiec at gmail.com
++*/
++
++#ifndef I18N_NOOP
++#define I18N_NOOP(x) x
++#endif
++
++#include "backend.h"
++
++#include <QObject>
++#include <cmath>
++
++#define __STDC_FORMAT_MACROS
++#include <inttypes.h>
++
++#include <xine.h>
++extern "C" {
++// xine headers use the reserved keyword this:
++#define this this_xine
++#include <xine/compat.h>
++#include <xine/post.h>
++#include <xine/xineutils.h>
++#undef this
++
++#define KEQUALIZER_MAX_GAIN 12.0
++#define KEQUALIZER_L       2      // Storage for filter taps
++#define KEQUALIZER_KM      10     // Max number of bands 
++#define KEQUALIZER_Q       1.2247449 
++/* Q value for band-pass filters 1.2247=(3/2)^(1/2)
++gives 4dB suppression @ Fc*2 and Fc/2 */
++#define KEQUALIZER_CF {60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000}
++// Maximum and minimum gain for the bands
++#define KEQUALIZER_G_MAX   +12.0
++#define KEQUALIZER_G_MIN   -12.0
++#define KEQUALIZER_CHANNELS_MAX 6
++
++typedef struct
++{
++    post_class_t post_class;
++    xine_t *xine;
++} kequalizer_class_t;
++
++typedef struct KEqualizerPlugin
++{
++    post_plugin_t post;
++
++    /* private data */
++    pthread_mutex_t    lock;
++    xine_post_in_t params_input;
++
++    int rate;
++    int bits;
++    double preAmp;
++    double eqBands[10];
++    //kequalizer_s kequalizer_t;
++    float   a[KEQUALIZER_KM][KEQUALIZER_L];             // A weights
++    float   b[KEQUALIZER_KM][KEQUALIZER_L];             // B weights
++    float   wq[KEQUALIZER_CHANNELS_MAX][KEQUALIZER_KM][KEQUALIZER_L];    // Circular buffer for W data
++    float   g[KEQUALIZER_CHANNELS_MAX][KEQUALIZER_KM];        // Gain factor for each channel and band
++    int     K;                    // Number of used eq bands
++    int     channels;             // Number of channels
++    /* Functions */
++    void equalize_Buffer(xine_post_t *this_gen,audio_buffer_t *buf);
++    void eq_calc_Bp2(float* a, float* b, float fc, float q);
++    void eq_calc_Gains(xine_post_t *this_gen);
++    void eq_setup_Filters(xine_post_t *this_gen);
++} kequalizer_plugin_t;
++
++/**************************************************************************
++ * parameters
++ *************************************************************************/
++
++typedef struct
++{
++    double preAmp;
++    double eqBands[10];
++} kequalizer_parameters_t;
++
++/*
++ * description of params struct
++ */
++START_PARAM_DESCR(kequalizer_parameters_t)
++
++PARAM_ITEM(POST_PARAM_TYPE_DOUBLE, preAmp, NULL, -KEQUALIZER_MAX_GAIN, KEQUALIZER_MAX_GAIN, 0, I18N_NOOP("Equalizer pre-amp gain"))
++PARAM_ITEM(POST_PARAM_TYPE_DOUBLE, eqBands[0], NULL, -KEQUALIZER_MAX_GAIN, KEQUALIZER_MAX_GAIN, 0, I18N_NOOP("Band 1 60Hz Gain"))
++PARAM_ITEM(POST_PARAM_TYPE_DOUBLE, eqBands[1], NULL, -KEQUALIZER_MAX_GAIN, KEQUALIZER_MAX_GAIN, 0, I18N_NOOP("Band 2 170Hz Gain"))
++PARAM_ITEM(POST_PARAM_TYPE_DOUBLE, eqBands[2], NULL, -KEQUALIZER_MAX_GAIN, KEQUALIZER_MAX_GAIN, 0, I18N_NOOP("Band 3 310Hz Gain"))
++PARAM_ITEM(POST_PARAM_TYPE_DOUBLE, eqBands[3], NULL, -KEQUALIZER_MAX_GAIN, KEQUALIZER_MAX_GAIN, 0, I18N_NOOP("Band 4 600Hz Gain"))
++PARAM_ITEM(POST_PARAM_TYPE_DOUBLE, eqBands[4], NULL, -KEQUALIZER_MAX_GAIN, KEQUALIZER_MAX_GAIN, 0, I18N_NOOP("Band 5 1000Hz Gain"))
++PARAM_ITEM(POST_PARAM_TYPE_DOUBLE, eqBands[5], NULL, -KEQUALIZER_MAX_GAIN, KEQUALIZER_MAX_GAIN, 0, I18N_NOOP("Band 6 3000Hz Gain"))
++PARAM_ITEM(POST_PARAM_TYPE_DOUBLE, eqBands[6], NULL, -KEQUALIZER_MAX_GAIN, KEQUALIZER_MAX_GAIN, 0, I18N_NOOP("Band 7 6000Hz Gain"))
++PARAM_ITEM(POST_PARAM_TYPE_DOUBLE, eqBands[7], NULL, -KEQUALIZER_MAX_GAIN, KEQUALIZER_MAX_GAIN, 0, I18N_NOOP("Band 8 12000Hz Gain"))
++PARAM_ITEM(POST_PARAM_TYPE_DOUBLE, eqBands[8], NULL, -KEQUALIZER_MAX_GAIN, KEQUALIZER_MAX_GAIN, 0, I18N_NOOP("Band 9 14000Hz Gain"))
++PARAM_ITEM(POST_PARAM_TYPE_DOUBLE, eqBands[9], NULL, -KEQUALIZER_MAX_GAIN, KEQUALIZER_MAX_GAIN, 0, I18N_NOOP("Band 10 16000Hz Gain"))
++
++END_PARAM_DESCR(param_descr)
++
++static int set_parameters (xine_post_t *this_gen, void *param_gen) 
++{
++    kequalizer_plugin_t *that = reinterpret_cast<kequalizer_plugin_t *>(this_gen);
++    kequalizer_parameters_t *param = static_cast<kequalizer_parameters_t *>(param_gen);
++
++    pthread_mutex_lock (&that->lock);
++    
++    that->preAmp = param->preAmp;
++    for (int i=0;i<=9;i++){
++        that->eqBands[i]=param->eqBands[i];
++    }
++  
++    that->eq_calc_Gains(this_gen);
++    
++    const char *x = "kequalizer:";
++    Phonon::Xine::debug() << Q_FUNC_INFO
++        << x
++        << param->preAmp
++        << param->eqBands[0]
++        << param->eqBands[1]
++        << param->eqBands[2]
++        << param->eqBands[3]
++        << param->eqBands[4]
++        << param->eqBands[5]
++        << param->eqBands[6]
++        << param->eqBands[7]
++        << param->eqBands[8]
++        << param->eqBands[9]
++        ;    
++    pthread_mutex_unlock (&that->lock);
++    
++    return 1;
++}
++
++static int get_parameters (xine_post_t *this_gen, void *param_gen) 
++{
++    kequalizer_plugin_t *that = reinterpret_cast<kequalizer_plugin_t *>(this_gen);
++    kequalizer_parameters_t *param = static_cast<kequalizer_parameters_t *>(param_gen);
++
++    pthread_mutex_lock (&that->lock);
++    
++    param->preAmp = that->preAmp;
++    for (int i=0;i<=9;i++){
++        param->eqBands[i]=that->eqBands[i];
++    }
++    
++    pthread_mutex_unlock (&that->lock);
++
++    return 1;
++}
++
++static xine_post_api_descr_t *get_param_descr()
++{
++    return &param_descr;
++}
++
++static char *get_help ()
++{
++    static QByteArray helpText(
++           QObject::tr("Equalizes audio using the very good IIR equalizer code by  "
++                 "Anders Johansson adopted from Audacious project.\n"
++                 "\n"
++                 "Parameters:\n"
++                 "Preamp gain - used to alter up or down all gain values\n"
++                 "10 Equalizer bands - actual IIR equalizer paameters.\n").toUtf8());
++    return helpText.data();
++}
++
++static xine_post_api_t post_api = {
++    set_parameters,
++    get_parameters,
++    get_param_descr,
++    get_help,
++};
++
++
++/**************************************************************************
++ * xine audio post plugin functions
++ *************************************************************************/
++
++static int kequalizer_port_open(xine_audio_port_t *port_gen, xine_stream_t *stream,
++                             uint32_t bits, uint32_t rate, int mode)
++{
++    post_audio_port_t *port = reinterpret_cast<post_audio_port_t *>(port_gen);
++    kequalizer_plugin_t *that = reinterpret_cast<kequalizer_plugin_t *>(port->post);
++    xine_post_t *post = reinterpret_cast<xine_post_t *>(port->post);
++
++    _x_post_rewire(&that->post);
++    _x_post_inc_usage(port);
++
++    port->stream = stream;
++    port->bits = bits;
++    port->rate = rate;
++    port->mode = mode;
++    that->rate = rate;
++    that->bits = bits;
++    
++    switch (mode) {
++    case AO_CAP_MODE_STEREO:
++        that->channels = 2;
++        break;
++    case AO_CAP_MODE_4CHANNEL:
++        that->channels = 4;
++        break;
++    case AO_CAP_MODE_4_1CHANNEL:
++    case AO_CAP_MODE_5CHANNEL:
++    case AO_CAP_MODE_5_1CHANNEL:
++        that->channels = 6;
++        break;
++    }
++    
++    that->eq_setup_Filters(post);
++    that->eq_calc_Gains(post);
++    
++    return port->original_port->open(port->original_port, stream, bits, rate, mode);
++}
++
++static void kequalizer_port_close(xine_audio_port_t *port_gen, xine_stream_t *stream)
++{
++    post_audio_port_t *port = reinterpret_cast<post_audio_port_t *>(port_gen);
++
++    port->stream = NULL;
++    port->original_port->close(port->original_port, stream);
++    _x_post_dec_usage(port);
++}
++
++static void kequalizer_port_put_buffer(xine_audio_port_t *port_gen,
++        audio_buffer_t *buf, xine_stream_t *stream)
++{
++    post_audio_port_t *port = reinterpret_cast<post_audio_port_t *>(port_gen);
++    kequalizer_plugin_t *that = reinterpret_cast<kequalizer_plugin_t *>(port->post);
++    xine_post_t *post = reinterpret_cast<xine_post_t *>(port->post);
++    
++    // Do actual equalization
++    that->equalize_Buffer(post,buf);
++    // and send the modified buffer to the original port
++    port->original_port->put_buffer(port->original_port, buf, stream);
++    return;
++}
++
++static void kequalizer_dispose(post_plugin_t *this_gen)
++{
++    kequalizer_plugin_t *that = reinterpret_cast<kequalizer_plugin_t *>(this_gen);
++
++    if (_x_post_dispose(this_gen)) {
++        pthread_mutex_destroy(&that->lock);
++        free(that);
++    }
++}
++
++/* plugin class functions */
++static post_plugin_t *kequalizer_open_plugin(post_class_t *class_gen, int inputs,
++                                          xine_audio_port_t **audio_target,
++                                          xine_video_port_t **video_target)
++{
++    Q_UNUSED(class_gen);
++    Q_UNUSED(inputs);
++    Q_UNUSED(video_target);
++    kequalizer_plugin_t *that;
++    //deprecated: kequalizer_plugin_t *that = static_cast<kequalizer_plugin_t *>(xine_xmalloc(sizeof(kequalizer_plugin_t)));
++    xine_xmalloc_aligned(2,sizeof(kequalizer_plugin_t),(void**)(&that));
++    post_in_t           *input;
++    post_out_t          *output;
++    xine_post_in_t      *input_api;
++    post_audio_port_t   *port;
++
++    // refuse to work without an audio port to decorate
++    if (!that || !audio_target || !audio_target[0]) {
++        free(that);
++        return NULL;
++    }
++
++    // creates 1 audio I/O, 0 video I/O
++    _x_post_init(&that->post, 1, 0);
++    pthread_mutex_init (&that->lock, NULL);
++
++    // init private data
++   
++    // the following call wires our plugin in front of the given audio_target
++    port = _x_post_intercept_audio_port(&that->post, audio_target[0], &input, &output);
++    // the methods of new_port are all forwarded to audio_target, overwrite a few of them here:
++    port->new_port.open       = kequalizer_port_open;
++    port->new_port.close      = kequalizer_port_close;
++    port->new_port.put_buffer = kequalizer_port_put_buffer;
++
++    // add a parameter input to the plugin
++    input_api       = &that->params_input;
++    input_api->name = "parameters";
++    input_api->type = XINE_POST_DATA_PARAMETERS;
++    input_api->data = &post_api;
++    xine_list_push_back(that->post.input, input_api);
++
++    that->post.xine_post.audio_input[0] = &port->new_port;
++
++    // our own cleanup function
++    that->post.dispose = kequalizer_dispose;
++
++    return &that->post;
++}
++
++#if XINE_MAJOR_VERSION < 1 || (XINE_MAJOR_VERSION == 1 && (XINE_MINOR_VERSION < 1 || (XINE_MINOR_VERSION == 1 && XINE_SUB_VERSION < 90)))
++#define NEED_DESCRIPTION_FUNCTION 1
++#else
++#define NEED_DESCRIPTION_FUNCTION 0
++#endif
++
++#define PLUGIN_DESCRIPTION I18N_NOOP("Fade in or fade out with different fade curves")
++#define PLUGIN_IDENTIFIER "KVolumeFader"
++
++#if NEED_DESCRIPTION_FUNCTION
++static char *kequalizer_get_identifier(post_class_t *class_gen)
++{
++    Q_UNUSED(class_gen);
++    return PLUGIN_IDENTIFIER;
++}
++
++static char *kequalizer_get_description(post_class_t *class_gen)
++{
++    Q_UNUSED(class_gen);
++    static QByteArray description(QObject::tr(PLUGIN_DESCRIPTION).toUtf8());
++    return description.data();
++}
++#endif
++
++static void kequalizer_class_dispose(post_class_t *class_gen)
++{
++    free(class_gen);
++}
++
++/* plugin class initialization function */
++void *init_kequalizer_plugin (xine_t *xine, void *)
++{
++    kequalizer_class_t *_class = static_cast<kequalizer_class_t *>(malloc(sizeof(kequalizer_class_t)));
++
++    if (!_class) {
++        return NULL;
++    }
++
++    _class->post_class.open_plugin     = kequalizer_open_plugin;
++#if NEED_DESCRIPTION_FUNCTION
++    _class->post_class.get_identifier  = kequalizer_get_identifier;
++    _class->post_class.get_description = kequalizer_get_description;
++#else
++    _class->post_class.description     = PLUGIN_DESCRIPTION;
++    _class->post_class.text_domain     = "phonon-xine";
++    _class->post_class.identifier      = PLUGIN_IDENTIFIER;
++#endif
++    _class->post_class.dispose         = kequalizer_class_dispose;
++
++    _class->xine                       = xine;
++
++    return _class;
++}
++
++/* Filter functions */
++
++// 2nd order Band-pass Filter design
++void KEqualizerPlugin::eq_calc_Bp2(float* a, float* b, float fc, float q)
++{ 
++    double th= 2.0 * M_PI * fc;
++    double C = (1.0 - tan(th*q/2.0))/(1.0 + tan(th*q/2.0));
++
++    a[0] = (1.0 + C) * cos(th);
++    a[1] = -1 * C;
++  
++    b[0] = (1.0 - C)/2.0;
++    b[1] = -1.0050;
++}
++
++void KEqualizerPlugin::eq_calc_Gains(xine_post_t *this_gen)
++{
++    kequalizer_plugin_t *that = reinterpret_cast<kequalizer_plugin_t *>(this_gen);
++    // Sanity check
++    if(that->channels<1 || that->channels>KEQUALIZER_CHANNELS_MAX)
++       return;
++    // adjust gains including preamp value
++    float b[10];
++    float adj = 0.0;
++    
++    // Get bands from config
++    for(int i = 0; i < 10; i++){
++        b[i] = that->eqBands[i] + that->preAmp;
++    }   
++    
++    for(int i = 0; i < 10; i++)
++        if(fabsf(b[i]) > fabsf(adj)) adj = b[i];
++
++    if(fabsf(adj) > KEQUALIZER_G_MAX) {
++        adj = adj > 0.0 ? KEQUALIZER_G_MAX - adj : -KEQUALIZER_G_MAX - adj;
++        for(int i = 0; i < 10; i++) b[i] += adj;
++    }
++     // Recalculate set gains to internal coeficient gains
++    for(int i=0;i<that->channels;i++){
++        
++        for(int k = 0 ; k<KEQUALIZER_KM ; k++){
++            if(b[k] > KEQUALIZER_G_MAX){
++                b[k]=KEQUALIZER_G_MAX;
++            }else if(b[k] < KEQUALIZER_G_MIN){
++                b[k]=KEQUALIZER_G_MIN;
++            }
++            that->g[i][k] = pow(10.0,b[k]/20.0)-1.0;
++       }
++    }
++}
++
++void KEqualizerPlugin::eq_setup_Filters(xine_post_t *this_gen)
++{
++    kequalizer_plugin_t *that = reinterpret_cast<kequalizer_plugin_t *>(this_gen);
++    int k =0;
++    float F[KEQUALIZER_KM] = KEQUALIZER_CF;
++
++    // Calculate number of active filters
++    that->K=KEQUALIZER_KM;
++    while(F[that->K-1] > (float)that->rate/2.2)
++      that->K--;
++    
++    if(that->K != KEQUALIZER_KM){
++        Phonon::Xine::debug() << Q_FUNC_INFO 
++        << "[kequalizer] Limiting the number of filters to" 
++        << "due to low sample rate =>"
++        << that->K;
++    }
++    // Generate filter taps
++    for(k=0;k<that->K;k++)
++      that->eq_calc_Bp2(that->a[k],that->b[k],F[k]/((float)that->rate),KEQUALIZER_Q);
++}
++
++void KEqualizerPlugin::equalize_Buffer(xine_post_t *this_gen, audio_buffer_t *buf)
++{
++    kequalizer_plugin_t *that = reinterpret_cast<kequalizer_plugin_t *>(this_gen);
++    const int bufferLength = buf->num_frames * that->channels;
++    
++    if (buf->format.bits == 16 || buf->format.bits == 0) {
++        int16_t         ci   = that->channels;            // Index for channels
++        int16_t         nch  = that->channels;             // Number of channels
++
++        while(ci--){
++        float*        g   = that->g[ci];      // Gain factor 
++        int16_t*      in  = ((int16_t*)static_cast<int16_t *>(buf->mem))+ci;
++        int16_t*      out = ((int16_t*)static_cast<int16_t *>(buf->mem))+ci;
++        int16_t*      end = in + bufferLength;//sizeof(int16_t); // Block loop end
++        
++            while(in < end){
++                  register int      k  = 0;         // Frequency band index
++                  register float    yt = *in;       // Current input sample
++                  in+=nch;
++         
++                  // Run the filters
++                  for(;k<that->K;k++){
++                        // Pointer to circular buffer wq
++                        register float* wq = that->wq[ci][k];
++                        // Calculate output from AR part of current filter
++                        register float w=yt*that->b[k][0] + wq[0]*that->a[k][0] + wq[1]*that->a[k][1];
++                        // Calculate output form MA part of current filter
++                        yt+=(w + wq[1]*that->b[k][1])*g[k];
++                        // Update circular buffer
++                        wq[1] = wq[0];
++                        wq[0] = w;
++                  }
++                  // Output data to buffer 
++                  // NOTE maybe we need to add more sophisticated convertion method from float to ine like in libSAD with dithering ??
++                  // NOTE for now this clipping have to be enough
++                  *out =  yt <= (float)32767 ? ( yt >= (float)-32768 ? (int16_t)yt : -32768 ) : 32767;
++                  out+=nch;//nch;
++                  } 
++        }
++    }else{
++        Phonon::Xine::debug() << Q_FUNC_INFO << "broken bits " << buf->format.bits;    
++    }
++}
++
++
++} // extern "C"
+--- a/xine/CMakeLists.txt
++++ b/xine/CMakeLists.txt
+@@ -72,6 +72,7 @@
+     bytestreamplugin.cpp
+     net_buf_ctrl.c
+     volumefader_plugin.cpp
++    kequalizer_plugin.cpp
+     plugins.c
+     demux_wav.c
+    )
+--- a/xine/plugins.c
++++ b/xine/plugins.c
+@@ -28,9 +28,11 @@
+ 
+ extern void *init_kbytestream_plugin (xine_t *xine, void *data);
+ extern void *init_kvolumefader_plugin (xine_t *xine, void *data);
++extern void *init_kequalizer_plugin (xine_t *xine, void *data);
+ /*extern void *init_kmixer_plugin(xine_t *xine, void *data);*/
+ 
+ static const post_info_t kvolumefader_special_info = { XINE_POST_TYPE_AUDIO_FILTER };
++static const post_info_t kequalizer_special_info = { XINE_POST_TYPE_AUDIO_FILTER };
+ /*static const post_info_t kmixer_special_info = { XINE_POST_TYPE_AUDIO_FILTER };*/
+ 
+ /*
+@@ -40,6 +42,7 @@
+     /* type, API, "name", version, special_info, init_function */
+     { PLUGIN_INPUT, 17, (char *)"KBYTESTREAM" , XINE_VERSION_CODE, NULL                      , &init_kbytestream_plugin  },
+     { PLUGIN_POST , 9 , (char *)"KVolumeFader", XINE_VERSION_CODE, &kvolumefader_special_info, &init_kvolumefader_plugin },
++    { PLUGIN_POST , 9 , (char *)"KEqualizer", XINE_VERSION_CODE, &kequalizer_special_info, &init_kequalizer_plugin },
+     /*{ PLUGIN_POST , 9 , "KMixer"      , XINE_VERSION_CODE, &kmixer_special_info      , &init_kmixer_plugin       },*/
+     { PLUGIN_NONE , 0 , (char *)""            , 0                , NULL                      , NULL                      }
+ };

Modified: trunk/packages/phonon/debian/patches/series
===================================================================
--- trunk/packages/phonon/debian/patches/series	2009-10-15 16:32:55 UTC (rev 16144)
+++ trunk/packages/phonon/debian/patches/series	2009-10-15 17:07:50 UTC (rev 16145)
@@ -2,3 +2,5 @@
 02_disable_phonon_build.diff
 03_r950739_fullscreen_hidecursor.diff
 05_924144_encoding_local_files_fix.diff
+06_983650_play_filenames_with_hash.diff
+07_feature_backport_xine_equalizer.diff




More information about the pkg-kde-commits mailing list