u32 gf_ar_proc(void *p) { GF_AudioRenderer *ar = (GF_AudioRenderer *) p; ar->audio_th_state = 1; GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[AudioRender] Entering audio thread ID %d\n", gf_th_id() )); gf_mixer_lock(ar->mixer, GF_TRUE); ar->need_reconfig = GF_TRUE; gf_sc_ar_reconfig(ar); gf_mixer_lock(ar->mixer, GF_FALSE); while (ar->audio_th_state == 1) { //do mix even if mixer is empty, otherwise we will push the same buffer over and over to the sound card /* if (ar->Frozen ) { gf_sleep(0); } else */ { if (ar->need_reconfig) gf_sc_ar_reconfig(ar); ar->audio_out->WriteAudio(ar->audio_out); } } GF_LOG(GF_LOG_DEBUG, GF_LOG_AUDIO, ("[AudioRender] Exiting audio thread\n")); ar->audio_out->Shutdown(ar->audio_out); ar->audio_th_state = 3; return 0; }
u32 gf_ar_proc(void *p) { GF_AudioRenderer *ar = (GF_AudioRenderer *) p; ar->audio_th_state = 1; GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[AudioRender] Entering audio thread ID %d\n", gf_th_id() )); gf_mixer_lock(ar->mixer, 1); ar->need_reconfig = 1; gf_sc_ar_reconfig(ar); gf_mixer_lock(ar->mixer, 0); while (ar->audio_th_state == 1) { //GF_LOG(GF_LOG_DEBUG, GF_LOG_AUDIO, ("[AudioRender] Audio simulation step\n")); /*THIS IS NEEDED FOR SYMBIAN - if no yield here, the audio module always grabs the main mixer mutex and it takes forever before it can be grabed by another thread, for instance when reconfiguring scene*/ // gf_sleep(1); gf_mixer_lock(ar->mixer, 1); if (ar->Frozen || gf_mixer_empty(ar->mixer) ) { gf_mixer_lock(ar->mixer, 0); gf_sleep(33); } else { if (ar->need_reconfig) gf_sc_ar_reconfig(ar); ar->audio_out->WriteAudio(ar->audio_out); gf_mixer_lock(ar->mixer, 0); } } GF_LOG(GF_LOG_DEBUG, GF_LOG_AUDIO, ("[AudioRender] Exiting audio thread\n")); ar->audio_out->Shutdown(ar->audio_out); ar->audio_th_state = 3; return 0; }