decode.c should be a lot smaller; start by moving all code which
handles cross-fading to crossfade.c.  Also includes camelCase
conversion.
---

 src/Makefile.am |    2 ++
 src/crossfade.c |   62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/crossfade.h |   34 ++++++++++++++++++++++++++++++
 src/decode.c    |   59 +++++++++-------------------------------------------
 4 files changed, 108 insertions(+), 49 deletions(-)
 create mode 100644 src/crossfade.c
 create mode 100644 src/crossfade.h

diff --git a/src/Makefile.am b/src/Makefile.am
index 216261a..b097e90 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -38,6 +38,7 @@ mpd_headers = \
        command.h \
        condition.h \
        conf.h \
+       crossfade.h \
        dbUtils.h \
        decode.h \
        decoder_api.h \
@@ -102,6 +103,7 @@ mpd_SOURCES = \
        command.c \
        condition.c \
        conf.c \
+       crossfade.c \
        dbUtils.c \
        decode.c \
        decoder_api.c \
diff --git a/src/crossfade.c b/src/crossfade.c
new file mode 100644
index 0000000..bf5fa53
--- /dev/null
+++ b/src/crossfade.c
@@ -0,0 +1,62 @@
+/* the Music Player Daemon (MPD)
+ * Copyright (C) 2003-2007 by Warren Dukes ([EMAIL PROTECTED])
+ * Copyright (C) 2008 Max Kellermann <[EMAIL PROTECTED]>
+ * This project's homepage is: http://www.musicpd.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.
+ *
+ * This program 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 General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "crossfade.h"
+#include "audio.h"
+#include "pcm_utils.h"
+
+unsigned cross_fade_calc(float duration, float total_time,
+                        const AudioFormat * af,
+                        unsigned max_chunks)
+{
+       unsigned int chunks;
+
+       if (duration <= 0 || duration >= total_time ||
+           !isCurrentAudioFormat(af))
+               return 0;
+
+       assert(duration > 0);
+       assert(af->bits > 0);
+       assert(af->channels > 0);
+       assert(af->sampleRate > 0);
+
+       chunks = audio_format_time_to_size(af) / CHUNK_SIZE;
+       chunks = (chunks * duration + 0.5);
+
+       if (chunks > max_chunks)
+               chunks = max_chunks;
+
+       return chunks;
+}
+
+void cross_fade_apply(ob_chunk * a, const ob_chunk * b,
+                     const AudioFormat * format,
+                     unsigned int current_chunk, unsigned int num_chunks)
+{
+       assert(current_chunk <= num_chunks);
+
+       pcm_mix(a->data,
+               b->data,
+               a->chunkSize,
+               b->chunkSize,
+               format,
+               ((float)current_chunk) / num_chunks);
+       if (b->chunkSize > a->chunkSize)
+               a->chunkSize = b->chunkSize;
+}
diff --git a/src/crossfade.h b/src/crossfade.h
new file mode 100644
index 0000000..544418e
--- /dev/null
+++ b/src/crossfade.h
@@ -0,0 +1,34 @@
+/* the Music Player Daemon (MPD)
+ * Copyright (C) 2003-2007 by Warren Dukes ([EMAIL PROTECTED])
+ * Copyright (C) 2008 Max Kellermann <[EMAIL PROTECTED]>
+ * This project's homepage is: http://www.musicpd.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.
+ *
+ * This program 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 General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef CROSSFADE_H
+#define CROSSFADE_H
+
+#include "audio_format.h"
+#include "outputBuffer.h"
+
+unsigned cross_fade_calc(float duration, float total_time,
+                        const AudioFormat * af,
+                        unsigned max_chunks);
+
+void cross_fade_apply(ob_chunk * a, const ob_chunk * b,
+                     const AudioFormat * format,
+                     unsigned int current_chunk, unsigned int num_chunks);
+
+#endif
diff --git a/src/decode.c b/src/decode.c
index f0c13f7..8d929d0 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -27,6 +27,7 @@
 #include "ls.h"
 #include "main_notify.h"
 #include "audio.h"
+#include "crossfade.h"
 
 enum xfade_state {
        XFADE_DISABLED = -1,
@@ -64,29 +65,6 @@ static void quitDecode(void)
        wakeup_main_task();
 }
 
-static unsigned calculateCrossFadeChunks(AudioFormat * af,
-                                        float totalTime, unsigned max_chunks)
-{
-       unsigned int chunks;
-
-       if (pc.crossFade == 0 || pc.crossFade >= totalTime ||
-           !isCurrentAudioFormat(af))
-               return 0;
-
-       assert(pc.crossFade > 0);
-       assert(af->bits > 0);
-       assert(af->channels > 0);
-       assert(af->sampleRate > 0);
-
-       chunks = audio_format_time_to_size(af) / CHUNK_SIZE;
-       chunks = (chunks * pc.crossFade + 0.5);
-
-       if (chunks > max_chunks)
-               chunks = max_chunks;
-
-       return chunks;
-}
-
 static int waitOnDecode(int *decodeWaitedOn)
 {
        while (dc.command == DECODE_COMMAND_START) {
@@ -360,23 +338,6 @@ void decoderInit(void)
                FATAL("Failed to spawn decoder task: %s\n", strerror(errno));
 }
 
-static void crossFade(ob_chunk * a, ob_chunk * b,
-                     AudioFormat * format,
-                     unsigned int fadePosition, unsigned int crossFadeChunks)
-{
-       assert(fadePosition <= crossFadeChunks);
-
-       pcm_mix(a->data,
-               b->data,
-               a->chunkSize,
-               b->chunkSize,
-               format,
-               ((float)fadePosition) /
-               crossFadeChunks);
-       if (b->chunkSize > a->chunkSize)
-               a->chunkSize = b->chunkSize;
-}
-
 static int playChunk(ob_chunk * chunk,
                     const AudioFormat * format, double sizeToTime)
 {
@@ -498,10 +459,10 @@ static void decodeParent(void)
                           calculate how many chunks will be required
                           for it */
                        crossFadeChunks =
-                               calculateCrossFadeChunks(&(ob.audioFormat),
-                                                        dc.totalTime,
-                                                        ob.size -
-                                                        buffered_before_play);
+                               cross_fade_calc(pc.crossFade, dc.totalTime,
+                                               &(ob.audioFormat),
+                                               ob.size -
+                                               buffered_before_play);
                        if (crossFadeChunks > 0) {
                                do_xfade = XFADE_ENABLED;
                                nextChunk = -1;
@@ -531,11 +492,11 @@ static void decodeParent(void)
                                nextChunk = ob_absolute(crossFadeChunks);
                                if (nextChunk >= 0) {
                                        ob_set_lazy(1);
-                                       crossFade(beginChunk,
-                                                 ob_get_chunk(nextChunk),
-                                                 &(ob.audioFormat),
-                                                 fadePosition,
-                                                 crossFadeChunks);
+                                       cross_fade_apply(beginChunk,
+                                                        
ob_get_chunk(nextChunk),
+                                                        &(ob.audioFormat),
+                                                        fadePosition,
+                                                        crossFadeChunks);
                                } else {
                                        /* there are not enough
                                           decoded chunks yet */


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Musicpd-dev-team mailing list
Musicpd-dev-team@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/musicpd-dev-team

Reply via email to