summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/mpeg.c115
-rw-r--r--firmware/mpeg.h22
2 files changed, 108 insertions, 29 deletions
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