Example #1
0
/* 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();
}
Example #2
0
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;
	}