diff options
Diffstat (limited to 'shell/audio/oss/sound_output.c')
-rw-r--r-- | shell/audio/oss/sound_output.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/shell/audio/oss/sound_output.c b/shell/audio/oss/sound_output.c new file mode 100644 index 0000000..39a7ba3 --- /dev/null +++ b/shell/audio/oss/sound_output.c @@ -0,0 +1,63 @@ +#include <stdio.h> +#include <sys/ioctl.h> +#include <stdint.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/soundcard.h> + +#include "sound_output.h" + +static int32_t oss_audio_fd = -1; + +uint32_t Audio_Init() +{ + uint32_t channels = 2; + uint32_t format = AFMT_S16_LE; + uint32_t tmp = SOUND_OUTPUT_FREQUENCY; + int32_t err_ret; + + oss_audio_fd = open("/dev/dsp", O_WRONLY | O_NONBLOCK); + if (oss_audio_fd < 0) + { + printf("Couldn't open /dev/dsp.\n"); + return 1; + } + + err_ret = ioctl(oss_audio_fd, SNDCTL_DSP_SPEED,&tmp); + if (err_ret == -1) + { + printf("Could not set sound frequency\n"); + return 1; + } + err_ret = ioctl(oss_audio_fd, SNDCTL_DSP_CHANNELS, &channels); + if (err_ret == -1) + { + printf("Could not set channels\n"); + return 1; + } + err_ret = ioctl(oss_audio_fd, SNDCTL_DSP_SETFMT, &format); + if (err_ret == -1) + { + printf("Could not set sound format\n"); + return 1; + } + return 0; +} + +void Audio_Write(int16_t* restrict buffer, uint32_t buffer_size) +{ + write(oss_audio_fd, buffer, buffer_size * 4 ); +} + +bool Audio_Underrun_Likely() { + return false; +} + +void Audio_Close() +{ + if (oss_audio_fd >= 0) + { + close(oss_audio_fd); + oss_audio_fd = -1; + } +} |