summaryrefslogtreecommitdiffstats
path: root/uisimulator
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2005-07-14 21:46:07 +0000
committerDaniel Stenberg <daniel@haxx.se>2005-07-14 21:46:07 +0000
commitfebb52fc037959ba8ce55091efa5bdc90475da6b (patch)
tree561e2862623fbd531d25fa5a0aa7958b6dfbffdb /uisimulator
parent771ed79f73734cca78a1af22d2b426c19cb5c15a (diff)
downloadrockbox-febb52fc037959ba8ce55091efa5bdc90475da6b.tar.gz
rockbox-febb52fc037959ba8ce55091efa5bdc90475da6b.tar.bz2
rockbox-febb52fc037959ba8ce55091efa5bdc90475da6b.zip
First take at PCM playback in the X11 sim on Linux.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7147 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'uisimulator')
-rw-r--r--uisimulator/common/stubs.c4
-rw-r--r--uisimulator/x11/SOURCES3
-rw-r--r--uisimulator/x11/sound.c95
-rw-r--r--uisimulator/x11/sound.h22
-rw-r--r--uisimulator/x11/thread.c17
5 files changed, 139 insertions, 2 deletions
diff --git a/uisimulator/common/stubs.c b/uisimulator/common/stubs.c
index 5865b2c223..ae876a54fd 100644
--- a/uisimulator/common/stubs.c
+++ b/uisimulator/common/stubs.c
@@ -57,9 +57,10 @@ void pcm_init(void)
{
}
+void (*sound_get_pcm)(unsigned char** start, long* size);
void pcm_play_data(void (*get_more)(unsigned char** start, long* size))
{
- (void)get_more;
+ sound_get_pcm = get_more;
}
/* Generic firmware stubs. */
@@ -94,7 +95,6 @@ int ata_write_sectors(IF_MV2(int drive,)
FILE* f;
char name[32];
- DEBUGF("Writing sector %X\n",start+i);
sprintf(name,"sector%lX.bin",start+i);
f=fopen(name,"w");
if (f) {
diff --git a/uisimulator/x11/SOURCES b/uisimulator/x11/SOURCES
index c4813706c3..edff103196 100644
--- a/uisimulator/x11/SOURCES
+++ b/uisimulator/x11/SOURCES
@@ -9,3 +9,6 @@ screenhack.c
thread.c
uibasic.c
visual.c
+#if CONFIG_HWCODEC == MASNONE
+sound.c
+#endif
diff --git a/uisimulator/x11/sound.c b/uisimulator/x11/sound.c
new file mode 100644
index 0000000000..761ad01a72
--- /dev/null
+++ b/uisimulator/x11/sound.c
@@ -0,0 +1,95 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2005 by Daniel Stenberg <daniel@haxx.se>
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "autoconf.h"
+
+#ifdef ROCKBOX_HAS_SIMSOUND /* play sound in sim enabled */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/soundcard.h>
+
+#include "sound.h"
+
+int sim_sound_init(void)
+{
+ int fd;
+ int pcmbits;
+ int rc;
+ int channels;
+ int rate;
+
+ fd = open("/dev/dsp", O_WRONLY);
+ if(-1 == fd)
+ return 1;
+
+ pcmbits = 16;
+ rc = ioctl(fd, SOUND_PCM_WRITE_BITS, &pcmbits);
+ rc = ioctl(fd, SOUND_PCM_READ_BITS, &pcmbits);
+
+ channels = 2; /* Number of channels, 1=mono */
+ rc = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &channels);
+ rc = ioctl(fd, SOUND_PCM_READ_CHANNELS, &channels);
+
+ rate = 44100; /* Yeah. sampling rate */
+ rc = ioctl(fd, SOUND_PCM_WRITE_RATE, &rate);
+ rc = ioctl(fd, SOUND_PCM_READ_RATE, &rate);
+
+ return fd;
+}
+
+void sim_sound_play(int soundfd, char *buffer, long len)
+{
+ write(soundfd, buffer, len);
+}
+
+void sound_playback_thread(void)
+{
+ int soundfd = sim_sound_init();
+ unsigned char *buf;
+ long size;
+
+ while(-1 == soundfd)
+ sleep(100000); /* wait forever, can't play sound! */
+
+ do {
+
+ while(!sound_get_pcm)
+ /* TODO: fix a fine thread-synch mechanism here */
+ usleep(10000);
+
+ do {
+ sound_get_pcm(&buf, &size);
+ if(!size) {
+ sound_get_pcm = NULL;
+ break;
+ }
+ sim_sound_play(soundfd, buf, size);
+ usleep(10000);
+ } while(size);
+
+ } while(1);
+
+}
+
+#endif /* ROCKBOX_HAS_SIMSOUND */
diff --git a/uisimulator/x11/sound.h b/uisimulator/x11/sound.h
new file mode 100644
index 0000000000..87499cac8e
--- /dev/null
+++ b/uisimulator/x11/sound.h
@@ -0,0 +1,22 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2005 by Daniel Stenberg <daniel@haxx.se>
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+void sound_playback_thread(void);
+
+extern void (*sound_get_pcm)(unsigned char** start, long* size);
diff --git a/uisimulator/x11/thread.c b/uisimulator/x11/thread.c
index 41f1fad8a7..f3fe868fbc 100644
--- a/uisimulator/x11/thread.c
+++ b/uisimulator/x11/thread.c
@@ -17,12 +17,18 @@
*
****************************************************************************/
+#include "autoconf.h"
+
#include <stdio.h>
#include <pthread.h>
#include "kernel.h"
#include <sys/time.h>
+#ifdef ROCKBOX_HAS_SIMSOUND
+#include "sound.h"
+#endif
+
long current_tick = 0;
extern void button_tick(void);
@@ -77,8 +83,19 @@ void init_threads(void)
/* get mutex to only allow one thread running at a time */
pthread_mutex_lock(&mp);
+ /* start a tick thread */
pthread_create(&tick_tid, NULL, (void *(*)(void *)) update_tick_thread,
NULL);
+
+#ifdef ROCKBOX_HAS_SIMSOUND /* start thread that plays PCM data */
+ {
+ pthread_t sound_tid;
+ pthread_create(&sound_tid, NULL,
+ (void *(*)(void *)) sound_playback_thread,
+ NULL);
+ }
+#endif
+
}
/*
int pthread_create(pthread_t *new_thread_ID,