Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 1 | /*************************************************************************** |
| 2 | * __________ __ ___. |
| 3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ |
| 4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / |
| 5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < |
| 6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ |
| 7 | * \/ \/ \/ \/ \/ |
| 8 | * $Id$ |
| 9 | * |
| 10 | * Copyright (C) 2005 Miika Pekkarinen |
| 11 | * |
| 12 | * All files in this archive are subject to the GNU General Public License. |
| 13 | * See the file COPYING in the source tree root for full license agreement. |
| 14 | * |
| 15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| 16 | * KIND, either express or implied. |
| 17 | * |
| 18 | ****************************************************************************/ |
| 19 | |
Dave Chapman | 3ad485b | 2005-06-14 22:27:57 +0000 | [diff] [blame^] | 20 | #ifndef _PLAYBACK_H |
| 21 | #define _PLAYBACK_H |
| 22 | |
| 23 | #include <stdlib.h> |
| 24 | #include <ctype.h> |
| 25 | #include <stdbool.h> |
| 26 | |
| 27 | #include "id3.h" |
| 28 | #include "mp3data.h" |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 29 | |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 30 | /* Supported file types. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 31 | #define AFMT_MPA_L1 0x0001 // MPEG Audio layer 1 |
| 32 | #define AFMT_MPA_L2 0x0002 // MPEG Audio layer 2 |
| 33 | #define AFMT_MPA_L3 0x0004 // MPEG Audio layer 3 |
| 34 | /* (MPEG-1, 2, 2.5 layers 1, 2 and 3 */ |
| 35 | #define AFMT_PCM_WAV 0x0008 // Uncompressed PCM in a WAV file |
| 36 | #define AFMT_OGG_VORBIS 0x0010 // Ogg Vorbis |
| 37 | #define AFMT_FLAC 0x0020 // FLAC |
| 38 | #define AFMT_MPC 0x0040 // Musepack |
| 39 | #define AFMT_AAC 0x0080 // AAC |
| 40 | #define AFMT_APE 0x0100 // Monkey's Audio |
| 41 | #define AFMT_WMA 0x0200 // Windows Media Audio |
| 42 | #define AFMT_A52 0x0400 // A/52 (aka AC3) audio |
| 43 | #define AFMT_REAL 0x0800 // Realaudio |
| 44 | #define AFMT_UNKNOWN 0x1000 // Unknown file format |
Dave Bryant | 57c6f6e | 2005-06-13 06:00:35 +0000 | [diff] [blame] | 45 | #define AFMT_WAVPACK 0x2000 // WavPack |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 46 | |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 47 | /* File buffer configuration keys. */ |
Miika Pekkarinen | 68b9acd | 2005-06-10 15:02:10 +0000 | [diff] [blame] | 48 | #define CODEC_SET_FILEBUF_WATERMARK 1 |
| 49 | #define CODEC_SET_FILEBUF_CHUNKSIZE 2 |
| 50 | #define CODEC_SET_FILEBUF_LIMIT 3 |
| 51 | |
| 52 | /* Not yet implemented. */ |
| 53 | #define CODEC_SET_AUDIOBUF_WATERMARK 4 |
| 54 | |
Dave Chapman | 3ad485b | 2005-06-14 22:27:57 +0000 | [diff] [blame^] | 55 | #define MAX_TRACK 10 |
| 56 | struct track_info { |
| 57 | struct mp3entry id3; /* TAG metadata */ |
| 58 | struct mp3info mp3data; /* MP3 metadata */ |
| 59 | char *codecbuf; /* Pointer to codec buffer */ |
| 60 | size_t codecsize; /* Codec length in bytes */ |
| 61 | int codectype; /* Codec type (example AFMT_MPA_L3) */ |
| 62 | |
| 63 | off_t filerem; /* Remaining bytes of file NOT in buffer */ |
| 64 | off_t filesize; /* File total length */ |
| 65 | off_t filepos; /* Read position of file for next buffer fill */ |
| 66 | off_t start_pos; /* Position to first bytes of file in buffer */ |
| 67 | volatile int available; /* Available bytes to read from buffer */ |
| 68 | bool taginfo_ready; /* Is metadata read */ |
| 69 | int playlist_offset; /* File location in playlist */ |
| 70 | }; |
| 71 | |
| 72 | |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 73 | /* Codec Interface */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 74 | struct codec_api { |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 75 | off_t filesize; /* Total file length */ |
| 76 | off_t curpos; /* Current buffer position */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 77 | |
| 78 | /* For gapless mp3 */ |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 79 | struct mp3entry *id3; /* TAG metadata pointer */ |
| 80 | struct mp3info *mp3data; /* MP3 metadata pointer */ |
| 81 | bool *taginfo_ready; /* Is metadata read */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 82 | |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 83 | /* Codec should periodically check if stop_codec is set to true. |
| 84 | In case it's, codec must return with PLUGIN_OK status immediately. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 85 | bool stop_codec; |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 86 | /* Codec should periodically check if reload_codec is set to true. |
| 87 | In case it's, codec should reload itself without exiting. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 88 | bool reload_codec; |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 89 | /* If seek_time != 0, codec should seek to that song position (in ms) |
| 90 | if codec supports seeking. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 91 | int seek_time; |
| 92 | |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 93 | /* Returns buffer to malloc array. Only codeclib should need this. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 94 | void* (*get_codec_memory)(size_t *size); |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 95 | /* Insert PCM data into audio buffer for playback. Playback will start |
| 96 | automatically. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 97 | bool (*audiobuffer_insert)(char *data, size_t length); |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 98 | /* Set song position in WPS (value in ms). */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 99 | void (*set_elapsed)(unsigned int value); |
| 100 | |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 101 | /* Read next <size> amount bytes from file buffer to <ptr>. |
| 102 | Will return number of bytes read or 0 if end of file. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 103 | size_t (*read_filebuf)(void *ptr, size_t size); |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 104 | /* Request pointer to file buffer which can be used to read |
| 105 | <realsize> amount of data. <reqsize> tells the buffer system |
| 106 | how much data it should try to allocate. If <realsize> is 0, |
| 107 | end of file is reached. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 108 | void* (*request_buffer)(size_t *realsize, size_t reqsize); |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 109 | /* Advance file buffer position by <amount> amount of bytes. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 110 | void (*advance_buffer)(size_t amount); |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 111 | /* Advance file buffer to a pointer location inside file buffer. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 112 | void (*advance_buffer_loc)(void *ptr); |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 113 | /* Seek file buffer to position <newpos> beginning of file. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 114 | bool (*seek_buffer)(off_t newpos); |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 115 | /* Calculate mp3 seek position from given time data in ms. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 116 | off_t (*mp3_get_filepos)(int newtime); |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 117 | /* Request file change from file buffer. Returns true is next |
| 118 | track is available and changed. If return value is false, |
| 119 | codec should exit immediately with PLUGIN_OK status. */ |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 120 | bool (*request_next_track)(void); |
Miika Pekkarinen | 68b9acd | 2005-06-10 15:02:10 +0000 | [diff] [blame] | 121 | |
Miika Pekkarinen | d94cba6 | 2005-06-13 15:26:53 +0000 | [diff] [blame] | 122 | /* Configure different codec buffer parameters. */ |
Miika Pekkarinen | 68b9acd | 2005-06-10 15:02:10 +0000 | [diff] [blame] | 123 | void (*configure)(int setting, void *value); |
Linus Nielsen Feltzing | 1c497e6 | 2005-06-05 23:05:10 +0000 | [diff] [blame] | 124 | }; |
| 125 | |
| 126 | #endif |
| 127 | |
| 128 | |