static void
alsa_poll_ready_playing (gpointer data,
			gint source,
			GdkInputCondition condition)
{
    alsa_driver * const d = data;
    snd_pcm_sframes_t w;
    struct timeval tv;

    if(!d->firstpoll) {
        w = snd_pcm_writei(d->soundfd, d->sndbuf, d->p_fragsize);
	if(d->verbose)
	    g_print("Written: %li from %li samples\n", w, d->p_fragsize);
        if(w != d->p_fragsize) {
	    if(w < 0) {
		fprintf(stderr, "driver_alsa2: write() returned -1.\n--- \"%s\"\n", snd_strerror(w));
	    } else {
		fprintf(stderr, "driver_alsa2: write not completely done.\n");
	    }
	}
    
	gettimeofday(&tv, NULL);
	d->outtime = tv.tv_sec + tv.tv_usec / 1e6;
        d->playtime += (double) d->p_fragsize / d->p_mixfreq;//!!!
    }

    d->firstpoll = FALSE;

    audio_mix(d->sndbuf, d->p_fragsize, d->p_mixfreq, d->mf);
}
static void
alsa_poll_ready_playing (gpointer data,
			gint source,
			GdkInputCondition condition)
{
    alsa_driver * const d = data;
    int byte_count = (d->stereo + 1) * (d->bits / 8) * d->fragsize;
    int w;
    struct timeval tv;

    w = snd_pcm_write(d->soundfd, d->sndbuf, byte_count);
    if(w != byte_count) {
      if(w < 0) {
	fprintf(stderr, "driver_alsa2: write() returned -1.\n--- \"%s\"", snd_strerror(w));
      } else {
	fprintf(stderr, "driver_alsa2: write not completely done.\n");
      }
    }
    
    gettimeofday(&tv, NULL);
    d->outtime = tv.tv_sec + tv.tv_usec / 1e6;
    d->playtime += (double) d->fragsize / d->playrate;

    audio_mix(d->sndbuf, d->fragsize, d->playrate, d->mf);
}
示例#3
0
static void
oss_poll_ready_playing (gpointer data,
			gint source,
			GdkInputCondition condition)
{
    oss_driver * const d = data;
    int w;
    int size;
    struct timeval tv;

    if(!d->firstpoll) {
	size = (d->stereo + 1) * (d->bits / 8) * d->fragsize;

	if((w = write(d->soundfd, d->sndbuf, size) != size)) {
	    if(w == -1) {
		fprintf(stderr, "driver_oss: write() returned -1.\n");
	    } else {
		fprintf(stderr, "driver_oss: write not completely done.\n");
	    }
	}

	if(!d->realtimecaps) {
	    gettimeofday(&tv, NULL);
	    d->outtime = tv.tv_sec + tv.tv_usec / 1e6;
	    d->playtime += (double) d->fragsize / d->playrate;
	}
    }

    d->firstpoll = FALSE;

    audio_mix(d->sndbuf, d->fragsize, d->playrate, d->mf);
}
static void
sndfile_poll_ready_playing (gpointer data,
			 gint source,
			 GdkInputCondition condition)
{
    sndfile_driver * const d = data;

    if(!d->firstpoll) {
	sf_writef_short (d->outfile, d->sndbuf, d->sndbuf_size / 4);
	d->playtime += (double)(d->sndbuf_size) / 4 / d->p_mixfreq;
    }

    d->firstpoll = FALSE;
#ifdef WORDS_BIGENDIAN
    audio_mix(d->sndbuf, d->sndbuf_size / 4, d->p_mixfreq, ST_MIXER_FORMAT_S16_BE | ST_MIXER_FORMAT_STEREO);
#else
    audio_mix(d->sndbuf, d->sndbuf_size / 4, d->p_mixfreq, ST_MIXER_FORMAT_S16_LE | ST_MIXER_FORMAT_STEREO);
#endif

}
static void
file_poll_ready_playing (gpointer data,
			 gint source,
			 GdkInputCondition condition)
{
    file_driver * const d = data;

    if(!d->firstpoll) {
	afWriteFrames(d->outfile, AF_DEFAULT_TRACK, d->sndbuf, d->sndbuf_size / 4);
	d->playtime += (double)(d->sndbuf_size) / 4 / d->p_mixfreq;
    }

    d->firstpoll = FALSE;

    audio_mix(d->sndbuf, d->sndbuf_size / 4, d->p_mixfreq, ST_MIXER_FORMAT_S16_LE | ST_MIXER_FORMAT_STEREO);
}