summaryrefslogtreecommitdiff
path: root/audiotest.cpp
blob: 81c6d84d612717c3d53d096168d2d6c1d7916f04 (plain)
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;
}