MP3 Player. You can change fwd/rev speed and skip. see: http://mbed.org/users/okini3939/notebook/lpc4088_madplayer/

Dependencies:   I2SSlave SDFileSystem TLV320 mbed

Committer:
okini3939
Date:
Tue Feb 18 00:22:50 2014 +0000
Revision:
0:8ba6230eefbd
1st build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:8ba6230eefbd 1 /*
okini3939 0:8ba6230eefbd 2 * libmad - MPEG audio decoder library
okini3939 0:8ba6230eefbd 3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
okini3939 0:8ba6230eefbd 4 *
okini3939 0:8ba6230eefbd 5 * This program is free software; you can redistribute it and/or modify
okini3939 0:8ba6230eefbd 6 * it under the terms of the GNU General Public License as published by
okini3939 0:8ba6230eefbd 7 * the Free Software Foundation; either version 2 of the License, or
okini3939 0:8ba6230eefbd 8 * (at your option) any later version.
okini3939 0:8ba6230eefbd 9 *
okini3939 0:8ba6230eefbd 10 * This program is distributed in the hope that it will be useful,
okini3939 0:8ba6230eefbd 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
okini3939 0:8ba6230eefbd 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
okini3939 0:8ba6230eefbd 13 * GNU General Public License for more details.
okini3939 0:8ba6230eefbd 14 *
okini3939 0:8ba6230eefbd 15 * You should have received a copy of the GNU General Public License
okini3939 0:8ba6230eefbd 16 * along with this program; if not, write to the Free Software
okini3939 0:8ba6230eefbd 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
okini3939 0:8ba6230eefbd 18 *
okini3939 0:8ba6230eefbd 19 * $Id: stream.c,v 1.1 2010/11/23 20:12:57 andy Exp $
okini3939 0:8ba6230eefbd 20 */
okini3939 0:8ba6230eefbd 21
okini3939 0:8ba6230eefbd 22 # include "config.h"
okini3939 0:8ba6230eefbd 23
okini3939 0:8ba6230eefbd 24 # include "global.h"
okini3939 0:8ba6230eefbd 25
okini3939 0:8ba6230eefbd 26 # include <stdlib.h>
okini3939 0:8ba6230eefbd 27
okini3939 0:8ba6230eefbd 28 # include "bit.h"
okini3939 0:8ba6230eefbd 29 # include "stream.h"
okini3939 0:8ba6230eefbd 30
okini3939 0:8ba6230eefbd 31 /*
okini3939 0:8ba6230eefbd 32 * NAME: stream->init()
okini3939 0:8ba6230eefbd 33 * DESCRIPTION: initialize stream struct
okini3939 0:8ba6230eefbd 34 */
okini3939 0:8ba6230eefbd 35 void mad_stream_init(struct mad_stream *stream)
okini3939 0:8ba6230eefbd 36 {
okini3939 0:8ba6230eefbd 37 stream->buffer = 0;
okini3939 0:8ba6230eefbd 38 stream->bufend = 0;
okini3939 0:8ba6230eefbd 39 stream->skiplen = 0;
okini3939 0:8ba6230eefbd 40
okini3939 0:8ba6230eefbd 41 stream->sync = 0;
okini3939 0:8ba6230eefbd 42 stream->freerate = 0;
okini3939 0:8ba6230eefbd 43
okini3939 0:8ba6230eefbd 44 stream->this_frame = 0;
okini3939 0:8ba6230eefbd 45 stream->next_frame = 0;
okini3939 0:8ba6230eefbd 46 mad_bit_init(&stream->ptr, 0);
okini3939 0:8ba6230eefbd 47
okini3939 0:8ba6230eefbd 48 mad_bit_init(&stream->anc_ptr, 0);
okini3939 0:8ba6230eefbd 49 stream->anc_bitlen = 0;
okini3939 0:8ba6230eefbd 50
okini3939 0:8ba6230eefbd 51 stream->main_data = 0;
okini3939 0:8ba6230eefbd 52 stream->md_len = 0;
okini3939 0:8ba6230eefbd 53
okini3939 0:8ba6230eefbd 54 stream->options = 0;
okini3939 0:8ba6230eefbd 55 stream->error = MAD_ERROR_NONE;
okini3939 0:8ba6230eefbd 56 }
okini3939 0:8ba6230eefbd 57
okini3939 0:8ba6230eefbd 58 /*
okini3939 0:8ba6230eefbd 59 * NAME: stream->finish()
okini3939 0:8ba6230eefbd 60 * DESCRIPTION: deallocate any dynamic memory associated with stream
okini3939 0:8ba6230eefbd 61 */
okini3939 0:8ba6230eefbd 62 void mad_stream_finish(struct mad_stream *stream)
okini3939 0:8ba6230eefbd 63 {
okini3939 0:8ba6230eefbd 64 if (stream->main_data) {
okini3939 0:8ba6230eefbd 65 #if !defined(TARGET_LPC1768)
okini3939 0:8ba6230eefbd 66 free(stream->main_data);
okini3939 0:8ba6230eefbd 67 #endif
okini3939 0:8ba6230eefbd 68 stream->main_data = 0;
okini3939 0:8ba6230eefbd 69 }
okini3939 0:8ba6230eefbd 70
okini3939 0:8ba6230eefbd 71 mad_bit_finish(&stream->anc_ptr);
okini3939 0:8ba6230eefbd 72 mad_bit_finish(&stream->ptr);
okini3939 0:8ba6230eefbd 73 }
okini3939 0:8ba6230eefbd 74
okini3939 0:8ba6230eefbd 75 /*
okini3939 0:8ba6230eefbd 76 * NAME: stream->buffer()
okini3939 0:8ba6230eefbd 77 * DESCRIPTION: set stream buffer pointers
okini3939 0:8ba6230eefbd 78 */
okini3939 0:8ba6230eefbd 79 void mad_stream_buffer(struct mad_stream *stream,
okini3939 0:8ba6230eefbd 80 unsigned char const *buffer, unsigned long length)
okini3939 0:8ba6230eefbd 81 {
okini3939 0:8ba6230eefbd 82 stream->buffer = buffer;
okini3939 0:8ba6230eefbd 83 stream->bufend = buffer + length;
okini3939 0:8ba6230eefbd 84
okini3939 0:8ba6230eefbd 85 stream->this_frame = buffer;
okini3939 0:8ba6230eefbd 86 stream->next_frame = buffer;
okini3939 0:8ba6230eefbd 87
okini3939 0:8ba6230eefbd 88 stream->sync = 1;
okini3939 0:8ba6230eefbd 89
okini3939 0:8ba6230eefbd 90 mad_bit_init(&stream->ptr, buffer);
okini3939 0:8ba6230eefbd 91 }
okini3939 0:8ba6230eefbd 92
okini3939 0:8ba6230eefbd 93 /*
okini3939 0:8ba6230eefbd 94 * NAME: stream->skip()
okini3939 0:8ba6230eefbd 95 * DESCRIPTION: arrange to skip bytes before the next frame
okini3939 0:8ba6230eefbd 96 */
okini3939 0:8ba6230eefbd 97 void mad_stream_skip(struct mad_stream *stream, unsigned long length)
okini3939 0:8ba6230eefbd 98 {
okini3939 0:8ba6230eefbd 99 stream->skiplen += length;
okini3939 0:8ba6230eefbd 100 }
okini3939 0:8ba6230eefbd 101
okini3939 0:8ba6230eefbd 102 /*
okini3939 0:8ba6230eefbd 103 * NAME: stream->sync()
okini3939 0:8ba6230eefbd 104 * DESCRIPTION: locate the next stream sync word
okini3939 0:8ba6230eefbd 105 */
okini3939 0:8ba6230eefbd 106 int mad_stream_sync(struct mad_stream *stream)
okini3939 0:8ba6230eefbd 107 {
okini3939 0:8ba6230eefbd 108 register unsigned char const *ptr, *end;
okini3939 0:8ba6230eefbd 109
okini3939 0:8ba6230eefbd 110 ptr = mad_bit_nextbyte(&stream->ptr);
okini3939 0:8ba6230eefbd 111 end = stream->bufend;
okini3939 0:8ba6230eefbd 112
okini3939 0:8ba6230eefbd 113 while (ptr < end - 1 &&
okini3939 0:8ba6230eefbd 114 !(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0))
okini3939 0:8ba6230eefbd 115 ++ptr;
okini3939 0:8ba6230eefbd 116
okini3939 0:8ba6230eefbd 117 if (end - ptr < MAD_BUFFER_GUARD)
okini3939 0:8ba6230eefbd 118 return -1;
okini3939 0:8ba6230eefbd 119
okini3939 0:8ba6230eefbd 120 mad_bit_init(&stream->ptr, ptr);
okini3939 0:8ba6230eefbd 121
okini3939 0:8ba6230eefbd 122 return 0;
okini3939 0:8ba6230eefbd 123 }
okini3939 0:8ba6230eefbd 124
okini3939 0:8ba6230eefbd 125 /*
okini3939 0:8ba6230eefbd 126 * NAME: stream->errorstr()
okini3939 0:8ba6230eefbd 127 * DESCRIPTION: return a string description of the current error condition
okini3939 0:8ba6230eefbd 128 */
okini3939 0:8ba6230eefbd 129 char const *mad_stream_errorstr(struct mad_stream const *stream)
okini3939 0:8ba6230eefbd 130 {
okini3939 0:8ba6230eefbd 131 switch (stream->error) {
okini3939 0:8ba6230eefbd 132 case MAD_ERROR_NONE: return "no error";
okini3939 0:8ba6230eefbd 133
okini3939 0:8ba6230eefbd 134 case MAD_ERROR_BUFLEN: return "input buffer too small (or EOF)";
okini3939 0:8ba6230eefbd 135 case MAD_ERROR_BUFPTR: return "invalid (null) buffer pointer";
okini3939 0:8ba6230eefbd 136
okini3939 0:8ba6230eefbd 137 case MAD_ERROR_NOMEM: return "not enough memory";
okini3939 0:8ba6230eefbd 138
okini3939 0:8ba6230eefbd 139 case MAD_ERROR_LOSTSYNC: return "lost synchronization";
okini3939 0:8ba6230eefbd 140 case MAD_ERROR_BADLAYER: return "reserved header layer value";
okini3939 0:8ba6230eefbd 141 case MAD_ERROR_BADBITRATE: return "forbidden bitrate value";
okini3939 0:8ba6230eefbd 142 case MAD_ERROR_BADSAMPLERATE: return "reserved sample frequency value";
okini3939 0:8ba6230eefbd 143 case MAD_ERROR_BADEMPHASIS: return "reserved emphasis value";
okini3939 0:8ba6230eefbd 144
okini3939 0:8ba6230eefbd 145 case MAD_ERROR_BADCRC: return "CRC check failed";
okini3939 0:8ba6230eefbd 146 case MAD_ERROR_BADBITALLOC: return "forbidden bit allocation value";
okini3939 0:8ba6230eefbd 147 case MAD_ERROR_BADSCALEFACTOR: return "bad scalefactor index";
okini3939 0:8ba6230eefbd 148 case MAD_ERROR_BADMODE: return "bad bitrate/mode combination";
okini3939 0:8ba6230eefbd 149 case MAD_ERROR_BADFRAMELEN: return "bad frame length";
okini3939 0:8ba6230eefbd 150 case MAD_ERROR_BADBIGVALUES: return "bad big_values count";
okini3939 0:8ba6230eefbd 151 case MAD_ERROR_BADBLOCKTYPE: return "reserved block_type";
okini3939 0:8ba6230eefbd 152 case MAD_ERROR_BADSCFSI: return "bad scalefactor selection info";
okini3939 0:8ba6230eefbd 153 case MAD_ERROR_BADDATAPTR: return "bad main_data_begin pointer";
okini3939 0:8ba6230eefbd 154 case MAD_ERROR_BADPART3LEN: return "bad audio data length";
okini3939 0:8ba6230eefbd 155 case MAD_ERROR_BADHUFFTABLE: return "bad Huffman table select";
okini3939 0:8ba6230eefbd 156 case MAD_ERROR_BADHUFFDATA: return "Huffman data overrun";
okini3939 0:8ba6230eefbd 157 case MAD_ERROR_BADSTEREO: return "incompatible block_type for JS";
okini3939 0:8ba6230eefbd 158 }
okini3939 0:8ba6230eefbd 159
okini3939 0:8ba6230eefbd 160 return 0;
okini3939 0:8ba6230eefbd 161 }