1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
//emcc -o test.html main.cpp -O2 -s USE_SDL=2
#include <stdlib.h>
#include <iostream>
#if defined(_MSC_VER)
#include "SDL.h"
#else
#include "SDL2/SDL.h"
#endif
#include <math.h>
#include <stdio.h>
#ifdef __EMSCRIPTEN__
#include "emscripten.h"
#endif
void audiomixer(void *userdata, Uint8 *stream, int len)
{
static int sample=0;
int volume=15000;
int samples = len / 4;
short *buf = (short*)stream;
int i;
for (i = 0; i < samples*2; i+=2)
{
buf[i]=buf[i+1] = volume*sin(sample*440/4410/2);
if((sample/44100)%2==1)buf[i]=buf[i+1]=0;
buf[i]+=volume*sin(sample*261/4410/2);
sample++;
}
}
void show_AudioSpec(SDL_AudioSpec *as)
{
std::cout << as->freq << std::endl;
std::cout << as->format << std::endl;
std::cout << as->channels << std::endl;
std::cout << as->samples << std::endl;
std::cout << as->callback << std::endl;
}
int sdlstatic_init(unsigned int aSamplerate, unsigned int aBuffer)
{
SDL_AudioSpec as;
as.freq = aSamplerate;
as.format = AUDIO_S16;
as.channels = 2;
as.samples = aBuffer;
as.callback = audiomixer;
SDL_AudioSpec as2;
if (SDL_OpenAudio(&as, &as2) < 0)
{
return -1;
}
std::cout << "desired:" << std::endl;
show_AudioSpec(&as);
std::cout << "obtained:" << std::endl;
show_AudioSpec(&as2);
SDL_PauseAudio(0);
return 0;
}
void mainloop()
{
// Poll for events, and handle the ones we care about.
SDL_Event event;
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_KEYUP:
// If escape is pressed, return (and thus, quit)
switch (event.key.keysym.sym)
{
case SDLK_ESCAPE:
{
exit(0);
}
break;
}
break;
case SDL_QUIT:
SDL_CloseAudio();
exit(0);
}
}
}
int main(int argc, char *argv[])
{
if ( SDL_Init(SDL_INIT_EVERYTHING) < 0 )
{
fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
exit(1);
}
std::cout << "SDL INIT OK" << std::endl;
atexit(SDL_Quit);
sdlstatic_init(44100, 1024);
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(mainloop, 60, 0);
#else
while (1)
{
mainloop();
}
#endif
return 0;
}
|