source: roaraudio/libroar/meta.c @ 3051:d0524f377074

Last change on this file since 3051:d0524f377074 was 3051:d0524f377074, checked in by phi, 14 years ago

added very basic genere interface

File size: 7.2 KB
Line 
1//meta.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008
5 *
6 *  This file is part of libroar a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  libroar is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22 *
23 *  NOTE for everyone want's to change something and send patches:
24 *  read README and HACKING! There a addition information on
25 *  the license of this document you need to read before you send
26 *  any patches.
27 *
28 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
29 *  or libpulse*:
30 *  The libs libroaresd, libroararts and libroarpulse link this lib
31 *  and are therefore GPL. Because of this it may be illigal to use
32 *  them with any software that uses libesd, libartsc or libpulse*.
33 */
34
35#include "libroar.h"
36
37/*
38
39grep ^'#define ROAR_META_TYPE_' meta.h | cut -d' ' -f2 | while read line; do printf ' {%-30s     "%-16s},\n' $line, $(echo $line | cut -d_ -f4)\"; done
40
41*/
42
43struct {
44 int    id;
45 char * name;
46} _libroar_meta_typelist[] = {
47 {ROAR_META_TYPE_NONE,               "NONE"           },
48 {ROAR_META_TYPE_TITLE,              "TITLE"          },
49 {ROAR_META_TYPE_ALBUM,              "ALBUM"          },
50 {ROAR_META_TYPE_AUTHOR,             "AUTHOR"         },
51 {ROAR_META_TYPE_AUTOR,              "AUTOR"          },
52 {ROAR_META_TYPE_ARTIST,             "ARTIST"         },
53 {ROAR_META_TYPE_VERSION,            "VERSION"        },
54 {ROAR_META_TYPE_DATE,               "DATE"           },
55 {ROAR_META_TYPE_LICENSE,            "LICENSE"        },
56 {ROAR_META_TYPE_TRACKNUMBER,        "TRACKNUMBER"    },
57 {ROAR_META_TYPE_ORGANIZATION,       "ORGANIZATION"   },
58 {ROAR_META_TYPE_DESCRIPTION,        "DESCRIPTION"    },
59 {ROAR_META_TYPE_GENRE,              "GENRE"          },
60 {ROAR_META_TYPE_LOCATION,           "LOCATION"       },
61 {ROAR_META_TYPE_CONTACT,            "CONTACT"        },
62 {ROAR_META_TYPE_STREAMURL,          "STREAMURL"      },
63 {ROAR_META_TYPE_HOMEPAGE,           "HOMEPAGE"       },
64 {ROAR_META_TYPE_THUMBNAIL,          "THUMBNAIL"      },
65 {ROAR_META_TYPE_LENGTH,             "LENGTH"         },
66 {ROAR_META_TYPE_COMMENT,            "COMMENT"        },
67 {ROAR_META_TYPE_OTHER,              "OTHER"          },
68 {ROAR_META_TYPE_FILENAME,           "FILENAME"       },
69 {ROAR_META_TYPE_FILEURL,            "FILEURL"        },
70 {ROAR_META_TYPE_SERVER,             "SERVER"         },
71 {ROAR_META_TYPE_DURATION,           "DURATION"       },
72 {ROAR_META_TYPE_WWW,                "WWW"            },
73 {ROAR_META_TYPE_WOAF,               "WOAF"           },
74 {ROAR_META_TYPE_ENCODER,            "ENCODER"        },
75 {ROAR_META_TYPE_ENCODEDBY,          "ENCODEDBY"      },
76 {ROAR_META_TYPE_YEAR,               "YEAR"           },
77 {ROAR_META_TYPE_DISCID,             "DISCID"         },
78 {ROAR_META_TYPE_RPG_TRACK_PEAK,     "REPLAYGAIN_TRACK_PEAK" },
79 {ROAR_META_TYPE_RPG_TRACK_GAIN,     "REPLAYGAIN_TRACK_GAIN" },
80 {ROAR_META_TYPE_RPG_ALBUM_PEAK,     "REPLAYGAIN_ALBUM_PEAK" },
81 {ROAR_META_TYPE_RPG_ALBUM_GAIN,     "REPLAYGAIN_ALBUM_GAIN" },
82 {ROAR_META_TYPE_HASH,               "HASH"           },
83 {ROAR_META_TYPE_SIGNALINFO,         "SIGNALINFO"     },
84 {ROAR_META_TYPE_AUDIOINFO,          "AUDIOINFO"      },
85 {ROAR_META_TYPE_OFFSET,             "OFFSET"         },
86 
87 {-1, "EOL"}
88};
89
90
91struct {
92 int    id;
93 char * name;
94} _libroar_meta_genrelist[] = {
95
96 {-1, "EOL"}
97};
98
99char * roar_meta_strtype(int type) {
100 int i;
101 static char name[ROAR_META_MAX_NAMELEN];
102
103 for (i = 0; _libroar_meta_typelist[i].id != -1; i++)
104  if ( _libroar_meta_typelist[i].id == type ) {
105   strncpy(name, _libroar_meta_typelist[i].name, ROAR_META_MAX_NAMELEN);
106   return name;
107  }
108
109 return NULL;
110}
111
112int    roar_meta_inttype(char * type) {
113 int i;
114
115 for (i = 0; _libroar_meta_typelist[i].id != -1; i++)
116  if ( strcasecmp(_libroar_meta_typelist[i].name, type) == 0 ) {
117   return _libroar_meta_typelist[i].id;
118  }
119
120 return -1;
121}
122
123int roar_stream_meta_set (struct roar_connection * con, struct roar_stream * s, int mode, struct roar_meta * meta) {
124 struct roar_message m;
125 int len;
126
127 memset(&m, 0, sizeof(struct roar_message)); // make valgrind happy!
128
129 m.cmd     = ROAR_CMD_SET_META;
130 m.stream  = s->id;
131// m.datalen = len;
132
133 if ( (mode == ROAR_META_MODE_FINALIZE || mode == ROAR_META_MODE_CLEAR) && meta->value == NULL )
134  meta->value = "";
135
136 if ( meta->value == NULL )
137   return -1;
138
139 m.data[0] = 0;
140 m.data[1] = mode;
141 m.data[2] = meta->type;
142
143 m.data[3] = strlen(meta->key);
144 m.data[4] = len = strlen(meta->value);
145
146 if ( len > 255 )
147  return -1;
148
149 m.datalen = (int) 5 + (int) m.data[3] + len;
150 if ( m.datalen > LIBROAR_BUFFER_MSGDATA )
151  return -1;
152
153 strncpy(&(m.data[5]), meta->key, ROAR_META_MAX_NAMELEN);
154 strncpy(&(m.data[5+m.data[3]]), meta->value, len);
155
156 ROAR_DBG("roar_stream_meta_set(*): meta value length is %i byte", len);
157 ROAR_DBG("roar_stream_meta_set(*): message data length is %i byte", m.datalen);
158
159 if ( roar_req(con, &m, NULL) == -1 )
160  return -1;
161
162 if ( m.cmd == ROAR_CMD_OK )
163  return 0;
164 return -1;
165}
166
167int roar_stream_meta_get (struct roar_connection * con, struct roar_stream * s, struct roar_meta * meta) {
168 struct roar_message m;
169 char * c;
170
171 m.cmd     = ROAR_CMD_GET_META;
172 m.stream  = s->id;
173// m.datalen = len;
174
175 m.data[0] = 0;
176 m.data[1] = meta->type;
177 m.datalen = 2;
178
179 if ( roar_req(con, &m, NULL) == -1 )
180  return -1;
181
182 if ( m.cmd != ROAR_CMD_OK )
183  return -1;
184
185 if ( m.datalen < 2 )
186  return -1;
187
188 if ( m.data[0] != 0 )
189  return -1;
190
191 if ( (c = malloc(((unsigned) m.data[1]) + 1)) == NULL )
192  return -1;
193
194 strncpy(c, &(m.data[2]), (unsigned) m.data[1]);
195 c[(unsigned) m.data[1]] = 0;
196
197 meta->value  = c;
198 meta->key[0] = 0;
199
200 return 0;
201}
202
203int roar_stream_meta_list (struct roar_connection * con, struct roar_stream * s, int * types, size_t len) {
204 int i;
205 struct roar_message m;
206
207 m.cmd     = ROAR_CMD_LIST_META;
208 m.stream  = s->id;
209 m.pos     = 0;
210
211 m.data[0] = 0;
212 m.datalen = 1;
213
214 if ( roar_req(con, &m, NULL) == -1 )
215  return -1;
216
217 if ( m.cmd != ROAR_CMD_OK )
218  return -1;
219
220 if ( m.datalen < 1 )
221  return -1;
222
223 if ( m.data[0] != 0 )
224  return -1;
225
226 if ( len < (m.datalen - 1 ) )
227  return -1;
228
229 for (i = 1; i < m.datalen; i++)
230  types[i-1] = (unsigned) m.data[i];
231
232 return m.datalen - 1;
233}
234
235int roar_meta_free (struct roar_meta * meta) {
236 if ( meta->value )
237  free(meta->value);
238
239 return 0;
240}
241
242
243// genere:
244char * roar_meta_strgenre(int genre) {
245 int i;
246
247 for (i = 0; _libroar_meta_genrelist[i].id != -1; i++)
248  if ( _libroar_meta_genrelist[i].id == genre ) {
249   return _libroar_meta_genrelist[i].name;
250  }
251
252 return NULL;
253}
254
255int    roar_meta_intgenre(char * genre) {
256 int i;
257
258 for (i = 0; _libroar_meta_genrelist[i].id != -1; i++)
259  if ( strcasecmp(_libroar_meta_genrelist[i].name, genre) == 0 ) {
260   return _libroar_meta_genrelist[i].id;
261  }
262
263 return -1;
264}
265
266//ll
Note: See TracBrowser for help on using the repository browser.