// // main.c // WasmAudio // // Created by Jacky Jack on 06/07/2021. // #include #include #include #include #include #include #include #include #include #if __EMSCRIPTEN__ #include #include #include #include #include #else #include #include #ifdef __APPLE__ #include #else #include #endif //how to use on mac? //#include #endif #define SCREEN_WIDTH 320 #define SCREEN_WIDTH2 (SCREEN_WIDTH/2) #define SCREEN_HEIGHT 320 #define SCREEN_HEIGHT2 (SCREEN_HEIGHT/2) #define BUFSIZE 1536000 //Maximum recording time plus padding #define RECORDING_BUFFER_SECONDS (2) //Maximum recording time #define MAX_RECORDING_SECONDS (RECORDING_BUFFER_SECONDS+2) int first_run=1; static int quit=0; static SDL_Window *window = NULL; static SDL_Renderer *renderer = NULL; //Audio device IDs static SDL_AudioDeviceID recordingDeviceId = 0; static SDL_AudioDeviceID playbackDeviceId = 0; int audio_rec_buffer_size=-1; int audio_rec_buffer_max_size=-1; //int audio_play_buffer_size=-1; //int audio_play_buffer_max_size=-1; static uint8_t audio_rec_buffer_[BUFSIZE]; static double process_buf[BUFSIZE/4]; uint8_t *audio_rec_buffer=NULL; int audio_buf_position=0; //uint8_t *audio_play_buffer=NULL; int current_state=0; void audio_recording_callback(void *data, uint8_t *insamples, int len) { //printf("record len=%d\n",len); if (audio_buf_position audio_rec_buffer_size ) { //Stop recording audio SDL_PauseAudioDevice( recordingDeviceId, SDL_TRUE ); current_state = RECORDED; printf("State: RECORDED\n"); } SDL_UnlockAudioDevice( recordingDeviceId ); } else if (current_state == PLAYBACK) { SDL_LockAudioDevice( playbackDeviceId ); //Finished playback if( audio_buf_position > audio_rec_buffer_size ) { //Stop playing audio SDL_PauseAudioDevice( playbackDeviceId, SDL_TRUE ); current_state = RECORDED; printf("State: RECORDED\n"); } //Unlock callback SDL_UnlockAudioDevice( playbackDeviceId ); } #endif //check for first ever run if (first_run == 1) { first_run = 0; update_fractal = 1; } if (update_fractal == 1) { } #ifndef __EMSCRIPTEN__ if (update_fractal == 1) #endif { SDL_GL_SwapWindow( window ); } update_fractal=0; tick_end = SDL_GetTicks(); if ((tick_end-tick_1sec)>1000) { //perf_end = SDL_GetPerformanceCounter()-perf_start; //tick_end = SDL_GetTicks()-tick_start; //printf("FPS:%f\n",(1.0f/perf_end)); printf("FPS:%f\n",1.0f/((tick_end-tick_start)/1000.0f)); tick_1sec = tick_end; } #if !__EMSCRIPTEN__ return 0; #endif } void main_loop() { int i,count; tick_1sec = SDL_GetTicks(); #if __EMSCRIPTEN__ emscripten_set_main_loop(main_tick, 25, 1); #else while (0 == quit) { main_tick(); #if !__EMSCRIPTEN__ if (current_state == RECORDING) { SDL_LockAudioDevice( recordingDeviceId ); printf("recording=%d\n",audio_buf_position); if( audio_buf_position > audio_rec_buffer_size ) { //Stop recording audio SDL_PauseAudioDevice( recordingDeviceId, SDL_TRUE ); current_state = RECORDED; printf("State: RECORDED\n"); } SDL_UnlockAudioDevice( recordingDeviceId ); } else if (current_state == PLAYBACK) { SDL_LockAudioDevice( playbackDeviceId ); //Finished playback if( audio_buf_position > audio_rec_buffer_size ) { //Stop playing audio SDL_PauseAudioDevice( playbackDeviceId, SDL_TRUE ); current_state = RECORDED; printf("State: RECORDED\n"); } //Unlock callback SDL_UnlockAudioDevice( playbackDeviceId ); } #endif } #endif } int main(int argc, const char * argv[]) { int i,count; // insert code here... printf("Hello, World2!\n"); //if ( SDL_Init(SDL_INIT_EVERYTHING) < 0 ) if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 ) { fprintf(stderr, "EXIT:Unable to init SDL: %s\n", SDL_GetError()); exit(1); } atexit(SDL_Quit); printf("Prepare SDL2 window\n"); SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 2 ); SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 1 ); window = SDL_CreateWindow("KOH", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN); renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); SDL_SetRenderDrawColor(renderer, 0xff, 0xaa, 0xaa, 0xaa); SDL_GLContext gl_context = SDL_GL_CreateContext(window); SDL_GL_SetSwapInterval( 0 ); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); count = SDL_GetNumAudioDevices(0); printf("Playback devices %d\n",count); for (i=0;i %d\n",audio_rec_want.freq,audio_rec_have.freq); } if (audio_rec_want.format != audio_rec_have.format) { printf("Format changed %d -> %d\n",audio_rec_want.format, audio_rec_have.format); } if (recordingDeviceId == 0) { printf("Failed to open recording device\n"); } else { int byte_per_sample = audio_rec_have.channels * ( SDL_AUDIO_BITSIZE( audio_rec_have.format )/8); int byte_per_second = audio_rec_have.freq * byte_per_sample; printf("bytes per second %d\n",byte_per_second); audio_rec_buffer_size = byte_per_second*RECORDING_BUFFER_SECONDS; audio_rec_buffer_max_size = byte_per_second*MAX_RECORDING_SECONDS; //audio_rec_buffer = malloc(audio_rec_buffer_max_size); audio_rec_buffer = &audio_rec_buffer_[0]; printf("buffsize_max=%d\n",audio_rec_buffer_max_size); printf("buffsize=%d\n",audio_rec_buffer_size); memset(audio_rec_buffer,0,audio_rec_buffer_max_size); } SDL_AudioSpec audio_play_want, audio_play_have; audio_play_want.freq = 48000; audio_play_want.format = AUDIO_F32; audio_play_want.channels = 2; audio_play_want.samples = 4096; audio_play_want.callback = audio_playback_callback; playbackDeviceId = SDL_OpenAudioDevice(NULL, SDL_FALSE, &audio_play_want, &audio_play_have, SDL_AUDIO_ALLOW_FORMAT_CHANGE|SDL_AUDIO_ALLOW_FREQUENCY_CHANGE); if (audio_play_want.freq != audio_play_have.freq) { printf("Freq changed %d -> %d\n",audio_rec_want.freq,audio_rec_have.freq); } if (audio_play_want.format != audio_play_have.format) { printf("Format changed %d -> %d\n",audio_play_want.format, audio_play_have.format); } current_state = STOPPED; printf("State: STOPED\n"); //SDL_PauseAudioDevice(recordingDeviceId,0); //!SDL_LockAudioDevice(recordingDeviceId); //SDL_PauseAudioDevice(recordingDeviceId, 0); //SDL_PauseAudio(0); //SDL_Delay(4000); //!SDL_UnlockAudioDevice(recordingDeviceId); //!SDL_CloseAudio(); //SDL_CloseAudioDevice(recordingDeviceId); /* if (SDL_OpenAudio(&audio_want, &audio_have) < 0) { SDL_Log("Failed to open audio: %s", SDL_GetError()); } else { if (audio_have.format != audio_want.format) { SDL_Log("We didn't get Float32 audio format."); } SDL_PauseAudio(0); SDL_Delay(5000); SDL_CloseAudio(); } */ main_loop(); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_CloseAudio();//? SDL_VideoQuit();//? SDL_Quit(); return 0; }