source: roaraudio/libroar/meta.c @ 4667:475bcad811d6

Last change on this file since 4667:475bcad811d6 was 4667:475bcad811d6, checked in by phi, 13 years ago

support ROAR_META_TYPE_LIKENESS in lookup functions

File size: 25.3 KB
Line 
1//meta.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008-2010
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, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
23 *
24 *  NOTE for everyone want's to change something and send patches:
25 *  read README and HACKING! There a addition information on
26 *  the license of this document you need to read before you send
27 *  any patches.
28 *
29 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
30 *  or libpulse*:
31 *  The libs libroaresd, libroararts and libroarpulse link this lib
32 *  and are therefore GPL. Because of this it may be illigal to use
33 *  them with any software that uses libesd, libartsc or libpulse*.
34 */
35
36#include "libroar.h"
37
38/*
39
40grep ^'#define ROAR_META_TYPE_' meta.h | cut -d' ' -f2 | while read line; do printf ' {%-30s     "%-16s},\n' $line, $(echo $line | cut -d_ -f4)\"; done
41
42*/
43
44static struct {
45 int    id;
46 const char * name;
47} _libroar_meta_typelist[] = {
48 {ROAR_META_TYPE_NONE,               "NONE"           },
49 {ROAR_META_TYPE_TITLE,              "TITLE"          },
50 {ROAR_META_TYPE_ALBUM,              "ALBUM"          },
51 {ROAR_META_TYPE_AUTHOR,             "AUTHOR"         },
52 {ROAR_META_TYPE_AUTOR,              "AUTOR"          },
53 {ROAR_META_TYPE_ARTIST,             "ARTIST"         },
54 {ROAR_META_TYPE_VERSION,            "VERSION"        },
55 {ROAR_META_TYPE_DATE,               "DATE"           },
56 {ROAR_META_TYPE_LICENSE,            "LICENSE"        },
57 {ROAR_META_TYPE_TRACKNUMBER,        "TRACKNUMBER"    },
58 {ROAR_META_TYPE_ORGANIZATION,       "ORGANIZATION"   },
59 {ROAR_META_TYPE_DESCRIPTION,        "DESCRIPTION"    },
60 {ROAR_META_TYPE_GENRE,              "GENRE"          },
61 {ROAR_META_TYPE_LOCATION,           "LOCATION"       },
62 {ROAR_META_TYPE_CONTACT,            "CONTACT"        },
63 {ROAR_META_TYPE_STREAMURL,          "STREAMURL"      },
64 {ROAR_META_TYPE_HOMEPAGE,           "HOMEPAGE"       },
65 {ROAR_META_TYPE_THUMBNAIL,          "THUMBNAIL"      },
66 {ROAR_META_TYPE_LENGTH,             "LENGTH"         },
67 {ROAR_META_TYPE_COMMENT,            "COMMENT"        },
68 {ROAR_META_TYPE_OTHER,              "OTHER"          },
69 {ROAR_META_TYPE_FILENAME,           "FILENAME"       },
70 {ROAR_META_TYPE_FILEURL,            "FILEURL"        },
71 {ROAR_META_TYPE_SERVER,             "SERVER"         },
72 {ROAR_META_TYPE_DURATION,           "DURATION"       },
73 {ROAR_META_TYPE_WWW,                "WWW"            },
74 {ROAR_META_TYPE_WOAF,               "WOAF"           },
75 {ROAR_META_TYPE_ENCODER,            "ENCODER"        },
76 {ROAR_META_TYPE_ENCODEDBY,          "ENCODEDBY"      },
77 {ROAR_META_TYPE_YEAR,               "YEAR"           },
78 {ROAR_META_TYPE_DISCID,             "DISCID"         },
79 {ROAR_META_TYPE_RPG_TRACK_PEAK,     "REPLAYGAIN_TRACK_PEAK" },
80 {ROAR_META_TYPE_RPG_TRACK_GAIN,     "REPLAYGAIN_TRACK_GAIN" },
81 {ROAR_META_TYPE_RPG_ALBUM_PEAK,     "REPLAYGAIN_ALBUM_PEAK" },
82 {ROAR_META_TYPE_RPG_ALBUM_GAIN,     "REPLAYGAIN_ALBUM_GAIN" },
83 {ROAR_META_TYPE_HASH,               "HASH"           },
84 {ROAR_META_TYPE_SIGNALINFO,         "SIGNALINFO"     },
85 {ROAR_META_TYPE_AUDIOINFO,          "AUDIOINFO"      },
86 {ROAR_META_TYPE_OFFSET,             "OFFSET"         },
87 {ROAR_META_TYPE_PERFORMER,          "PERFORMER"      },
88 {ROAR_META_TYPE_COPYRIGHT,          "COPYRIGHT"      },
89 {ROAR_META_TYPE_LIKENESS,           "LIKENESS"       },
90 
91 {-1, "EOL"}
92};
93
94
95static struct {
96 int    id;
97 const char * name;
98} _libroar_meta_genrelist[] = {
99{ROAR_META_GENRE_RDS_EU_NONE,             "rds_eu_none"},
100{ROAR_META_GENRE_RDS_EU_NONE,             "none"},
101{ROAR_META_GENRE_RDS_EU_NEWS,             "rds_eu_news"},
102{ROAR_META_GENRE_RDS_EU_NEWS,             "news"},
103{ROAR_META_GENRE_RDS_EU_CURRENT_AFFAIRS,  "rds_eu_current_affairs"},
104{ROAR_META_GENRE_RDS_EU_CURRENT_AFFAIRS,  "current affairs"},
105{ROAR_META_GENRE_RDS_EU_INFORMATION,      "rds_eu_information"},
106{ROAR_META_GENRE_RDS_EU_INFORMATION,      "information"},
107{ROAR_META_GENRE_RDS_EU_SPORT,            "rds_eu_sport"},
108{ROAR_META_GENRE_RDS_EU_SPORT,            "sport"},
109{ROAR_META_GENRE_RDS_EU_EDUCATION,        "rds_eu_education"},
110{ROAR_META_GENRE_RDS_EU_EDUCATION,        "education"},
111{ROAR_META_GENRE_RDS_EU_DRAMA,            "rds_eu_drama"},
112{ROAR_META_GENRE_RDS_EU_DRAMA,            "drama"},
113{ROAR_META_GENRE_RDS_EU_CULTURE,          "rds_eu_culture"},
114{ROAR_META_GENRE_RDS_EU_CULTURE,          "culture"},
115{ROAR_META_GENRE_RDS_EU_SCIENCE,          "rds_eu_science"},
116{ROAR_META_GENRE_RDS_EU_SCIENCE,          "science"},
117{ROAR_META_GENRE_RDS_EU_VARIED,           "rds_eu_varied"},
118{ROAR_META_GENRE_RDS_EU_VARIED,           "varied"},
119{ROAR_META_GENRE_RDS_EU_POP_MUSIC,        "rds_eu_pop_music"},
120{ROAR_META_GENRE_RDS_EU_POP_MUSIC,        "pop music"},
121{ROAR_META_GENRE_RDS_EU_ROCK_MUSIC,       "rds_eu_rock_music"},
122{ROAR_META_GENRE_RDS_EU_ROCK_MUSIC,       "rock music"},
123{ROAR_META_GENRE_RDS_EU_EASY_LISTENING,   "rds_eu_easy_listening"},
124{ROAR_META_GENRE_RDS_EU_EASY_LISTENING,   "easy listening"},
125{ROAR_META_GENRE_RDS_EU_LIGHT_CLASSICAL,  "rds_eu_light_classical"},
126{ROAR_META_GENRE_RDS_EU_LIGHT_CLASSICAL,  "light classical"},
127{ROAR_META_GENRE_RDS_EU_SERIOUS_CLASSICAL, "rds_eu_serious_classical"},
128{ROAR_META_GENRE_RDS_EU_SERIOUS_CLASSICAL, "serious classical"},
129{ROAR_META_GENRE_RDS_EU_OTHER_MUSIC,      "rds_eu_other_music"},
130{ROAR_META_GENRE_RDS_EU_OTHER_MUSIC,      "other music"},
131{ROAR_META_GENRE_RDS_EU_WEATHER,          "rds_eu_weather"},
132{ROAR_META_GENRE_RDS_EU_WEATHER,          "weather"},
133{ROAR_META_GENRE_RDS_EU_FINANCE,          "rds_eu_finance"},
134{ROAR_META_GENRE_RDS_EU_FINANCE,          "finance"},
135{ROAR_META_GENRE_RDS_EU_CHILDREN_S_PROGRAMMES, "rds_eu_children_s_programmes"},
136{ROAR_META_GENRE_RDS_EU_CHILDREN_S_PROGRAMMES, "children s programmes"},
137{ROAR_META_GENRE_RDS_EU_SOCIAL_AFFAIRS,   "rds_eu_social_affairs"},
138{ROAR_META_GENRE_RDS_EU_SOCIAL_AFFAIRS,   "social affairs"},
139{ROAR_META_GENRE_RDS_EU_RELIGION,         "rds_eu_religion"},
140{ROAR_META_GENRE_RDS_EU_RELIGION,         "religion"},
141{ROAR_META_GENRE_RDS_EU_PHONE_IN,         "rds_eu_phone_in"},
142{ROAR_META_GENRE_RDS_EU_PHONE_IN,         "phone in"},
143{ROAR_META_GENRE_RDS_EU_TRAVEL,           "rds_eu_travel"},
144{ROAR_META_GENRE_RDS_EU_TRAVEL,           "travel"},
145{ROAR_META_GENRE_RDS_EU_LEISURE,          "rds_eu_leisure"},
146{ROAR_META_GENRE_RDS_EU_LEISURE,          "leisure"},
147{ROAR_META_GENRE_RDS_EU_JAZZ_MUSIC,       "rds_eu_jazz_music"},
148{ROAR_META_GENRE_RDS_EU_JAZZ_MUSIC,       "jazz music"},
149{ROAR_META_GENRE_RDS_EU_COUNTRY_MUSIC,    "rds_eu_country_music"},
150{ROAR_META_GENRE_RDS_EU_COUNTRY_MUSIC,    "country music"},
151{ROAR_META_GENRE_RDS_EU_NATIONAL_MUSIC,   "rds_eu_national_music"},
152{ROAR_META_GENRE_RDS_EU_NATIONAL_MUSIC,   "national music"},
153{ROAR_META_GENRE_RDS_EU_OLDIES_MUSIC,     "rds_eu_oldies_music"},
154{ROAR_META_GENRE_RDS_EU_OLDIES_MUSIC,     "oldies music"},
155{ROAR_META_GENRE_RDS_EU_FOLK_MUSIC,       "rds_eu_folk_music"},
156{ROAR_META_GENRE_RDS_EU_FOLK_MUSIC,       "folk music"},
157{ROAR_META_GENRE_RDS_EU_DOCUMENTARY,      "rds_eu_documentary"},
158{ROAR_META_GENRE_RDS_EU_DOCUMENTARY,      "documentary"},
159{ROAR_META_GENRE_RDS_EU_ALARM_TEST,       "rds_eu_alarm_test"},
160{ROAR_META_GENRE_RDS_EU_ALARM_TEST,       "alarm test"},
161{ROAR_META_GENRE_RDS_EU_ALARM,            "rds_eu_alarm"},
162{ROAR_META_GENRE_RDS_EU_ALARM,            "alarm"},
163{ROAR_META_GENRE_RDS_EU_EMERGENCY_TEST,   "rds_eu_emergency_test"},
164{ROAR_META_GENRE_RDS_EU_EMERGENCY_TEST,   "emergency test"},
165{ROAR_META_GENRE_RDS_EU_EMERGENCY,        "rds_eu_emergency"},
166{ROAR_META_GENRE_RDS_EU_EMERGENCY,        "emergency"},
167{ROAR_META_GENRE_RDS_NA_NONE,             "rds_na_none"},
168{ROAR_META_GENRE_RDS_NA_NONE,             "none"},
169{ROAR_META_GENRE_RDS_NA_NEWS,             "rds_na_news"},
170{ROAR_META_GENRE_RDS_NA_NEWS,             "news"},
171{ROAR_META_GENRE_RDS_NA_INFORMATION,      "rds_na_information"},
172{ROAR_META_GENRE_RDS_NA_INFORMATION,      "information"},
173{ROAR_META_GENRE_RDS_NA_SPORTS,           "rds_na_sports"},
174{ROAR_META_GENRE_RDS_NA_SPORTS,           "sports"},
175{ROAR_META_GENRE_RDS_NA_TALK,             "rds_na_talk"},
176{ROAR_META_GENRE_RDS_NA_TALK,             "talk"},
177{ROAR_META_GENRE_RDS_NA_ROCK,             "rds_na_rock"},
178{ROAR_META_GENRE_RDS_NA_ROCK,             "rock"},
179{ROAR_META_GENRE_RDS_NA_CLASSIC_ROCK,     "rds_na_classic_rock"},
180{ROAR_META_GENRE_RDS_NA_CLASSIC_ROCK,     "classic rock"},
181{ROAR_META_GENRE_RDS_NA_ADULT_HITS,       "rds_na_adult_hits"},
182{ROAR_META_GENRE_RDS_NA_ADULT_HITS,       "adult hits"},
183{ROAR_META_GENRE_RDS_NA_SOFT_ROCK,        "rds_na_soft_rock"},
184{ROAR_META_GENRE_RDS_NA_SOFT_ROCK,        "soft rock"},
185{ROAR_META_GENRE_RDS_NA_TOP_40,           "rds_na_top_40"},
186{ROAR_META_GENRE_RDS_NA_TOP_40,           "top 40"},
187{ROAR_META_GENRE_RDS_NA_COUNTRY,          "rds_na_country"},
188{ROAR_META_GENRE_RDS_NA_COUNTRY,          "country"},
189{ROAR_META_GENRE_RDS_NA_OLDIES,           "rds_na_oldies"},
190{ROAR_META_GENRE_RDS_NA_OLDIES,           "oldies"},
191{ROAR_META_GENRE_RDS_NA_SOFT,             "rds_na_soft"},
192{ROAR_META_GENRE_RDS_NA_SOFT,             "soft"},
193{ROAR_META_GENRE_RDS_NA_NOSTALGIA,        "rds_na_nostalgia"},
194{ROAR_META_GENRE_RDS_NA_NOSTALGIA,        "nostalgia"},
195{ROAR_META_GENRE_RDS_NA_JAZZ,             "rds_na_jazz"},
196{ROAR_META_GENRE_RDS_NA_JAZZ,             "jazz"},
197{ROAR_META_GENRE_RDS_NA_CLASSICAL,        "rds_na_classical"},
198{ROAR_META_GENRE_RDS_NA_CLASSICAL,        "classical"},
199{ROAR_META_GENRE_RDS_NA_RHYTHM_AND_BLUES, "rds_na_rhythm_and_blues"},
200{ROAR_META_GENRE_RDS_NA_RHYTHM_AND_BLUES, "rhythm and blues"},
201{ROAR_META_GENRE_RDS_NA_SOFT_RHYTHM_AND_BLUES, "rds_na_soft_rhythm_and_blues"},
202{ROAR_META_GENRE_RDS_NA_SOFT_RHYTHM_AND_BLUES, "soft rhythm and blues"},
203{ROAR_META_GENRE_RDS_NA_LANGUAGE,         "rds_na_language"},
204{ROAR_META_GENRE_RDS_NA_LANGUAGE,         "language"},
205{ROAR_META_GENRE_RDS_NA_RELIGIOUS_MUSIC,  "rds_na_religious_music"},
206{ROAR_META_GENRE_RDS_NA_RELIGIOUS_MUSIC,  "religious music"},
207{ROAR_META_GENRE_RDS_NA_RELIGIOUS_TALK,   "rds_na_religious_talk"},
208{ROAR_META_GENRE_RDS_NA_RELIGIOUS_TALK,   "religious talk"},
209{ROAR_META_GENRE_RDS_NA_PERSONALITY,      "rds_na_personality"},
210{ROAR_META_GENRE_RDS_NA_PERSONALITY,      "personality"},
211{ROAR_META_GENRE_RDS_NA_PUBLIC,           "rds_na_public"},
212{ROAR_META_GENRE_RDS_NA_PUBLIC,           "public"},
213{ROAR_META_GENRE_RDS_NA_COLLEGE,          "rds_na_college"},
214{ROAR_META_GENRE_RDS_NA_COLLEGE,          "college"},
215{ROAR_META_GENRE_RDS_NA_UNASSIGNED_0,     "rds_na_unassigned_0"},
216{ROAR_META_GENRE_RDS_NA_UNASSIGNED_0,     "unassigned 0"},
217{ROAR_META_GENRE_RDS_NA_UNASSIGNED_1,     "rds_na_unassigned_1"},
218{ROAR_META_GENRE_RDS_NA_UNASSIGNED_1,     "unassigned 1"},
219{ROAR_META_GENRE_RDS_NA_UNASSIGNED_2,     "rds_na_unassigned_2"},
220{ROAR_META_GENRE_RDS_NA_UNASSIGNED_2,     "unassigned 2"},
221{ROAR_META_GENRE_RDS_NA_UNASSIGNED_3,     "rds_na_unassigned_3"},
222{ROAR_META_GENRE_RDS_NA_UNASSIGNED_3,     "unassigned 3"},
223{ROAR_META_GENRE_RDS_NA_UNASSIGNED_4,     "rds_na_unassigned_4"},
224{ROAR_META_GENRE_RDS_NA_UNASSIGNED_4,     "unassigned 4"},
225{ROAR_META_GENRE_RDS_NA_WEATHER,          "rds_na_weather"},
226{ROAR_META_GENRE_RDS_NA_WEATHER,          "weather"},
227{ROAR_META_GENRE_RDS_NA_EMERGENCY_TEST,   "rds_na_emergency_test"},
228{ROAR_META_GENRE_RDS_NA_EMERGENCY_TEST,   "emergency test"},
229{ROAR_META_GENRE_RDS_NA_EMERGENCY,        "rds_na_emergency"},
230{ROAR_META_GENRE_RDS_NA_EMERGENCY,        "emergency"},
231{ROAR_META_GENRE_RDS_NA_ALARM_TEST,       "rds_na_alarm_test"},
232{ROAR_META_GENRE_RDS_NA_ALARM_TEST,       "alarm test"},
233{ROAR_META_GENRE_RDS_NA_ALARM,            "rds_na_alarm"},
234{ROAR_META_GENRE_RDS_NA_ALARM,            "alarm"},
235{ROAR_META_GENRE_ID3_BLUES,               "id3_blues"},
236{ROAR_META_GENRE_ID3_BLUES,               "blues"},
237{ROAR_META_GENRE_ID3_CLASSIC_ROCK,        "id3_classic_rock"},
238{ROAR_META_GENRE_ID3_CLASSIC_ROCK,        "classic rock"},
239{ROAR_META_GENRE_ID3_COUNTRY,             "id3_country"},
240{ROAR_META_GENRE_ID3_COUNTRY,             "country"},
241{ROAR_META_GENRE_ID3_DANCE,               "id3_dance"},
242{ROAR_META_GENRE_ID3_DANCE,               "dance"},
243{ROAR_META_GENRE_ID3_DISCO,               "id3_disco"},
244{ROAR_META_GENRE_ID3_DISCO,               "disco"},
245{ROAR_META_GENRE_ID3_FUNK,                "id3_funk"},
246{ROAR_META_GENRE_ID3_FUNK,                "funk"},
247{ROAR_META_GENRE_ID3_GRUNGE,              "id3_grunge"},
248{ROAR_META_GENRE_ID3_GRUNGE,              "grunge"},
249{ROAR_META_GENRE_ID3_HIP_HOP,             "id3_hip_hop"},
250{ROAR_META_GENRE_ID3_HIP_HOP,             "hip hop"},
251{ROAR_META_GENRE_ID3_JAZZ,                "id3_jazz"},
252{ROAR_META_GENRE_ID3_JAZZ,                "jazz"},
253{ROAR_META_GENRE_ID3_METAL,               "id3_metal"},
254{ROAR_META_GENRE_ID3_METAL,               "metal"},
255{ROAR_META_GENRE_ID3_NEW_AGE,             "id3_new_age"},
256{ROAR_META_GENRE_ID3_NEW_AGE,             "new age"},
257{ROAR_META_GENRE_ID3_OLDIES,              "id3_oldies"},
258{ROAR_META_GENRE_ID3_OLDIES,              "oldies"},
259{ROAR_META_GENRE_ID3_OTHER,               "id3_other"},
260{ROAR_META_GENRE_ID3_OTHER,               "other"},
261{ROAR_META_GENRE_ID3_POP,                 "id3_pop"},
262{ROAR_META_GENRE_ID3_POP,                 "pop"},
263{ROAR_META_GENRE_ID3_R_AND_B,             "id3_r_and_b"},
264{ROAR_META_GENRE_ID3_R_AND_B,             "r and b"},
265{ROAR_META_GENRE_ID3_RAP,                 "id3_rap"},
266{ROAR_META_GENRE_ID3_RAP,                 "rap"},
267{ROAR_META_GENRE_ID3_REGGAE,              "id3_reggae"},
268{ROAR_META_GENRE_ID3_REGGAE,              "reggae"},
269{ROAR_META_GENRE_ID3_ROCK,                "id3_rock"},
270{ROAR_META_GENRE_ID3_ROCK,                "rock"},
271{ROAR_META_GENRE_ID3_TECHNO,              "id3_techno"},
272{ROAR_META_GENRE_ID3_TECHNO,              "techno"},
273{ROAR_META_GENRE_ID3_INDUSTRIAL,          "id3_industrial"},
274{ROAR_META_GENRE_ID3_INDUSTRIAL,          "industrial"},
275{ROAR_META_GENRE_ID3_ALTERNATIVE,         "id3_alternative"},
276{ROAR_META_GENRE_ID3_ALTERNATIVE,         "alternative"},
277{ROAR_META_GENRE_ID3_SKA,                 "id3_ska"},
278{ROAR_META_GENRE_ID3_SKA,                 "ska"},
279{ROAR_META_GENRE_ID3_DEATH_METAL,         "id3_death_metal"},
280{ROAR_META_GENRE_ID3_DEATH_METAL,         "death metal"},
281{ROAR_META_GENRE_ID3_PRANKS,              "id3_pranks"},
282{ROAR_META_GENRE_ID3_PRANKS,              "pranks"},
283{ROAR_META_GENRE_ID3_SOUNDTRACK,          "id3_soundtrack"},
284{ROAR_META_GENRE_ID3_SOUNDTRACK,          "soundtrack"},
285{ROAR_META_GENRE_ID3_EURO_TECHNO,         "id3_euro_techno"},
286{ROAR_META_GENRE_ID3_EURO_TECHNO,         "euro techno"},
287{ROAR_META_GENRE_ID3_AMBIENT,             "id3_ambient"},
288{ROAR_META_GENRE_ID3_AMBIENT,             "ambient"},
289{ROAR_META_GENRE_ID3_TRIP_HOP,            "id3_trip_hop"},
290{ROAR_META_GENRE_ID3_TRIP_HOP,            "trip hop"},
291{ROAR_META_GENRE_ID3_VOCAL,               "id3_vocal"},
292{ROAR_META_GENRE_ID3_VOCAL,               "vocal"},
293{ROAR_META_GENRE_ID3_JAZZ_FUNK,           "id3_jazz_funk"},
294{ROAR_META_GENRE_ID3_JAZZ_FUNK,           "jazz funk"},
295{ROAR_META_GENRE_ID3_FUSION,              "id3_fusion"},
296{ROAR_META_GENRE_ID3_FUSION,              "fusion"},
297{ROAR_META_GENRE_ID3_TRANCE,              "id3_trance"},
298{ROAR_META_GENRE_ID3_TRANCE,              "trance"},
299{ROAR_META_GENRE_ID3_CLASSICAL,           "id3_classical"},
300{ROAR_META_GENRE_ID3_CLASSICAL,           "classical"},
301{ROAR_META_GENRE_ID3_INSTRUMENTAL,        "id3_instrumental"},
302{ROAR_META_GENRE_ID3_INSTRUMENTAL,        "instrumental"},
303{ROAR_META_GENRE_ID3_ACID,                "id3_acid"},
304{ROAR_META_GENRE_ID3_ACID,                "acid"},
305{ROAR_META_GENRE_ID3_HOUSE,               "id3_house"},
306{ROAR_META_GENRE_ID3_HOUSE,               "house"},
307{ROAR_META_GENRE_ID3_GAME,                "id3_game"},
308{ROAR_META_GENRE_ID3_GAME,                "game"},
309{ROAR_META_GENRE_ID3_SOUND_CLIP,          "id3_sound_clip"},
310{ROAR_META_GENRE_ID3_SOUND_CLIP,          "sound clip"},
311{ROAR_META_GENRE_ID3_GOSPEL,              "id3_gospel"},
312{ROAR_META_GENRE_ID3_GOSPEL,              "gospel"},
313{ROAR_META_GENRE_ID3_NOISE,               "id3_noise"},
314{ROAR_META_GENRE_ID3_NOISE,               "noise"},
315{ROAR_META_GENRE_ID3_ALTERNROCK,          "id3_alternrock"},
316{ROAR_META_GENRE_ID3_ALTERNROCK,          "alternrock"},
317{ROAR_META_GENRE_ID3_BASS,                "id3_bass"},
318{ROAR_META_GENRE_ID3_BASS,                "bass"},
319{ROAR_META_GENRE_ID3_SOUL,                "id3_soul"},
320{ROAR_META_GENRE_ID3_SOUL,                "soul"},
321{ROAR_META_GENRE_ID3_PUNK,                "id3_punk"},
322{ROAR_META_GENRE_ID3_PUNK,                "punk"},
323{ROAR_META_GENRE_ID3_SPACE,               "id3_space"},
324{ROAR_META_GENRE_ID3_SPACE,               "space"},
325{ROAR_META_GENRE_ID3_MEDITATIVE,          "id3_meditative"},
326{ROAR_META_GENRE_ID3_MEDITATIVE,          "meditative"},
327{ROAR_META_GENRE_ID3_INSTRUMENTAL_POP,    "id3_instrumental_pop"},
328{ROAR_META_GENRE_ID3_INSTRUMENTAL_POP,    "instrumental pop"},
329{ROAR_META_GENRE_ID3_INSTRUMENTAL_ROCK,   "id3_instrumental_rock"},
330{ROAR_META_GENRE_ID3_INSTRUMENTAL_ROCK,   "instrumental rock"},
331{ROAR_META_GENRE_ID3_ETHNIC,              "id3_ethnic"},
332{ROAR_META_GENRE_ID3_ETHNIC,              "ethnic"},
333{ROAR_META_GENRE_ID3_GOTHIC,              "id3_gothic"},
334{ROAR_META_GENRE_ID3_GOTHIC,              "gothic"},
335{ROAR_META_GENRE_ID3_DARKWAVE,            "id3_darkwave"},
336{ROAR_META_GENRE_ID3_DARKWAVE,            "darkwave"},
337{ROAR_META_GENRE_ID3_TECHNO_INDUSTRIAL,   "id3_techno_industrial"},
338{ROAR_META_GENRE_ID3_TECHNO_INDUSTRIAL,   "techno industrial"},
339{ROAR_META_GENRE_ID3_ELECTRONIC,          "id3_electronic"},
340{ROAR_META_GENRE_ID3_ELECTRONIC,          "electronic"},
341{ROAR_META_GENRE_ID3_POP_FOLK,            "id3_pop_folk"},
342{ROAR_META_GENRE_ID3_POP_FOLK,            "pop folk"},
343{ROAR_META_GENRE_ID3_EURODANCE,           "id3_eurodance"},
344{ROAR_META_GENRE_ID3_EURODANCE,           "eurodance"},
345{ROAR_META_GENRE_ID3_DREAM,               "id3_dream"},
346{ROAR_META_GENRE_ID3_DREAM,               "dream"},
347{ROAR_META_GENRE_ID3_SOUTHERN_ROCK,       "id3_southern_rock"},
348{ROAR_META_GENRE_ID3_SOUTHERN_ROCK,       "southern rock"},
349{ROAR_META_GENRE_ID3_COMEDY,              "id3_comedy"},
350{ROAR_META_GENRE_ID3_COMEDY,              "comedy"},
351{ROAR_META_GENRE_ID3_CULT,                "id3_cult"},
352{ROAR_META_GENRE_ID3_CULT,                "cult"},
353{ROAR_META_GENRE_ID3_GANGSTA,             "id3_gangsta"},
354{ROAR_META_GENRE_ID3_GANGSTA,             "gangsta"},
355{ROAR_META_GENRE_ID3_TOP_40,              "id3_top_40"},
356{ROAR_META_GENRE_ID3_TOP_40,              "top 40"},
357{ROAR_META_GENRE_ID3_CHRISTIAN_RAP,       "id3_christian_rap"},
358{ROAR_META_GENRE_ID3_CHRISTIAN_RAP,       "christian rap"},
359{ROAR_META_GENRE_ID3_POP_FUNK,            "id3_pop_funk"},
360{ROAR_META_GENRE_ID3_POP_FUNK,            "pop funk"},
361{ROAR_META_GENRE_ID3_JUNGLE,              "id3_jungle"},
362{ROAR_META_GENRE_ID3_JUNGLE,              "jungle"},
363{ROAR_META_GENRE_ID3_NATIVE_AMERICAN,     "id3_native_american"},
364{ROAR_META_GENRE_ID3_NATIVE_AMERICAN,     "native american"},
365{ROAR_META_GENRE_ID3_CABARET,             "id3_cabaret"},
366{ROAR_META_GENRE_ID3_CABARET,             "cabaret"},
367{ROAR_META_GENRE_ID3_NEW_WAVE,            "id3_new_wave"},
368{ROAR_META_GENRE_ID3_NEW_WAVE,            "new wave"},
369{ROAR_META_GENRE_ID3_PSYCHADELIC,         "id3_psychadelic"},
370{ROAR_META_GENRE_ID3_PSYCHADELIC,         "psychadelic"},
371{ROAR_META_GENRE_ID3_RAVE,                "id3_rave"},
372{ROAR_META_GENRE_ID3_RAVE,                "rave"},
373{ROAR_META_GENRE_ID3_SHOWTUNES,           "id3_showtunes"},
374{ROAR_META_GENRE_ID3_SHOWTUNES,           "showtunes"},
375{ROAR_META_GENRE_ID3_TRAILER,             "id3_trailer"},
376{ROAR_META_GENRE_ID3_TRAILER,             "trailer"},
377{ROAR_META_GENRE_ID3_LO_FI,               "id3_lo_fi"},
378{ROAR_META_GENRE_ID3_LO_FI,               "lo fi"},
379{ROAR_META_GENRE_ID3_TRIBAL,              "id3_tribal"},
380{ROAR_META_GENRE_ID3_TRIBAL,              "tribal"},
381{ROAR_META_GENRE_ID3_ACID_PUNK,           "id3_acid_punk"},
382{ROAR_META_GENRE_ID3_ACID_PUNK,           "acid punk"},
383{ROAR_META_GENRE_ID3_ACID_JAZZ,           "id3_acid_jazz"},
384{ROAR_META_GENRE_ID3_ACID_JAZZ,           "acid jazz"},
385{ROAR_META_GENRE_ID3_POLKA,               "id3_polka"},
386{ROAR_META_GENRE_ID3_POLKA,               "polka"},
387{ROAR_META_GENRE_ID3_RETRO,               "id3_retro"},
388{ROAR_META_GENRE_ID3_RETRO,               "retro"},
389{ROAR_META_GENRE_ID3_MUSICAL,             "id3_musical"},
390{ROAR_META_GENRE_ID3_MUSICAL,             "musical"},
391{ROAR_META_GENRE_ID3_ROCK_AND_ROLL,       "id3_rock_and_roll"},
392{ROAR_META_GENRE_ID3_ROCK_AND_ROLL,       "rock and roll"},
393{ROAR_META_GENRE_ID3_HARD_ROCK,           "id3_hard_rock"},
394{ROAR_META_GENRE_ID3_HARD_ROCK,           "hard rock"},
395
396 {-1, "EOL"}
397};
398
399// TODO: Why do we return a non-const buffer here?
400char * roar_meta_strtype(const int type) {
401 int i;
402 static char name[ROAR_META_MAX_NAMELEN];
403
404 for (i = 0; _libroar_meta_typelist[i].id != -1; i++)
405  if ( _libroar_meta_typelist[i].id == type ) {
406   strncpy(name, _libroar_meta_typelist[i].name, ROAR_META_MAX_NAMELEN);
407   return name;
408  }
409
410 return NULL;
411}
412
413int    roar_meta_inttype(const char * type) {
414 int i;
415
416 for (i = 0; _libroar_meta_typelist[i].id != -1; i++)
417  if ( strcasecmp(_libroar_meta_typelist[i].name, type) == 0 ) {
418   return _libroar_meta_typelist[i].id;
419  }
420
421 return -1;
422}
423
424int roar_stream_meta_set (struct roar_connection * con, struct roar_stream * s, int mode, struct roar_meta * meta) {
425 struct roar_message m;
426 int len;
427
428 memset(&m, 0, sizeof(struct roar_message)); // make valgrind happy!
429
430 m.cmd     = ROAR_CMD_SET_META;
431 m.stream  = s->id;
432// m.datalen = len;
433
434 if ( (mode == ROAR_META_MODE_FINALIZE || mode == ROAR_META_MODE_CLEAR) && meta->value == NULL )
435  meta->value = "";
436
437 if ( meta->value == NULL )
438   return -1;
439
440 m.data[0] = 0;
441 m.data[1] = mode;
442 m.data[2] = meta->type;
443
444 m.data[3] = strlen(meta->key);
445 m.data[4] = len = strlen(meta->value);
446
447 if ( len > 255 )
448  return -1;
449
450 m.datalen = (int) 5 + (int) m.data[3] + len;
451 if ( m.datalen > LIBROAR_BUFFER_MSGDATA )
452  return -1;
453
454 strncpy(&(m.data[5]), meta->key, ROAR_META_MAX_NAMELEN);
455 strncpy(&(m.data[5+m.data[3]]), meta->value, len);
456
457 ROAR_DBG("roar_stream_meta_set(*): meta value length is %i byte", len);
458 ROAR_DBG("roar_stream_meta_set(*): message data length is %i byte", m.datalen);
459
460 if ( roar_req(con, &m, NULL) == -1 )
461  return -1;
462
463 if ( m.cmd == ROAR_CMD_OK )
464  return 0;
465 return -1;
466}
467
468int roar_stream_meta_get (struct roar_connection * con, struct roar_stream * s, struct roar_meta * meta) {
469 struct roar_message m;
470 char * c;
471
472 memset(&m,  0, sizeof(m));
473
474 m.cmd     = ROAR_CMD_GET_META;
475 m.stream  = s->id;
476// m.datalen = len;
477
478 m.data[0] = 0;
479 m.data[1] = meta->type;
480 m.datalen = 2;
481
482 if ( roar_req(con, &m, NULL) == -1 )
483  return -1;
484
485 if ( m.cmd != ROAR_CMD_OK )
486  return -1;
487
488 if ( m.datalen < 2 )
489  return -1;
490
491 if ( m.data[0] != 0 )
492  return -1;
493
494 if ( (c = malloc(((unsigned) m.data[1]) + 1)) == NULL )
495  return -1;
496
497 strncpy(c, &(m.data[2]), (unsigned) m.data[1]);
498 c[(unsigned) m.data[1]] = 0;
499
500 meta->value  = c;
501 meta->key[0] = 0;
502
503 return 0;
504}
505
506int roar_stream_meta_list (struct roar_connection * con, struct roar_stream * s, int * types, size_t len) {
507 int i;
508 struct roar_message m;
509
510 memset(&m,  0, sizeof(m));
511
512 m.cmd     = ROAR_CMD_LIST_META;
513 m.stream  = s->id;
514 m.pos     = 0;
515
516 m.data[0] = 0;
517 m.datalen = 1;
518
519 if ( roar_req(con, &m, NULL) == -1 )
520  return -1;
521
522 if ( m.cmd != ROAR_CMD_OK )
523  return -1;
524
525 if ( m.datalen < 1 )
526  return -1;
527
528 if ( m.data[0] != 0 )
529  return -1;
530
531 if ( len < (m.datalen - 1 ) )
532  return -1;
533
534 for (i = 1; i < m.datalen; i++)
535  types[i-1] = (unsigned) m.data[i];
536
537 return m.datalen - 1;
538}
539
540int roar_meta_free (struct roar_meta * meta) {
541 if ( meta->value )
542  free(meta->value);
543
544 return 0;
545}
546
547
548// genere:
549const char * roar_meta_strgenre(const int genre) {
550 int i;
551
552 for (i = 0; _libroar_meta_genrelist[i].id != -1; i++)
553  if ( _libroar_meta_genrelist[i].id == genre ) {
554   return _libroar_meta_genrelist[i].name;
555  }
556
557 return NULL;
558}
559
560int    roar_meta_intgenre(const char * genre) {
561 int i;
562
563 for (i = 0; _libroar_meta_genrelist[i].id != -1; i++)
564  if ( strcasecmp(_libroar_meta_genrelist[i].name, genre) == 0 ) {
565   return _libroar_meta_genrelist[i].id;
566  }
567
568 return -1;
569}
570
571int    roar_meta_parse_audioinfo(struct roar_audio_info * info, const char * str) {
572 char * lc;
573 char * cur, * next;
574 char * k,   * v;
575
576 if ( info == NULL || str == NULL )
577  return -1;
578
579 memset(info, 0, sizeof(struct roar_audio_info));
580
581 info->codec = -1;
582
583 if ( (lc = strdup(str)) == NULL )
584  return -1;
585
586 cur = lc;
587
588 while (cur != NULL) {
589  next = strstr(cur, " ");
590  if ( next != NULL ) {
591   *next = 0;
592    next++;
593  }
594
595  k = cur;
596  v = strstr(cur, ":");
597
598  if ( v != NULL ) {
599   *v = 0;
600    v++;
601  } else {
602    v = "";
603  }
604
605  // we test for the key, unknown keys get ignored.
606  if ( !strcasecmp(k, "rate") ) {
607   info->rate     = atoi(v);
608  } else if ( !strcasecmp(k, "bits") ) {
609   info->bits     = atoi(v);
610  } else if ( !strcasecmp(k, "channels") ) {
611   info->channels = atoi(v);
612  } else if ( !strcasecmp(k, "codec") ) {
613   info->codec    = roar_str2codec(v);
614  }
615
616  cur = next;
617 }
618
619 free(lc);
620
621 return 0;
622}
623
624//ll
Note: See TracBrowser for help on using the repository browser.