[SCM] audacious-plugins/master: Added ffaudio.diff patch

davromaniak-guest at users.alioth.debian.org davromaniak-guest at users.alioth.debian.org
Thu Feb 9 16:47:49 UTC 2012


The following commit has been merged in the master branch:
commit 8ceb40fa4de446977b85c5036b186da3a353d4aa
Author: Cyril Lavier <cyril.lavier at davromaniak.eu>
Date:   Thu Feb 9 17:40:34 2012 +0100

    Added ffaudio.diff patch

diff --git a/debian/patches/ffaudio.diff b/debian/patches/ffaudio.diff
new file mode 100644
index 0000000..388a3ba
--- /dev/null
+++ b/debian/patches/ffaudio.diff
@@ -0,0 +1,187 @@
+Description: Make audacious work with current unstable version of FFAUDIO
+Author: Cyril Lavier <cyril.lavier at davromaniak.eu>
+Last-Update: 2012-01-28
+--- a/configure.ac
++++ b/configure.ac
+@@ -549,7 +549,7 @@
+ 
+ if test $enable_ffaudio = yes ; then
+     PKG_CHECK_MODULES([FFMPEG],
+-     [libavcodec >= 53.40.0 libavformat >= 53.5.0 libavutil >= 50.42.0],
++     [libavcodec >= 52.64.0 libavformat >= 52.110.0 libavutil >= 50.42.0],
+      [have_ffaudio=yes], [have_ffaudio=no])
+ fi
+ 
+--- a/src/ffaudio/ffaudio-core.c
++++ b/src/ffaudio/ffaudio-core.c
+@@ -40,6 +40,14 @@
+ #endif
+ #include <libaudcore/audstrings.h>
+ 
++#if ! CHECK_LIBAVFORMAT_VERSION (53, 5, 0)
++#define avformat_find_stream_info(i, o) av_find_stream_info (i)
++#endif
++
++#if ! CHECK_LIBAVCODEC_VERSION (53, 8, 0)
++#define avcodec_open2(a, c, o) avcodec_open (a, c)
++#endif
++
+ static GMutex *ctrl_mutex = NULL;
+ static GCond *ctrl_cond = NULL;
+ static gint64 seek_value = -1;
+@@ -423,8 +431,11 @@
+     AVCodecContext *c = NULL;
+     AVStream *s = NULL;
+     AVPacket pkt = {.data = NULL};
++    guint8 *outbuf = NULL, *resbuf = NULL;
+     gint i, stream_id, errcount;
+-    gboolean codec_opened = FALSE;
++    gint in_sample_size, out_sample_size, chunk_size;
++    ReSampleContext *resctx = NULL;
++    gboolean codec_opened = FALSE, do_resampling = FALSE;
+     gint out_fmt;
+     gboolean seekable;
+     gboolean error = FALSE;
+@@ -460,14 +471,38 @@
+ 
+     codec_opened = TRUE;
+ 
++    /* Determine if audio conversion or resampling is needed */
++    in_sample_size = av_get_bytes_per_sample (c->sample_fmt);
++    out_sample_size = av_get_bytes_per_sample (SAMPLE_FMT_S16);
++
++    chunk_size = out_sample_size * c->channels * (c->sample_rate / 50);
++
++
+     switch (c->sample_fmt) {
+         case SAMPLE_FMT_U8: out_fmt = FMT_U8; break;
+         case SAMPLE_FMT_S16: out_fmt = FMT_S16_NE; break;
+         case SAMPLE_FMT_S32: out_fmt = FMT_S32_NE; break;
+         case SAMPLE_FMT_FLT: out_fmt = FMT_FLOAT; break;
+-    default:
+-        fprintf (stderr, "ffaudio: Unsupported audio format %d\n", (int) c->sample_fmt);
+-        goto error_exit;
++        default: do_resampling = TRUE; break;
++    }
++
++    if (do_resampling)
++    {
++        /* Initialize resampling context */
++        out_fmt = FMT_S16_NE;
++
++        AUDDBG("resampling needed chn=%d, rate=%d, fmt=%d -> chn=%d, rate=%d, fmt=S16NE\n",
++            c->channels, c->sample_rate, c->sample_fmt,
++            c->channels, c->sample_rate);
++
++        resctx = av_audio_resample_init(
++            c->channels, c->channels,
++            c->sample_rate, c->sample_rate,
++            SAMPLE_FMT_S16, c->sample_fmt,
++            16, 10, 0, 0.8);
++
++        if (resctx == NULL)
++            goto error_exit;
+     }
+ 
+     /* Open audio output */
+@@ -481,6 +516,10 @@
+ 
+     playback->set_gain_from_playlist(playback);
+ 
++    /* Allocate output buffer aligned to 16 byte boundary */
++    outbuf = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
++    resbuf = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
++
+     AUDDBG("setting parameters\n");
+ 
+     if (pause)
+@@ -553,6 +592,9 @@
+         memcpy(&tmp, &pkt, sizeof(tmp));
+         while (tmp.size > 0 && !stop_flag)
+         {
++            gint len, out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
++            guint8 *outbuf_p;
++
+             /* Check for seek request and bail out if we have one */
+             g_mutex_lock(ctrl_mutex);
+             if (seek_value != -1)
+@@ -570,25 +612,60 @@
+             }
+             g_mutex_unlock(ctrl_mutex);
+ 
+-            AVFrame * frame = avcodec_alloc_frame ();
+-            int decoded = 0;
+-            int len = avcodec_decode_audio4 (c, frame, & decoded, & tmp);
++            /* Decode whatever we can of the frame data */
++            len = avcodec_decode_audio3(c, (gint16 *)outbuf, &out_size, &tmp);
+ 
+             if (len < 0)
+             {
+-                fprintf (stderr, "ffaudio: decode_audio() failed, code %d\n", len);
++                AUDDBG("codec failure, breaking out of loop\n");
+                 break;
+             }
+ 
+             tmp.size -= len;
+             tmp.data += len;
+ 
+-            if (! decoded)
++            if (out_size <= 0)
+                 continue;
+ 
+-            playback->output->write_audio (frame->data[0], FMT_SIZEOF (out_fmt)
+-             * c->channels * frame->nb_samples);
+-            av_free (frame);
++            /* Perform audio resampling if necessary */
++            if (do_resampling)
++            {
++                out_size = audio_resample(resctx,
++                    (gint16 *)resbuf, (gint16 *)outbuf,
++                    out_size / in_sample_size) * out_sample_size;
++                outbuf_p = resbuf;
++            }
++            else
++                outbuf_p = outbuf;
++
++            /* Output audio in small blocks */
++            while (out_size > 0 && !stop_flag && (stop_time < 0 ||
++             playback->output->written_time () < stop_time))
++            {
++                gint writeoff = MIN (chunk_size, out_size);
++
++                playback->output->write_audio((gint16 *)outbuf_p, writeoff);
++
++                outbuf_p += writeoff;
++                out_size -= writeoff;
++
++                /* Check for seek request and bail out if we have one */
++                g_mutex_lock(ctrl_mutex);
++                if (seek_value != -1)
++                {
++                    if (!seekable)
++                    {
++                        seek_value = -1;
++                        g_cond_signal(ctrl_cond);
++                    }
++                    else
++                    {
++                        g_mutex_unlock(ctrl_mutex);
++                        break;
++                    }
++                }
++                g_mutex_unlock(ctrl_mutex);
++            }
+         }
+ 
+         if (pkt.data)
+@@ -611,6 +688,10 @@
+ 
+     stop_flag = TRUE;
+ 
++    av_free(outbuf);
++    av_free(resbuf);
++    if (resctx != NULL)
++        audio_resample_close(resctx);
+     if (pkt.data)
+         av_free_packet(&pkt);
+     if (codec_opened)

-- 
Plugins for audacious



More information about the pkg-multimedia-commits mailing list