//emcc -o test.html main.cpp -O2 -s USE_SDL=2 #include #include #if defined(_MSC_VER) #include "SDL.h" #else #include "SDL2/SDL.h" #endif #include #include #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; }