diff options
| author | Daniel Stenberg <daniel@haxx.se> | 2005-07-14 21:46:07 +0000 |
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2005-07-14 21:46:07 +0000 |
| commit | febb52fc037959ba8ce55091efa5bdc90475da6b (patch) | |
| tree | 561e2862623fbd531d25fa5a0aa7958b6dfbffdb | |
| parent | 771ed79f73734cca78a1af22d2b426c19cb5c15a (diff) | |
| download | rockbox-febb52fc037959ba8ce55091efa5bdc90475da6b.zip rockbox-febb52fc037959ba8ce55091efa5bdc90475da6b.tar.gz rockbox-febb52fc037959ba8ce55091efa5bdc90475da6b.tar.bz2 rockbox-febb52fc037959ba8ce55091efa5bdc90475da6b.tar.xz | |
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
| -rwxr-xr-x | tools/configure | 15 | ||||
| -rw-r--r-- | uisimulator/common/stubs.c | 4 | ||||
| -rw-r--r-- | uisimulator/x11/SOURCES | 3 | ||||
| -rw-r--r-- | uisimulator/x11/sound.c | 95 | ||||
| -rw-r--r-- | uisimulator/x11/sound.h | 22 | ||||
| -rw-r--r-- | uisimulator/x11/thread.c | 17 |
6 files changed, 153 insertions, 3 deletions
diff --git a/tools/configure b/tools/configure index 520add2..a92060a 100755 --- a/tools/configure +++ b/tools/configure @@ -12,6 +12,7 @@ CCOPTS="-W -Wall -O -nostdlib -ffreestanding -Wstrict-prototypes" use_logf="#undef ROCKBOX_HAS_LOGF" +use_simsound="#undef ROCKBOX_HAS_SIMSOUND" scriptver=`echo '$Revision$' | sed -e 's:\\$::g' -e 's/Revision: //'` @@ -82,7 +83,14 @@ simcc () { LDOPTS='-L/usr/X11R6/lib -lX11 -lm -lXt -lXmu -lnsl -ldl -lpthread' if [ "$simver" = "win32" ]; then crosswincc # setup cross-compiler - fi + else + if test -n "$codecs"; then + if test -f "/usr/include/linux/soundcard.h"; then + # We have a header file so we can build the sound code + use_simsound="#define ROCKBOX_HAS_SIMSOUND 1" + fi # header file present + fi # has codecs + fi # not a cross-compiler ;; FreeBSD) @@ -691,6 +699,7 @@ fi sed > autoconf.h \ -e "s,@ENDIAN@,${defendian},g" \ -e "s,^#undef ROCKBOX_HAS_LOGF,$use_logf,g" \ + -e "s,@SIMSOUND@,$use_simsound,g" \ <<EOF /* This header was made by configure */ #ifndef __BUILD_AUTOCONF_H @@ -702,6 +711,10 @@ sed > autoconf.h \ /* Define this if you build rockbox to support the logf logging and display */ #undef ROCKBOX_HAS_LOGF +/* Define this if you have the linux/soundcard.h header and thus can compile + the sound-playing code in the X11 sim */ +@SIMSOUND@ + #endif /* __BUILD_AUTOCONF_H */ EOF diff --git a/uisimulator/common/stubs.c b/uisimulator/common/stubs.c index 5865b2c..ae876a5 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 c481370..edff103 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 0000000..761ad01 --- /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 0000000..87499ca --- /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 41f1fad..f3fe868 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, |