1 /* 2 * Copyright 2008-2013 Various Authors 3 * Copyright 2004 Timo Hirvonen 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation; either version 2 of the 8 * License, or (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #ifndef CMUS_NOMAD_H 20 #define CMUS_NOMAD_H 21 22 #include <sys/types.h> 23 24 #ifndef __GNUC__ 25 #include <unistd.h> 26 #endif 27 28 /* default callbacks use read, lseek, close */ 29 struct nomad_callbacks { 30 ssize_t (*read)(void *datasource, void *buffer, size_t count); 31 off_t (*lseek)(void *datasource, off_t offset, int whence); 32 int (*close)(void *datasource); 33 }; 34 35 enum { 36 XING_FRAMES = 0x00000001L, 37 XING_BYTES = 0x00000002L, 38 XING_TOC = 0x00000004L, 39 XING_SCALE = 0x00000008L 40 }; 41 42 struct nomad_xing { 43 unsigned int is_info : 1; 44 unsigned int flags; 45 unsigned int nr_frames; 46 unsigned int bytes; 47 unsigned int scale; 48 unsigned char toc[100]; 49 }; 50 51 struct nomad_lame { 52 char encoder[10]; /* 9 byte encoder name/version ("LAME3.97b") */ 53 int vbr_method; /* VBR method */ 54 float peak; /* replaygain peak */ 55 float trackGain; /* replaygain track gain */ 56 float albumGain; /* replaygain album gain */ 57 int encoderDelay; /* # of added samples at start of mp3 */ 58 int encoderPadding; /* # of added samples at end of mp3 */ 59 }; 60 61 /* always 16-bit signed little-endian */ 62 struct nomad_info { 63 double duration; 64 int sample_rate; 65 int channels; 66 int nr_frames; 67 int layer; 68 /* guessed */ 69 int vbr; 70 /* guessed */ 71 int avg_bitrate; 72 /* -1 if file not seekable */ 73 off_t filesize; 74 unsigned int joint_stereo : 1; 75 unsigned int dual_channel : 1; 76 }; 77 78 enum { 79 NOMAD_ERROR_SUCCESS, 80 NOMAD_ERROR_ERRNO, 81 NOMAD_ERROR_FILE_FORMAT 82 }; 83 84 struct nomad; 85 86 /* -NOMAD_ERROR_ERRNO -NOMAD_ERROR_FILE_FORMAT */ 87 int nomad_open_callbacks(struct nomad **nomadp, void *datasource, 88 struct nomad_callbacks *cbs); 89 90 void nomad_close(struct nomad *nomad); 91 92 /* -NOMAD_ERROR_ERRNO */ 93 int nomad_read(struct nomad *nomad, char *buffer, int count); 94 95 /* -NOMAD_ERROR_ERRNO */ 96 int nomad_time_seek(struct nomad *nomad, double pos); 97 98 const struct nomad_xing *nomad_xing(struct nomad *nomad); 99 const struct nomad_lame *nomad_lame(struct nomad *nomad); 100 const struct nomad_info *nomad_info(struct nomad *nomad); 101 long nomad_current_bitrate(struct nomad *nomad); 102 103 #endif 104