From 0e82078fefcc63b24a911a9c6cb986dd903816d7 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Tue, 31 Mar 2015 22:51:11 +0100 Subject: [PATCH] audio: add the base audio code and hooks --- Kernel/audio.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ Kernel/devsys.c | 6 ++++++ Kernel/process.c | 4 ++++ 3 files changed, 65 insertions(+) create mode 100644 Kernel/audio.c diff --git a/Kernel/audio.c b/Kernel/audio.c new file mode 100644 index 00000000..9e6bf03e --- /dev/null +++ b/Kernel/audio.c @@ -0,0 +1,55 @@ +/* + * FUZIX audio core support + */ + +#include +#include +#include +#include + +#ifdef CONFIG_AUDIO + +struct sound sound; + +int audio_ioctl(uarg_t op, void *val) +{ + uint8_t i; + + if ((op >> 8) != 0x02) + return -EINVAL; + switch(op) { + case AUDIOC_GETINFO: + return uput(&audio_info, val, sizeof(audio_info)); + case AUDIOC_STOP: + for (i = 0; i < audio_info.channels;i++) + devaudio_stop(i); + return 0; + case AUDIOC_WAIT: + for (i = 0; i < audio_info.channels;i++) + devaudio_wait(i); + return 0; + case AUDIOC_PLAY: + if (uget(&sound, val, sizeof(sound)) == -1) + return -1; + if (sound.channel > audio_info.channels) { + udata.u_error = ERANGE; + return -1; + } + if (sound.flags & SND_WAIT) + if (devaudio_wait(sound.channel)) + return -1; + return devaudio_play(); + default: + return devaudio_ioctl(op, val); + } +} + +void audio_tick(void) +{ + /* For now no core processing */ + devaudio_tick(); +} + +/* TODO: read/write for DSP devices */ + +#endif diff --git a/Kernel/devsys.c b/Kernel/devsys.c index c2fcc25a..89e4e68b 100644 --- a/Kernel/devsys.c +++ b/Kernel/devsys.c @@ -2,6 +2,7 @@ #include #include #include +#include /* * System devices: @@ -10,6 +11,7 @@ * Minor 1 mem * Minor 2 zero * Minor 3 proc + * Minor 64 audio * * Use Minor 128+ for platform specific devices */ @@ -72,6 +74,10 @@ int sys_write(uint8_t minor, uint8_t rawflag, uint8_t flag) int sys_ioctl(uint8_t minor, uarg_t request, char *data) { +#ifdef CONFIG_AUDIO + if (minor == 64) + return audio_ioctl(request, data); +#endif if (minor != 3) { udata.u_error = ENOTTY; return -1; diff --git a/Kernel/process.c b/Kernel/process.c index 493c3482..ffcce80b 100644 --- a/Kernel/process.c +++ b/Kernel/process.c @@ -5,6 +5,7 @@ #include #include #include +#include /* psleep() puts a process to sleep on the given event. If another * process is runnable, it switches out the current one and starts the @@ -350,6 +351,9 @@ void timer_interrupt(void) } } updatetod(); +#ifdef CONFIG_AUDIO + audio_tick(); +#endif } #ifndef CONFIG_SINGLETASK /* Check run time of current process */ -- 2.34.1