From f30f93cb8b08ac7082116244f37b44d6d4b156bb Mon Sep 17 00:00:00 2001 From: "J. Alexander Treuman" Date: Sat, 23 Dec 2006 18:00:15 +0000 Subject: 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 --- src/conf.c | 1 + src/conf.h | 1 + src/inputPlugins/mp3_plugin.c | 17 +++++++++++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) (limited to 'src') 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 #include @@ -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, -- cgit v1.2.3