static void a2dp_init(void) { snd_async_handler_t *async; snd_timer_info_t *info; snd_timer_params_t *params; long resolution; char timername[64]; int err, i; a2dp_lock(); for (i = 0; i < MAX_CONNECTIONS; i++) connections[i] = NULL; a2dp_unlock(); snd_timer_info_alloca(&info); snd_timer_params_alloca(¶ms); sprintf(timername, "hw:CLASS=%i,SCLASS=%i,CARD=%i,DEV=%i,SUBDEV=%i", SND_TIMER_CLASS_GLOBAL, SND_TIMER_CLASS_NONE, 0, SND_TIMER_GLOBAL_SYSTEM, 0); err = snd_timer_open(&timer, timername, SND_TIMER_OPEN_NONBLOCK); if (err < 0) { SNDERR("Can't open global timer"); return; } err = snd_timer_info(timer, info); if (err < 0) { SNDERR("Can't get global timer info"); return; } snd_timer_params_set_auto_start(params, 1); resolution = snd_timer_info_get_resolution(info); snd_timer_params_set_ticks(params, 1000000000 / resolution); if (snd_timer_params_get_ticks(params) < 1) snd_timer_params_set_ticks(params, 1); err = snd_timer_params(timer, params); if (err < 0) { SNDERR("Can't set global timer parameters"); snd_timer_close(timer); return; } err = snd_async_add_timer_handler(&async, timer, a2dp_timer, NULL); if (err < 0) { SNDERR("Can't create global async callback"); snd_timer_close(timer); return; } err = snd_timer_start(timer); }
unsigned int AlsaTimer::setTimerFreq(unsigned int freq) { signed int err; unsigned int setTick, actFreq; if(TIMER_DEBUG) printf("AlsaTimer::setTimerFreq(this=%p)\n",this); setTick = (1000000000 / snd_timer_info_get_resolution(info)) / freq; if (setTick == 0) { // return, print error if freq is below 500 (timing will suffer) if (((1000000000.0 / snd_timer_info_get_resolution(info)) / snd_timer_params_get_ticks(params)) < 500) { fprintf(stderr,"AlsaTimer::setTimerTicks(): requested freq %u Hz too high for timer (max is %g)\n", freq, 1000000000.0 / snd_timer_info_get_resolution(info)); fprintf(stderr," freq stays at %ld Hz\n", (long int)((1000000000.0 / snd_timer_info_get_resolution(info)) / snd_timer_params_get_ticks(params))); } return (long int)((1000000000.0 / snd_timer_info_get_resolution(info)) / snd_timer_params_get_ticks(params)); } actFreq = (1000000000 / snd_timer_info_get_resolution(info)) / setTick; if (actFreq != freq) { fprintf(stderr,"AlsaTimer::setTimerTicks(): warning: requested %u Hz, actual freq is %u Hz\n", freq, actFreq); } if(TIMER_DEBUG) printf("AlsaTimer::setTimerFreq(): Setting ticks (period) to %d ticks\n", setTick); snd_timer_params_set_auto_start(params, 1); snd_timer_params_set_ticks(params, setTick); if ((err = snd_timer_params(handle, params)) < 0) { fprintf(stderr, "AlsaTimer::setTimerFreq(): timer params %i (%s)\n", err, snd_strerror(err)); return 0; } return actFreq; }
unsigned int AlsaTimer::getTimerFreq() { return (1000000000 / snd_timer_info_get_resolution(info)) / snd_timer_params_get_ticks(params); }