/* * =================== Input/output port handling ========================= */ static void set_process_info(struct process_info *info, alsa_seqmidi_t *self, int dir, jack_nframes_t nframes) { const snd_seq_real_time_t* alsa_time; snd_seq_queue_status_t *status; snd_seq_queue_status_alloca(&status); info->dir = dir; info->period_start = jack_last_frame_time(self->jack); info->nframes = nframes; info->sample_rate = jack_get_sample_rate(self->jack); info->cur_frames = jack_frame_time(self->jack); // immediately get alsa'a real time (uhh, why everybody has their own 'real' time) snd_seq_get_queue_status(self->seq, self->queue, status); alsa_time = snd_seq_queue_status_get_real_time(status); info->alsa_time = alsa_time->tv_sec * NSEC_PER_SEC + alsa_time->tv_nsec; if (info->period_start + info->nframes < info->cur_frames) { int periods_lost = (info->cur_frames - info->period_start) / info->nframes; info->period_start += periods_lost * info->nframes; debug_log("xrun detected: %d periods lost\n", periods_lost); } }
static guint32 get_current_tick (void) { snd_seq_queue_status_t *status; snd_seq_queue_status_alloca (&status); snd_seq_get_queue_status (seq, queue_id, status); return snd_seq_queue_status_get_tick_time (status); }
static unsigned int get_tick(void) { snd_seq_queue_status_t * status; int result; snd_seq_queue_status_alloca(&status); result = snd_seq_get_queue_status(seq, seq_queue, status); if (result < 0) { fprintf(stderr, "ALSA snd_seq_get_queue_status err %d\n", result); return 0; } return (unsigned int) snd_seq_queue_status_get_tick_time(status); }