aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.android2
-rw-r--r--android/audio-test.c103
-rw-r--r--android/audio-test.h22
-rw-r--r--hw/goldfish_audio.c2
-rw-r--r--qemu-options.hx7
-rw-r--r--vl-android.c5
6 files changed, 138 insertions, 3 deletions
diff --git a/Makefile.android b/Makefile.android
index 7849775..b13cd47 100644
--- a/Makefile.android
+++ b/Makefile.android
@@ -735,6 +735,8 @@ CORE_SOURCES = $(CORE_BLOCK_SOURCES) $(CORE_HW_SOURCES)
CORE_SOURCES += $(CORE_MIGRATION_SOURCES) $(CORE_MISC_SOURCES)
CORE_SOURCES += $(CORE_UPSTREAM_SOURCES)
+CORE_SOURCES += android/audio-test.c
+
##############################################################################
# lists of source files used to build the emulator UI
#
diff --git a/android/audio-test.c b/android/audio-test.c
new file mode 100644
index 0000000..e10b987
--- /dev/null
+++ b/android/audio-test.c
@@ -0,0 +1,103 @@
+/* Copyright (C) 2010 The Android Open Source Project
+**
+** This software is licensed under the terms of the GNU General Public
+** License version 2, as published by the Free Software Foundation, and
+** may be copied, distributed, and modified under those terms.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+*/
+#include "audio/audio.h"
+#include "android/utils/debug.h"
+
+/* This source file contains a small test audio virtual device that
+ * can be used to check that the emulator properly plays sound on
+ * the host system without having to boot a full system.
+ */
+
+#define SAMPLE_SIZE 16384
+
+typedef struct {
+ QEMUSoundCard card;
+ SWVoiceOut *voice;
+ int pos;
+ short sample[SAMPLE_SIZE];
+} TestAudio;
+
+static void
+testAudio_audio_callback(void* opaque, int free)
+{
+ TestAudio* ta = opaque;
+
+ //printf("%s: pos=%d free=%d\n", __FUNCTION__, ta->pos, free);
+
+ while (free > 0) {
+ int avail = SAMPLE_SIZE - ta->pos;
+ if (avail > free)
+ avail = free;
+
+ AUD_write(ta->voice, ta->sample + ta->pos, avail);
+ ta->pos += avail;
+ if (ta->pos >= SAMPLE_SIZE)
+ ta->pos = 0;
+
+ free -= avail;
+ }
+}
+
+static int
+testAudio_init( TestAudio* ta )
+{
+ struct audsettings as;
+
+ AUD_register_card("test_audio", &ta->card);
+
+ as.freq = 16000;
+ as.nchannels = 1;
+ as.fmt = AUD_FMT_S16;
+ as.endianness = AUDIO_HOST_ENDIANNESS;
+
+ ta->voice = AUD_open_out(
+ &ta->card,
+ ta->voice,
+ "test_audio",
+ ta,
+ testAudio_audio_callback,
+ &as);
+
+ if (!ta->voice) {
+ dprint("Cannot open test audio!");
+ return -1;
+ }
+ ta->pos = 0;
+
+ /* Initialize samples */
+ int nn;
+ for (nn = 0; nn < SAMPLE_SIZE; nn++) {
+ ta->sample[nn] = (short)(((nn % (SAMPLE_SIZE/4))*65536/(SAMPLE_SIZE/4)) & 0xffff);
+ }
+
+ AUD_set_active_out(ta->voice, 1);
+ return 0;
+}
+
+static TestAudio* testAudio;
+
+int
+android_audio_test_start_out(void)
+{
+ if (!testAudio) {
+ testAudio = malloc(sizeof(*testAudio));
+ if (testAudio_init(testAudio) < 0) {
+ free(testAudio);
+ testAudio = NULL;
+ fprintf(stderr, "Could not start audio test!\n");
+ return -1;
+ } else {
+ printf("Audio test started!\n");
+ }
+ }
+ return 0;
+}
diff --git a/android/audio-test.h b/android/audio-test.h
new file mode 100644
index 0000000..8113aae
--- /dev/null
+++ b/android/audio-test.h
@@ -0,0 +1,22 @@
+/* Copyright (C) 2010 The Android Open Source Project
+**
+** This software is licensed under the terms of the GNU General Public
+** License version 2, as published by the Free Software Foundation, and
+** may be copied, distributed, and modified under those terms.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+*/
+#ifndef ANDROID_AUDIO_TEST_H
+#define ANDROID_AUDIO_TEST_H
+
+/* Start the audio test output, this will register a virtual sound
+ * device that sends a saw signal to the audio sub-system. This is
+ * used to test that the audio backend works without having to boot
+ * a full system and launch a music application.
+ */
+extern int android_audio_test_start_out(void);
+
+#endif /* ANDROID_AUDIO_TEST_H */
diff --git a/hw/goldfish_audio.c b/hw/goldfish_audio.c
index 37e4c09..434522c 100644
--- a/hw/goldfish_audio.c
+++ b/hw/goldfish_audio.c
@@ -582,7 +582,7 @@ void goldfish_audio_init(uint32_t base, int id, const char* input_source)
if (android_hw->hw_audioOutput) {
s->voice = AUD_open_out (
&s->card,
- s->voice,
+ NULL,
"goldfish_audio",
s,
goldfish_audio_callback,
diff --git a/qemu-options.hx b/qemu-options.hx
index bd5934b..db3dfbb 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1598,7 +1598,7 @@ DEF("nand", HAS_ARG, QEMU_OPTION_nand, \
#endif /* CONFIG_TRACE */
-#if 1 /* ANDROID */
+#ifdef CONFIG_ANDROID
DEF("savevm-on-exit", HAS_ARG, QEMU_OPTION_savevm_on_exit, \
"savevm-on-exit [tag|id]\n" \
@@ -1688,4 +1688,7 @@ DEF("ui-port", HAS_ARG, QEMU_OPTION_ui_port, \
DEF("ui-settings", HAS_ARG, QEMU_OPTION_ui_settings, \
"-ui-settings <string> opaque string containing persitent UI settings\n")
-#endif
+DEF("audio-test-out", 0, QEMU_OPTION_audio_test_out, \
+ "-audio-test-out Test audio output\n")
+
+#endif /* ANDROID */
diff --git a/vl-android.c b/vl-android.c
index 57be79c..3fb50ea 100644
--- a/vl-android.c
+++ b/vl-android.c
@@ -191,6 +191,7 @@
#include "android/hw-lcd.h"
#include "android/boot-properties.h"
#include "android/core-init-utils.h"
+#include "android/audio-test.h"
#ifdef CONFIG_STANDALONE_CORE
/* Verbose value used by the standalone emulator core (without UI) */
@@ -4641,6 +4642,10 @@ int main(int argc, char **argv, char **envp)
android_op_ui_settings = (char*)optarg;
break;
+ case QEMU_OPTION_audio_test_out:
+ android_audio_test_start_out();
+ break;
+
#ifdef CONFIG_MEMCHECK
case QEMU_OPTION_android_memcheck:
android_op_memcheck = (char*)optarg;