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 /uisimulator | |
parent | 771ed79f73734cca78a1af22d2b426c19cb5c15a (diff) | |
download | rockbox-febb52fc037959ba8ce55091efa5bdc90475da6b.tar.gz 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.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 |
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, |