/* alsa_update: * Updates main buffer in case ALSA is ready. */ static void alsa_update(int threaded) { unsigned short revents; if (poll_next) { poll(ufds, pdc, 0); snd_pcm_poll_descriptors_revents(pcm_handle, ufds, pdc, &revents); if (revents & POLLERR) { if (snd_pcm_state(pcm_handle) == SND_PCM_STATE_XRUN || snd_pcm_state(pcm_handle) == SND_PCM_STATE_SUSPENDED) { int err = snd_pcm_state(pcm_handle) == SND_PCM_STATE_XRUN ? -EPIPE : -ESTRPIPE; if (xrun_recovery(pcm_handle, err) < 0) { fprintf(stderr, "Write error: %s\n", snd_strerror(err)); } poll_next = 0; } else { fprintf(stderr, "Wait for poll failed\n"); } return; } if (!(revents & POLLOUT)) return; } alsa_mix(); }
static int mixmaster(jack_nframes_t nframes, void *arg) { sample_t *outs[QMX_CHANNELS], *ch; size_t n, i; if (use_jack && need_init_guile) { scm_init_guile(); need_init_guile = 0; } for (n = 0; n < QMX_CHANNELS; n++) { // zero the mix buffers if (use_jack) ch = outs[n] = jack_port_get_buffer(jack_cauldron[n], nframes); else ch = outs[n] = fixed_cauldron + n * nframes; for (i = 0; i < nframes; i++) ch[i] = 0.0; } // mix from sources alsa_mix(nframes, outs); audio_files_mix(nframes, outs); feeds_mix(nframes, outs); if (use_jack) jack_ports_mix(nframes, outs); unit_gens_mix(nframes, outs); // process mix; e.g. fade run_filter(fader, nframes, outs, outs, 0); // deliver mix buffer_out(nframes, outs); record(nframes, outs); return 0; }