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
This commit is contained in:
J. Alexander Treuman 2006-12-23 18:00:15 +00:00
parent d4be2276a0
commit f30f93cb8b
3 changed files with 17 additions and 2 deletions

View File

@ -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,

View File

@ -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;

View File

@ -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,