Mercurial > hg > xmms-sid
comparison src/xmms-sid.c @ 184:4406e91d2da3
Subtune control slider in fileinfo-window now works. Various fixes.
Pop-up subtune control can now be exited via ESC-button. The slider
is focused by default.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 18 Aug 2004 05:16:00 +0000 |
parents | 6e350784aa57 |
children | e9e97670f7d7 |
comparison
equal
deleted
inserted
replaced
183:11d0f9555717 | 184:4406e91d2da3 |
---|---|
25 #include <stdio.h> | 25 #include <stdio.h> |
26 #include <errno.h> | 26 #include <errno.h> |
27 | 27 |
28 #include <xmms/plugin.h> | 28 #include <xmms/plugin.h> |
29 #include <xmms/util.h> | 29 #include <xmms/util.h> |
30 | |
31 #include <gdk/gdkkeysyms.h> | |
32 #include <gtk/gtk.h> | |
30 | 33 |
31 #include "xmms-sid.h" | 34 #include "xmms-sid.h" |
32 #include "xs_support.h" | 35 #include "xs_support.h" |
33 #include "xs_config.h" | 36 #include "xs_config.h" |
34 #include "xs_length.h" | 37 #include "xs_length.h" |
115 *xs_subctrl = NULL; | 118 *xs_subctrl = NULL; |
116 static GtkObject *xs_subctrl_adj = NULL; | 119 static GtkObject *xs_subctrl_adj = NULL; |
117 static t_xs_tune *xs_fileinfotune = NULL; | 120 static t_xs_tune *xs_fileinfotune = NULL; |
118 static t_xs_stil_node *xs_fileinfostil = NULL; | 121 static t_xs_stil_node *xs_fileinfostil = NULL; |
119 | 122 |
123 | |
120 void xs_subctrl_close(void); | 124 void xs_subctrl_close(void); |
125 void xs_subctrl_update(void); | |
121 | 126 |
122 | 127 |
123 /* | 128 /* |
124 * Re-initialize some settings | 129 * Re-initialize some settings |
125 */ | 130 */ |
297 while (xs_status.isPlaying && doPlay) | 302 while (xs_status.isPlaying && doPlay) |
298 { | 303 { |
299 pthread_mutex_lock(&xs_mutex); | 304 pthread_mutex_lock(&xs_mutex); |
300 myStatus.currSong = xs_status.currSong; | 305 myStatus.currSong = xs_status.currSong; |
301 pthread_mutex_unlock(&xs_mutex); | 306 pthread_mutex_unlock(&xs_mutex); |
307 xs_subctrl_update(); | |
302 | 308 |
303 XSDEBUG("subtune #%i selected, initializing...\n", myStatus.currSong); | 309 XSDEBUG("subtune #%i selected, initializing...\n", myStatus.currSong); |
304 | 310 |
305 songLength = myTune->subTunes[myStatus.currSong - 1].tuneLength; | 311 songLength = myTune->subTunes[myStatus.currSong - 1].tuneLength; |
312 | |
313 /* Check minimum playtime */ | |
306 if (xs_cfg.playMinTimeEnable) | 314 if (xs_cfg.playMinTimeEnable) |
307 { | 315 { |
308 if (songLength < xs_cfg.playMinTime) | 316 if (songLength < xs_cfg.playMinTime) |
309 songLength = xs_cfg.playMinTime; | 317 songLength = xs_cfg.playMinTime; |
310 } | 318 } |
312 /* Initialize song */ | 320 /* Initialize song */ |
313 if (!xs_player->plrInitSong(&myStatus)) | 321 if (!xs_player->plrInitSong(&myStatus)) |
314 { | 322 { |
315 XSERR("Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n", | 323 XSERR("Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n", |
316 myTune->tuneFilename, myStatus.currSong); | 324 myTune->tuneFilename, myStatus.currSong); |
317 goto err_exit; | 325 goto xs_err_exit; |
318 } | 326 } |
319 | 327 |
320 | 328 |
321 /* Get song information for current subtune */ | 329 /* Get song information for current subtune */ |
322 xs_plugin_ip.set_info( | 330 xs_plugin_ip.set_info( |
333 XSERR("Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n", | 341 XSERR("Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n", |
334 myStatus.audioFormat, myStatus.audioFrequency, myStatus.audioChannels); | 342 myStatus.audioFormat, myStatus.audioFrequency, myStatus.audioChannels); |
335 pthread_mutex_lock(&xs_mutex); | 343 pthread_mutex_lock(&xs_mutex); |
336 xs_status.isError = TRUE; | 344 xs_status.isError = TRUE; |
337 pthread_mutex_unlock(&xs_mutex); | 345 pthread_mutex_unlock(&xs_mutex); |
338 goto err_exit; | 346 goto xs_err_exit; |
339 } | 347 } |
340 | 348 |
341 audioOpen = TRUE; | 349 audioOpen = TRUE; |
342 | 350 |
343 /* | 351 /* |
397 | 405 |
398 /* Now determine if we continue by selecting other subtune or something */ | 406 /* Now determine if we continue by selecting other subtune or something */ |
399 if (!myStatus.isPlaying) doPlay = FALSE; | 407 if (!myStatus.isPlaying) doPlay = FALSE; |
400 } | 408 } |
401 | 409 |
402 err_exit: | 410 xs_err_exit: |
403 /* Close audio */ | 411 /* Close audio */ |
404 if (audioOpen) | 412 if (audioOpen) |
405 { | 413 { |
406 XSDEBUG("close audio #2\n"); | 414 XSDEBUG("close audio #2\n"); |
407 xs_plugin_ip.output->close_audio(); | 415 xs_plugin_ip.output->close_audio(); |
440 | 448 |
441 /* Set general status information */ | 449 /* Set general status information */ |
442 xs_status.isPlaying = TRUE; | 450 xs_status.isPlaying = TRUE; |
443 xs_status.isError = FALSE; | 451 xs_status.isError = FALSE; |
444 xs_status.currSong = xs_status.pTune->startTune; | 452 xs_status.currSong = xs_status.pTune->startTune; |
445 | 453 |
446 /* Start the playing thread! */ | 454 /* Start the playing thread! */ |
447 if (pthread_create(&xs_decode_thread, NULL, xs_play_loop, NULL) < 0) | 455 if (pthread_create(&xs_decode_thread, NULL, xs_play_loop, NULL) < 0) |
448 { | 456 { |
449 XSERR("Couldn't start playing thread! Possible reason reported by system: %s\n", strerror(errno)); | 457 XSERR("Couldn't start playing thread! Possible reason reported by system: %s\n", strerror(errno)); |
450 xs_tune_free(xs_status.pTune); | 458 xs_tune_free(xs_status.pTune); |
477 | 485 |
478 /* Free tune information */ | 486 /* Free tune information */ |
479 xs_player->plrDeleteSID(&xs_status); | 487 xs_player->plrDeleteSID(&xs_status); |
480 xs_tune_free(xs_status.pTune); | 488 xs_tune_free(xs_status.pTune); |
481 xs_status.pTune = NULL; | 489 xs_status.pTune = NULL; |
490 | |
491 /* Update subtune control */ | |
492 xs_subctrl_update(); | |
482 } | 493 } |
483 | 494 |
484 | 495 |
485 /* | 496 /* |
486 * Pause/unpause the playing | 497 * Pause/unpause the playing |
498 #define LUW(x...) lookup_widget(xs_fileinfowin, ## x) | 509 #define LUW(x...) lookup_widget(xs_fileinfowin, ## x) |
499 | 510 |
500 void xs_subctrl_update(void) | 511 void xs_subctrl_update(void) |
501 { | 512 { |
502 GtkAdjustment *tmpAdj; | 513 GtkAdjustment *tmpAdj; |
503 | 514 gboolean isEnabled; |
504 if (xs_subctrl) | 515 |
516 /* Check if control window exists, we are currently playing and have a tune */ | |
517 if (xs_subctrl && xs_status.pTune && xs_status.isPlaying) | |
505 { | 518 { |
506 tmpAdj = GTK_ADJUSTMENT(xs_subctrl_adj); | 519 tmpAdj = GTK_ADJUSTMENT(xs_subctrl_adj); |
507 | 520 |
508 tmpAdj->value = xs_status.currSong; | 521 tmpAdj->value = xs_status.currSong; |
509 tmpAdj->lower = 1; | 522 tmpAdj->lower = 1; |
510 tmpAdj->upper = (xs_status.pTune) ? xs_status.pTune->nsubTunes : 1; | 523 tmpAdj->upper = xs_status.pTune->nsubTunes; |
511 gtk_adjustment_value_changed(tmpAdj); | 524 gtk_adjustment_value_changed(tmpAdj); |
512 } | 525 } |
513 | 526 |
514 if (xs_fileinfowin) | 527 if (xs_fileinfowin) |
515 { | 528 { |
516 tmpAdj = gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj"))); | 529 /* Check if we are currently playing and have a tune */ |
517 | 530 if (xs_status.pTune && xs_status.isPlaying) |
518 tmpAdj->value = xs_status.currSong; | 531 { |
519 tmpAdj->lower = 1; | 532 tmpAdj = gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj"))); |
520 tmpAdj->upper = xs_status.pTune->nsubTunes; | 533 |
521 gtk_adjustment_value_changed(tmpAdj); | 534 tmpAdj->value = xs_status.currSong; |
522 } | 535 tmpAdj->lower = 1; |
536 tmpAdj->upper = xs_status.pTune->nsubTunes; | |
537 gtk_adjustment_value_changed(tmpAdj); | |
538 isEnabled = TRUE; | |
539 } else | |
540 isEnabled = FALSE; | |
541 | |
542 /* Enable or disable subtune-control in fileinfo window */ | |
543 gtk_widget_set_sensitive(LUW("fileinfo_subctrl_prev"), isEnabled); | |
544 gtk_widget_set_sensitive(LUW("fileinfo_subctrl_adj"), isEnabled); | |
545 gtk_widget_set_sensitive(LUW("fileinfo_subctrl_next"), isEnabled); | |
546 } | |
547 } | |
548 | |
549 | |
550 void xs_fileinfo_setsong(void) | |
551 { | |
552 pthread_mutex_lock(&xs_mutex); | |
553 xs_status.currSong = gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj")))->value; | |
554 pthread_mutex_unlock(&xs_mutex); | |
523 } | 555 } |
524 | 556 |
525 | 557 |
526 void xs_subctrl_setsong(void) | 558 void xs_subctrl_setsong(void) |
527 { | 559 { |
531 } | 563 } |
532 | 564 |
533 | 565 |
534 void xs_subctrl_prevsong(void) | 566 void xs_subctrl_prevsong(void) |
535 { | 567 { |
536 pthread_mutex_lock(&xs_mutex); | 568 if (xs_status.pTune && xs_status.isPlaying) |
537 if (xs_status.currSong > 1) | 569 { |
538 xs_status.currSong--; | 570 pthread_mutex_lock(&xs_mutex); |
539 pthread_mutex_unlock(&xs_mutex); | 571 if (xs_status.currSong > 1) |
572 xs_status.currSong--; | |
573 pthread_mutex_unlock(&xs_mutex); | |
574 } | |
540 | 575 |
541 xs_subctrl_update(); | 576 xs_subctrl_update(); |
542 } | 577 } |
543 | 578 |
544 | 579 |
545 void xs_subctrl_nextsong(void) | 580 void xs_subctrl_nextsong(void) |
546 { | 581 { |
547 pthread_mutex_lock(&xs_mutex); | 582 if (xs_status.pTune && xs_status.isPlaying) |
548 if (xs_status.currSong < xs_status.pTune->nsubTunes) | 583 { |
549 xs_status.currSong++; | 584 pthread_mutex_lock(&xs_mutex); |
550 pthread_mutex_unlock(&xs_mutex); | 585 if (xs_status.currSong < xs_status.pTune->nsubTunes) |
586 xs_status.currSong++; | |
587 pthread_mutex_unlock(&xs_mutex); | |
588 } | |
551 | 589 |
552 xs_subctrl_update(); | 590 xs_subctrl_update(); |
553 } | 591 } |
554 | 592 |
555 | 593 |
558 if (xs_subctrl) | 596 if (xs_subctrl) |
559 { | 597 { |
560 gtk_widget_destroy(xs_subctrl); | 598 gtk_widget_destroy(xs_subctrl); |
561 xs_subctrl = NULL; | 599 xs_subctrl = NULL; |
562 } | 600 } |
601 } | |
602 | |
603 | |
604 gboolean xs_subctrl_keypress(GtkWidget *win, GdkEventKey *ev) | |
605 { | |
606 if (ev->keyval == GDK_Escape) | |
607 xs_subctrl_close(); | |
608 | |
609 return FALSE; | |
563 } | 610 } |
564 | 611 |
565 | 612 |
566 void xs_subctrl_open() | 613 void xs_subctrl_open() |
567 { | 614 { |
609 subctrl_current = gtk_hscale_new (GTK_ADJUSTMENT(xs_subctrl_adj)); | 656 subctrl_current = gtk_hscale_new (GTK_ADJUSTMENT(xs_subctrl_adj)); |
610 gtk_widget_set_name (subctrl_current, "subctrl_current"); | 657 gtk_widget_set_name (subctrl_current, "subctrl_current"); |
611 gtk_box_pack_start (GTK_BOX (hbox15), subctrl_current, FALSE, TRUE, 0); | 658 gtk_box_pack_start (GTK_BOX (hbox15), subctrl_current, FALSE, TRUE, 0); |
612 gtk_scale_set_digits (GTK_SCALE (subctrl_current), 0); | 659 gtk_scale_set_digits (GTK_SCALE (subctrl_current), 0); |
613 gtk_range_set_update_policy (GTK_RANGE (subctrl_current), GTK_UPDATE_DELAYED); | 660 gtk_range_set_update_policy (GTK_RANGE (subctrl_current), GTK_UPDATE_DELAYED); |
661 gtk_widget_grab_focus (subctrl_current); | |
614 | 662 |
615 subctrl_next = gtk_button_new_with_label (" > "); | 663 subctrl_next = gtk_button_new_with_label (" > "); |
616 gtk_widget_set_name (subctrl_next, "subctrl_next"); | 664 gtk_widget_set_name (subctrl_next, "subctrl_next"); |
617 gtk_box_pack_start (GTK_BOX (hbox15), subctrl_next, FALSE, FALSE, 0); | 665 gtk_box_pack_start (GTK_BOX (hbox15), subctrl_next, FALSE, FALSE, 0); |
618 | 666 |
620 GTK_SIGNAL_FUNC (xs_subctrl_prevsong), NULL); | 668 GTK_SIGNAL_FUNC (xs_subctrl_prevsong), NULL); |
621 | 669 |
622 gtk_signal_connect (GTK_OBJECT (subctrl_next), "clicked", | 670 gtk_signal_connect (GTK_OBJECT (subctrl_next), "clicked", |
623 GTK_SIGNAL_FUNC (xs_subctrl_nextsong), NULL); | 671 GTK_SIGNAL_FUNC (xs_subctrl_nextsong), NULL); |
624 | 672 |
673 gtk_signal_connect (GTK_OBJECT (xs_subctrl), "key_press_event", | |
674 GTK_SIGNAL_FUNC (xs_subctrl_keypress), NULL); | |
675 | |
625 gtk_widget_show_all(xs_subctrl); | 676 gtk_widget_show_all(xs_subctrl); |
626 } | 677 } |
627 | 678 |
628 | 679 |
629 /* | 680 /* |
875 gtk_widget_destroy(GTK_OPTION_MENU(tmpOptionMenu)->menu); | 926 gtk_widget_destroy(GTK_OPTION_MENU(tmpOptionMenu)->menu); |
876 GTK_OPTION_MENU(tmpOptionMenu)->menu = gtk_menu_new(); | 927 GTK_OPTION_MENU(tmpOptionMenu)->menu = gtk_menu_new(); |
877 } else { | 928 } else { |
878 /* If not, create a new one */ | 929 /* If not, create a new one */ |
879 xs_fileinfowin = create_xs_fileinfowin(); | 930 xs_fileinfowin = create_xs_fileinfowin(); |
931 | |
932 /* Connect additional signals */ | |
933 gtk_signal_connect(GTK_OBJECT( | |
934 gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj")))), | |
935 "value_changed", GTK_SIGNAL_FUNC (xs_fileinfo_setsong), NULL); | |
880 } | 936 } |
881 | 937 |
882 | 938 |
883 /* Set the generic song information */ | 939 /* Set the generic song information */ |
884 gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_filename")), pcFilename); | 940 gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_filename")), pcFilename); |