Mercurial > audlegacy-plugins
comparison src/cdaudio-ng/cdaudio-ng.c @ 2326:854b5fae995e
1) cdaudio-ng tries to fetch cd information in a background thread, and 2) cdaudio-ng no longer queries the cddb if cdtext is available
author | Calin Crisan ccrisan@gmail.com |
---|---|
date | Fri, 18 Jan 2008 00:40:34 +0200 |
parents | dc92a550179e |
children | 0824c92b6132 |
comparison
equal
deleted
inserted
replaced
2287:2421c87fb855 | 2326:854b5fae995e |
---|---|
1 /* | 1 /* |
2 * Audacious CD Digital Audio plugin | 2 * Audacious CD Digital Audio plugin |
3 * | 3 * |
4 * Copyright (c) 2007 Calin Crisan <ccrisan@gmail.com> | 4 * Copyright (c) 2007 Calin Crisan <ccrisan@gmail.com> |
5 * | 5 * |
6 * This program is free software; you can redistribute it and/or modify | 6 * This program is free software; you can redistribute it and/or modify |
7 * it under the terms of the GNU General Public License as published by | 7 * it under the terms of the GNU General Public License as published by |
8 * the Free Software Foundation; under version 3 of the License. | 8 * the Free Software Foundation; under version 3 of the License. |
9 * | 9 * |
10 * This program is distributed in the hope that it will be useful, | 10 * This program is distributed in the hope that it will be useful, |
14 * | 14 * |
15 * You should have received a copy of the GNU General Public License | 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>. | 16 * along with this program. If not, see <http://www.gnu.org/licenses>. |
17 */ | 17 */ |
18 | 18 |
19 /* TODO (added by ccr) | |
20 * - maybe make CDDB lib optional? | |
21 * - use_cddb/use_cdtext don't seem to be checked in all necessary places. why? | |
22 */ | |
23 | 19 |
24 #include "config.h" | 20 #include "config.h" |
25 | 21 |
26 #include <string.h> | 22 #include <string.h> |
27 #include <stdlib.h> | 23 #include <stdlib.h> |
49 #include <audacious/util.h> | 45 #include <audacious/util.h> |
50 | 46 |
51 #include "cdaudio-ng.h" | 47 #include "cdaudio-ng.h" |
52 #include "configure.h" | 48 #include "configure.h" |
53 | 49 |
54 struct cdng_cfg_t cdng_cfg; | 50 |
55 static gint firsttrackno = -1; | 51 struct cdng_cfg_t cdng_cfg; |
56 static gint lasttrackno = -1; | 52 static gint firsttrackno = -1; |
57 static CdIo_t *pcdio = NULL; | 53 static gint lasttrackno = -1; |
58 static trackinfo_t *trackinfo = NULL; | 54 static CdIo_t *pcdio = NULL; |
59 static gboolean is_paused = FALSE; | 55 static trackinfo_t *trackinfo = NULL; |
60 static gint playing_track = -1; | 56 static gboolean is_paused = FALSE; |
61 static dae_params_t *pdae_params = NULL; | 57 static gint playing_track = -1; |
62 static InputPlayback *pglobalinputplayback = NULL; | 58 static dae_params_t *pdae_params = NULL; |
63 static GtkWidget *main_menu_item, *playlist_menu_item; | 59 static InputPlayback *pglobalinputplayback = NULL; |
60 static GtkWidget *main_menu_item, *playlist_menu_item; | |
61 static GThread *scan_cd_thread = NULL; | |
64 | 62 |
65 static void cdaudio_init(void); | 63 static void cdaudio_init(void); |
66 static void cdaudio_about(void); | 64 static void cdaudio_about(void); |
67 static void cdaudio_configure(void); | 65 static void cdaudio_configure(void); |
68 static gint cdaudio_is_our_file(gchar *filename); | 66 static gint cdaudio_is_our_file(gchar *filename); |
69 static GList *cdaudio_scan_dir(gchar *dirname); | |
70 static void cdaudio_play_file(InputPlayback *pinputplayback); | 67 static void cdaudio_play_file(InputPlayback *pinputplayback); |
71 static void cdaudio_stop(InputPlayback *pinputplayback); | 68 static void cdaudio_stop(InputPlayback *pinputplayback); |
72 static void cdaudio_pause(InputPlayback *pinputplayback, gshort paused); | 69 static void cdaudio_pause(InputPlayback *pinputplayback, gshort paused); |
73 static void cdaudio_seek(InputPlayback *pinputplayback, gint time); | 70 static void cdaudio_seek(InputPlayback *pinputplayback, gint time); |
74 static gint cdaudio_get_time(InputPlayback *pinputplayback); | 71 static gint cdaudio_get_time(InputPlayback *pinputplayback); |
77 static void cdaudio_cleanup(void); | 74 static void cdaudio_cleanup(void); |
78 static void cdaudio_get_song_info(gchar *filename, gchar **title, gint *length); | 75 static void cdaudio_get_song_info(gchar *filename, gchar **title, gint *length); |
79 static Tuple *cdaudio_get_song_tuple(gchar *filename); | 76 static Tuple *cdaudio_get_song_tuple(gchar *filename); |
80 | 77 |
81 static void menu_click(void); | 78 static void menu_click(void); |
82 static Tuple *create_tuple_from_trackinfo(gchar *filename); | 79 static Tuple *create_tuple_from_trackinfo_and_filename(gchar *filename); |
80 static Tuple *create_tuple_from_trackinfo(int trackno); | |
83 static void dae_play_loop(dae_params_t *pdae_params); | 81 static void dae_play_loop(dae_params_t *pdae_params); |
82 static void *scan_cd(void *nothing); | |
83 static void scan_cd_threaded(); | |
84 static gint calculate_track_length(gint startlsn, gint endlsn); | 84 static gint calculate_track_length(gint startlsn, gint endlsn); |
85 static gint find_trackno_from_filename(gchar *filename); | 85 static gint find_trackno_from_filename(gchar *filename); |
86 static void cleanup_on_error(void); | 86 static void cleanup_on_error(void); |
87 | 87 |
88 | 88 |
90 .description = "CD Audio Plugin NG", | 90 .description = "CD Audio Plugin NG", |
91 .init = cdaudio_init, | 91 .init = cdaudio_init, |
92 .about = cdaudio_about, | 92 .about = cdaudio_about, |
93 .configure = cdaudio_configure, | 93 .configure = cdaudio_configure, |
94 .is_our_file = cdaudio_is_our_file, | 94 .is_our_file = cdaudio_is_our_file, |
95 .scan_dir = cdaudio_scan_dir, | 95 // .scan_cd = cdaudio_scan_cd, |
96 .play_file = cdaudio_play_file, | 96 .play_file = cdaudio_play_file, |
97 .stop = cdaudio_stop, | 97 .stop = cdaudio_stop, |
98 .pause = cdaudio_pause, | 98 .pause = cdaudio_pause, |
99 .seek = cdaudio_seek, | 99 .seek = cdaudio_seek, |
100 .get_time = cdaudio_get_time, | 100 .get_time = cdaudio_get_time, |
134 | 134 |
135 static void cdaudio_init() | 135 static void cdaudio_init() |
136 { | 136 { |
137 ConfigDb *db; | 137 ConfigDb *db; |
138 gchar *menu_item_text; | 138 gchar *menu_item_text; |
139 | 139 |
140 debug("cdaudio_init()\n"); | 140 debug("cdaudio_init()\n"); |
141 | 141 |
142 memset(&cdng_cfg, 0, sizeof(cdng_cfg)); | 142 memset(&cdng_cfg, 0, sizeof(cdng_cfg)); |
143 | 143 |
144 if ((db = aud_cfg_db_open()) == NULL) { | 144 if ((db = aud_cfg_db_open()) == NULL) { |
145 cdaudio_error("Failed to read configuration.\n"); | 145 cdaudio_error("Failed to read configuration.\n"); |
146 cleanup_on_error(); | 146 cleanup_on_error(); |
157 | 157 |
158 /* | 158 /* |
159 if (!aud_cfg_db_get_bool(db, "CDDA", "use_dae", &cdng_cfg.use_dae)) | 159 if (!aud_cfg_db_get_bool(db, "CDDA", "use_dae", &cdng_cfg.use_dae)) |
160 */ | 160 */ |
161 cdng_cfg.use_dae = TRUE; | 161 cdng_cfg.use_dae = TRUE; |
162 | 162 |
163 if (!aud_cfg_db_get_int(db, "CDDA", "limitspeed", &cdng_cfg.limitspeed)) | 163 if (!aud_cfg_db_get_int(db, "CDDA", "limitspeed", &cdng_cfg.limitspeed)) |
164 cdng_cfg.limitspeed = 1; | 164 cdng_cfg.limitspeed = 1; |
165 if (!aud_cfg_db_get_bool(db, "CDDA", "use_cdtext", &cdng_cfg.use_cdtext)) | 165 if (!aud_cfg_db_get_bool(db, "CDDA", "use_cdtext", &cdng_cfg.use_cdtext)) |
166 cdng_cfg.use_cdtext = TRUE; | 166 cdng_cfg.use_cdtext = TRUE; |
167 if (!aud_cfg_db_get_bool(db, "CDDA", "use_cddb", &cdng_cfg.use_cddb)) | 167 if (!aud_cfg_db_get_bool(db, "CDDA", "use_cddb", &cdng_cfg.use_cddb)) |
175 if (!aud_cfg_db_get_string(db, "CDDA", "device", &cdng_cfg.device)) | 175 if (!aud_cfg_db_get_string(db, "CDDA", "device", &cdng_cfg.device)) |
176 cdng_cfg.device = g_strdup(""); | 176 cdng_cfg.device = g_strdup(""); |
177 if (!aud_cfg_db_get_bool(db, "CDDA", "debug", &cdng_cfg.debug)) | 177 if (!aud_cfg_db_get_bool(db, "CDDA", "debug", &cdng_cfg.debug)) |
178 cdng_cfg.debug = FALSE; | 178 cdng_cfg.debug = FALSE; |
179 if (!aud_cfg_db_get_bool(db, "audacious", "use_proxy", &cdng_cfg.use_proxy)) | 179 if (!aud_cfg_db_get_bool(db, "audacious", "use_proxy", &cdng_cfg.use_proxy)) |
180 cdng_cfg.debug = FALSE; | 180 cdng_cfg.use_proxy = FALSE; |
181 if (!aud_cfg_db_get_string(db, "audacious", "proxy_host", &cdng_cfg.proxy_host)) | 181 if (!aud_cfg_db_get_string(db, "audacious", "proxy_host", &cdng_cfg.proxy_host)) |
182 cdng_cfg.proxy_host = g_strdup(""); | 182 cdng_cfg.proxy_host = g_strdup(""); |
183 if (!aud_cfg_db_get_int(db, "audacious", "proxy_port", &cdng_cfg.proxy_port)) | 183 if (!aud_cfg_db_get_int(db, "audacious", "proxy_port", &cdng_cfg.proxy_port)) |
184 cdng_cfg.proxy_port = 8080; | 184 cdng_cfg.proxy_port = 8080; |
185 if (!aud_cfg_db_get_string(db, "audacious", "proxy_user", &cdng_cfg.proxy_username)) | 185 if (!aud_cfg_db_get_string(db, "audacious", "proxy_user", &cdng_cfg.proxy_username)) |
198 menu_item_text = _("Add CD"); | 198 menu_item_text = _("Add CD"); |
199 main_menu_item = gtk_image_menu_item_new_with_label(menu_item_text); | 199 main_menu_item = gtk_image_menu_item_new_with_label(menu_item_text); |
200 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(main_menu_item), gtk_image_new_from_stock(GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU)); | 200 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(main_menu_item), gtk_image_new_from_stock(GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU)); |
201 gtk_widget_show(main_menu_item); | 201 gtk_widget_show(main_menu_item); |
202 audacious_menu_plugin_item_add(AUDACIOUS_MENU_MAIN, main_menu_item); | 202 audacious_menu_plugin_item_add(AUDACIOUS_MENU_MAIN, main_menu_item); |
203 g_signal_connect(G_OBJECT(main_menu_item), "button_press_event", G_CALLBACK(menu_click), NULL); | 203 g_signal_connect(G_OBJECT(main_menu_item), "button_press_event", G_CALLBACK(menu_click), NULL); |
204 | 204 |
205 playlist_menu_item = gtk_image_menu_item_new_with_label(menu_item_text); | 205 playlist_menu_item = gtk_image_menu_item_new_with_label(menu_item_text); |
206 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(playlist_menu_item), gtk_image_new_from_stock(GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU)); | 206 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(playlist_menu_item), gtk_image_new_from_stock(GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU)); |
207 gtk_widget_show(playlist_menu_item); | 207 gtk_widget_show(playlist_menu_item); |
208 audacious_menu_plugin_item_add(AUDACIOUS_MENU_PLAYLIST, playlist_menu_item); | 208 audacious_menu_plugin_item_add(AUDACIOUS_MENU_PLAYLIST, playlist_menu_item); |
209 g_signal_connect(G_OBJECT(playlist_menu_item), "button_press_event", G_CALLBACK(menu_click), NULL); | 209 g_signal_connect(G_OBJECT(playlist_menu_item), "button_press_event", G_CALLBACK(menu_click), NULL); |
210 | 210 |
211 aud_uri_set_plugin("cdda://", &inputplugin); | 211 aud_uri_set_plugin("cdda://", &inputplugin); |
212 } | 212 } |
213 | 213 |
214 static void cdaudio_about() | 214 static void cdaudio_about() |
215 { | 215 { |
253 | 253 |
254 if ((filename != NULL) && strlen(filename) > 4 && (!strcasecmp(filename + strlen(filename) - 4, ".cda"))) { | 254 if ((filename != NULL) && strlen(filename) > 4 && (!strcasecmp(filename + strlen(filename) - 4, ".cda"))) { |
255 /* no CD information yet */ | 255 /* no CD information yet */ |
256 if (pcdio == NULL) { | 256 if (pcdio == NULL) { |
257 debug("no CD information, scanning\n"); | 257 debug("no CD information, scanning\n"); |
258 cdaudio_scan_dir(CDDA_DEFAULT); | 258 scan_cd_threaded(NULL); |
259 } | 259 } |
260 | 260 |
261 /* reload the cd information if the media has changed */ | 261 /* reload the cd information if the media has changed */ |
262 if (cdio_get_media_changed(pcdio) && pcdio != NULL) { | 262 if (pcdio != NULL && cdio_get_media_changed(pcdio)) { |
263 debug("CD changed, rescanning\n"); | 263 debug("CD changed, rescanning\n"); |
264 if (cdaudio_scan_dir(CDDA_DEFAULT) == NULL) | 264 scan_cd_threaded(NULL); |
265 pcdio = NULL; | |
266 } | |
267 | |
268 if (pcdio == NULL) { | |
269 debug("\"%s\" is not our file\n", filename); | |
270 return FALSE; | |
271 } | 265 } |
272 | 266 |
273 /* check if the requested track actually exists on the current audio cd */ | 267 /* check if the requested track actually exists on the current audio cd */ |
274 gint trackno = find_trackno_from_filename(filename); | 268 gint trackno = find_trackno_from_filename(filename); |
275 if (trackno < firsttrackno || trackno > lasttrackno) { | 269 if (trackno < firsttrackno || trackno > lasttrackno) { |
276 debug("\"%s\" is not our file\n", filename); | 270 debug("\"%s\" is not our file\n", filename); |
277 return FALSE; | 271 return FALSE; |
278 } | 272 } |
279 | 273 |
280 debug("\"%s\" is our file\n", filename); | 274 debug("\"%s\" is our file\n", filename); |
281 return TRUE; | 275 return TRUE; |
282 } | 276 } |
283 else { | 277 else { |
284 debug("\"%s\" is not our file\n", filename); | 278 debug("\"%s\" is not our file\n", filename); |
304 t->endlsn = endlsn; | 298 t->endlsn = endlsn; |
305 cdaudio_set_strinfo(t, performer, name, genre); | 299 cdaudio_set_strinfo(t, performer, name, genre); |
306 } | 300 } |
307 | 301 |
308 | 302 |
309 static GList *cdaudio_scan_dir(gchar *dirname) | |
310 { | |
311 gint trackno; | |
312 | |
313 debug("cdaudio_scan_dir(\"%s\")\n", dirname); | |
314 | |
315 /* if the given dirname does not belong to us, we return NULL */ | |
316 if (strstr(dirname, CDDA_DEFAULT) == NULL) { | |
317 debug("\"%s\" directory does not belong to us\n", dirname); | |
318 return NULL; | |
319 } | |
320 | |
321 /* find an available, audio capable, cd drive */ | |
322 if (cdng_cfg.device != NULL && strlen(cdng_cfg.device) > 0) { | |
323 pcdio = cdio_open(cdng_cfg.device, DRIVER_UNKNOWN); | |
324 if (pcdio == NULL) { | |
325 cdaudio_error("Failed to open CD device \"%s\".\n", cdng_cfg.device); | |
326 return NULL; | |
327 } | |
328 } | |
329 else { | |
330 gchar **ppcd_drives = cdio_get_devices_with_cap(NULL, CDIO_FS_AUDIO, false); | |
331 pcdio = NULL; | |
332 if (ppcd_drives != NULL && *ppcd_drives != NULL) { /* we have at least one audio capable cd drive */ | |
333 pcdio = cdio_open(*ppcd_drives, DRIVER_UNKNOWN); | |
334 if (pcdio == NULL) { | |
335 cdaudio_error("Failed to open CD.\n"); | |
336 cleanup_on_error(); | |
337 return NULL; | |
338 } | |
339 debug("found cd drive \"%s\" with audio capable media\n", *ppcd_drives); | |
340 } | |
341 else { | |
342 cdaudio_error("Unable to find or access a CDDA capable drive.\n"); | |
343 cleanup_on_error(); | |
344 return NULL; | |
345 } | |
346 if (ppcd_drives != NULL && *ppcd_drives != NULL) | |
347 cdio_free_device_list(ppcd_drives); | |
348 } | |
349 | |
350 /* limit read speed */ | |
351 if (cdng_cfg.limitspeed > 0 && cdng_cfg.use_dae) { | |
352 debug("setting drive speed limit to %dx\n", cdng_cfg.limitspeed); | |
353 if (cdio_set_speed(pcdio, cdng_cfg.limitspeed) != DRIVER_OP_SUCCESS) | |
354 cdaudio_error("Failed to set drive speed to %dx.\n", cdng_cfg.limitspeed); | |
355 } | |
356 | |
357 /* get general track initialization */ | |
358 cdrom_drive_t *pcdrom_drive = cdio_cddap_identify_cdio(pcdio, 1, NULL); // todo : check return / NULL | |
359 firsttrackno = cdio_get_first_track_num(pcdrom_drive->p_cdio); | |
360 lasttrackno = cdio_get_last_track_num(pcdrom_drive->p_cdio); | |
361 if (firsttrackno == CDIO_INVALID_TRACK || lasttrackno == CDIO_INVALID_TRACK) { | |
362 cdaudio_error("Failed to retrieve first/last track number.\n"); | |
363 cleanup_on_error(); | |
364 return NULL; | |
365 } | |
366 debug("first track is %d and last track is %d\n", firsttrackno, lasttrackno); | |
367 | |
368 g_free(trackinfo); | |
369 trackinfo = (trackinfo_t *) g_new(trackinfo_t, (lasttrackno + 1)); | |
370 | |
371 cdaudio_set_fullinfo(&trackinfo[0], | |
372 cdio_get_track_lsn(pcdrom_drive->p_cdio, 0), | |
373 cdio_get_track_last_lsn(pcdrom_drive->p_cdio, CDIO_CDROM_LEADOUT_TRACK), | |
374 "", "", ""); | |
375 | |
376 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { | |
377 cdaudio_set_fullinfo(&trackinfo[trackno], | |
378 cdio_get_track_lsn(pcdrom_drive->p_cdio, trackno), | |
379 cdio_get_track_last_lsn(pcdrom_drive->p_cdio, trackno), | |
380 "", "", ""); | |
381 | |
382 if (trackinfo[trackno].startlsn == CDIO_INVALID_LSN || trackinfo[trackno].endlsn == CDIO_INVALID_LSN) { | |
383 cdaudio_error("Failed to retrieve stard/end lsn for track %d.\n", trackno); | |
384 cleanup_on_error(); | |
385 return NULL; | |
386 } | |
387 } | |
388 | |
389 /* initialize de cddb subsystem */ | |
390 cddb_conn_t *pcddb_conn = NULL; | |
391 cddb_disc_t *pcddb_disc = NULL; | |
392 cddb_track_t *pcddb_track = NULL; | |
393 | |
394 if (cdng_cfg.use_cddb) { | |
395 pcddb_conn = cddb_new(); | |
396 if (pcddb_conn == NULL) | |
397 cdaudio_error("Failed to create the cddb connection.\n"); | |
398 else { | |
399 debug("getting CDDB info\n"); | |
400 | |
401 if (cdng_cfg.use_proxy) { | |
402 cddb_http_proxy_enable(pcddb_conn); | |
403 cddb_set_http_proxy_server_name(pcddb_conn, cdng_cfg.proxy_host); | |
404 cddb_set_http_proxy_server_port(pcddb_conn, cdng_cfg.proxy_port); | |
405 cddb_set_http_proxy_username(pcddb_conn, cdng_cfg.proxy_username); | |
406 cddb_set_http_proxy_password(pcddb_conn, cdng_cfg.proxy_password); | |
407 cddb_set_server_name(pcddb_conn, cdng_cfg.cddb_server); | |
408 cddb_set_server_port(pcddb_conn, cdng_cfg.cddb_port); | |
409 } | |
410 else | |
411 if (cdng_cfg.cddb_http) { | |
412 cddb_http_enable(pcddb_conn); | |
413 cddb_set_server_name(pcddb_conn, cdng_cfg.cddb_server); | |
414 cddb_set_server_port(pcddb_conn, cdng_cfg.cddb_port); | |
415 } | |
416 else { | |
417 cddb_set_server_name(pcddb_conn, cdng_cfg.cddb_server); | |
418 cddb_set_server_port(pcddb_conn, cdng_cfg.cddb_port); | |
419 } | |
420 | |
421 pcddb_disc = cddb_disc_new(); | |
422 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { | |
423 pcddb_track = cddb_track_new(); | |
424 cddb_track_set_frame_offset(pcddb_track, trackinfo[trackno].startlsn); | |
425 cddb_disc_add_track(pcddb_disc, pcddb_track); | |
426 } | |
427 | |
428 msf_t startmsf, endmsf; | |
429 cdio_get_track_msf(pcdio, 1, &startmsf); | |
430 cdio_get_track_msf(pcdio, CDIO_CDROM_LEADOUT_TRACK, &endmsf); | |
431 cddb_disc_set_length(pcddb_disc, cdio_audio_get_msf_seconds(&endmsf) - cdio_audio_get_msf_seconds(&startmsf)); | |
432 | |
433 cddb_disc_calc_discid(pcddb_disc); | |
434 int discid = cddb_disc_get_discid(pcddb_disc); | |
435 debug("CDDB disc id = %x\n", discid); | |
436 | |
437 gint matches; | |
438 if ((matches = cddb_query(pcddb_conn, pcddb_disc)) == -1) { | |
439 if (cddb_errno(pcddb_conn) == CDDB_ERR_OK) | |
440 cdaudio_error("Failed to query the CDDB server\n"); | |
441 else | |
442 cdaudio_error("Failed to query the CDDB server: %s\n", cddb_error_str(cddb_errno(pcddb_conn))); | |
443 | |
444 cddb_disc_destroy(pcddb_disc); | |
445 pcddb_disc = NULL; | |
446 } | |
447 else { | |
448 if (matches == 0) { | |
449 debug("no cddb info available for this disc\n"); | |
450 | |
451 cddb_disc_destroy(pcddb_disc); | |
452 pcddb_disc = NULL; | |
453 } | |
454 else { | |
455 debug("CDDB disc category = \"%s\"\n", cddb_disc_get_category_str(pcddb_disc)); | |
456 | |
457 cddb_read(pcddb_conn, pcddb_disc); | |
458 if (cddb_errno(pcddb_conn) != CDDB_ERR_OK) { | |
459 cdaudio_error("failed to read the cddb info: %s\n", cddb_error_str(cddb_errno(pcddb_conn))); | |
460 cddb_disc_destroy(pcddb_disc); | |
461 pcddb_disc = NULL; | |
462 } | |
463 else { | |
464 debug("we have got the cddb info\n"); | |
465 cdaudio_set_strinfo(&trackinfo[0], | |
466 cddb_disc_get_artist(pcddb_disc), | |
467 cddb_disc_get_title(pcddb_disc), | |
468 cddb_disc_get_genre(pcddb_disc)); | |
469 } | |
470 } | |
471 } | |
472 } | |
473 } | |
474 | |
475 /* adding trackinfo[0] information (the disc) */ | |
476 if (cdng_cfg.use_cdtext) { | |
477 debug("getting cd-text information for disc\n"); | |
478 cdtext_t *pcdtext = cdio_get_cdtext(pcdrom_drive->p_cdio, 0); | |
479 if (pcdtext == NULL || pcdtext->field[CDTEXT_TITLE] == NULL) { | |
480 debug("no cd-text available for disc\n"); | |
481 } | |
482 else { | |
483 cdaudio_set_strinfo(&trackinfo[0], | |
484 pcdtext->field[CDTEXT_PERFORMER] ? pcdtext->field[CDTEXT_PERFORMER] : "", | |
485 pcdtext->field[CDTEXT_TITLE] ? pcdtext->field[CDTEXT_TITLE] : "", | |
486 pcdtext->field[CDTEXT_GENRE] ? pcdtext->field[CDTEXT_GENRE] : ""); | |
487 } | |
488 } | |
489 | |
490 /* add track "file" names to the list */ | |
491 GList *list = NULL; | |
492 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { | |
493 list = g_list_append(list, g_strdup_printf("track%02u.cda", trackno)); | |
494 cdtext_t *pcdtext = NULL; | |
495 if (cdng_cfg.use_cdtext) { | |
496 debug("getting cd-text information for track %d\n", trackno); | |
497 pcdtext = cdio_get_cdtext(pcdrom_drive->p_cdio, trackno); | |
498 if (pcdtext == NULL || pcdtext->field[CDTEXT_PERFORMER] == NULL) { | |
499 debug("no cd-text available for track %d\n", trackno); | |
500 pcdtext = NULL; | |
501 } | |
502 } | |
503 | |
504 if (pcdtext != NULL) { | |
505 cdaudio_set_strinfo(&trackinfo[trackno], | |
506 pcdtext->field[CDTEXT_PERFORMER] ? pcdtext->field[CDTEXT_PERFORMER] : "", | |
507 pcdtext->field[CDTEXT_TITLE] ? pcdtext->field[CDTEXT_TITLE] : "", | |
508 pcdtext->field[CDTEXT_GENRE] ? pcdtext->field[CDTEXT_GENRE] : ""); | |
509 } | |
510 else | |
511 if (pcddb_disc != NULL) { | |
512 cddb_track_t *pcddb_track = cddb_disc_get_track(pcddb_disc, trackno - 1); | |
513 cdaudio_set_strinfo(&trackinfo[trackno], | |
514 cddb_track_get_artist(pcddb_track), | |
515 cddb_track_get_title(pcddb_track), | |
516 cddb_disc_get_genre(pcddb_disc)); | |
517 } | |
518 else { | |
519 cdaudio_set_strinfo(&trackinfo[trackno], "", "", ""); | |
520 g_snprintf(trackinfo[trackno].name, DEF_STRING_LEN, "CD Audio Track %02u", trackno); | |
521 } | |
522 } | |
523 | |
524 if (cdng_cfg.debug) { | |
525 debug("disc has : performer = \"%s\", name = \"%s\", genre = \"%s\"\n", | |
526 trackinfo[0].performer, trackinfo[0].name, trackinfo[0].genre); | |
527 | |
528 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { | |
529 debug("track %d has : performer = \"%s\", name = \"%s\", genre = \"%s\", startlsn = %d, endlsn = %d\n", | |
530 trackno, trackinfo[trackno].performer, trackinfo[trackno].name, trackinfo[trackno].genre, trackinfo[trackno].startlsn, trackinfo[trackno].endlsn); | |
531 } | |
532 } | |
533 | |
534 if (pcddb_disc != NULL) | |
535 cddb_disc_destroy(pcddb_disc); | |
536 | |
537 if (pcddb_conn != NULL) | |
538 cddb_destroy(pcddb_conn); | |
539 | |
540 return list; | |
541 } | |
542 | |
543 static void cdaudio_play_file(InputPlayback *pinputplayback) | 303 static void cdaudio_play_file(InputPlayback *pinputplayback) |
544 { | 304 { |
545 Tuple *tuple; | 305 Tuple *tuple; |
546 gchar *title; | 306 gchar *title; |
547 | 307 |
548 debug("cdaudio_play_file(\"%s\")\n", pinputplayback->filename); | 308 debug("cdaudio_play_file(\"%s\")\n", pinputplayback->filename); |
549 | 309 |
550 pglobalinputplayback = pinputplayback; | 310 pglobalinputplayback = pinputplayback; |
551 | 311 |
552 if (trackinfo == NULL) { | 312 if (trackinfo == NULL) { |
553 debug("no CD information, scanning\n"); | 313 debug("no CD information, scanning\n"); |
554 cdaudio_scan_dir(CDDA_DEFAULT); | 314 if (scan_cd_thread != NULL) |
555 } | 315 g_thread_join(scan_cd_thread); |
556 | 316 else |
557 if (cdio_get_media_changed(pcdio)) { | 317 scan_cd(pinputplayback); |
558 debug("CD changed, rescanning\n"); | 318 } |
559 cdaudio_scan_dir(CDDA_DEFAULT); | 319 else |
560 } | 320 if (cdio_get_media_changed(pcdio)) { |
321 debug("CD changed, rescanning\n"); | |
322 if (scan_cd_thread != NULL) | |
323 g_thread_join(scan_cd_thread); | |
324 else | |
325 scan_cd(pinputplayback); | |
326 } | |
561 | 327 |
562 if (trackinfo == NULL) { | 328 if (trackinfo == NULL) { |
563 debug("no CD information can be retrieved, aborting\n"); | 329 debug("no CD information can be retrieved, aborting\n"); |
564 pinputplayback->playing = FALSE; | 330 pinputplayback->playing = FALSE; |
565 return; | 331 return; |
574 | 340 |
575 pinputplayback->playing = TRUE; | 341 pinputplayback->playing = TRUE; |
576 playing_track = trackno; | 342 playing_track = trackno; |
577 is_paused = FALSE; | 343 is_paused = FALSE; |
578 | 344 |
579 tuple = create_tuple_from_trackinfo(pinputplayback->filename); | 345 tuple = create_tuple_from_trackinfo_and_filename(pinputplayback->filename); |
580 title = aud_tuple_formatter_make_title_string(tuple, aud_get_gentitle_format()); | 346 title = aud_tuple_formatter_make_title_string(tuple, aud_get_gentitle_format()); |
581 | 347 |
582 pinputplayback->set_params(pinputplayback, title, calculate_track_length(trackinfo[trackno].startlsn, trackinfo[trackno].endlsn), 1411200, 44100, 2); | 348 pinputplayback->set_params(pinputplayback, title, calculate_track_length(trackinfo[trackno].startlsn, trackinfo[trackno].endlsn), 1411200, 44100, 2); |
583 g_free(title); | 349 g_free(title); |
584 aud_tuple_free(tuple); | 350 aud_tuple_free(tuple); |
816 | 582 |
817 static void cdaudio_get_song_info(gchar *filename, gchar **title, gint *length) | 583 static void cdaudio_get_song_info(gchar *filename, gchar **title, gint *length) |
818 { | 584 { |
819 debug("cdaudio_get_song_info(\"%s\")\n", filename); | 585 debug("cdaudio_get_song_info(\"%s\")\n", filename); |
820 | 586 |
821 gint trackno = find_trackno_from_filename(filename); | 587 Tuple *tuple = create_tuple_from_trackinfo_and_filename(filename); |
822 Tuple *tuple = create_tuple_from_trackinfo(filename); | 588 int trackno = find_trackno_from_filename(filename); |
823 | 589 |
824 if (tuple) { | 590 if (tuple) { |
825 *title = aud_tuple_formatter_process_string(tuple, aud_get_gentitle_format()); | 591 *title = aud_tuple_formatter_process_string(tuple, aud_get_gentitle_format()); |
826 aud_tuple_free(tuple); | 592 aud_tuple_free(tuple); |
827 tuple = NULL; | 593 tuple = NULL; |
831 | 597 |
832 static Tuple *cdaudio_get_song_tuple(gchar *filename) | 598 static Tuple *cdaudio_get_song_tuple(gchar *filename) |
833 { | 599 { |
834 debug("cdaudio_get_song_tuple(\"%s\")\n", filename); | 600 debug("cdaudio_get_song_tuple(\"%s\")\n", filename); |
835 | 601 |
836 return create_tuple_from_trackinfo(filename); | 602 return create_tuple_from_trackinfo_and_filename(filename); |
837 } | 603 } |
838 | 604 |
839 | 605 |
840 /* | 606 /* |
841 * auxiliar functions | 607 * auxiliar functions |
842 */ | 608 */ |
843 static void menu_click() | 609 static void menu_click() |
844 { | 610 { |
845 GList *list, *node; | 611 gchar filename[DEF_STRING_LEN]; |
846 gchar *filename; | 612 gboolean available = TRUE; |
847 | 613 |
848 if (!(list = cdaudio_scan_dir(CDDA_DEFAULT))) { | 614 /* reload the cd information if the media has changed, or no track information is available */ |
615 if (pcdio == NULL || cdio_get_media_changed(pcdio)) { | |
616 debug("CD changed, rescanning\n"); | |
617 | |
618 available = FALSE; | |
619 if (scan_cd_thread != NULL) | |
620 return; | |
621 else | |
622 available = (scan_cd(NULL) != NULL); | |
623 } | |
624 | |
625 if (!available) { | |
849 const gchar *markup = | 626 const gchar *markup = |
850 N_("<b><big>No playable CD found.</big></b>\n\n" | 627 N_("<b><big>No playable CD found.</big></b>\n\n" |
851 "No CD inserted, or inserted CD is not an audio CD.\n"); | 628 "No CD inserted, or inserted CD is not an audio CD.\n"); |
852 | 629 |
853 GtkWidget *dialog = | 630 GtkWidget *dialog = |
859 gtk_dialog_run(GTK_DIALOG(dialog)); | 636 gtk_dialog_run(GTK_DIALOG(dialog)); |
860 gtk_widget_destroy(dialog); | 637 gtk_widget_destroy(dialog); |
861 return; | 638 return; |
862 } | 639 } |
863 | 640 |
864 for (node = list; node; node = g_list_next(node)) { | 641 int trackno; |
865 filename = g_build_filename(CDDA_DEFAULT, node->data, NULL); | 642 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { |
866 aud_playlist_add(aud_playlist_get_active(), filename); | 643 g_snprintf(filename, DEF_STRING_LEN, "track%02u.cda", trackno); |
867 g_free(filename); | 644 gchar *pathname = g_build_filename(CDDA_DEFAULT, filename, NULL); |
868 g_free(node->data); | 645 aud_playlist_add(aud_playlist_get_active(), pathname); |
869 } | 646 } |
870 | 647 } |
871 g_list_free(list); | 648 |
872 } | 649 static Tuple *create_tuple_from_trackinfo(int trackno) |
873 | 650 { |
874 static Tuple *create_tuple_from_trackinfo(gchar *filename) | 651 Tuple *tuple = aud_tuple_new(); |
875 { | |
876 Tuple *tuple = aud_tuple_new_from_filename(filename); | |
877 | 652 |
878 if (trackinfo == NULL) | 653 if (trackinfo == NULL) |
879 return tuple; | 654 return tuple; |
880 | 655 |
881 gint trackno = find_trackno_from_filename(filename); | |
882 | |
883 if (trackno < firsttrackno || trackno > lasttrackno) | 656 if (trackno < firsttrackno || trackno > lasttrackno) |
884 return tuple; | 657 return tuple; |
885 | 658 |
886 if(strlen(trackinfo[trackno].performer)) { | 659 if(strlen(trackinfo[trackno].performer)) { |
887 aud_tuple_associate_string(tuple, FIELD_ARTIST, NULL, trackinfo[trackno].performer); | 660 aud_tuple_associate_string(tuple, FIELD_ARTIST, NULL, trackinfo[trackno].performer); |
890 aud_tuple_associate_string(tuple, FIELD_ALBUM, NULL, trackinfo[0].name); | 663 aud_tuple_associate_string(tuple, FIELD_ALBUM, NULL, trackinfo[0].name); |
891 } | 664 } |
892 if(strlen(trackinfo[trackno].name)) { | 665 if(strlen(trackinfo[trackno].name)) { |
893 aud_tuple_associate_string(tuple, FIELD_TITLE, NULL, trackinfo[trackno].name); | 666 aud_tuple_associate_string(tuple, FIELD_TITLE, NULL, trackinfo[trackno].name); |
894 } | 667 } |
895 | 668 |
896 aud_tuple_associate_int(tuple, FIELD_TRACK_NUMBER, NULL, trackno); | 669 aud_tuple_associate_int(tuple, FIELD_TRACK_NUMBER, NULL, trackno); |
897 aud_tuple_associate_string(tuple, -1, "ext", "cda"); //XXX should do? --yaz | 670 aud_tuple_associate_string(tuple, -1, "ext", "cda"); //XXX should do? --yaz |
898 | 671 |
899 aud_tuple_associate_int(tuple, FIELD_LENGTH, NULL, | 672 aud_tuple_associate_int(tuple, FIELD_LENGTH, NULL, |
900 calculate_track_length(trackinfo[trackno].startlsn, trackinfo[trackno].endlsn)); | 673 calculate_track_length(trackinfo[trackno].startlsn, trackinfo[trackno].endlsn)); |
901 | 674 |
675 if(strlen(trackinfo[trackno].genre)) { | |
676 aud_tuple_associate_string(tuple, FIELD_GENRE, NULL, trackinfo[trackno].genre); | |
677 } | |
678 //tuple->year = 0; todo: set the year | |
679 | |
680 return tuple; | |
681 } | |
682 | |
683 static Tuple *create_tuple_from_trackinfo_and_filename(gchar *filename) | |
684 { | |
685 Tuple *tuple = aud_tuple_new_from_filename(filename); | |
686 | |
687 if (trackinfo == NULL) | |
688 return tuple; | |
689 | |
690 gint trackno = find_trackno_from_filename(filename); | |
691 | |
692 if (trackno < firsttrackno || trackno > lasttrackno) | |
693 return tuple; | |
694 | |
695 if(strlen(trackinfo[trackno].performer)) { | |
696 aud_tuple_associate_string(tuple, FIELD_ARTIST, NULL, trackinfo[trackno].performer); | |
697 } | |
698 if(strlen(trackinfo[0].name)) { | |
699 aud_tuple_associate_string(tuple, FIELD_ALBUM, NULL, trackinfo[0].name); | |
700 } | |
701 if(strlen(trackinfo[trackno].name)) { | |
702 aud_tuple_associate_string(tuple, FIELD_TITLE, NULL, trackinfo[trackno].name); | |
703 } | |
704 | |
705 aud_tuple_associate_int(tuple, FIELD_TRACK_NUMBER, NULL, trackno); | |
706 aud_tuple_associate_string(tuple, -1, "ext", "cda"); //XXX should do? --yaz | |
707 | |
708 aud_tuple_associate_int(tuple, FIELD_LENGTH, NULL, | |
709 calculate_track_length(trackinfo[trackno].startlsn, trackinfo[trackno].endlsn)); | |
710 | |
902 if(strlen(trackinfo[trackno].genre)) { | 711 if(strlen(trackinfo[trackno].genre)) { |
903 aud_tuple_associate_string(tuple, FIELD_GENRE, NULL, trackinfo[trackno].genre); | 712 aud_tuple_associate_string(tuple, FIELD_GENRE, NULL, trackinfo[trackno].genre); |
904 } | 713 } |
905 //tuple->year = 0; todo: set the year | 714 //tuple->year = 0; todo: set the year |
906 | 715 |
948 pdae_params->seektime = -1; | 757 pdae_params->seektime = -1; |
949 } | 758 } |
950 | 759 |
951 /* compute the actual number of sectors to read */ | 760 /* compute the actual number of sectors to read */ |
952 gint lsncount = CDDA_DAE_FRAMES <= (pdae_params->endlsn - pdae_params->currlsn + 1) ? CDDA_DAE_FRAMES : (pdae_params->endlsn - pdae_params->currlsn + 1); | 761 gint lsncount = CDDA_DAE_FRAMES <= (pdae_params->endlsn - pdae_params->currlsn + 1) ? CDDA_DAE_FRAMES : (pdae_params->endlsn - pdae_params->currlsn + 1); |
953 | 762 |
954 /* check too see if we have reached the end of the song */ | 763 /* check too see if we have reached the end of the song */ |
955 if (lsncount <= 0) { | 764 if (lsncount <= 0) { |
956 sleep(3); | 765 sleep(3); |
957 break; | 766 break; |
958 } | 767 } |
972 gint remainingbytes = lsncount * CDIO_CD_FRAMESIZE_RAW; | 781 gint remainingbytes = lsncount * CDIO_CD_FRAMESIZE_RAW; |
973 guchar *bytebuff = buffer; | 782 guchar *bytebuff = buffer; |
974 while (pdae_params->pplayback->playing && remainingbytes > 0 && pdae_params->seektime == -1) { | 783 while (pdae_params->pplayback->playing && remainingbytes > 0 && pdae_params->seektime == -1) { |
975 /* compute the actual number of bytes to play */ | 784 /* compute the actual number of bytes to play */ |
976 gint bytecount = CDIO_CD_FRAMESIZE_RAW <= remainingbytes ? CDIO_CD_FRAMESIZE_RAW : remainingbytes; | 785 gint bytecount = CDIO_CD_FRAMESIZE_RAW <= remainingbytes ? CDIO_CD_FRAMESIZE_RAW : remainingbytes; |
977 | 786 |
978 /* wait until the output buffer has enough room */ | 787 /* wait until the output buffer has enough room */ |
979 while (pdae_params->pplayback->playing && pdae_params->pplayback->output->buffer_free() < bytecount && pdae_params->seektime == -1) | 788 while (pdae_params->pplayback->playing && pdae_params->pplayback->output->buffer_free() < bytecount && pdae_params->seektime == -1) |
980 g_usleep(1000); | 789 g_usleep(1000); |
981 | 790 |
982 /* play the sound :) */ | 791 /* play the sound :) */ |
983 if (pdae_params->pplayback->playing && pdae_params->seektime == -1) | 792 if (pdae_params->pplayback->playing && pdae_params->seektime == -1) |
984 pdae_params->pplayback->pass_audio(pdae_params->pplayback, FMT_S16_LE, 2, | 793 pdae_params->pplayback->pass_audio(pdae_params->pplayback, FMT_S16_LE, 2, |
985 bytecount, bytebuff, &pdae_params->pplayback->playing); | 794 bytecount, bytebuff, &pdae_params->pplayback->playing); |
986 remainingbytes -= bytecount; | 795 remainingbytes -= bytecount; |
987 bytebuff += bytecount; | 796 bytebuff += bytecount; |
988 } | 797 } |
989 pdae_params->currlsn += lsncount; | 798 pdae_params->currlsn += lsncount; |
996 | 805 |
997 pdae_params->pplayback->output->close_audio(); | 806 pdae_params->pplayback->output->close_audio(); |
998 g_free(buffer); | 807 g_free(buffer); |
999 } | 808 } |
1000 | 809 |
810 static void scan_cd_threaded() | |
811 { | |
812 if (scan_cd_thread != NULL) { | |
813 debug("A scan_cd thread is already running.\n"); | |
814 return; | |
815 } | |
816 | |
817 scan_cd_thread = g_thread_create((GThreadFunc)scan_cd, NULL, TRUE, NULL); | |
818 if (scan_cd_thread == NULL) { | |
819 cdaudio_error("Failed to create the thread for retrieving song information.\n"); | |
820 return; | |
821 } | |
822 } | |
823 | |
824 | |
825 static void *scan_cd(void *nothing) | |
826 { | |
827 debug("scan_cd started\n"); | |
828 | |
829 gint trackno; | |
830 | |
831 /* find an available, audio capable, cd drive */ | |
832 if (cdng_cfg.device != NULL && strlen(cdng_cfg.device) > 0) { | |
833 pcdio = cdio_open(cdng_cfg.device, DRIVER_UNKNOWN); | |
834 if (pcdio == NULL) { | |
835 cdaudio_error("Failed to open CD device \"%s\".\n", cdng_cfg.device); | |
836 scan_cd_thread = NULL; | |
837 return NULL; | |
838 } | |
839 } | |
840 else { | |
841 gchar **ppcd_drives = cdio_get_devices_with_cap(NULL, CDIO_FS_AUDIO, false); | |
842 pcdio = NULL; | |
843 if (ppcd_drives != NULL && *ppcd_drives != NULL) { /* we have at least one audio capable cd drive */ | |
844 pcdio = cdio_open(*ppcd_drives, DRIVER_UNKNOWN); | |
845 if (pcdio == NULL) { | |
846 cdaudio_error("Failed to open CD.\n"); | |
847 cleanup_on_error(); | |
848 scan_cd_thread = NULL; | |
849 return NULL; | |
850 } | |
851 debug("found cd drive \"%s\" with audio capable media\n", *ppcd_drives); | |
852 } | |
853 else { | |
854 cdaudio_error("Unable to find or access a CDDA capable drive.\n"); | |
855 cleanup_on_error(); | |
856 scan_cd_thread = NULL; | |
857 return NULL; | |
858 } | |
859 if (ppcd_drives != NULL && *ppcd_drives != NULL) | |
860 cdio_free_device_list(ppcd_drives); | |
861 } | |
862 | |
863 /* limit read speed */ | |
864 if (cdng_cfg.limitspeed > 0 && cdng_cfg.use_dae) { | |
865 debug("setting drive speed limit to %dx\n", cdng_cfg.limitspeed); | |
866 if (cdio_set_speed(pcdio, cdng_cfg.limitspeed) != DRIVER_OP_SUCCESS) | |
867 cdaudio_error("Failed to set drive speed to %dx.\n", cdng_cfg.limitspeed); | |
868 } | |
869 | |
870 /* general track initialization */ | |
871 cdrom_drive_t *pcdrom_drive = cdio_cddap_identify_cdio(pcdio, 1, NULL); // todo : check return / NULL | |
872 firsttrackno = cdio_get_first_track_num(pcdrom_drive->p_cdio); | |
873 lasttrackno = cdio_get_last_track_num(pcdrom_drive->p_cdio); | |
874 if (firsttrackno == CDIO_INVALID_TRACK || lasttrackno == CDIO_INVALID_TRACK) { | |
875 cdaudio_error("Failed to retrieve first/last track number.\n"); | |
876 cleanup_on_error(); | |
877 scan_cd_thread = NULL; | |
878 return NULL; | |
879 } | |
880 debug("first track is %d and last track is %d\n", firsttrackno, lasttrackno); | |
881 | |
882 g_free(trackinfo); | |
883 trackinfo = (trackinfo_t *) g_new(trackinfo_t, (lasttrackno + 1)); | |
884 | |
885 cdaudio_set_fullinfo(&trackinfo[0], | |
886 cdio_get_track_lsn(pcdrom_drive->p_cdio, 0), | |
887 cdio_get_track_last_lsn(pcdrom_drive->p_cdio, CDIO_CDROM_LEADOUT_TRACK), | |
888 "", "", ""); | |
889 | |
890 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { | |
891 cdaudio_set_fullinfo(&trackinfo[trackno], | |
892 cdio_get_track_lsn(pcdrom_drive->p_cdio, trackno), | |
893 cdio_get_track_last_lsn(pcdrom_drive->p_cdio, trackno), | |
894 "", "", ""); | |
895 | |
896 if (trackinfo[trackno].startlsn == CDIO_INVALID_LSN || trackinfo[trackno].endlsn == CDIO_INVALID_LSN) { | |
897 cdaudio_error("Failed to retrieve stard/end lsn for track %d.\n", trackno); | |
898 cleanup_on_error(); | |
899 scan_cd_thread = NULL; | |
900 return NULL; | |
901 } | |
902 } | |
903 | |
904 /* get trackinfo[0] cdtext information (the disc) */ | |
905 if (cdng_cfg.use_cdtext) { | |
906 debug("getting cd-text information for disc\n"); | |
907 cdtext_t *pcdtext = cdio_get_cdtext(pcdrom_drive->p_cdio, 0); | |
908 if (pcdtext == NULL || pcdtext->field[CDTEXT_TITLE] == NULL) { | |
909 debug("no cd-text available for disc\n"); | |
910 } | |
911 else { | |
912 cdaudio_set_strinfo(&trackinfo[0], | |
913 pcdtext->field[CDTEXT_PERFORMER] ? pcdtext->field[CDTEXT_PERFORMER] : "", | |
914 pcdtext->field[CDTEXT_TITLE] ? pcdtext->field[CDTEXT_TITLE] : "", | |
915 pcdtext->field[CDTEXT_GENRE] ? pcdtext->field[CDTEXT_GENRE] : ""); | |
916 } | |
917 } | |
918 | |
919 /* get track information from cdtext */ | |
920 gboolean cdtext_was_available = FALSE; | |
921 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { | |
922 cdtext_t *pcdtext = NULL; | |
923 if (cdng_cfg.use_cdtext) { | |
924 debug("getting cd-text information for track %d\n", trackno); | |
925 pcdtext = cdio_get_cdtext(pcdrom_drive->p_cdio, trackno); | |
926 if (pcdtext == NULL || pcdtext->field[CDTEXT_PERFORMER] == NULL) { | |
927 debug("no cd-text available for track %d\n", trackno); | |
928 pcdtext = NULL; | |
929 } | |
930 } | |
931 | |
932 if (pcdtext != NULL) { | |
933 cdaudio_set_strinfo(&trackinfo[trackno], | |
934 pcdtext->field[CDTEXT_PERFORMER] ? pcdtext->field[CDTEXT_PERFORMER] : "", | |
935 pcdtext->field[CDTEXT_TITLE] ? pcdtext->field[CDTEXT_TITLE] : "", | |
936 pcdtext->field[CDTEXT_GENRE] ? pcdtext->field[CDTEXT_GENRE] : ""); | |
937 cdtext_was_available = TRUE; | |
938 } | |
939 else { | |
940 cdaudio_set_strinfo(&trackinfo[trackno], "", "", ""); | |
941 g_snprintf(trackinfo[trackno].name, DEF_STRING_LEN, "CD Audio Track %02u", trackno); | |
942 } | |
943 } | |
944 | |
945 if (!cdtext_was_available) { | |
946 /* initialize de cddb subsystem */ | |
947 cddb_conn_t *pcddb_conn = NULL; | |
948 cddb_disc_t *pcddb_disc = NULL; | |
949 cddb_track_t *pcddb_track = NULL; | |
950 | |
951 if (cdng_cfg.use_cddb) { | |
952 pcddb_conn = cddb_new(); | |
953 if (pcddb_conn == NULL) | |
954 cdaudio_error("Failed to create the cddb connection.\n"); | |
955 else { | |
956 debug("getting CDDB info\n"); | |
957 | |
958 if (cdng_cfg.use_proxy) { | |
959 cddb_http_proxy_enable(pcddb_conn); | |
960 cddb_set_http_proxy_server_name(pcddb_conn, cdng_cfg.proxy_host); | |
961 cddb_set_http_proxy_server_port(pcddb_conn, cdng_cfg.proxy_port); | |
962 cddb_set_http_proxy_username(pcddb_conn, cdng_cfg.proxy_username); | |
963 cddb_set_http_proxy_password(pcddb_conn, cdng_cfg.proxy_password); | |
964 cddb_set_server_name(pcddb_conn, cdng_cfg.cddb_server); | |
965 cddb_set_server_port(pcddb_conn, cdng_cfg.cddb_port); | |
966 } | |
967 else | |
968 if (cdng_cfg.cddb_http) { | |
969 cddb_http_enable(pcddb_conn); | |
970 cddb_set_server_name(pcddb_conn, cdng_cfg.cddb_server); | |
971 cddb_set_server_port(pcddb_conn, cdng_cfg.cddb_port); | |
972 } | |
973 else { | |
974 cddb_set_server_name(pcddb_conn, cdng_cfg.cddb_server); | |
975 cddb_set_server_port(pcddb_conn, cdng_cfg.cddb_port); | |
976 } | |
977 | |
978 pcddb_disc = cddb_disc_new(); | |
979 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { | |
980 pcddb_track = cddb_track_new(); | |
981 cddb_track_set_frame_offset(pcddb_track, trackinfo[trackno].startlsn); | |
982 cddb_disc_add_track(pcddb_disc, pcddb_track); | |
983 } | |
984 | |
985 msf_t startmsf, endmsf; | |
986 cdio_get_track_msf(pcdio, 1, &startmsf); | |
987 cdio_get_track_msf(pcdio, CDIO_CDROM_LEADOUT_TRACK, &endmsf); | |
988 cddb_disc_set_length(pcddb_disc, cdio_audio_get_msf_seconds(&endmsf) - cdio_audio_get_msf_seconds(&startmsf)); | |
989 | |
990 cddb_disc_calc_discid(pcddb_disc); | |
991 int discid = cddb_disc_get_discid(pcddb_disc); | |
992 debug("CDDB disc id = %x\n", discid); | |
993 | |
994 gint matches; | |
995 if ((matches = cddb_query(pcddb_conn, pcddb_disc)) == -1) { | |
996 if (cddb_errno(pcddb_conn) == CDDB_ERR_OK) | |
997 cdaudio_error("Failed to query the CDDB server\n"); | |
998 else | |
999 cdaudio_error("Failed to query the CDDB server: %s\n", cddb_error_str(cddb_errno(pcddb_conn))); | |
1000 | |
1001 cddb_disc_destroy(pcddb_disc); | |
1002 pcddb_disc = NULL; | |
1003 } | |
1004 else { | |
1005 if (matches == 0) { | |
1006 debug("no cddb info available for this disc\n"); | |
1007 | |
1008 cddb_disc_destroy(pcddb_disc); | |
1009 pcddb_disc = NULL; | |
1010 } | |
1011 else { | |
1012 debug("CDDB disc category = \"%s\"\n", cddb_disc_get_category_str(pcddb_disc)); | |
1013 | |
1014 cddb_read(pcddb_conn, pcddb_disc); | |
1015 if (cddb_errno(pcddb_conn) != CDDB_ERR_OK) { | |
1016 cdaudio_error("failed to read the cddb info: %s\n", cddb_error_str(cddb_errno(pcddb_conn))); | |
1017 cddb_disc_destroy(pcddb_disc); | |
1018 pcddb_disc = NULL; | |
1019 } | |
1020 else { | |
1021 debug("we have got the cddb info\n"); | |
1022 cdaudio_set_strinfo(&trackinfo[0], | |
1023 cddb_disc_get_artist(pcddb_disc), | |
1024 cddb_disc_get_title(pcddb_disc), | |
1025 cddb_disc_get_genre(pcddb_disc)); | |
1026 | |
1027 int trackno; | |
1028 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { | |
1029 cddb_track_t *pcddb_track = cddb_disc_get_track(pcddb_disc, trackno - 1); | |
1030 cdaudio_set_strinfo(&trackinfo[trackno], | |
1031 cddb_track_get_artist(pcddb_track), | |
1032 cddb_track_get_title(pcddb_track), | |
1033 cddb_disc_get_genre(pcddb_disc)); | |
1034 } | |
1035 } | |
1036 } | |
1037 } | |
1038 } | |
1039 } | |
1040 | |
1041 if (pcddb_disc != NULL) | |
1042 cddb_disc_destroy(pcddb_disc); | |
1043 | |
1044 if (pcddb_conn != NULL) | |
1045 cddb_destroy(pcddb_conn); | |
1046 } | |
1047 | |
1048 if (cdng_cfg.debug) { | |
1049 debug("disc has : performer = \"%s\", name = \"%s\", genre = \"%s\"\n", | |
1050 trackinfo[0].performer, trackinfo[0].name, trackinfo[0].genre); | |
1051 | |
1052 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { | |
1053 debug("track %d has : performer = \"%s\", name = \"%s\", genre = \"%s\", startlsn = %d, endlsn = %d\n", | |
1054 trackno, trackinfo[trackno].performer, trackinfo[trackno].name, trackinfo[trackno].genre, trackinfo[trackno].startlsn, trackinfo[trackno].endlsn); | |
1055 } | |
1056 } | |
1057 | |
1058 /* | |
1059 if (pinputplayback != NULL) { | |
1060 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) { | |
1061 Tuple *tuple = create_tuple_from_trackinfo(trackno); | |
1062 gchar *title = aud_tuple_formatter_make_title_string(tuple, aud_get_gentitle_format()); | |
1063 | |
1064 pinputplayback->set_params(pinputplayback, title, calculate_track_length(trackinfo[trackno].startlsn, trackinfo[trackno].endlsn), 1411200, 44100, 2); | |
1065 g_free(title); | |
1066 aud_tuple_free(tuple); | |
1067 } | |
1068 } | |
1069 */ | |
1070 | |
1071 debug("scan_cd ended\n"); | |
1072 | |
1073 scan_cd_thread = NULL; | |
1074 return (void* ) -1; | |
1075 } | |
1076 | |
1001 static gint calculate_track_length(gint startlsn, gint endlsn) | 1077 static gint calculate_track_length(gint startlsn, gint endlsn) |
1002 { | 1078 { |
1003 return ((endlsn - startlsn + 1) * 1000) / 75; | 1079 return ((endlsn - startlsn + 1) * 1000) / 75; |
1004 } | 1080 } |
1005 | 1081 |