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);