| /*************************************************************************** |
| * __________ __ ___. |
| * 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 <stdbool.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| #include <sys/ioctl.h> |
| #include <sys/soundcard.h> |
| |
| #include "sound.h" |
| |
| static bool playing = false; |
| |
| 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, (char *)buf, size); |
| usleep(10000); |
| } while(size); |
| |
| } while(1); |
| |
| } |
| |
| /* Stubs for PCM audio playback. */ |
| bool pcm_is_playing(void) |
| { |
| return playing; |
| } |
| |
| void pcm_mute(bool state) |
| { |
| (void)state; |
| } |
| |
| void pcm_play_pause(bool state) |
| { |
| (void)state; |
| } |
| |
| bool pcm_is_paused(void) |
| { |
| return false; |
| } |
| |
| void pcm_play_stop(void) |
| { |
| playing = false; |
| } |
| |
| 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)) |
| { |
| sound_get_pcm = get_more; |
| playing = true; |
| } |
| |
| long pcm_get_bytes_waiting(void) |
| { |
| return 0; |
| } |
| |
| #endif /* ROCKBOX_HAS_SIMSOUND */ |