Mercurial > audlegacy-plugins
comparison src/cdaudio-ng/cdaudio-ng.c @ 3058:2e649bf16ebc
Robust media change handling written by John Wehle, closes bug #46.
author | Tony Vroon <chainsaw@gentoo.org> |
---|---|
date | Fri, 24 Apr 2009 09:23:20 +0100 |
parents | 1192140d9e3f |
children | 7c27b8612b7e |
comparison
equal
deleted
inserted
replaced
3057:e7e3fb0b0aaf | 3058:2e649bf16ebc |
---|---|
57 cdng_cfg_t cdng_cfg; | 57 cdng_cfg_t cdng_cfg; |
58 static gint firsttrackno = -1; | 58 static gint firsttrackno = -1; |
59 static gint lasttrackno = -1; | 59 static gint lasttrackno = -1; |
60 static CdIo_t *pcdio = NULL; | 60 static CdIo_t *pcdio = NULL; |
61 static trackinfo_t *trackinfo = NULL; | 61 static trackinfo_t *trackinfo = NULL; |
62 static gboolean is_paused = FALSE; | 62 static GMutex *trackinfo_mutex; |
63 static volatile gboolean trackinfo_changed = FALSE; | |
64 static volatile gboolean is_paused = FALSE; | |
63 static gint playing_track = -1; | 65 static gint playing_track = -1; |
64 static dae_params_t *pdae_params = NULL; | 66 static dae_params_t *pdae_params = NULL; |
65 static InputPlayback *pglobalinputplayback = NULL; | 67 static InputPlayback *pglobalinputplayback = NULL; |
66 static GtkWidget *main_menu_item, *playlist_menu_item; | 68 static GtkWidget *main_menu_item, *playlist_menu_item; |
67 static GThread *scan_cd_thread = NULL; | |
68 static gint first_trackno_to_add_after_scan = -1; | |
69 static gint last_trackno_to_add_after_scan = -1; | |
70 | 69 |
71 static void cdaudio_init(void); | 70 static void cdaudio_init(void); |
72 static void cdaudio_about(void); | 71 static void cdaudio_about(void); |
73 static void cdaudio_configure(void); | 72 static void cdaudio_configure(void); |
74 static gint cdaudio_is_our_file(gchar *filename); | 73 static gint cdaudio_is_our_file(gchar *filename); |
86 static void menu_click(void); | 85 static void menu_click(void); |
87 static void rescan_menu_click(void); | 86 static void rescan_menu_click(void); |
88 static Tuple *create_tuple_from_trackinfo_and_filename(gchar *filename); | 87 static Tuple *create_tuple_from_trackinfo_and_filename(gchar *filename); |
89 static void dae_play_loop(dae_params_t *pdae_params); | 88 static void dae_play_loop(dae_params_t *pdae_params); |
90 static void *scan_cd(void *nothing); | 89 static void *scan_cd(void *nothing); |
91 static void scan_cd_threaded(int firsttrackno, int lasttrackno); | 90 static void refresh_trackinfo(void); |
91 static gboolean refresh_playlist(gboolean force); | |
92 static void append_track_to_playlist(int trackno); | 92 static void append_track_to_playlist(int trackno); |
93 static gboolean show_noaudiocd_info(); | 93 static gboolean show_noaudiocd_info(); |
94 static gint calculate_track_length(gint startlsn, gint endlsn); | 94 static gint calculate_track_length(gint startlsn, gint endlsn); |
95 static gint find_trackno_from_filename(gchar *filename); | 95 static gint find_trackno_from_filename(gchar *filename); |
96 static void cleanup_on_error(void); | 96 static void cleanup_on_error(void); |
168 cdaudio_error("Failed to read configuration.\n"); | 168 cdaudio_error("Failed to read configuration.\n"); |
169 cleanup_on_error(); | 169 cleanup_on_error(); |
170 return; | 170 return; |
171 } | 171 } |
172 | 172 |
173 if (!cdio_init()) { | |
174 cdaudio_error("Failed to initialize cdio subsystem.\n"); | |
175 cleanup_on_error(); | |
176 aud_cfg_db_close(db); | |
177 return; | |
178 } | |
179 | |
180 libcddb_init(); | |
181 | |
182 aud_cfg_db_get_bool(db, "CDDA", "use_dae", &cdng_cfg.use_dae); | 173 aud_cfg_db_get_bool(db, "CDDA", "use_dae", &cdng_cfg.use_dae); |
183 aud_cfg_db_get_bool(db, "CDDA", "use_cdtext", &cdng_cfg.use_cdtext); | 174 aud_cfg_db_get_bool(db, "CDDA", "use_cdtext", &cdng_cfg.use_cdtext); |
184 aud_cfg_db_get_bool(db, "CDDA", "use_cddb", &cdng_cfg.use_cddb); | 175 aud_cfg_db_get_bool(db, "CDDA", "use_cddb", &cdng_cfg.use_cddb); |
185 aud_cfg_db_get_bool(db, "CDDA", "debug", &cdng_cfg.debug); | 176 aud_cfg_db_get_bool(db, "CDDA", "debug", &cdng_cfg.debug); |
186 aud_cfg_db_get_string(db, "CDDA", "device", &cdng_cfg.device); | 177 aud_cfg_db_get_string(db, "CDDA", "device", &cdng_cfg.device); |
199 | 190 |
200 debug("use_dae = %d, limitspeed = %d, use_cdtext = %d, use_cddb = %d, cddbserver = \"%s\", cddbpath = \"%s\", cddbport = %d, cddbhttp = %d, device = \"%s\", debug = %d\n", | 191 debug("use_dae = %d, limitspeed = %d, use_cdtext = %d, use_cddb = %d, cddbserver = \"%s\", cddbpath = \"%s\", cddbport = %d, cddbhttp = %d, device = \"%s\", debug = %d\n", |
201 cdng_cfg.use_dae, cdng_cfg.limitspeed, cdng_cfg.use_cdtext, cdng_cfg.use_cddb, | 192 cdng_cfg.use_dae, cdng_cfg.limitspeed, cdng_cfg.use_cdtext, cdng_cfg.use_cddb, |
202 cdng_cfg.cddb_server, cdng_cfg.cddb_path, cdng_cfg.cddb_port, cdng_cfg.cddb_http, cdng_cfg.device, cdng_cfg.debug); | 193 cdng_cfg.cddb_server, cdng_cfg.cddb_path, cdng_cfg.cddb_port, cdng_cfg.cddb_http, cdng_cfg.device, cdng_cfg.debug); |
203 | 194 |
195 if (!cdio_init()) { | |
196 cdaudio_error("Failed to initialize cdio subsystem.\n"); | |
197 cleanup_on_error(); | |
198 return; | |
199 } | |
200 | |
201 libcddb_init(); | |
202 | |
203 trackinfo_mutex = g_mutex_new(); | |
204 trackinfo_changed = FALSE; | |
205 | |
204 menu_item_text = _("Rescan CD"); | 206 menu_item_text = _("Rescan CD"); |
205 main_menu_item = gtk_image_menu_item_new_with_label(menu_item_text); | 207 main_menu_item = gtk_image_menu_item_new_with_label(menu_item_text); |
206 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(main_menu_item), gtk_image_new_from_stock(GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU)); | 208 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(main_menu_item), gtk_image_new_from_stock(GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU)); |
207 gtk_widget_show(main_menu_item); | 209 gtk_widget_show(main_menu_item); |
208 audacious_menu_plugin_item_add(AUDACIOUS_MENU_MAIN, main_menu_item); | 210 audacious_menu_plugin_item_add(AUDACIOUS_MENU_MAIN, main_menu_item); |
210 | 212 |
211 playlist_menu_item = gtk_image_menu_item_new_with_label(menu_item_text); | 213 playlist_menu_item = gtk_image_menu_item_new_with_label(menu_item_text); |
212 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)); | 214 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)); |
213 gtk_widget_show(playlist_menu_item); | 215 gtk_widget_show(playlist_menu_item); |
214 audacious_menu_plugin_item_add(AUDACIOUS_MENU_PLAYLIST_RCLICK, playlist_menu_item); | 216 audacious_menu_plugin_item_add(AUDACIOUS_MENU_PLAYLIST_RCLICK, playlist_menu_item); |
215 g_signal_connect(G_OBJECT(playlist_menu_item), "activate", G_CALLBACK(menu_click), NULL); | 217 g_signal_connect(G_OBJECT(playlist_menu_item), "activate", G_CALLBACK(rescan_menu_click), NULL); |
216 | 218 |
217 menu_item_text = _("Add CD"); | 219 menu_item_text = _("Add CD"); |
218 main_menu_item = gtk_image_menu_item_new_with_label(menu_item_text); | 220 main_menu_item = gtk_image_menu_item_new_with_label(menu_item_text); |
219 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)); | 221 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)); |
220 gtk_widget_show(main_menu_item); | 222 gtk_widget_show(main_menu_item); |
265 { | 267 { |
266 debug("cdaudio_is_our_file(\"%s\")\n", filename); | 268 debug("cdaudio_is_our_file(\"%s\")\n", filename); |
267 | 269 |
268 if (filename != NULL && !strcmp(filename, CDDA_DUMMYPATH)) { | 270 if (filename != NULL && !strcmp(filename, CDDA_DUMMYPATH)) { |
269 debug("\"%s\" will add the whole audio cd\n", filename); | 271 debug("\"%s\" will add the whole audio cd\n", filename); |
270 menu_click(); | 272 refresh_trackinfo(); |
273 refresh_playlist(TRUE); | |
271 return FALSE; | 274 return FALSE; |
272 } | 275 } |
273 | 276 |
274 if ((filename != NULL) && strlen(filename) > 4 && (!strcasecmp(filename + strlen(filename) - 4, ".cda"))) { | 277 if ((filename != NULL) && strlen(filename) > 4 && (!strcasecmp(filename + strlen(filename) - 4, ".cda"))) { |
275 gint trackno = find_trackno_from_filename(filename); | 278 gint trackno = find_trackno_from_filename(filename); |
276 | 279 |
277 /* no CD information yet */ | 280 refresh_trackinfo (); |
278 if (pcdio == NULL) { | |
279 debug("no CD information, scanning\n"); | |
280 if (first_trackno_to_add_after_scan == -1) | |
281 scan_cd_threaded(0, 0); | |
282 else | |
283 scan_cd_threaded(trackno, trackno); | |
284 } | |
285 | |
286 /* reload the cd information if the media has changed */ | |
287 if (pcdio != NULL && cdio_get_media_changed(pcdio)) { | |
288 debug("CD changed, rescanning\n"); | |
289 scan_cd_threaded(0, 0); | |
290 } | |
291 | 281 |
292 /* check if the requested track actually exists on the current audio cd */ | 282 /* check if the requested track actually exists on the current audio cd */ |
293 if (trackno < firsttrackno || trackno > lasttrackno) { | 283 if (trackno < firsttrackno || trackno > lasttrackno) { |
294 debug("\"%s\" is not our file (track number is out of the valid range)\n", filename); | 284 debug("\"%s\" is not our file (track number is out of the valid range)\n", filename); |
295 return FALSE; | 285 return FALSE; |
331 | 321 |
332 debug("cdaudio_play_file(\"%s\")\n", pinputplayback->filename); | 322 debug("cdaudio_play_file(\"%s\")\n", pinputplayback->filename); |
333 | 323 |
334 pglobalinputplayback = pinputplayback; | 324 pglobalinputplayback = pinputplayback; |
335 | 325 |
336 if (trackinfo == NULL) { | 326 refresh_trackinfo (); |
337 debug("no CD information, scanning\n"); | 327 |
338 if (scan_cd_thread != NULL) | 328 gint trackno = find_trackno_from_filename(pinputplayback->filename); |
339 g_thread_join(scan_cd_thread); | 329 |
340 else | 330 if (refresh_playlist(FALSE)) |
341 scan_cd(pinputplayback); | 331 return; |
342 } | |
343 else | |
344 if (cdio_get_media_changed(pcdio)) { | |
345 debug("CD changed, rescanning\n"); | |
346 if (scan_cd_thread != NULL) | |
347 g_thread_join(scan_cd_thread); | |
348 else | |
349 scan_cd(pinputplayback); | |
350 } | |
351 | 332 |
352 if (trackinfo == NULL) { | 333 if (trackinfo == NULL) { |
353 debug("no CD information can be retrieved, aborting\n"); | 334 debug("no CD information can be retrieved, aborting\n"); |
354 pinputplayback->playing = FALSE; | 335 pinputplayback->playing = FALSE; |
355 return; | 336 return; |
356 } | 337 } |
357 | 338 |
358 gint trackno = find_trackno_from_filename(pinputplayback->filename); | |
359 if (trackno < firsttrackno || trackno > lasttrackno) { | 339 if (trackno < firsttrackno || trackno > lasttrackno) { |
360 cdaudio_error("Track #%d is out of range [%d..%d]\n", trackno, firsttrackno, lasttrackno); | 340 cdaudio_error("Track #%d is out of range [%d..%d]\n", trackno, firsttrackno, lasttrackno); |
361 cleanup_on_error(); | 341 cleanup_on_error(); |
362 return; | 342 return; |
363 } | 343 } |
566 | 546 |
567 static void cdaudio_cleanup(void) | 547 static void cdaudio_cleanup(void) |
568 { | 548 { |
569 debug("cdaudio_cleanup()\n"); | 549 debug("cdaudio_cleanup()\n"); |
570 | 550 |
571 libcddb_shutdown(); | 551 audacious_menu_plugin_item_remove(AUDACIOUS_MENU_MAIN, main_menu_item); |
572 | 552 audacious_menu_plugin_item_remove(AUDACIOUS_MENU_PLAYLIST, playlist_menu_item); |
573 if (pcdio != NULL) { | 553 if (pcdio != NULL) { |
574 if (playing_track != -1 && !cdng_cfg.use_dae) | 554 if (playing_track != -1 && !cdng_cfg.use_dae) |
575 cdio_audio_stop(pcdio); | 555 cdio_audio_stop(pcdio); |
576 cdio_destroy(pcdio); | 556 cdio_destroy(pcdio); |
577 pcdio = NULL; | 557 pcdio = NULL; |
579 if (trackinfo != NULL) { | 559 if (trackinfo != NULL) { |
580 g_free(trackinfo); | 560 g_free(trackinfo); |
581 trackinfo = NULL; | 561 trackinfo = NULL; |
582 } | 562 } |
583 playing_track = -1; | 563 playing_track = -1; |
564 | |
565 g_mutex_free(trackinfo_mutex); | |
566 | |
567 libcddb_shutdown(); | |
584 | 568 |
585 // todo: destroy the gui | 569 // todo: destroy the gui |
586 | 570 |
587 mcs_handle_t *db = aud_cfg_db_open(); | 571 mcs_handle_t *db = aud_cfg_db_open(); |
588 aud_cfg_db_set_bool(db, "CDDA", "use_dae", cdng_cfg.use_dae); | 572 aud_cfg_db_set_bool(db, "CDDA", "use_dae", cdng_cfg.use_dae); |
595 aud_cfg_db_set_bool(db, "CDDA", "cddbhttp", cdng_cfg.cddb_http); | 579 aud_cfg_db_set_bool(db, "CDDA", "cddbhttp", cdng_cfg.cddb_http); |
596 aud_cfg_db_set_string(db, "CDDA", "device", cdng_cfg.device); | 580 aud_cfg_db_set_string(db, "CDDA", "device", cdng_cfg.device); |
597 aud_cfg_db_set_bool(db, "CDDA", "debug", cdng_cfg.debug); | 581 aud_cfg_db_set_bool(db, "CDDA", "debug", cdng_cfg.debug); |
598 aud_cfg_db_close(db); | 582 aud_cfg_db_close(db); |
599 | 583 |
600 audacious_menu_plugin_item_remove(AUDACIOUS_MENU_MAIN, main_menu_item); | |
601 audacious_menu_plugin_item_remove(AUDACIOUS_MENU_PLAYLIST, playlist_menu_item); | |
602 } | 584 } |
603 | 585 |
604 static void cdaudio_get_song_info(gchar *filename, gchar **title, gint *length) | 586 static void cdaudio_get_song_info(gchar *filename, gchar **title, gint *length) |
605 { | 587 { |
606 debug("cdaudio_get_song_info(\"%s\")\n", filename); | 588 debug("cdaudio_get_song_info(\"%s\")\n", filename); |
630 static void menu_click(void) | 612 static void menu_click(void) |
631 { | 613 { |
632 debug("plugin services menu option selected\n"); | 614 debug("plugin services menu option selected\n"); |
633 | 615 |
634 /* reload the cd information if the media has changed, or no track information is available */ | 616 /* reload the cd information if the media has changed, or no track information is available */ |
635 if (pcdio == NULL || cdio_get_media_changed(pcdio)) { | 617 refresh_trackinfo(); |
636 if (scan_cd_thread != NULL) | 618 (void)refresh_playlist(TRUE); |
637 return; | |
638 else { | |
639 scan_cd_threaded(-1, -1); | |
640 debug("CD changed, rescanning\n"); | |
641 } | |
642 } | |
643 else { | |
644 gint trackno; | |
645 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) | |
646 append_track_to_playlist(trackno); | |
647 } | |
648 } | 619 } |
649 | 620 |
650 static void rescan_menu_click(void) | 621 static void rescan_menu_click(void) |
651 { | 622 { |
652 debug("plugin services rescan option selected\n"); | 623 debug("plugin services rescan option selected\n"); |
653 | 624 |
654 scan_cd_threaded(0, 0); | 625 refresh_trackinfo(); |
655 } | 626 } |
656 | 627 |
657 static Tuple *create_tuple_from_trackinfo_and_filename(gchar *filename) | 628 static Tuple *create_tuple_from_trackinfo_and_filename(gchar *filename) |
658 { | 629 { |
659 Tuple *tuple = aud_tuple_new_from_filename(filename); | 630 Tuple *tuple = aud_tuple_new_from_filename(filename); |
631 | |
632 refresh_trackinfo (); | |
660 | 633 |
661 if (trackinfo == NULL) | 634 if (trackinfo == NULL) |
662 return tuple; | 635 return tuple; |
663 | 636 |
664 gint trackno = find_trackno_from_filename(filename); | 637 gint trackno = find_trackno_from_filename(filename); |
772 | 745 |
773 pdae_params->pplayback->output->close_audio(); | 746 pdae_params->pplayback->output->close_audio(); |
774 g_free(buffer); | 747 g_free(buffer); |
775 } | 748 } |
776 | 749 |
777 static void scan_cd_threaded(int firsttrackno, int lasttrackno) | |
778 { | |
779 if (scan_cd_thread != NULL) { | |
780 debug("A scan_cd thread is already running.\n"); | |
781 return; | |
782 } | |
783 | |
784 first_trackno_to_add_after_scan = firsttrackno; | |
785 last_trackno_to_add_after_scan = lasttrackno; | |
786 | |
787 scan_cd_thread = g_thread_create((GThreadFunc)scan_cd, NULL, TRUE, NULL); | |
788 if (scan_cd_thread == NULL) { | |
789 cdaudio_error("Failed to create the thread for retrieving song information.\n"); | |
790 return; | |
791 } | |
792 } | |
793 | |
794 static void append_track_to_playlist(int trackno) | 750 static void append_track_to_playlist(int trackno) |
795 { | 751 { |
796 gchar pathname[DEF_STRING_LEN]; | 752 gchar pathname[DEF_STRING_LEN]; |
797 | 753 |
798 g_snprintf(pathname, DEF_STRING_LEN, "%strack%02u.cda", CDDA_DUMMYPATH, trackno); | 754 g_snprintf(pathname, DEF_STRING_LEN, "%strack%02u.cda", CDDA_DUMMYPATH, trackno); |
799 aud_playlist_add(aud_playlist_get_active(), pathname); | 755 audacious_drct_pl_add_url_string(pathname); |
800 | 756 |
801 debug("added track \"%s\" to the playlist\n", pathname); | 757 debug("added track \"%s\" to the playlist\n", pathname); |
802 } | 758 } |
803 | 759 |
804 static gboolean show_noaudiocd_info() | 760 static gboolean show_noaudiocd_info() |
830 /* find an available, audio capable, cd drive */ | 786 /* find an available, audio capable, cd drive */ |
831 if (cdng_cfg.device != NULL && strlen(cdng_cfg.device) > 0) { | 787 if (cdng_cfg.device != NULL && strlen(cdng_cfg.device) > 0) { |
832 pcdio = cdio_open(cdng_cfg.device, DRIVER_UNKNOWN); | 788 pcdio = cdio_open(cdng_cfg.device, DRIVER_UNKNOWN); |
833 if (pcdio == NULL) { | 789 if (pcdio == NULL) { |
834 cdaudio_error("Failed to open CD device \"%s\".\n", cdng_cfg.device); | 790 cdaudio_error("Failed to open CD device \"%s\".\n", cdng_cfg.device); |
835 scan_cd_thread = NULL; | |
836 show_noaudiocd_info(); | 791 show_noaudiocd_info(); |
837 return NULL; | 792 return NULL; |
838 } | 793 } |
839 } | 794 } |
840 else { | 795 else { |
843 if (ppcd_drives != NULL && *ppcd_drives != NULL) { /* we have at least one audio capable cd drive */ | 798 if (ppcd_drives != NULL && *ppcd_drives != NULL) { /* we have at least one audio capable cd drive */ |
844 pcdio = cdio_open(*ppcd_drives, DRIVER_UNKNOWN); | 799 pcdio = cdio_open(*ppcd_drives, DRIVER_UNKNOWN); |
845 if (pcdio == NULL) { | 800 if (pcdio == NULL) { |
846 cdaudio_error("Failed to open CD.\n"); | 801 cdaudio_error("Failed to open CD.\n"); |
847 cleanup_on_error(); | 802 cleanup_on_error(); |
848 scan_cd_thread = NULL; | |
849 show_noaudiocd_info(); | 803 show_noaudiocd_info(); |
850 return NULL; | 804 return NULL; |
851 } | 805 } |
852 debug("found cd drive \"%s\" with audio capable media\n", *ppcd_drives); | 806 debug("found cd drive \"%s\" with audio capable media\n", *ppcd_drives); |
853 } | 807 } |
854 else { | 808 else { |
855 cdaudio_error("Unable to find or access a CDDA capable drive.\n"); | 809 cdaudio_error("Unable to find or access a CDDA capable drive.\n"); |
856 cleanup_on_error(); | 810 cleanup_on_error(); |
857 scan_cd_thread = NULL; | |
858 show_noaudiocd_info(); | 811 show_noaudiocd_info(); |
859 return NULL; | 812 return NULL; |
860 } | 813 } |
861 if (ppcd_drives != NULL && *ppcd_drives != NULL) | 814 if (ppcd_drives != NULL && *ppcd_drives != NULL) |
862 cdio_free_device_list(ppcd_drives); | 815 cdio_free_device_list(ppcd_drives); |
874 firsttrackno = cdio_get_first_track_num(pcdrom_drive->p_cdio); | 827 firsttrackno = cdio_get_first_track_num(pcdrom_drive->p_cdio); |
875 lasttrackno = cdio_get_last_track_num(pcdrom_drive->p_cdio); | 828 lasttrackno = cdio_get_last_track_num(pcdrom_drive->p_cdio); |
876 if (firsttrackno == CDIO_INVALID_TRACK || lasttrackno == CDIO_INVALID_TRACK) { | 829 if (firsttrackno == CDIO_INVALID_TRACK || lasttrackno == CDIO_INVALID_TRACK) { |
877 cdaudio_error("Failed to retrieve first/last track number.\n"); | 830 cdaudio_error("Failed to retrieve first/last track number.\n"); |
878 cleanup_on_error(); | 831 cleanup_on_error(); |
879 scan_cd_thread = NULL; | |
880 show_noaudiocd_info(); | 832 show_noaudiocd_info(); |
881 return NULL; | 833 return NULL; |
882 } | 834 } |
883 debug("first track is %d and last track is %d\n", firsttrackno, lasttrackno); | 835 debug("first track is %d and last track is %d\n", firsttrackno, lasttrackno); |
884 | 836 |
897 "", "", ""); | 849 "", "", ""); |
898 | 850 |
899 if (trackinfo[trackno].startlsn == CDIO_INVALID_LSN || trackinfo[trackno].endlsn == CDIO_INVALID_LSN) { | 851 if (trackinfo[trackno].startlsn == CDIO_INVALID_LSN || trackinfo[trackno].endlsn == CDIO_INVALID_LSN) { |
900 cdaudio_error("Failed to retrieve stard/end lsn for track %d.\n", trackno); | 852 cdaudio_error("Failed to retrieve stard/end lsn for track %d.\n", trackno); |
901 cleanup_on_error(); | 853 cleanup_on_error(); |
902 scan_cd_thread = NULL; | |
903 show_noaudiocd_info(); | 854 show_noaudiocd_info(); |
904 return NULL; | 855 return NULL; |
905 } | 856 } |
906 } | 857 } |
907 | 858 |
1063 } | 1014 } |
1064 } | 1015 } |
1065 | 1016 |
1066 debug("scan_cd ended\n"); | 1017 debug("scan_cd ended\n"); |
1067 | 1018 |
1068 scan_cd_thread = NULL; | 1019 return NULL; |
1069 | 1020 } |
1070 | 1021 |
1071 /* add the requested entries to the current playlist */ | 1022 static void refresh_trackinfo (void) |
1072 | 1023 { |
1073 if (first_trackno_to_add_after_scan == 0 || last_trackno_to_add_after_scan == 0) | 1024 |
1074 return NULL; | 1025 g_mutex_lock(trackinfo_mutex); |
1075 | 1026 |
1076 if (first_trackno_to_add_after_scan == -1) | 1027 if (pcdio == NULL || cdio_get_media_changed(pcdio) || ! trackinfo) { |
1077 first_trackno_to_add_after_scan = firsttrackno; | 1028 debug(pcdio ? "CD changed, rescanning\n" |
1078 if (last_trackno_to_add_after_scan == -1) | 1029 : "no CD information, scanning\n"); |
1079 last_trackno_to_add_after_scan = lasttrackno; | 1030 scan_cd(NULL); |
1080 | 1031 trackinfo_changed = TRUE; |
1081 for (trackno = first_trackno_to_add_after_scan; trackno <= last_trackno_to_add_after_scan; trackno++) | 1032 } |
1033 | |
1034 g_mutex_unlock(trackinfo_mutex); | |
1035 } | |
1036 | |
1037 static gboolean refresh_playlist (gboolean force) | |
1038 { | |
1039 gint need_jump; | |
1040 gint trackno; | |
1041 | |
1042 g_mutex_lock(trackinfo_mutex); | |
1043 | |
1044 if ((! trackinfo_changed && ! force) || ! trackinfo) { | |
1045 g_mutex_unlock(trackinfo_mutex); | |
1046 return FALSE; | |
1047 } | |
1048 | |
1049 need_jump = audacious_drct_pl_get_length () && trackinfo_changed; | |
1050 | |
1051 audacious_drct_pl_clear (); | |
1052 | |
1053 for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) | |
1082 append_track_to_playlist(trackno); | 1054 append_track_to_playlist(trackno); |
1083 | 1055 |
1084 return NULL; | 1056 if (need_jump) { |
1057 audacious_drct_pq_clear (); | |
1058 audacious_drct_pq_add (0); | |
1059 } | |
1060 | |
1061 trackinfo_changed = FALSE; | |
1062 | |
1063 g_mutex_unlock(trackinfo_mutex); | |
1064 | |
1065 return TRUE; | |
1085 } | 1066 } |
1086 | 1067 |
1087 static gint calculate_track_length(gint startlsn, gint endlsn) | 1068 static gint calculate_track_length(gint startlsn, gint endlsn) |
1088 { | 1069 { |
1089 return ((endlsn - startlsn + 1) * 1000) / 75; | 1070 return ((endlsn - startlsn + 1) * 1000) / 75; |