/* * =================== 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 PyObject * alsaseq_status(PyObject *self /* Not used */, PyObject *args) { snd_seq_queue_status_t *queue_status; int running, events; const snd_seq_real_time_t *current_time; if (!PyArg_ParseTuple(args, "" )) return NULL; snd_seq_queue_status_malloc( &queue_status ); snd_seq_get_queue_status( seq_handle, queue_id, queue_status ); current_time = snd_seq_queue_status_get_real_time( queue_status ); running = snd_seq_queue_status_get_status( queue_status ); events = snd_seq_queue_status_get_events( queue_status ); snd_seq_queue_status_free( queue_status ); return Py_BuildValue( "(i(ii),i)", running, current_time->tv_sec, current_time->tv_nsec, events ); }
static PyObject * alsaseq_status(PyObject *self /* Not used */, PyObject *args) { snd_seq_queue_status_t *queue_status; int running, events; const snd_seq_real_time_t *current_time; if (!PyArg_ParseTuple(args, "" )) return NULL; if (!seq_handle) { PyErr_SetString(PyExc_RuntimeError, "Must initialize module with alsaseq.client() before using it"); return NULL; } snd_seq_queue_status_malloc( &queue_status ); snd_seq_get_queue_status( seq_handle, queue_id, queue_status ); current_time = snd_seq_queue_status_get_real_time( queue_status ); running = snd_seq_queue_status_get_status( queue_status ); events = snd_seq_queue_status_get_events( queue_status ); snd_seq_queue_status_free( queue_status ); return Py_BuildValue( "(i(ii),i)", running, current_time->tv_sec, current_time->tv_nsec, events ); }