auto import from //depot/cupcake/@135843
diff --git a/simulator/wrapsim/DevAudio.c b/simulator/wrapsim/DevAudio.c
new file mode 100644
index 0000000..752ee65
--- /dev/null
+++ b/simulator/wrapsim/DevAudio.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2007 The Android Open Source Project
+ *
+ * Audio output device.
+ */
+#include "Common.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <esd.h>
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/input.h>
+
+
+/*
+ * Input event device state.
+ */
+typedef struct AudioState {
+ int fd;
+ int sourceId;
+ int esdVol;
+ int streamType;
+} AudioState;
+
+/*
+ * Set some stuff up.
+ */
+static int configureInitialState(const char* pathName, AudioState* audioState)
+{
+#if BUILD_SIM_WITHOUT_AUDIO
+ return 0;
+#else
+ esd_player_info_t *pi;
+ audioState->fd = -1;
+ audioState->sourceId = -1;
+ audioState->esdVol = -1;
+ audioState->streamType = 0;
+
+ int format = ESD_BITS16 | ESD_STEREO | ESD_STREAM | ESD_PLAY;
+ char namestring[] = "Android Audio XXXXXXXX";
+ sprintf(namestring,"Android Audio %08x", (unsigned int)audioState);
+ int esd_fd = esd_play_stream_fallback(format, 44100, NULL, namestring);
+ if (esd_fd > 0) {
+ // find the source_id for this stream
+ int mix = esd_open_sound(NULL);
+ if (mix > 0) {
+ esd_info_t *info = esd_get_all_info(mix);
+
+ if (info) {
+ for(pi = info->player_list; pi; pi = pi->next) {
+ if(strcmp(pi->name, namestring) == 0) {
+ audioState->sourceId = pi->source_id;
+ break;
+ }
+ }
+ esd_free_all_info(info);
+ }
+ esd_close(mix);
+ }
+ audioState->fd = esd_fd;
+ return 0;
+ }
+ printf("Couldn't open audio device. Faking it.\n");
+ return 0;
+#endif
+}
+
+/*
+ * Return the next available input event.
+ *
+ * We just pass this through to the real "write", since "fd" is real.
+ */
+static ssize_t writeAudio(FakeDev* dev, int fd, const void* buf, size_t count)
+{
+#if BUILD_SIM_WITHOUT_AUDIO
+ return 0;
+#else
+ AudioState *state = (AudioState*)dev->state;
+ if (state->fd >= 0)
+ return _ws_write(state->fd, buf, count);
+
+ // fake timing
+ usleep(count * 10000 / 441 * 4);
+ return count;
+#endif
+}
+
+/*
+ * Handle event ioctls.
+ */
+static int ioctlAudio(FakeDev* dev, int fd, int request, void* argp)
+{
+ return -1;
+}
+
+/*
+ * Free up our state before closing down the fake descriptor.
+ */
+static int closeAudio(FakeDev* dev, int fd)
+{
+#if BUILD_SIM_WITHOUT_AUDIO
+ return 0;
+#else
+ AudioState *state = (AudioState*)dev->state;
+ close(state->fd);
+ free(state);
+ dev->state = NULL;
+ return 0;
+#endif
+}
+
+/*
+ * Open an audio output device.
+ */
+FakeDev* wsOpenDevAudio(const char* pathName, int flags)
+{
+ FakeDev* newDev = wsCreateFakeDev(pathName);
+ if (newDev != NULL) {
+ newDev->write = writeAudio;
+ newDev->ioctl = ioctlAudio;
+ newDev->close = closeAudio;
+
+ AudioState* eventState = calloc(1, sizeof(AudioState));
+
+ if (configureInitialState(pathName, eventState) != 0) {
+ free(eventState);
+ return NULL;
+ }
+ newDev->state = eventState;
+ }
+
+ return newDev;
+}