diff options
-rw-r--r-- | apps/debug_menu.c | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c index 993b5fdde3..c386f05972 100644 --- a/apps/debug_menu.c +++ b/apps/debug_menu.c | |||
@@ -58,6 +58,177 @@ | |||
58 | #include "ata_mmc.h" | 58 | #include "ata_mmc.h" |
59 | #endif | 59 | #endif |
60 | 60 | ||
61 | #ifdef IRIVER_H100 | ||
62 | #include "uda1380.h" | ||
63 | #include "pcm_playback.h" | ||
64 | #include "buffer.h" | ||
65 | |||
66 | #define CHUNK_SIZE 44100 /* Transfer CHUNK_SIZE bytes on | ||
67 | each DMA transfer */ | ||
68 | |||
69 | static unsigned char line = 0; | ||
70 | static unsigned char *audio_buffer; | ||
71 | static int audio_pos; | ||
72 | static int audio_size; | ||
73 | |||
74 | static void puts(const char *fmt, ...) | ||
75 | { | ||
76 | char buf[80]; | ||
77 | |||
78 | if (line > 15) | ||
79 | { | ||
80 | lcd_clear_display(); | ||
81 | line = 0; | ||
82 | } | ||
83 | |||
84 | va_list ap; | ||
85 | va_start(ap, fmt); | ||
86 | vsnprintf(buf, sizeof(buf)-1, fmt, ap); | ||
87 | va_end(ap); | ||
88 | |||
89 | lcd_puts(0, line, buf); | ||
90 | lcd_update(); | ||
91 | |||
92 | line++; | ||
93 | } | ||
94 | |||
95 | /* Very basic WAVE-file support.. Just for testing purposes.. */ | ||
96 | int load_wave(char *filename) | ||
97 | { | ||
98 | int f, i; | ||
99 | unsigned char buf[32]; | ||
100 | unsigned short *p; | ||
101 | |||
102 | puts("Loading %s..", filename); | ||
103 | |||
104 | f = open(filename, O_RDONLY); | ||
105 | if (f == -1) | ||
106 | { | ||
107 | puts("File not found"); | ||
108 | return -1; | ||
109 | } | ||
110 | |||
111 | memset(buf,0,32); | ||
112 | read(f, buf, 32); | ||
113 | if (memcmp(buf, "RIFF", 4) != 0 || memcmp(buf+8, "WAVE", 4) != 0) | ||
114 | { | ||
115 | puts("Not WAVE"); | ||
116 | return -1; | ||
117 | } | ||
118 | if (buf[12+8] != 1 || buf[12+9] != 0 || /* Check PCM format */ | ||
119 | buf[12+10] != 2 || buf[12+11] != 0) /* Check stereo */ | ||
120 | { | ||
121 | puts("Unsupported format"); | ||
122 | return -1; | ||
123 | } | ||
124 | |||
125 | audio_size = filesize(f) - 0x30; | ||
126 | if (audio_size > 8*1024*1024) | ||
127 | audio_size = 8*1024*1024; | ||
128 | |||
129 | audio_buffer = mp3buf; | ||
130 | |||
131 | puts("Reading %d bytes..", audio_size); | ||
132 | |||
133 | lseek(f, 0x30, SEEK_SET); /* Skip wave header */ | ||
134 | |||
135 | read(f, audio_buffer, audio_size); | ||
136 | close(f); | ||
137 | |||
138 | puts("Changing byte order.."); | ||
139 | p = (unsigned short *)audio_buffer; | ||
140 | for (i=0; i<audio_size/2; i++, p++) | ||
141 | { | ||
142 | *p = SWAB16(*p); | ||
143 | } | ||
144 | |||
145 | return 0; | ||
146 | } | ||
147 | |||
148 | /* | ||
149 | Test routined of the UDA1380 codec | ||
150 | - Loads a WAVE file and plays it.. | ||
151 | - Control play/stop, master volume and analog mixer volume | ||
152 | |||
153 | */ | ||
154 | |||
155 | static void test_get_more(unsigned char **ptr, long *size) | ||
156 | { | ||
157 | static long last_chunk_size = 0; | ||
158 | |||
159 | audio_pos += last_chunk_size; | ||
160 | |||
161 | if(audio_pos < audio_size) | ||
162 | { | ||
163 | last_chunk_size = MIN(CHUNK_SIZE, (audio_size - audio_pos)); | ||
164 | *ptr = &audio_buffer[audio_pos]; | ||
165 | *size = last_chunk_size; | ||
166 | } | ||
167 | } | ||
168 | |||
169 | bool uda1380_test(void) | ||
170 | { | ||
171 | long button; | ||
172 | int vol = 0x7f; | ||
173 | bool done = false; | ||
174 | |||
175 | lcd_setmargins(0, 0); | ||
176 | lcd_clear_display(); | ||
177 | lcd_update(); | ||
178 | |||
179 | if (load_wave("/sample.wav") == -1) | ||
180 | goto exit; | ||
181 | |||
182 | audio_pos = 0; | ||
183 | |||
184 | puts("uda1380_init"); | ||
185 | if (uda1380_init() == -1) | ||
186 | { | ||
187 | puts("Init failed.."); | ||
188 | goto exit; | ||
189 | } | ||
190 | |||
191 | puts("Playing.."); | ||
192 | audio_pos = 0; | ||
193 | pcm_play_data(audio_buffer, CHUNK_SIZE, | ||
194 | test_get_more); | ||
195 | |||
196 | while(!done) | ||
197 | { | ||
198 | button = button_get_w_tmo(HZ/2); | ||
199 | switch(button) | ||
200 | { | ||
201 | case BUTTON_UP: | ||
202 | if (vol) | ||
203 | vol--; | ||
204 | |||
205 | uda1380_setvol(vol); | ||
206 | break; | ||
207 | case BUTTON_DOWN: | ||
208 | if (vol < 255) | ||
209 | vol++; | ||
210 | |||
211 | uda1380_setvol(vol); | ||
212 | break; | ||
213 | case BUTTON_OFF: | ||
214 | done = true; | ||
215 | break; | ||
216 | } | ||
217 | |||
218 | if(!pcm_is_playing()) | ||
219 | done = true; | ||
220 | } | ||
221 | |||
222 | pcm_play_stop(); | ||
223 | uda1380_mute(1); | ||
224 | |||
225 | exit: | ||
226 | sleep(HZ >> 1); /* Sleep 1/2 second to fade out sound */ | ||
227 | |||
228 | return false; | ||
229 | } | ||
230 | #endif | ||
231 | |||
61 | /*---------------------------------------------------*/ | 232 | /*---------------------------------------------------*/ |
62 | /* SPECIAL DEBUG STUFF */ | 233 | /* SPECIAL DEBUG STUFF */ |
63 | /*---------------------------------------------------*/ | 234 | /*---------------------------------------------------*/ |
@@ -1793,6 +1964,7 @@ bool debug_menu(void) | |||
1793 | #endif | 1964 | #endif |
1794 | #ifdef HAVE_ADJUSTABLE_CPU_FREQ | 1965 | #ifdef HAVE_ADJUSTABLE_CPU_FREQ |
1795 | { "CPU frequency", dbg_cpufreq }, | 1966 | { "CPU frequency", dbg_cpufreq }, |
1967 | { "Audio test", uda1380_test }, | ||
1796 | #endif | 1968 | #endif |
1797 | #if CONFIG_CPU == SH7034 | 1969 | #if CONFIG_CPU == SH7034 |
1798 | #ifdef HAVE_LCD_BITMAP | 1970 | #ifdef HAVE_LCD_BITMAP |