| #include <algorithm> | |
| #include <cstdio> | |
| #include <iostream> | |
| #include "SDL.h" | |
| #include "Audio.hpp" | |
| #include "audio/audio.hpp" | |
| #include "engine/api_private.hpp" | |
| blit::AudioChannel channels[CHANNEL_COUNT]; | |
| Audio::Audio() { | |
| blit::api.channels = channels; | |
| SDL_AudioSpec desired = {}, audio_spec = {}; | |
| desired.freq = _sample_rate; | |
| desired.format = AUDIO_S16LSB; | |
| desired.channels = 1; | |
| desired.samples = 256; | |
| desired.callback = _audio_callback; | |
| audio_device = SDL_OpenAudioDevice(nullptr, 0, &desired, &audio_spec, 0); | |
| if(audio_device == 0){ | |
| std::cout << "Audio Init Failed: " << SDL_GetError() << std::endl; | |
| } | |
| std::cout << "Audio Init Done" << std::endl; | |
| SDL_PauseAudioDevice(audio_device, 0); | |
| } | |
| Audio::~Audio() { | |
| SDL_PauseAudioDevice(audio_device, 1); | |
| SDL_CloseAudioDevice(audio_device); | |
| } | |
| void _audio_bufferfill(short *buffer, int buffer_size){ | |
| memset(buffer, 0, buffer_size); | |
| for(auto sample = 0; sample < buffer_size; sample++){ | |
| buffer[sample] = (int)blit::get_audio_frame() - 0x8000; | |
| } | |
| } | |
| void _audio_callback(void *userdata, uint8_t *stream, int len){ | |
| _audio_bufferfill((short *)stream, len / 2); | |
| } |