aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ. Alexander Treuman <jat@spatialrift.net>2006-12-23 18:00:15 +0000
committerJ. Alexander Treuman <jat@spatialrift.net>2006-12-23 18:00:15 +0000
commitf30f93cb8b08ac7082116244f37b44d6d4b156bb (patch)
treeed2f8c5f702f5794fcd4c5be0c979a26b9eb6ff9
parentd4be2276a0bd866f732f29c7b0710e9d7bfca10f (diff)
downloadmpd-f30f93cb8b08ac7082116244f37b44d6d4b156bb.tar.gz
mpd-f30f93cb8b08ac7082116244f37b44d6d4b156bb.tar.xz
mpd-f30f93cb8b08ac7082116244f37b44d6d4b156bb.zip
Added gapless_mp3_playback option. Setting to "no" will disable gapless
MP3 playback, thus allowing songs that run longer than the Xing frame claims (f.e., an MP3 created by catting two MP3s together) to continue playing past the end. git-svn-id: https://svn.musicpd.org/mpd/trunk@5157 09075e82-0dd4-0310-85a5-a0d7c8717e4f
-rw-r--r--src/conf.c1
-rw-r--r--src/conf.h1
-rw-r--r--src/inputPlugins/mp3_plugin.c17
3 files changed, 17 insertions, 2 deletions
diff --git a/src/conf.c b/src/conf.c
index 0b3e0df5f..d354634ef 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -173,6 +173,7 @@ void initConf(void)
registerConfigParam(CONF_ID3V1_ENCODING, 0, 0);
registerConfigParam(CONF_METADATA_TO_USE, 0, 0);
registerConfigParam(CONF_SAVE_ABSOLUTE_PATHS, 0, 0);
+ registerConfigParam(CONF_GAPLESS_MP3_PLAYBACK, 0, 0);
}
static void addBlockParam(ConfigParam * param, char *name, char *value,
diff --git a/src/conf.h b/src/conf.h
index 166b1d4b6..7d26cadf7 100644
--- a/src/conf.h
+++ b/src/conf.h
@@ -59,6 +59,7 @@
#define CONF_ID3V1_ENCODING "id3v1_encoding"
#define CONF_METADATA_TO_USE "metadata_to_use"
#define CONF_SAVE_ABSOLUTE_PATHS "save_absolute_paths_in_playlists"
+#define CONF_GAPLESS_MP3_PLAYBACK "gapless_mp3_playback"
typedef struct _BlockParam {
char *name;
diff --git a/src/inputPlugins/mp3_plugin.c b/src/inputPlugins/mp3_plugin.c
index 4b3ab6c8c..4e37f9a1c 100644
--- a/src/inputPlugins/mp3_plugin.c
+++ b/src/inputPlugins/mp3_plugin.c
@@ -31,6 +31,7 @@
#include "../utils.h"
#include "../replayGain.h"
#include "../tag.h"
+#include "../conf.h"
#include <stdio.h>
#include <stdlib.h>
@@ -55,6 +56,10 @@
/* the number of samples of silence the decoder inserts at start */
#define DECODERDELAY 529
+#define DEFAULT_GAPLESS_MP3_PLAYBACK 1
+
+static int gaplessPlayback;
+
/* this is stolen from mpg321! */
struct audio_dither {
mad_fixed_t error[3];
@@ -113,6 +118,14 @@ static signed long audio_linear_dither(unsigned int bits, mad_fixed_t sample,
/* end of stolen stuff from mpg321 */
+static int mp3_plugin_init(void)
+{
+ gaplessPlayback = getBoolConfigParam(CONF_GAPLESS_MP3_PLAYBACK);
+ if (gaplessPlayback == -1) gaplessPlayback = DEFAULT_GAPLESS_MP3_PLAYBACK;
+ else if (gaplessPlayback < 0) exit(EXIT_FAILURE);
+ return 1;
+}
+
/* decoder stuff is based on madlld */
#define MP3_DATA_OUTPUT_BUFFER_SIZE 4096
@@ -679,7 +692,7 @@ static int decodeFirstFrame(mp3DecodeData * data, DecoderControl * dc,
data->foundXing = 1;
data->muteFrame = MUTEFRAME_SKIP;
- if (data->inStream->seekable &&
+ if (gaplessPlayback && data->inStream->seekable &&
parse_lame(&lame, &ptr, &bitlen)) {
data->dropSamplesAtStart = lame.encoderDelay + DECODERDELAY;
data->dropSamplesAtEnd = lame.encoderPadding;
@@ -1063,7 +1076,7 @@ static char *mp3_mimeTypes[] = { "audio/mpeg", NULL };
InputPlugin mp3Plugin = {
"mp3",
- NULL,
+ mp3_plugin_init,
NULL,
NULL,
mp3_decode,