|
1 | 1 | #include "Audio.h" |
2 | 2 | #include <stdio.h> |
3 | 3 |
|
4 | | -Audio::Audio() { |
5 | | - wave_position = 0; |
6 | | - wave_increment = ((double) TONE * (2.0 * M_PI)) / (double) FREQUENCY; |
| 4 | +/* Global audio instance */ |
| 5 | +struct audio audio; |
| 6 | + |
| 7 | +void audio_create(void) { |
| 8 | + audio.wave_position = 0; |
| 9 | + audio.wave_increment = ((double) TONE * (2.0 * M_PI)) / (double) FREQUENCY; |
7 | 10 | } |
8 | 11 |
|
9 | | -Audio::~Audio() { |
| 12 | +void audio_destroy(void) { |
10 | 13 | /* pause & close the audio */ |
11 | | - SDL_PauseAudioDevice(device, 1); |
12 | | - if (device) SDL_CloseAudioDevice(device); |
13 | | - free(audio_buffer); |
| 14 | + SDL_PauseAudioDevice(audio.device, 1); |
| 15 | + if (audio.device) SDL_CloseAudioDevice(audio.device); |
| 16 | + free(audio.audio_buffer); |
14 | 17 | } |
15 | 18 |
|
16 | | -int Audio::Initialize() { |
17 | | - audiospec.freq = FREQUENCY; |
18 | | - audiospec.format = AUDIO_U8; /* unsigned 8-bit data stream */ |
19 | | - audiospec.channels = 1; /* mono */ |
20 | | - audiospec.samples = 2048; /* must be a power of 2 */ |
21 | | - audiospec.callback = NULL; |
22 | | - audiospec.userdata = NULL; |
| 19 | +int audio_initialize(void) { |
| 20 | + audio.audiospec.freq = FREQUENCY; |
| 21 | + audio.audiospec.format = AUDIO_U8; /* unsigned 8-bit data stream */ |
| 22 | + audio.audiospec.channels = 1; /* mono */ |
| 23 | + audio.audiospec.samples = 2048; /* must be a power of 2 */ |
| 24 | + audio.audiospec.callback = NULL; |
| 25 | + audio.audiospec.userdata = NULL; |
23 | 26 |
|
24 | 27 | /* open default audio device (allow audio changes) */ |
25 | | - device = SDL_OpenAudioDevice(NULL, 0, &audiospec, NULL, SDL_AUDIO_ALLOW_ANY_CHANGE); |
| 28 | + audio.device = SDL_OpenAudioDevice(NULL, 0, &audio.audiospec, NULL, SDL_AUDIO_ALLOW_ANY_CHANGE); |
26 | 29 |
|
27 | | - if (!device) { |
| 30 | + if (!audio.device) { |
28 | 31 | fprintf(stderr, "Error: %s\n", SDL_GetError()); |
29 | 32 | return 1; |
30 | 33 | } |
31 | 34 |
|
32 | 35 | /* ~.5 seconds worth of audio (probably overkill) */ |
33 | | - audio_buffer = (unsigned char *)malloc(SAMPLES_PER_FRAME * 30); |
34 | | - if (!audio_buffer) { |
| 36 | + audio.audio_buffer = (unsigned char *)malloc(SAMPLES_PER_FRAME * 30); |
| 37 | + if (!audio.audio_buffer) { |
35 | 38 | fprintf(stderr, "Unable to allocate memory for audio buffer.\n"); |
36 | 39 | return 1; |
37 | 40 | } |
38 | 41 |
|
39 | 42 | /* start playing audio */ |
40 | | - SDL_PauseAudioDevice(device, 0); |
| 43 | + SDL_PauseAudioDevice(audio.device, 0); |
41 | 44 |
|
42 | 45 | return 0; |
43 | 46 | } |
44 | 47 |
|
45 | | -void Audio::SineWave(int length) { |
| 48 | +static void audio_sine_wave(int length) { |
46 | 49 | for (int i = 0; i < length; i++) { |
47 | 50 | /* sine wave varies from 120 - 134 */ |
48 | | - audio_buffer[i] = (unsigned char) ((AMPLITUDE * sin(wave_position)) + BIAS); |
49 | | - wave_position += wave_increment; |
| 51 | + audio.audio_buffer[i] = (unsigned char) ((AMPLITUDE * sin(audio.wave_position)) + BIAS); |
| 52 | + audio.wave_position += audio.wave_increment; |
50 | 53 | } |
51 | 54 | } |
52 | 55 |
|
53 | | -void Audio::Beep(int length) { |
54 | | - if (SDL_GetQueuedAudioSize(device) < (SAMPLES_PER_FRAME * 2)) { |
55 | | - SineWave(length); |
56 | | - SDL_QueueAudio(device, audio_buffer, length); |
| 56 | +void audio_beep(int length) { |
| 57 | + if (SDL_GetQueuedAudioSize(audio.device) < (SAMPLES_PER_FRAME * 2)) { |
| 58 | + audio_sine_wave(length); |
| 59 | + SDL_QueueAudio(audio.device, audio.audio_buffer, length); |
57 | 60 | } |
58 | 61 | } |
0 commit comments