diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2002-06-28 11:48:53 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2002-06-28 11:48:53 +0000 |
commit | 667fb7c6e94060294dd1a9f95934b841f7df9f71 (patch) | |
tree | f261846271d84633598e03afe8f68c5b73b396af | |
parent | b983d1b4a1126356462863364c9cc8d3f9471a03 (diff) | |
download | rockbox-667fb7c6e94060294dd1a9f95934b841f7df9f71.tar.gz rockbox-667fb7c6e94060294dd1a9f95934b841f7df9f71.zip |
First step towards a better sound setting API
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1243 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/settings.h | 6 | ||||
-rw-r--r-- | apps/sound_menu.c | 66 | ||||
-rw-r--r-- | apps/wps.c | 16 | ||||
-rw-r--r-- | firmware/mpeg.c | 115 | ||||
-rw-r--r-- | firmware/mpeg.h | 22 |
5 files changed, 182 insertions, 43 deletions
diff --git a/apps/settings.h b/apps/settings.h index d3b891c790..5f67b3b1bc 100644 --- a/apps/settings.h +++ b/apps/settings.h | |||
@@ -84,10 +84,10 @@ extern struct user_settings global_settings; | |||
84 | 84 | ||
85 | /* system defines */ | 85 | /* system defines */ |
86 | 86 | ||
87 | #define DEFAULT_VOLUME_SETTING 70 | 87 | #define DEFAULT_VOLUME_SETTING 70/2 |
88 | #define DEFAULT_BALANCE_SETTING 50 | 88 | #define DEFAULT_BALANCE_SETTING 50 |
89 | #define DEFAULT_BASS_SETTING 50 | 89 | #define DEFAULT_BASS_SETTING 50/2 |
90 | #define DEFAULT_TREBLE_SETTING 50 | 90 | #define DEFAULT_TREBLE_SETTING 50/2 |
91 | #define DEFAULT_LOUDNESS_SETTING 0 | 91 | #define DEFAULT_LOUDNESS_SETTING 0 |
92 | #define DEFAULT_BASS_BOOST_SETTING 0 | 92 | #define DEFAULT_BASS_BOOST_SETTING 0 |
93 | #define DEFAULT_CONTRAST_SETTING 0 | 93 | #define DEFAULT_CONTRAST_SETTING 0 |
diff --git a/apps/sound_menu.c b/apps/sound_menu.c index 183c3439a3..50ba26582d 100644 --- a/apps/sound_menu.c +++ b/apps/sound_menu.c | |||
@@ -19,23 +19,83 @@ | |||
19 | #include "config.h" | 19 | #include "config.h" |
20 | #include <stdio.h> | 20 | #include <stdio.h> |
21 | #include <stdbool.h> | 21 | #include <stdbool.h> |
22 | #include "lcd.h" | ||
22 | #include "menu.h" | 23 | #include "menu.h" |
24 | #include "button.h" | ||
23 | #include "mpeg.h" | 25 | #include "mpeg.h" |
24 | #include "settings.h" | 26 | #include "settings.h" |
25 | 27 | ||
28 | void set_sound(char* string, | ||
29 | int* variable, | ||
30 | int setting) | ||
31 | { | ||
32 | bool done = false; | ||
33 | int min, max; | ||
34 | int val; | ||
35 | char* unit; | ||
36 | char str[32]; | ||
37 | |||
38 | unit = mpeg_sound_unit(setting); | ||
39 | min = mpeg_sound_min(setting); | ||
40 | max = mpeg_sound_max(setting); | ||
41 | |||
42 | lcd_clear_display(); | ||
43 | lcd_puts_scroll(0,0,string); | ||
44 | |||
45 | while (!done) { | ||
46 | val = mpeg_val2phys(setting, *variable); | ||
47 | snprintf(str,sizeof str,"%d %s ", val, unit); | ||
48 | lcd_puts(0,1,str); | ||
49 | lcd_update(); | ||
50 | |||
51 | switch( button_get(true) ) { | ||
52 | #ifdef HAVE_RECORDER_KEYPAD | ||
53 | case BUTTON_UP: | ||
54 | #else | ||
55 | case BUTTON_RIGHT: | ||
56 | #endif | ||
57 | (*variable)++; | ||
58 | if(*variable > max ) | ||
59 | *variable = max; | ||
60 | break; | ||
61 | |||
62 | #ifdef HAVE_RECORDER_KEYPAD | ||
63 | case BUTTON_DOWN: | ||
64 | #else | ||
65 | case BUTTON_LEFT: | ||
66 | #endif | ||
67 | (*variable)--; | ||
68 | if(*variable < min ) | ||
69 | *variable = min; | ||
70 | break; | ||
71 | |||
72 | #ifdef HAVE_RECORDER_KEYPAD | ||
73 | case BUTTON_LEFT: | ||
74 | #else | ||
75 | case BUTTON_STOP: | ||
76 | case BUTTON_MENU: | ||
77 | #endif | ||
78 | done = true; | ||
79 | break; | ||
80 | } | ||
81 | mpeg_sound_set(setting, *variable); | ||
82 | } | ||
83 | lcd_stop_scroll(); | ||
84 | } | ||
85 | |||
26 | static void volume(void) | 86 | static void volume(void) |
27 | { | 87 | { |
28 | set_int("Volume","%", &global_settings.volume, mpeg_volume, 2, 0, 100); | 88 | set_sound("Volume", &global_settings.volume, SOUND_VOLUME); |
29 | } | 89 | } |
30 | 90 | ||
31 | static void bass(void) | 91 | static void bass(void) |
32 | { | 92 | { |
33 | set_int("Bass","%", &global_settings.bass, mpeg_bass, 2, 0, 100); | 93 | set_sound("Bass", &global_settings.bass, SOUND_BASS); |
34 | }; | 94 | }; |
35 | 95 | ||
36 | static void treble(void) | 96 | static void treble(void) |
37 | { | 97 | { |
38 | set_int("Treble","%", &global_settings.treble, mpeg_treble, 2, 0, 100); | 98 | set_sound("Treble", &global_settings.treble, SOUND_TREBLE); |
39 | } | 99 | } |
40 | 100 | ||
41 | void sound_menu(void) | 101 | void sound_menu(void) |
diff --git a/apps/wps.c b/apps/wps.c index 51add88872..2779af7a5d 100644 --- a/apps/wps.c +++ b/apps/wps.c | |||
@@ -176,17 +176,17 @@ void wps_show(void) | |||
176 | 176 | ||
177 | #ifdef HAVE_RECORDER_KEYPAD | 177 | #ifdef HAVE_RECORDER_KEYPAD |
178 | case BUTTON_UP: | 178 | case BUTTON_UP: |
179 | global_settings.volume += 2; | 179 | global_settings.volume++; |
180 | if(global_settings.volume > 100) | 180 | if(global_settings.volume > mpeg_sound_max(SOUND_VOLUME)) |
181 | global_settings.volume = 100; | 181 | global_settings.volume = mpeg_sound_max(SOUND_VOLUME); |
182 | mpeg_volume(global_settings.volume); | 182 | mpeg_sound_set(SOUND_VOLUME, global_settings.volume); |
183 | break; | 183 | break; |
184 | 184 | ||
185 | case BUTTON_DOWN: | 185 | case BUTTON_DOWN: |
186 | global_settings.volume -= 2; | 186 | global_settings.volume--; |
187 | if(global_settings.volume < 0) | 187 | if(global_settings.volume < mpeg_sound_min(SOUND_VOLUME)) |
188 | global_settings.volume = 0; | 188 | global_settings.volume = mpeg_sound_min(SOUND_VOLUME); |
189 | mpeg_volume(global_settings.volume); | 189 | mpeg_sound_set(SOUND_VOLUME, global_settings.volume); |
190 | break; | 190 | break; |
191 | #endif | 191 | #endif |
192 | 192 | ||
diff --git a/firmware/mpeg.c b/firmware/mpeg.c index ab99fa744c..a421e5da82 100644 --- a/firmware/mpeg.c +++ b/firmware/mpeg.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include "thread.h" | 27 | #include "thread.h" |
28 | #include "panic.h" | 28 | #include "panic.h" |
29 | #include "file.h" | 29 | #include "file.h" |
30 | #include "mpeg.h" | ||
30 | #include "id3.h" | 31 | #include "id3.h" |
31 | 32 | ||
32 | #define MPEG_STACK_SIZE 0x2000 | 33 | #define MPEG_STACK_SIZE 0x2000 |
@@ -44,6 +45,42 @@ | |||
44 | extern char* peek_next_track(int type); | 45 | extern char* peek_next_track(int type); |
45 | extern char* peek_prev_track(int type); | 46 | extern char* peek_prev_track(int type); |
46 | 47 | ||
48 | static char *units[] = | ||
49 | { | ||
50 | "%", /* Volume */ | ||
51 | "%", /* Bass */ | ||
52 | "%" /* Treble */ | ||
53 | }; | ||
54 | |||
55 | static int minval[] = | ||
56 | { | ||
57 | 0, /* Volume */ | ||
58 | 0, /* Bass */ | ||
59 | 0 /* Treble */ | ||
60 | }; | ||
61 | |||
62 | static int maxval[] = | ||
63 | { | ||
64 | 50, /* Volume */ | ||
65 | 50, /* Bass */ | ||
66 | 50 /* Treble */ | ||
67 | }; | ||
68 | |||
69 | char *mpeg_sound_unit(int setting) | ||
70 | { | ||
71 | return units[setting]; | ||
72 | } | ||
73 | |||
74 | int mpeg_sound_min(int setting) | ||
75 | { | ||
76 | return minval[setting]; | ||
77 | } | ||
78 | |||
79 | int mpeg_sound_max(int setting) | ||
80 | { | ||
81 | return maxval[setting]; | ||
82 | } | ||
83 | |||
47 | #ifndef ARCHOS_RECORDER | 84 | #ifndef ARCHOS_RECORDER |
48 | static unsigned int bass_table[] = | 85 | static unsigned int bass_table[] = |
49 | { | 86 | { |
@@ -638,43 +675,69 @@ void mpeg_prev(void) | |||
638 | queue_post(&mpeg_queue, MPEG_PREV, NULL); | 675 | queue_post(&mpeg_queue, MPEG_PREV, NULL); |
639 | } | 676 | } |
640 | 677 | ||
641 | void mpeg_volume(int percent) | 678 | void mpeg_sound_set(int setting, int value) |
642 | { | 679 | { |
643 | int volume; | 680 | int tmp; |
644 | 681 | ||
682 | switch(setting) | ||
683 | { | ||
684 | case SOUND_VOLUME: | ||
685 | value *= 2; /* Convert to percent */ | ||
686 | |||
645 | #ifdef ARCHOS_RECORDER | 687 | #ifdef ARCHOS_RECORDER |
646 | volume = 0x7f00 * percent / 100; | 688 | tmp = 0x7f00 * value / 100; |
647 | mas_codec_writereg(0x10, volume & 0xff00); | 689 | mas_codec_writereg(0x10, tmp & 0xff00); |
648 | #else | 690 | #else |
649 | volume = 0x38 * percent / 100; | 691 | tmp = 0x38 * value / 100; |
650 | dac_volume(volume, volume, false); | 692 | dac_volume(tmp, tmp, false); |
651 | #endif | 693 | #endif |
652 | } | 694 | break; |
653 | 695 | ||
654 | void mpeg_bass(int percent) | 696 | case SOUND_BASS: |
655 | { | 697 | value *= 2; /* Convert to percent */ |
656 | int bass; | 698 | |
657 | |||
658 | #ifdef ARCHOS_RECORDER | 699 | #ifdef ARCHOS_RECORDER |
659 | bass = 0x6000 * percent / 100; | 700 | tmp = 0x6000 * value / 100; |
660 | mas_codec_writereg(0x14, bass & 0xff00); | 701 | mas_codec_writereg(0x14, tmp & 0xff00); |
661 | #else | 702 | #else |
662 | bass = 15 * percent / 100; | 703 | tmp = 15 * value / 100; |
663 | mas_writereg(MAS_REG_KBASS, bass_table[bass]); | 704 | mas_writereg(MAS_REG_KBASS, bass_table[tmp]); |
664 | #endif | 705 | #endif |
665 | } | 706 | break; |
666 | 707 | ||
667 | void mpeg_treble(int percent) | 708 | case SOUND_TREBLE: |
668 | { | 709 | value *= 2; /* Convert to percent */ |
669 | int treble; | ||
670 | 710 | ||
671 | #ifdef ARCHOS_RECORDER | 711 | #ifdef ARCHOS_RECORDER |
672 | treble = 0x6000 * percent / 100; | 712 | tmp = 0x6000 * value / 100; |
673 | mas_codec_writereg(0x15, treble & 0xff00); | 713 | mas_codec_writereg(0x15, tmp & 0xff00); |
674 | #else | 714 | #else |
675 | treble = 15 * percent / 100; | 715 | tmp = 15 * value / 100; |
676 | mas_writereg(MAS_REG_KTREBLE, treble_table[treble]); | 716 | mas_writereg(MAS_REG_KTREBLE, treble_table[tmp]); |
677 | #endif | 717 | #endif |
718 | break; | ||
719 | } | ||
720 | } | ||
721 | |||
722 | int mpeg_val2phys(int setting, int value) | ||
723 | { | ||
724 | int result = 0; | ||
725 | |||
726 | switch(setting) | ||
727 | { | ||
728 | case SOUND_VOLUME: | ||
729 | result = value * 2; | ||
730 | break; | ||
731 | |||
732 | case SOUND_BASS: | ||
733 | result = value * 2; | ||
734 | break; | ||
735 | |||
736 | case SOUND_TREBLE: | ||
737 | result = value * 2; | ||
738 | break; | ||
739 | } | ||
740 | return result; | ||
678 | } | 741 | } |
679 | 742 | ||
680 | void mpeg_init(int volume, int bass, int treble) | 743 | void mpeg_init(int volume, int bass, int treble) |
@@ -742,7 +805,7 @@ void mpeg_init(int volume, int bass, int treble) | |||
742 | dac_config(0x04); /* DAC on, all else off */ | 805 | dac_config(0x04); /* DAC on, all else off */ |
743 | #endif | 806 | #endif |
744 | 807 | ||
745 | mpeg_bass(bass); | 808 | mpeg_sound_set(SOUND_BASS, bass); |
746 | mpeg_treble(treble); | 809 | mpeg_sound_set(SOUND_TREBLE, treble); |
747 | mpeg_volume(volume); | 810 | mpeg_sound_set(SOUND_VOLUME, volume); |
748 | } | 811 | } |
diff --git a/firmware/mpeg.h b/firmware/mpeg.h index 908eabcda7..c9de7dc12c 100644 --- a/firmware/mpeg.h +++ b/firmware/mpeg.h | |||
@@ -26,9 +26,25 @@ void mpeg_pause(void); | |||
26 | void mpeg_resume(void); | 26 | void mpeg_resume(void); |
27 | void mpeg_next(void); | 27 | void mpeg_next(void); |
28 | void mpeg_prev(void); | 28 | void mpeg_prev(void); |
29 | void mpeg_volume(int percent); | 29 | void mpeg_sound_set(int setting, int value); |
30 | void mpeg_bass(int percent); | 30 | int mpeg_sound_min(int setting); |
31 | void mpeg_treble(int percent); | 31 | int mpeg_sound_max(int setting); |
32 | int mpeg_val2phys(int setting, int value); | ||
33 | char *mpeg_sound_unit(int setting); | ||
32 | struct mp3entry* mpeg_current_track(void); | 34 | struct mp3entry* mpeg_current_track(void); |
33 | 35 | ||
36 | #define SOUND_VOLUME 0 | ||
37 | #define SOUND_BASS 1 | ||
38 | #define SOUND_TREBLE 2 | ||
39 | #define SOUND_BALANCE 3 | ||
40 | |||
41 | #ifdef ARCHOS_RECORDER | ||
42 | #define SOUND_LOUDNESS 4 | ||
43 | #define SOUND_SUPERBASS 5 | ||
44 | #define SOUND_NUMSETTINGS 6 | ||
45 | #else | ||
46 | #define SOUND_DEEMPH 4 | ||
47 | #define SOUND_NUMSETTINGS 5 | ||
48 | #endif | ||
49 | |||
34 | #endif | 50 | #endif |