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;