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