summaryrefslogtreecommitdiff
path: root/apps/debug_menu.c
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2005-03-18 11:40:09 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2005-03-18 11:40:09 +0000
commit70161bfeaf25eba605298225ac45e176cdadba22 (patch)
tree6d578cc27dfa153756c247992da355a61e094d6e /apps/debug_menu.c
parent19c56af4f4b2764bf21a9457c937a25cca162df1 (diff)
downloadrockbox-70161bfeaf25eba605298225ac45e176cdadba22.zip
rockbox-70161bfeaf25eba605298225ac45e176cdadba22.tar.gz
rockbox-70161bfeaf25eba605298225ac45e176cdadba22.tar.bz2
rockbox-70161bfeaf25eba605298225ac45e176cdadba22.tar.xz
PCM playback test code
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6212 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/debug_menu.c')
-rw-r--r--apps/debug_menu.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index 993b5fd..c386f05 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -58,6 +58,177 @@
#include "ata_mmc.h"
#endif
+#ifdef IRIVER_H100
+#include "uda1380.h"
+#include "pcm_playback.h"
+#include "buffer.h"
+
+#define CHUNK_SIZE 44100 /* Transfer CHUNK_SIZE bytes on
+ each DMA transfer */
+
+static unsigned char line = 0;
+static unsigned char *audio_buffer;
+static int audio_pos;
+static int audio_size;
+
+static void puts(const char *fmt, ...)
+{
+ char buf[80];
+
+ if (line > 15)
+ {
+ lcd_clear_display();
+ line = 0;
+ }
+
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(buf, sizeof(buf)-1, fmt, ap);
+ va_end(ap);
+
+ lcd_puts(0, line, buf);
+ lcd_update();
+
+ line++;
+}
+
+/* Very basic WAVE-file support.. Just for testing purposes.. */
+int load_wave(char *filename)
+{
+ int f, i;
+ unsigned char buf[32];
+ unsigned short *p;
+
+ puts("Loading %s..", filename);
+
+ f = open(filename, O_RDONLY);
+ if (f == -1)
+ {
+ puts("File not found");
+ return -1;
+ }
+
+ memset(buf,0,32);
+ read(f, buf, 32);
+ if (memcmp(buf, "RIFF", 4) != 0 || memcmp(buf+8, "WAVE", 4) != 0)
+ {
+ puts("Not WAVE");
+ return -1;
+ }
+ if (buf[12+8] != 1 || buf[12+9] != 0 || /* Check PCM format */
+ buf[12+10] != 2 || buf[12+11] != 0) /* Check stereo */
+ {
+ puts("Unsupported format");
+ return -1;
+ }
+
+ audio_size = filesize(f) - 0x30;
+ if (audio_size > 8*1024*1024)
+ audio_size = 8*1024*1024;
+
+ audio_buffer = mp3buf;
+
+ puts("Reading %d bytes..", audio_size);
+
+ lseek(f, 0x30, SEEK_SET); /* Skip wave header */
+
+ read(f, audio_buffer, audio_size);
+ close(f);
+
+ puts("Changing byte order..");
+ p = (unsigned short *)audio_buffer;
+ for (i=0; i<audio_size/2; i++, p++)
+ {
+ *p = SWAB16(*p);
+ }
+
+ return 0;
+}
+
+/*
+ Test routined of the UDA1380 codec
+ - Loads a WAVE file and plays it..
+ - Control play/stop, master volume and analog mixer volume
+
+*/
+
+static void test_get_more(unsigned char **ptr, long *size)
+{
+ static long last_chunk_size = 0;
+
+ audio_pos += last_chunk_size;
+
+ if(audio_pos < audio_size)
+ {
+ last_chunk_size = MIN(CHUNK_SIZE, (audio_size - audio_pos));
+ *ptr = &audio_buffer[audio_pos];
+ *size = last_chunk_size;
+ }
+}
+
+bool uda1380_test(void)
+{
+ long button;
+ int vol = 0x7f;
+ bool done = false;
+
+ lcd_setmargins(0, 0);
+ lcd_clear_display();
+ lcd_update();
+
+ if (load_wave("/sample.wav") == -1)
+ goto exit;
+
+ audio_pos = 0;
+
+ puts("uda1380_init");
+ if (uda1380_init() == -1)
+ {
+ puts("Init failed..");
+ goto exit;
+ }
+
+ puts("Playing..");
+ audio_pos = 0;
+ pcm_play_data(audio_buffer, CHUNK_SIZE,
+ test_get_more);
+
+ while(!done)
+ {
+ button = button_get_w_tmo(HZ/2);
+ switch(button)
+ {
+ case BUTTON_UP:
+ if (vol)
+ vol--;
+
+ uda1380_setvol(vol);
+ break;
+ case BUTTON_DOWN:
+ if (vol < 255)
+ vol++;
+
+ uda1380_setvol(vol);
+ break;
+ case BUTTON_OFF:
+ done = true;
+ break;
+ }
+
+ if(!pcm_is_playing())
+ done = true;
+ }
+
+ pcm_play_stop();
+ uda1380_mute(1);
+
+exit:
+ sleep(HZ >> 1); /* Sleep 1/2 second to fade out sound */
+
+ return false;
+}
+#endif
+
/*---------------------------------------------------*/
/* SPECIAL DEBUG STUFF */
/*---------------------------------------------------*/
@@ -1793,6 +1964,7 @@ bool debug_menu(void)
#endif
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
{ "CPU frequency", dbg_cpufreq },
+ { "Audio test", uda1380_test },
#endif
#if CONFIG_CPU == SH7034
#ifdef HAVE_LCD_BITMAP