mp3_plugin.c 29.7 KB
Newer Older
Warren Dukes's avatar
Warren Dukes committed
1
/* the Music Player Daemon (MPD)
2
 * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com)
Warren Dukes's avatar
Warren Dukes committed
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 * 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
 */

19
#include "../decoder_api.h"
20
#include "../conf.h"
Warren Dukes's avatar
Warren Dukes committed
21

22
#include <assert.h>
23 24 25
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
26
#include <glib.h>
Warren Dukes's avatar
Warren Dukes committed
27
#include <mad.h>
28

29 30 31
#ifdef HAVE_ID3TAG
#include <id3tag.h>
#endif
32

33
#define FRAMES_CUSHION    2000
Warren Dukes's avatar
Warren Dukes committed
34

35
#define READ_BUFFER_SIZE  40960
Warren Dukes's avatar
Warren Dukes committed
36

37 38 39 40 41 42
enum mp3_action {
	DECODE_SKIP = -3,
	DECODE_BREAK = -2,
	DECODE_CONT = -1,
	DECODE_OK = 0
};
Warren Dukes's avatar
Warren Dukes committed
43

44 45 46 47 48
enum muteframe {
	MUTEFRAME_NONE,
	MUTEFRAME_SKIP,
	MUTEFRAME_SEEK
};
49

50 51 52
/* the number of samples of silence the decoder inserts at start */
#define DECODERDELAY 529

Max Kellermann's avatar
Max Kellermann committed
53
#define DEFAULT_GAPLESS_MP3_PLAYBACK true
54

Max Kellermann's avatar
Max Kellermann committed
55
static bool gapless_playback;
56

57 58
static inline int32_t
mad_fixed_to_24_sample(mad_fixed_t sample)
Avuton Olrich's avatar
Avuton Olrich committed
59
{
Warren Dukes's avatar
Warren Dukes committed
60
	enum {
61
		bits = 24,
Warren Dukes's avatar
Warren Dukes committed
62
		MIN = -MAD_F_ONE,
Avuton Olrich's avatar
Avuton Olrich committed
63
		MAX = MAD_F_ONE - 1
Warren Dukes's avatar
Warren Dukes committed
64 65
	};

66 67
	/* round */
	sample = sample + (1L << (MAD_F_FRACBITS - bits));
Warren Dukes's avatar
Warren Dukes committed
68

69 70 71 72 73
	/* clip */
	if (sample > MAX)
		sample = MAX;
	else if (sample < MIN)
		sample = MIN;
Warren Dukes's avatar
Warren Dukes committed
74

75 76
	/* quantize */
	return sample >> (MAD_F_FRACBITS + 1 - bits);
Warren Dukes's avatar
Warren Dukes committed
77
}
Avuton Olrich's avatar
Avuton Olrich committed
78

79 80 81 82
static void
mad_fixed_to_24_buffer(int32_t *dest, const struct mad_synth *synth,
		       unsigned int start, unsigned int end,
		       unsigned int num_channels)
83
{
84
	unsigned int i, c;
85 86

	for (i = start; i < end; ++i) {
87
		for (c = 0; c < num_channels; ++c)
88
			*dest++ = mad_fixed_to_24_sample(synth->pcm.samples[c][i]);
89 90 91
	}
}

92
static bool mp3_plugin_init(void)
93
{
Max Kellermann's avatar
Max Kellermann committed
94 95 96 97
	int ret = getBoolConfigParam(CONF_GAPLESS_MP3_PLAYBACK, true);
	gapless_playback = ret != CONF_BOOL_UNSET
		? !!ret
		: DEFAULT_GAPLESS_MP3_PLAYBACK;
98
	return true;
99 100
}

101
#define MP3_DATA_OUTPUT_BUFFER_SIZE 2048
102

Max Kellermann's avatar
Max Kellermann committed
103
struct mp3_data {
Warren Dukes's avatar
Warren Dukes committed
104 105 106 107
	struct mad_stream stream;
	struct mad_frame frame;
	struct mad_synth synth;
	mad_timer_t timer;
Max Kellermann's avatar
Max Kellermann committed
108 109 110 111
	unsigned char input_buffer[READ_BUFFER_SIZE];
	int32_t output_buffer[MP3_DATA_OUTPUT_BUFFER_SIZE];
	float total_time;
	float elapsed_time;
Max Kellermann's avatar
Max Kellermann committed
112
	float seek_where;
Max Kellermann's avatar
Max Kellermann committed
113 114
	enum muteframe mute_frame;
	long *frame_offsets;
Avuton Olrich's avatar
Avuton Olrich committed
115
	mad_timer_t *times;
Max Kellermann's avatar
Max Kellermann committed
116 117 118 119 120 121 122
	unsigned long highest_frame;
	unsigned long max_frames;
	unsigned long current_frame;
	unsigned int drop_start_frames;
	unsigned int drop_end_frames;
	unsigned int drop_start_samples;
	unsigned int drop_end_samples;
Max Kellermann's avatar
Max Kellermann committed
123 124 125
	bool found_xing;
	bool found_first_frame;
	bool decoded_first_frame;
Max Kellermann's avatar
Max Kellermann committed
126
	unsigned long bit_rate;
127
	struct decoder *decoder;
Max Kellermann's avatar
Max Kellermann committed
128
	struct input_stream *input_stream;
129
	enum mad_layer layer;
Max Kellermann's avatar
Max Kellermann committed
130
};
Warren Dukes's avatar
Warren Dukes committed
131

Max Kellermann's avatar
Max Kellermann committed
132 133 134
static void
mp3_data_init(struct mp3_data *data, struct decoder *decoder,
	      struct input_stream *input_stream)
Avuton Olrich's avatar
Avuton Olrich committed
135
{
Max Kellermann's avatar
Max Kellermann committed
136 137 138 139
	data->mute_frame = MUTEFRAME_NONE;
	data->highest_frame = 0;
	data->max_frames = 0;
	data->frame_offsets = NULL;
Warren Dukes's avatar
Warren Dukes committed
140
	data->times = NULL;
Max Kellermann's avatar
Max Kellermann committed
141 142 143 144 145
	data->current_frame = 0;
	data->drop_start_frames = 0;
	data->drop_end_frames = 0;
	data->drop_start_samples = 0;
	data->drop_end_samples = 0;
Max Kellermann's avatar
Max Kellermann committed
146 147 148
	data->found_xing = false;
	data->found_first_frame = false;
	data->decoded_first_frame = false;
149
	data->decoder = decoder;
Max Kellermann's avatar
Max Kellermann committed
150
	data->input_stream = input_stream;
151
	data->layer = 0;
152

Warren Dukes's avatar
Warren Dukes committed
153
	mad_stream_init(&data->stream);
154
	mad_stream_options(&data->stream, MAD_OPTION_IGNORECRC);
Warren Dukes's avatar
Warren Dukes committed
155 156 157 158 159
	mad_frame_init(&data->frame);
	mad_synth_init(&data->synth);
	mad_timer_reset(&data->timer);
}

Max Kellermann's avatar
Max Kellermann committed
160
static bool mp3_seek(struct mp3_data *data, long offset)
Avuton Olrich's avatar
Avuton Olrich committed
161
{
Max Kellermann's avatar
Max Kellermann committed
162
	if (!input_stream_seek(data->input_stream, offset, SEEK_SET))
Max Kellermann's avatar
Max Kellermann committed
163
		return false;
164

Max Kellermann's avatar
Max Kellermann committed
165
	mad_stream_buffer(&data->stream, data->input_buffer, 0);
166
	(data->stream).error = 0;
167

Max Kellermann's avatar
Max Kellermann committed
168
	return true;
169 170
}

Max Kellermann's avatar
Max Kellermann committed
171 172
static bool
mp3_fill_buffer(struct mp3_data *data)
Avuton Olrich's avatar
Avuton Olrich committed
173
{
Max Kellermann's avatar
Max Kellermann committed
174 175 176 177 178 179 180 181 182
	size_t remaining, length;
	unsigned char *dest;

	if (data->stream.next_frame != NULL) {
		remaining = data->stream.bufend - data->stream.next_frame;
		memmove(data->input_buffer, data->stream.next_frame,
			remaining);
		dest = (data->input_buffer) + remaining;
		length = READ_BUFFER_SIZE - remaining;
Avuton Olrich's avatar
Avuton Olrich committed
183
	} else {
Max Kellermann's avatar
Max Kellermann committed
184 185 186
		remaining = 0;
		length = READ_BUFFER_SIZE;
		dest = data->input_buffer;
Warren Dukes's avatar
Warren Dukes committed
187 188
	}

189 190
	/* we've exhausted the read buffer, so give up!, these potential
	 * mp3 frames are way too big, and thus unlikely to be mp3 frames */
Max Kellermann's avatar
Max Kellermann committed
191
	if (length == 0)
Max Kellermann's avatar
Max Kellermann committed
192
		return false;
193

Max Kellermann's avatar
Max Kellermann committed
194 195
	length = decoder_read(data->decoder, data->input_stream, dest, length);
	if (length == 0)
Max Kellermann's avatar
Max Kellermann committed
196
		return false;
197

Max Kellermann's avatar
Max Kellermann committed
198 199
	mad_stream_buffer(&data->stream, data->input_buffer,
			  length + remaining);
Warren Dukes's avatar
Warren Dukes committed
200 201
	(data->stream).error = 0;

Max Kellermann's avatar
Max Kellermann committed
202
	return true;
Warren Dukes's avatar
Warren Dukes committed
203 204
}

205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
#ifdef HAVE_ID3TAG
/* Parse mp3 RVA2 frame. Shamelessly stolen from madplay. */
static int parse_rva2(struct id3_tag * tag, struct replay_gain_info * replay_gain_info)
{
	struct id3_frame const * frame;

	id3_latin1_t const *id;
	id3_byte_t const *data;
	id3_length_t length;
	int found;

	enum {
		CHANNEL_OTHER         = 0x00,
		CHANNEL_MASTER_VOLUME = 0x01,
		CHANNEL_FRONT_RIGHT   = 0x02,
		CHANNEL_FRONT_LEFT    = 0x03,
		CHANNEL_BACK_RIGHT    = 0x04,
		CHANNEL_BACK_LEFT     = 0x05,
		CHANNEL_FRONT_CENTRE  = 0x06,
		CHANNEL_BACK_CENTRE   = 0x07,
		CHANNEL_SUBWOOFER     = 0x08
	};

	found = 0;

	/* relative volume adjustment information */

	frame = id3_tag_findframe(tag, "RVA2", 0);
	if (!frame) return 0;

	id   = id3_field_getlatin1(id3_frame_field(frame, 0));
	data = id3_field_getbinarydata(id3_frame_field(frame, 1),
					&length);

	if (!id || !data) return 0;

	/*
	 * "The 'identification' string is used to identify the
	 * situation and/or device where this adjustment should apply.
	 * The following is then repeated for every channel
	 *
	 *   Type of channel         $xx
	 *   Volume adjustment       $xx xx
	 *   Bits representing peak  $xx
	 *   Peak volume             $xx (xx ...)"
	 */

	while (length >= 4) {
		unsigned int peak_bytes;

		peak_bytes = (data[3] + 7) / 8;
		if (4 + peak_bytes > length)
			break;

		if (data[0] == CHANNEL_MASTER_VOLUME) {
			signed int voladj_fixed;
			double voladj_float;

			/*
			 * "The volume adjustment is encoded as a fixed
			 * point decibel value, 16 bit signed integer
			 * representing (adjustment*512), giving +/- 64
			 * dB with a precision of 0.001953125 dB."
			 */

			voladj_fixed  = (data[1] << 8) | (data[2] << 0);
			voladj_fixed |= -(voladj_fixed & 0x8000);

			voladj_float  = (double) voladj_fixed / 512;

			replay_gain_info->tuples[REPLAY_GAIN_TRACK].peak = voladj_float;
			replay_gain_info->tuples[REPLAY_GAIN_ALBUM].peak = voladj_float;

			g_debug("parseRVA2: Relative Volume "
				"%+.1f dB adjustment (%s)\n",
				voladj_float, id);

			found = 1;
			break;
		}

		data   += 4 + peak_bytes;
		length -= 4 + peak_bytes;
	}

	return found;
}
#endif

294
#ifdef HAVE_ID3TAG
295 296
static struct replay_gain_info *
parse_id3_replay_gain_info(struct id3_tag *tag)
Avuton Olrich's avatar
Avuton Olrich committed
297
{
298
	int i;
Avuton Olrich's avatar
Avuton Olrich committed
299 300 301
	char *key;
	char *value;
	struct id3_frame *frame;
302
	bool found = false;
303
	struct replay_gain_info *replay_gain_info;
304

305
	replay_gain_info = replay_gain_info_new();
306

Avuton Olrich's avatar
Avuton Olrich committed
307 308 309
	for (i = 0; (frame = id3_tag_findframe(tag, "TXXX", i)); i++) {
		if (frame->nfields < 3)
			continue;
310

Avuton Olrich's avatar
Avuton Olrich committed
311
		key = (char *)
Avuton Olrich's avatar
Avuton Olrich committed
312 313
		    id3_ucs4_latin1duplicate(id3_field_getstring
					     (&frame->fields[1]));
Avuton Olrich's avatar
Avuton Olrich committed
314
		value = (char *)
Avuton Olrich's avatar
Avuton Olrich committed
315 316
		    id3_ucs4_latin1duplicate(id3_field_getstring
					     (&frame->fields[2]));
317

318
		if (strcasecmp(key, "replaygain_track_gain") == 0) {
319
			replay_gain_info->tuples[REPLAY_GAIN_TRACK].gain = atof(value);
320
			found = true;
321
		} else if (strcasecmp(key, "replaygain_album_gain") == 0) {
322
			replay_gain_info->tuples[REPLAY_GAIN_ALBUM].gain = atof(value);
323
			found = true;
324
		} else if (strcasecmp(key, "replaygain_track_peak") == 0) {
325
			replay_gain_info->tuples[REPLAY_GAIN_TRACK].peak = atof(value);
326
			found = true;
327
		} else if (strcasecmp(key, "replaygain_album_peak") == 0) {
328
			replay_gain_info->tuples[REPLAY_GAIN_ALBUM].peak = atof(value);
329
			found = true;
330 331 332 333 334 335
		}

		free(key);
		free(value);
	}

336 337 338 339 340
	if (!found) {
		/* fall back on RVA2 if no replaygain tags found */
		found = parse_rva2(tag, replay_gain_info);
	}

Avuton Olrich's avatar
Avuton Olrich committed
341
	if (found)
Max Kellermann's avatar
Max Kellermann committed
342
		return replay_gain_info;
343
	replay_gain_info_free(replay_gain_info);
344
	return NULL;
345
}
346
#endif
347

348
#ifdef HAVE_ID3TAG
Max Kellermann's avatar
Max Kellermann committed
349 350
static void mp3_parse_id3(struct mp3_data *data, size_t tagsize,
			  struct tag **mpd_tag,
351
			  struct replay_gain_info **replay_gain_info_r)
Avuton Olrich's avatar
Avuton Olrich committed
352
{
Max Kellermann's avatar
Max Kellermann committed
353
	struct id3_tag *id3_tag = NULL;
354 355
	id3_length_t count;
	id3_byte_t const *id3_data;
Avuton Olrich's avatar
Avuton Olrich committed
356
	id3_byte_t *allocated = NULL;
357

358 359
	count = data->stream.bufend - data->stream.this_frame;

Avuton Olrich's avatar
Avuton Olrich committed
360
	if (tagsize <= count) {
361 362
		id3_data = data->stream.this_frame;
		mad_stream_skip(&(data->stream), tagsize);
Avuton Olrich's avatar
Avuton Olrich committed
363
	} else {
364
		allocated = g_malloc(tagsize);
365 366 367
		memcpy(allocated, data->stream.this_frame, count);
		mad_stream_skip(&(data->stream), count);

Avuton Olrich's avatar
Avuton Olrich committed
368
		while (count < tagsize) {
369
			size_t len;
370

Max Kellermann's avatar
Max Kellermann committed
371
			len = decoder_read(data->decoder, data->input_stream,
Max Kellermann's avatar
Max Kellermann committed
372 373
					   allocated + count, tagsize - count);
			if (len == 0)
374
				break;
Avuton Olrich's avatar
Avuton Olrich committed
375 376
			else
				count += len;
377 378
		}

Avuton Olrich's avatar
Avuton Olrich committed
379
		if (count != tagsize) {
Max Kellermann's avatar
Max Kellermann committed
380
			g_debug("mp3_decode: error parsing ID3 tag\n");
Max Kellermann's avatar
Max Kellermann committed
381 382
			g_free(allocated);
			return;
Warren Dukes's avatar
Warren Dukes committed
383
		}
384 385 386 387

		id3_data = allocated;
	}

Max Kellermann's avatar
Max Kellermann committed
388
	id3_tag = id3_tag_parse(id3_data, tagsize);
Max Kellermann's avatar
Max Kellermann committed
389 390 391 392
	if (id3_tag == NULL) {
		g_free(allocated);
		return;
	}
393

Max Kellermann's avatar
Max Kellermann committed
394 395 396 397 398 399
	if (mpd_tag) {
		struct tag *tmp_tag = tag_id3_import(id3_tag);
		if (tmp_tag != NULL) {
			if (*mpd_tag != NULL)
				tag_free(*mpd_tag);
			*mpd_tag = tmp_tag;
400
		}
401
	}
402

Max Kellermann's avatar
Max Kellermann committed
403
	if (replay_gain_info_r) {
404 405
		struct replay_gain_info *tmp_rgi =
			parse_id3_replay_gain_info(id3_tag);
Max Kellermann's avatar
Max Kellermann committed
406 407
		if (tmp_rgi != NULL) {
			if (*replay_gain_info_r)
408
				replay_gain_info_free(*replay_gain_info_r);
Max Kellermann's avatar
Max Kellermann committed
409
			*replay_gain_info_r = tmp_rgi;
410 411 412
		}
	}

Max Kellermann's avatar
Max Kellermann committed
413
	id3_tag_delete(id3_tag);
Max Kellermann's avatar
Max Kellermann committed
414

415
	g_free(allocated);
416 417 418
}
#endif

419
static enum mp3_action
420 421
decode_next_frame_header(struct mp3_data *data, G_GNUC_UNUSED struct tag **tag,
			 G_GNUC_UNUSED struct replay_gain_info **replay_gain_info_r)
Avuton Olrich's avatar
Avuton Olrich committed
422
{
423 424
	enum mad_layer layer;

Avuton Olrich's avatar
Avuton Olrich committed
425 426
	if ((data->stream).buffer == NULL
	    || (data->stream).error == MAD_ERROR_BUFLEN) {
Max Kellermann's avatar
Max Kellermann committed
427
		if (!mp3_fill_buffer(data))
Warren Dukes's avatar
Warren Dukes committed
428 429
			return DECODE_BREAK;
	}
Avuton Olrich's avatar
Avuton Olrich committed
430
	if (mad_header_decode(&data->frame.header, &data->stream)) {
431
#ifdef HAVE_ID3TAG
Avuton Olrich's avatar
Avuton Olrich committed
432 433 434 435 436 437 438 439 440 441 442
		if ((data->stream).error == MAD_ERROR_LOSTSYNC &&
		    (data->stream).this_frame) {
			signed long tagsize = id3_tag_query((data->stream).
							    this_frame,
							    (data->stream).
							    bufend -
							    (data->stream).
							    this_frame);

			if (tagsize > 0) {
				if (tag && !(*tag)) {
Max Kellermann's avatar
Max Kellermann committed
443 444
					mp3_parse_id3(data, (size_t)tagsize,
						      tag, replay_gain_info_r);
Avuton Olrich's avatar
Avuton Olrich committed
445
				} else {
446 447 448
					mad_stream_skip(&(data->stream),
							tagsize);
				}
449 450 451
				return DECODE_CONT;
			}
		}
452
#endif
Avuton Olrich's avatar
Avuton Olrich committed
453
		if (MAD_RECOVERABLE((data->stream).error)) {
454
			return DECODE_SKIP;
Avuton Olrich's avatar
Avuton Olrich committed
455 456 457 458
		} else {
			if ((data->stream).error == MAD_ERROR_BUFLEN)
				return DECODE_CONT;
			else {
Max Kellermann's avatar
Max Kellermann committed
459 460 461
				g_warning("unrecoverable frame level error "
					  "(%s).\n",
					  mad_stream_errorstr(&data->stream));
Warren Dukes's avatar
Warren Dukes committed
462 463 464 465
				return DECODE_BREAK;
			}
		}
	}
466 467 468 469 470

	layer = data->frame.header.layer;
	if (!data->layer) {
		if (layer != MAD_LAYER_II && layer != MAD_LAYER_III) {
			/* Only layer 2 and 3 have been tested to work */
471
			return DECODE_SKIP;
472 473 474 475
		}
		data->layer = layer;
	} else if (layer != data->layer) {
		/* Don't decode frames with a different layer than the first */
476 477
		return DECODE_SKIP;
	}
Warren Dukes's avatar
Warren Dukes committed
478 479 480 481

	return DECODE_OK;
}

482
static enum mp3_action
Max Kellermann's avatar
Max Kellermann committed
483
decodeNextFrame(struct mp3_data *data)
Avuton Olrich's avatar
Avuton Olrich committed
484 485 486
{
	if ((data->stream).buffer == NULL
	    || (data->stream).error == MAD_ERROR_BUFLEN) {
Max Kellermann's avatar
Max Kellermann committed
487
		if (!mp3_fill_buffer(data))
Warren Dukes's avatar
Warren Dukes committed
488 489
			return DECODE_BREAK;
	}
Avuton Olrich's avatar
Avuton Olrich committed
490
	if (mad_frame_decode(&data->frame, &data->stream)) {
Warren Dukes's avatar
Warren Dukes committed
491
#ifdef HAVE_ID3TAG
Avuton Olrich's avatar
Avuton Olrich committed
492 493 494 495 496 497 498 499 500
		if ((data->stream).error == MAD_ERROR_LOSTSYNC) {
			signed long tagsize = id3_tag_query((data->stream).
							    this_frame,
							    (data->stream).
							    bufend -
							    (data->stream).
							    this_frame);
			if (tagsize > 0) {
				mad_stream_skip(&(data->stream), tagsize);
501 502 503
				return DECODE_CONT;
			}
		}
504
#endif
Avuton Olrich's avatar
Avuton Olrich committed
505
		if (MAD_RECOVERABLE((data->stream).error)) {
506
			return DECODE_SKIP;
Avuton Olrich's avatar
Avuton Olrich committed
507 508 509 510
		} else {
			if ((data->stream).error == MAD_ERROR_BUFLEN)
				return DECODE_CONT;
			else {
Max Kellermann's avatar
Max Kellermann committed
511 512 513
				g_warning("unrecoverable frame level error "
					  "(%s).\n",
					  mad_stream_errorstr(&data->stream));
Warren Dukes's avatar
Warren Dukes committed
514 515 516 517 518 519 520 521
				return DECODE_BREAK;
			}
		}
	}

	return DECODE_OK;
}

522
/* xing stuff stolen from alsaplayer, and heavily modified by jat */
523 524
#define XI_MAGIC (('X' << 8) | 'i')
#define NG_MAGIC (('n' << 8) | 'g')
525 526 527 528
#define IN_MAGIC (('I' << 8) | 'n')
#define FO_MAGIC (('f' << 8) | 'o')

enum xing_magic {
529
	XING_MAGIC_XING, /* VBR */
530
	XING_MAGIC_INFO  /* CBR */
531
};
Warren Dukes's avatar
Warren Dukes committed
532 533

struct xing {
534 535 536 537 538 539
	long flags;             /* valid fields (see below) */
	unsigned long frames;   /* total number of frames */
	unsigned long bytes;    /* total number of bytes */
	unsigned char toc[100]; /* 100-point seek table */
	long scale;             /* VBR quality */
	enum xing_magic magic;  /* header magic */
Warren Dukes's avatar
Warren Dukes committed
540 541 542
};

enum {
Avuton Olrich's avatar
Avuton Olrich committed
543
	XING_FRAMES = 0x00000001L,
544 545
	XING_BYTES  = 0x00000002L,
	XING_TOC    = 0x00000004L,
546
	XING_SCALE  = 0x00000008L
Warren Dukes's avatar
Warren Dukes committed
547 548
};

549
struct version {
550 551
	unsigned major;
	unsigned minor;
552 553
};

554
struct lame {
555 556 557
	char encoder[10];       /* 9 byte encoder name/version ("LAME3.97b") */
	struct version version; /* struct containing just the version */
	float peak;             /* replaygain peak */
Max Kellermann's avatar
Max Kellermann committed
558 559 560 561
	float track_gain;       /* replaygain track gain */
	float album_gain;       /* replaygain album gain */
	int encoder_delay;      /* # of added samples at start of mp3 */
	int encoder_padding;    /* # of added samples at end of mp3 */
562
	int crc;                /* CRC of the first 190 bytes of this frame */
563 564
};

Max Kellermann's avatar
Max Kellermann committed
565 566
static bool
parse_xing(struct xing *xing, struct mad_bitptr *ptr, int *oldbitlen)
Warren Dukes's avatar
Warren Dukes committed
567
{
568
	unsigned long bits;
569
	int bitlen;
570 571 572
	int bitsleft;
	int i;

573
	bitlen = *oldbitlen;
Warren Dukes's avatar
Warren Dukes committed
574

Max Kellermann's avatar
Max Kellermann committed
575 576 577
	if (bitlen < 16)
		return false;

578
	bits = mad_bit_read(ptr, 16);
579 580
	bitlen -= 16;

581
	if (bits == XI_MAGIC) {
Max Kellermann's avatar
Max Kellermann committed
582 583 584 585 586 587
		if (bitlen < 16)
			return false;

		if (mad_bit_read(ptr, 16) != NG_MAGIC)
			return false;

588
		bitlen -= 16;
589 590
		xing->magic = XING_MAGIC_XING;
	} else if (bits == IN_MAGIC) {
Max Kellermann's avatar
Max Kellermann committed
591 592 593 594 595 596
		if (bitlen < 16)
			return false;

		if (mad_bit_read(ptr, 16) != FO_MAGIC)
			return false;

597 598
		bitlen -= 16;
		xing->magic = XING_MAGIC_INFO;
599 600 601
	}
	else if (bits == NG_MAGIC) xing->magic = XING_MAGIC_XING;
	else if (bits == FO_MAGIC) xing->magic = XING_MAGIC_INFO;
Max Kellermann's avatar
Max Kellermann committed
602 603
	else
		return false;
604

Max Kellermann's avatar
Max Kellermann committed
605 606
	if (bitlen < 32)
		return false;
607
	xing->flags = mad_bit_read(ptr, 32);
608 609 610
	bitlen -= 32;

	if (xing->flags & XING_FRAMES) {
Max Kellermann's avatar
Max Kellermann committed
611 612
		if (bitlen < 32)
			return false;
613
		xing->frames = mad_bit_read(ptr, 32);
614 615 616 617
		bitlen -= 32;
	}

	if (xing->flags & XING_BYTES) {
Max Kellermann's avatar
Max Kellermann committed
618 619
		if (bitlen < 32)
			return false;
620
		xing->bytes = mad_bit_read(ptr, 32);
621 622
		bitlen -= 32;
	}
Warren Dukes's avatar
Warren Dukes committed
623

624
	if (xing->flags & XING_TOC) {
Max Kellermann's avatar
Max Kellermann committed
625 626
		if (bitlen < 800)
			return false;
627
		for (i = 0; i < 100; ++i) xing->toc[i] = mad_bit_read(ptr, 8);
628 629 630 631
		bitlen -= 800;
	}

	if (xing->flags & XING_SCALE) {
Max Kellermann's avatar
Max Kellermann committed
632 633
		if (bitlen < 32)
			return false;
634
		xing->scale = mad_bit_read(ptr, 32);
635 636 637
		bitlen -= 32;
	}

638 639
	/* Make sure we consume no less than 120 bytes (960 bits) in hopes that
	 * the LAME tag is found there, and not right after the Xing header */
640
	bitsleft = 960 - ((*oldbitlen) - bitlen);
Max Kellermann's avatar
Max Kellermann committed
641 642
	if (bitsleft < 0)
		return false;
643 644 645 646 647
	else if (bitsleft > 0) {
		mad_bit_read(ptr, bitsleft);
		bitlen -= bitsleft;
	}

648
	*oldbitlen = bitlen;
649

Max Kellermann's avatar
Max Kellermann committed
650
	return true;
Warren Dukes's avatar
Warren Dukes committed
651 652
}

Max Kellermann's avatar
Max Kellermann committed
653 654
static bool
parse_lame(struct lame *lame, struct mad_bitptr *ptr, int *bitlen)
655
{
656 657 658 659 660
	int adj = 0;
	int name;
	int orig;
	int sign;
	int gain;
661 662 663 664
	int i;

	/* Unlike the xing header, the lame tag has a fixed length.  Fail if
	 * not all 36 bytes (288 bits) are there. */
665
	if (*bitlen < 288)
Max Kellermann's avatar
Max Kellermann committed
666
		return false;
667

668 669
	for (i = 0; i < 9; i++)
		lame->encoder[i] = (char)mad_bit_read(ptr, 8);
670 671
	lame->encoder[9] = '\0';

672 673
	*bitlen -= 72;

674 675 676
	/* This is technically incorrect, since the encoder might not be lame.
	 * But there's no other way to determine if this is a lame tag, and we
	 * wouldn't want to go reading a tag that's not there. */
677
	if (!g_str_has_prefix(lame->encoder, "LAME"))
Max Kellermann's avatar
Max Kellermann committed
678
		return false;
679 680 681

	if (sscanf(lame->encoder+4, "%u.%u",
	           &lame->version.major, &lame->version.minor) != 2)
Max Kellermann's avatar
Max Kellermann committed
682
		return false;
683

Max Kellermann's avatar
Max Kellermann committed
684 685
	g_debug("detected LAME version %i.%i (\"%s\")\n",
		lame->version.major, lame->version.minor, lame->encoder);
686 687 688 689 690 691 692 693 694 695 696

	/* The reference volume was changed from the 83dB used in the
	 * ReplayGain spec to 89dB in lame 3.95.1.  Bump the gain for older
	 * versions, since everyone else uses 89dB instead of 83dB.
	 * Unfortunately, lame didn't differentiate between 3.95 and 3.95.1, so
	 * it's impossible to make the proper adjustment for 3.95.
	 * Fortunately, 3.95 was only out for about a day before 3.95.1 was
	 * released. -- tmz */
	if (lame->version.major < 3 ||
	    (lame->version.major == 3 && lame->version.minor < 95))
		adj = 6;
697 698 699

	mad_bit_read(ptr, 16);

700
	lame->peak = mad_f_todouble(mad_bit_read(ptr, 32) << 5); /* peak */
Max Kellermann's avatar
Max Kellermann committed
701
	g_debug("LAME peak found: %f\n", lame->peak);
702

Max Kellermann's avatar
Max Kellermann committed
703
	lame->track_gain = 0;
704 705 706 707 708
	name = mad_bit_read(ptr, 3); /* gain name */
	orig = mad_bit_read(ptr, 3); /* gain originator */
	sign = mad_bit_read(ptr, 1); /* sign bit */
	gain = mad_bit_read(ptr, 9); /* gain*10 */
	if (gain && name == 1 && orig != 0) {
Max Kellermann's avatar
Max Kellermann committed
709
		lame->track_gain = ((sign ? -gain : gain) / 10.0) + adj;
Max Kellermann's avatar
Max Kellermann committed
710
		g_debug("LAME track gain found: %f\n", lame->track_gain);
711
	}
712

713 714 715 716
	/* tmz reports that this isn't currently written by any version of lame
	 * (as of 3.97).  Since we have no way of testing it, don't use it.
	 * Wouldn't want to go blowing someone's ears just because we read it
	 * wrong. :P -- jat */
Max Kellermann's avatar
Max Kellermann committed
717
	lame->album_gain = 0;
718 719 720 721 722 723
#if 0
	name = mad_bit_read(ptr, 3); /* gain name */
	orig = mad_bit_read(ptr, 3); /* gain originator */
	sign = mad_bit_read(ptr, 1); /* sign bit */
	gain = mad_bit_read(ptr, 9); /* gain*10 */
	if (gain && name == 2 && orig != 0) {
Max Kellermann's avatar
Max Kellermann committed
724
		lame->album_gain = ((sign ? -gain : gain) / 10.0) + adj;
Max Kellermann's avatar
Max Kellermann committed
725
		g_debug("LAME album gain found: %f\n", lame->track_gain);
726
	}
727
#else
728
	mad_bit_read(ptr, 16);
729 730
#endif

731 732
	mad_bit_read(ptr, 16);

Max Kellermann's avatar
Max Kellermann committed
733 734
	lame->encoder_delay = mad_bit_read(ptr, 12);
	lame->encoder_padding = mad_bit_read(ptr, 12);
735

Max Kellermann's avatar
Max Kellermann committed
736
	g_debug("encoder delay is %i, encoder padding is %i\n",
Max Kellermann's avatar
Max Kellermann committed
737
	      lame->encoder_delay, lame->encoder_padding);
738

739 740 741 742 743
	mad_bit_read(ptr, 80);

	lame->crc = mad_bit_read(ptr, 16);

	*bitlen -= 216;
744

Max Kellermann's avatar
Max Kellermann committed
745
	return true;
746 747
}

748 749 750 751 752 753 754 755
static inline float
mp3_frame_duration(const struct mad_frame *frame)
{
	return mad_timer_count(frame->header.duration,
			       MAD_UNITS_MILLISECONDS) / 1000.0;
}

static off_t
756
mp3_this_frame_offset(const struct mp3_data *data)
757 758 759 760 761 762 763 764
{
	off_t offset = data->input_stream->offset;

	if (data->stream.this_frame != NULL)
		offset -= data->stream.bufend - data->stream.this_frame;
	else
		offset -= data->stream.bufend - data->stream.buffer;

765 766 767 768 769 770 771
	return offset;
}

static off_t
mp3_rest_including_this_frame(const struct mp3_data *data)
{
	return data->input_stream->size - mp3_this_frame_offset(data);
772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793
}

/**
 * Attempt to calulcate the length of the song from filesize
 */
static void
mp3_filesize_to_song_length(struct mp3_data *data)
{
	off_t rest = mp3_rest_including_this_frame(data);

	if (rest > 0) {
		float frame_duration = mp3_frame_duration(&data->frame);

		data->total_time = (rest * 8.0) / (data->frame).header.bitrate;
		data->max_frames = data->total_time / frame_duration +
			FRAMES_CUSHION;
	} else {
		data->max_frames = FRAMES_CUSHION;
		data->total_time = 0;
	}
}

Max Kellermann's avatar
Max Kellermann committed
794
static bool
Max Kellermann's avatar
Max Kellermann committed
795
mp3_decode_first_frame(struct mp3_data *data, struct tag **tag,
796
		       struct replay_gain_info **replay_gain_info_r)
797
{
Warren Dukes's avatar
Warren Dukes committed
798
	struct xing xing;
799
	struct lame lame;
800 801
	struct mad_bitptr ptr;
	int bitlen;
802
	enum mp3_action ret;
Warren Dukes's avatar
Warren Dukes committed
803

804 805 806
	/* stfu gcc */
	memset(&xing, 0, sizeof(struct xing));
	xing.flags = 0;
807

Max Kellermann's avatar
Max Kellermann committed
808
	while (true) {
809 810 811 812 813
		do {
			ret = decode_next_frame_header(data, tag,
						       replay_gain_info_r);
		} while (ret == DECODE_CONT);
		if (ret == DECODE_BREAK)
Max Kellermann's avatar
Max Kellermann committed
814
			return false;
815
		if (ret == DECODE_SKIP) continue;
816

817 818 819 820
		do {
			ret = decodeNextFrame(data);
		} while (ret == DECODE_CONT);
		if (ret == DECODE_BREAK)
Max Kellermann's avatar
Max Kellermann committed
821
			return false;
822
		if (ret == DECODE_OK) break;
Avuton Olrich's avatar
Avuton Olrich committed
823 824
	}

825 826 827
	ptr = data->stream.anc_ptr;
	bitlen = data->stream.anc_bitlen;

828 829
	mp3_filesize_to_song_length(data);

830 831 832
	/*
	 * if an xing tag exists, use that!
	 */
833
	if (parse_xing(&xing, &ptr, &bitlen)) {
Max Kellermann's avatar
Max Kellermann committed
834
		data->found_xing = true;
Max Kellermann's avatar
Max Kellermann committed
835
		data->mute_frame = MUTEFRAME_SKIP;
836

837
		if ((xing.flags & XING_FRAMES) && xing.frames) {
Warren Dukes's avatar
Warren Dukes committed
838
			mad_timer_t duration = data->frame.header.duration;
Avuton Olrich's avatar
Avuton Olrich committed
839
			mad_timer_multiply(&duration, xing.frames);
Max Kellermann's avatar
Max Kellermann committed
840 841
			data->total_time = ((float)mad_timer_count(duration, MAD_UNITS_MILLISECONDS)) / 1000;
			data->max_frames = xing.frames;
Warren Dukes's avatar
Warren Dukes committed
842
		}
843 844

		if (parse_lame(&lame, &ptr, &bitlen)) {
Max Kellermann's avatar
Max Kellermann committed
845 846 847
			if (gapless_playback &&
			    data->input_stream->seekable) {
				data->drop_start_samples = lame.encoder_delay +
848
				                           DECODERDELAY;
Max Kellermann's avatar
Max Kellermann committed
849
				data->drop_end_samples = lame.encoder_padding;
850 851 852 853
			}

			/* Album gain isn't currently used.  See comment in
			 * parse_lame() for details. -- jat */
Max Kellermann's avatar
Max Kellermann committed
854 855
			if (replay_gain_info_r && !*replay_gain_info_r &&
			    lame.track_gain) {
856
				*replay_gain_info_r = replay_gain_info_new();
857 858
				(*replay_gain_info_r)->tuples[REPLAY_GAIN_TRACK].gain = lame.track_gain;
				(*replay_gain_info_r)->tuples[REPLAY_GAIN_TRACK].peak = lame.peak;
859 860
			}
		}
861
	} 
Warren Dukes's avatar
Warren Dukes committed
862

Max Kellermann's avatar
Max Kellermann committed
863 864
	if (!data->max_frames)
		return false;
865

Max Kellermann's avatar
Max Kellermann committed
866
	if (data->max_frames > 8 * 1024 * 1024) {
Max Kellermann's avatar
Max Kellermann committed
867 868
		g_warning("mp3 file header indicates too many frames: %lu\n",
			  data->max_frames);
Max Kellermann's avatar
Max Kellermann committed
869
		return false;
870 871
	}

872 873
	data->frame_offsets = g_malloc(sizeof(long) * data->max_frames);
	data->times = g_malloc(sizeof(mad_timer_t) * data->max_frames);
Warren Dukes's avatar
Warren Dukes committed
874

Max Kellermann's avatar
Max Kellermann committed
875
	return true;
Warren Dukes's avatar
Warren Dukes committed
876 877
}

Max Kellermann's avatar
Max Kellermann committed
878
static void mp3_data_finish(struct mp3_data *data)
Avuton Olrich's avatar
Avuton Olrich committed
879
{
Warren Dukes's avatar
Warren Dukes committed
880 881 882 883
	mad_synth_finish(&data->synth);
	mad_frame_finish(&data->frame);
	mad_stream_finish(&data->stream);

884 885
	g_free(data->frame_offsets);
	g_free(data->times);
Warren Dukes's avatar
Warren Dukes committed
886 887 888
}

/* this is primarily used for getting total time for tags */
889
static int mp3_total_file_time(const char *file)
Avuton Olrich's avatar
Avuton Olrich committed
890
{
Max Kellermann's avatar
Max Kellermann committed
891 892
	struct input_stream input_stream;
	struct mp3_data data;
Warren Dukes's avatar
Warren Dukes committed
893 894
	int ret;

Max Kellermann's avatar
Max Kellermann committed
895
	if (!input_stream_open(&input_stream, file))
Avuton Olrich's avatar
Avuton Olrich committed
896
		return -1;
Max Kellermann's avatar
Max Kellermann committed
897
	mp3_data_init(&data, NULL, &input_stream);
Max Kellermann's avatar
Max Kellermann committed
898
	if (!mp3_decode_first_frame(&data, NULL, NULL))
Avuton Olrich's avatar
Avuton Olrich committed
899 900
		ret = -1;
	else
Max Kellermann's avatar
Max Kellermann committed
901 902 903
		ret = data.total_time + 0.5;
	mp3_data_finish(&data);
	input_stream_close(&input_stream);
Warren Dukes's avatar
Warren Dukes committed
904 905 906 907

	return ret;
}

Max Kellermann's avatar
Max Kellermann committed
908
static bool
Max Kellermann's avatar
Max Kellermann committed
909 910
mp3_open(struct input_stream *is, struct mp3_data *data,
	 struct decoder *decoder, struct tag **tag,
911
	 struct replay_gain_info **replay_gain_info_r)
912
{
Max Kellermann's avatar
Max Kellermann committed
913
	mp3_data_init(data, decoder, is);
914
	*tag = NULL;
Max Kellermann's avatar
Max Kellermann committed
915
	if (!mp3_decode_first_frame(data, tag, replay_gain_info_r)) {
Max Kellermann's avatar
Max Kellermann committed
916
		mp3_data_finish(data);
Avuton Olrich's avatar
Avuton Olrich committed
917
		if (tag && *tag)
918
			tag_free(*tag);
Max Kellermann's avatar
Max Kellermann committed
919
		return false;
Warren Dukes's avatar
Warren Dukes committed
920 921
	}

Max Kellermann's avatar
Max Kellermann committed
922
	return true;
Warren Dukes's avatar
Warren Dukes committed
923 924
}

925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940
static long
mp3_time_to_frame(const struct mp3_data *data, double t)
{
	unsigned long i;

	for (i = 0; i < data->highest_frame; ++i) {
		double frame_time =
			mad_timer_count(data->times[i],
					MAD_UNITS_MILLISECONDS) / 1000.;
		if (frame_time >= t)
			break;
	}

	return i;
}

941 942
static void
mp3_update_timer_next_frame(struct mp3_data *data)
Avuton Olrich's avatar
Avuton Olrich committed
943
{
Max Kellermann's avatar
Max Kellermann committed
944
	if (data->current_frame >= data->highest_frame) {
945 946 947
		/* record this frame's properties in
		   data->frame_offsets (for seeking) and
		   data->times */
Max Kellermann's avatar
Max Kellermann committed
948
		data->bit_rate = (data->frame).header.bitrate;
949 950 951

		if (data->current_frame >= data->max_frames)
			/* cap data->current_frame */
Max Kellermann's avatar
Max Kellermann committed
952
			data->current_frame = data->max_frames - 1;
953
		else
Max Kellermann's avatar
Max Kellermann committed
954
			data->highest_frame++;
955

956 957
		data->frame_offsets[data->current_frame] =
			mp3_this_frame_offset(data);
958 959

		mad_timer_add(&data->timer, (data->frame).header.duration);
Max Kellermann's avatar
Max Kellermann committed
960
		data->times[data->current_frame] = data->timer;
961 962
	} else
		/* get the new timer value from data->times */
Max Kellermann's avatar
Max Kellermann committed
963
		data->timer = data->times[data->current_frame];
964

Max Kellermann's avatar
Max Kellermann committed
965 966
	data->current_frame++;
	data->elapsed_time =
967 968 969
		mad_timer_count(data->timer, MAD_UNITS_MILLISECONDS) / 1000.0;
}

970 971 972 973 974
/**
 * Sends the synthesized current frame via decoder_data().
 */
static enum decoder_command
mp3_send_pcm(struct mp3_data *data, unsigned i, unsigned pcm_length,
975
	     struct replay_gain_info *replay_gain_info)
976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002
{
	unsigned max_samples;

	max_samples = sizeof(data->output_buffer) /
		sizeof(data->output_buffer[0]) /
		MAD_NCHANNELS(&(data->frame).header);

	while (i < pcm_length) {
		enum decoder_command cmd;
		unsigned int num_samples = pcm_length - i;
		if (num_samples > max_samples)
			num_samples = max_samples;

		i += num_samples;

		mad_fixed_to_24_buffer(data->output_buffer,
				       &data->synth,
				       i - num_samples, i,
				       MAD_NCHANNELS(&(data->frame).header));
		num_samples *= MAD_NCHANNELS(&(data->frame).header);

		cmd = decoder_data(data->decoder, data->input_stream,
				   data->output_buffer,
				   sizeof(data->output_buffer[0]) * num_samples,
				   data->elapsed_time,
				   data->bit_rate / 1000,
				   replay_gain_info);
1003
		if (cmd != DECODE_COMMAND_NONE)
1004 1005 1006 1007 1008 1009
			return cmd;
	}

	return DECODE_COMMAND_NONE;
}

1010 1011 1012 1013
/**
 * Synthesize the current frame and send it via decoder_data().
 */
static enum decoder_command
1014 1015
mp3_synth_and_send(struct mp3_data *data,
		   struct replay_gain_info *replay_gain_info)
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056
{
	unsigned i, pcm_length;
	enum decoder_command cmd;

	mad_synth_frame(&data->synth, &data->frame);

	if (!data->found_first_frame) {
		unsigned int samples_per_frame = data->synth.pcm.length;
		data->drop_start_frames = data->drop_start_samples / samples_per_frame;
		data->drop_end_frames = data->drop_end_samples / samples_per_frame;
		data->drop_start_samples = data->drop_start_samples % samples_per_frame;
		data->drop_end_samples = data->drop_end_samples % samples_per_frame;
		data->found_first_frame = true;
	}

	if (data->drop_start_frames > 0) {
		data->drop_start_frames--;
		return DECODE_COMMAND_NONE;
	} else if ((data->drop_end_frames > 0) &&
		   (data->current_frame == (data->max_frames + 1 - data->drop_end_frames))) {
		/* stop decoding, effectively dropping all remaining
		   frames */
		return DECODE_COMMAND_STOP;
	}

	if (!data->decoded_first_frame) {
		i = data->drop_start_samples;
		data->decoded_first_frame = true;
	} else
		i = 0;

	pcm_length = data->synth.pcm.length;
	if (data->drop_end_samples &&
	    (data->current_frame == data->max_frames - data->drop_end_frames)) {
		if (data->drop_end_samples >= pcm_length)
			pcm_length = 0;
		else
			pcm_length -= data->drop_end_samples;
	}

	cmd = mp3_send_pcm(data, i, pcm_length, replay_gain_info);
1057
	if (cmd != DECODE_COMMAND_NONE)
1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068
		return cmd;

	if (data->drop_end_samples &&
	    (data->current_frame == data->max_frames - data->drop_end_frames))
		/* stop decoding, effectively dropping
		 * all remaining samples */
		return DECODE_COMMAND_STOP;

	return DECODE_COMMAND_NONE;
}

1069
static bool
1070
mp3_read(struct mp3_data *data, struct replay_gain_info **replay_gain_info_r)
1071 1072
{
	struct decoder *decoder = data->decoder;
1073
	enum mp3_action ret;
1074
	enum decoder_command cmd;
1075 1076

	mp3_update_timer_next_frame(data);
Warren Dukes's avatar
Warren Dukes committed
1077

Max Kellermann's avatar
Max Kellermann committed
1078
	switch (data->mute_frame) {
Avuton Olrich's avatar
Avuton Olrich committed
1079
	case MUTEFRAME_SKIP:
Max Kellermann's avatar
Max Kellermann committed
1080
		data->mute_frame = MUTEFRAME_NONE;
Avuton Olrich's avatar
Avuton Olrich committed
1081 1082
		break;
	case MUTEFRAME_SEEK:
Max Kellermann's avatar
Max Kellermann committed
1083
		if (data->elapsed_time >= data->seek_where)
Max Kellermann's avatar
Max Kellermann committed
1084
			data->mute_frame = MUTEFRAME_NONE;
Avuton Olrich's avatar
Avuton Olrich committed
1085
		break;
1086
	case MUTEFRAME_NONE:
1087 1088 1089
		cmd = mp3_synth_and_send(data,
					 replay_gain_info_r != NULL
					 ? *replay_gain_info_r : NULL);
1090
		if (cmd == DECODE_COMMAND_SEEK) {
1091
			unsigned long j;
1092 1093 1094

			assert(data->input_stream->seekable);

1095 1096
			j = mp3_time_to_frame(data,
					      decoder_seek_where(decoder));
Max Kellermann's avatar
Max Kellermann committed
1097
			if (j < data->highest_frame) {
Max Kellermann's avatar
Max Kellermann committed
1098
				if (mp3_seek(data, data->frame_offsets[j])) {
Max Kellermann's avatar
Max Kellermann committed
1099
					data->current_frame = j;
1100
					decoder_command_finished(decoder);
Avuton Olrich's avatar
Avuton Olrich committed
1101
				} else
1102
					decoder_seek_error(decoder);
Max Kellermann's avatar
Max Kellermann committed
1103 1104
			} else {
				data->seek_where = decoder_seek_where(decoder);
1105
				data->mute_frame = MUTEFRAME_SEEK;
Max Kellermann's avatar
Max Kellermann committed
1106 1107
				decoder_command_finished(decoder);
			}
1108 1109
		} else if (cmd != DECODE_COMMAND_NONE)
			return false;
Warren Dukes's avatar
Warren Dukes committed
1110 1111
	}

Max Kellermann's avatar
Max Kellermann committed
1112
	while (true) {
1113 1114
		bool skip = false;

1115
		do {
1116 1117 1118
			struct tag *tag = NULL;

			ret = decode_next_frame_header(data, &tag,
1119
						       replay_gain_info_r);
1120 1121 1122 1123 1124

			if (tag != NULL) {
				decoder_tag(decoder, data->input_stream, tag);
				tag_free(tag);
			}
1125 1126
		} while (ret == DECODE_CONT);
		if (ret == DECODE_BREAK)
1127
			return false;
Avuton Olrich's avatar
Avuton Olrich committed
1128
		else if (ret == DECODE_SKIP)
1129
			skip = true;
1130

Max Kellermann's avatar
Max Kellermann committed
1131
		if (data->mute_frame == MUTEFRAME_NONE) {
1132 1133 1134 1135
			do {
				ret = decodeNextFrame(data);
			} while (ret == DECODE_CONT);
			if (ret == DECODE_BREAK)
1136
				return false;
Warren Dukes's avatar
Warren Dukes committed
1137
		}
1138

Avuton Olrich's avatar
Avuton Olrich committed
1139 1140
		if (!skip && ret == DECODE_OK)
			break;
Warren Dukes's avatar
Warren Dukes committed
1141
	}
Warren Dukes's avatar
Warren Dukes committed
1142

1143
	return ret != DECODE_BREAK;
Warren Dukes's avatar
Warren Dukes committed
1144 1145
}

Max Kellermann's avatar
Max Kellermann committed
1146
static void mp3_audio_format(struct mp3_data *data, struct audio_format *af)
Avuton Olrich's avatar
Avuton Olrich committed
1147
{
1148
	af->bits = 24;
1149
	af->sample_rate = (data->frame).header.samplerate;
Warren Dukes's avatar
Warren Dukes committed
1150 1151 1152
	af->channels = MAD_NCHANNELS(&(data->frame).header);
}

1153
static void
Max Kellermann's avatar
Max Kellermann committed
1154
mp3_decode(struct decoder *decoder, struct input_stream *input_stream)
Avuton Olrich's avatar
Avuton Olrich committed
1155
{
Max Kellermann's avatar
Max Kellermann committed
1156
	struct mp3_data data;
1157
	struct tag *tag = NULL;
1158
	struct replay_gain_info *replay_gain_info = NULL;
1159
	struct audio_format audio_format;
1160

Max Kellermann's avatar
Max Kellermann committed
1161
	if (!mp3_open(input_stream, &data, decoder, &tag, &replay_gain_info)) {
1162
		if (decoder_get_command(decoder) == DECODE_COMMAND_NONE)
Max Kellermann's avatar
Max Kellermann committed
1163
			g_warning
Avuton Olrich's avatar
Avuton Olrich committed
1164
			    ("Input does not appear to be a mp3 bit stream.\n");
1165
		return;
Warren Dukes's avatar
Warren Dukes committed
1166 1167
	}

Max Kellermann's avatar
Max Kellermann committed
1168
	mp3_audio_format(&data, &audio_format);
Avuton Olrich's avatar
Avuton Olrich committed
1169

1170 1171
	decoder_initialized(decoder, &audio_format,
			    data.input_stream->seekable, data.total_time);
Warren Dukes's avatar
Warren Dukes committed
1172

1173 1174 1175 1176 1177
	if (tag != NULL) {
		decoder_tag(decoder, input_stream, tag);
		tag_free(tag);
	}

1178
	while (mp3_read(&data, &replay_gain_info)) ;
Warren Dukes's avatar
Warren Dukes committed
1179

Max Kellermann's avatar
Max Kellermann committed
1180
	if (replay_gain_info)
1181
		replay_gain_info_free(replay_gain_info);
1182

1183
	if (decoder_get_command(decoder) == DECODE_COMMAND_SEEK &&
1184
	    data.mute_frame == MUTEFRAME_SEEK)
1185
		decoder_command_finished(decoder);
1186

Max Kellermann's avatar
Max Kellermann committed
1187
	mp3_data_finish(&data);
Warren Dukes's avatar
Warren Dukes committed
1188 1189
}

1190
static struct tag *mp3_tag_dup(const char *file)
Avuton Olrich's avatar
Avuton Olrich committed
1191
{
1192
	struct tag *ret = NULL;
Max Kellermann's avatar
Max Kellermann committed
1193
	int total_time;
Warren Dukes's avatar
Warren Dukes committed
1194

1195
	ret = tag_id3_load(file);
Warren Dukes's avatar
Warren Dukes committed
1196

Max Kellermann's avatar
Max Kellermann committed
1197
	total_time = mp3_total_file_time(file);
Max Kellermann's avatar
Max Kellermann committed
1198
	if (total_time >= 0) {
Avuton Olrich's avatar
Avuton Olrich committed
1199
		if (!ret)
1200
			ret = tag_new();
Max Kellermann's avatar
Max Kellermann committed
1201
		ret->time = total_time;
Avuton Olrich's avatar
Avuton Olrich committed
1202
	} else {
Max Kellermann's avatar
Max Kellermann committed
1203 1204
		g_debug("mp3_tag_dup: Failed to get total song time from: %s\n",
			file);
1205
	}
Warren Dukes's avatar
Warren Dukes committed
1206 1207 1208 1209

	return ret;
}

1210 1211
static const char *const mp3_suffixes[] = { "mp3", "mp2", NULL };
static const char *const mp3_mime_types[] = { "audio/mpeg", NULL };
Warren Dukes's avatar
Warren Dukes committed
1212

1213
const struct decoder_plugin mp3Plugin = {
1214 1215 1216
	.name = "mp3",
	.init = mp3_plugin_init,
	.stream_decode = mp3_decode,
Max Kellermann's avatar
Max Kellermann committed
1217
	.tag_dup = mp3_tag_dup,
1218
	.suffixes = mp3_suffixes,
Max Kellermann's avatar
Max Kellermann committed
1219
	.mime_types = mp3_mime_types
Warren Dukes's avatar
Warren Dukes committed
1220
};