summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/settings.h6
-rw-r--r--apps/sound_menu.c66
-rw-r--r--apps/wps.c16
-rw-r--r--firmware/mpeg.c115
-rw-r--r--firmware/mpeg.h22
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
28void 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
26static void volume(void) 86static 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
31static void bass(void) 91static 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
36static void treble(void) 96static 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
41void sound_menu(void) 101void 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 @@
44extern char* peek_next_track(int type); 45extern char* peek_next_track(int type);
45extern char* peek_prev_track(int type); 46extern char* peek_prev_track(int type);
46 47
48static char *units[] =
49{
50 "%", /* Volume */
51 "%", /* Bass */
52 "%" /* Treble */
53};
54
55static int minval[] =
56{
57 0, /* Volume */
58 0, /* Bass */
59 0 /* Treble */
60};
61
62static int maxval[] =
63{
64 50, /* Volume */
65 50, /* Bass */
66 50 /* Treble */
67};
68
69char *mpeg_sound_unit(int setting)
70{
71 return units[setting];
72}
73
74int mpeg_sound_min(int setting)
75{
76 return minval[setting];
77}
78
79int mpeg_sound_max(int setting)
80{
81 return maxval[setting];
82}
83
47#ifndef ARCHOS_RECORDER 84#ifndef ARCHOS_RECORDER
48static unsigned int bass_table[] = 85static 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
641void mpeg_volume(int percent) 678void 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
654void 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
667void 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
722int 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
680void mpeg_init(int volume, int bass, int treble) 743void 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);
26void mpeg_resume(void); 26void mpeg_resume(void);
27void mpeg_next(void); 27void mpeg_next(void);
28void mpeg_prev(void); 28void mpeg_prev(void);
29void mpeg_volume(int percent); 29void mpeg_sound_set(int setting, int value);
30void mpeg_bass(int percent); 30int mpeg_sound_min(int setting);
31void mpeg_treble(int percent); 31int mpeg_sound_max(int setting);
32int mpeg_val2phys(int setting, int value);
33char *mpeg_sound_unit(int setting);
32struct mp3entry* mpeg_current_track(void); 34struct 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