Beispiel #1
0
int handleoutput(struct bat *bat, void *buffer, int bytes, int frames)
{
	int err = 0;

	/* If capture completed, terminate the playback */
	if (bat->periods_played * frames > 2 * bat->rate
			&& bat->latency.is_capturing == false)
		return bat->latency.state;

	if (bat->latency.state == LATENCY_STATE_PLAY_AND_LISTEN)
		err = generate_sine_wave(bat, frames, buffer);
	else
		/* Output silence */
		memset(buffer, 0, bytes);

	return err;
}
Beispiel #2
0
/*
 * Generate buffer to be played either from input file or from generated data
 * Return value
 * <0 error
 * 0 ok
 * >0 break
 */
static int generate_input_data(struct pcm_container *sndpcm, int bytes,
		struct bat *bat)
{
	int err;
	static int load;
	int frames = bytes * 8 / sndpcm->frame_bits;

	if (bat->playback.file != NULL) {
		/* From input file */
		load = 0;

		while (1) {
			err = fread(sndpcm->buffer + load, 1,
					bytes - load, bat->fp);
			if (0 == err) {
				if (feof(bat->fp)) {
					fprintf(bat->log,
							_("End of playing.\n"));
					return 1;
				}
			} else if (err < bytes - load) {
				if (ferror(bat->fp)) {
					fprintf(bat->err, _("Read file error"));
					fprintf(bat->err, _(": %d\n"), err);
					return -EIO;
				}
				load += err;
			} else {
				break;
			}
		}
	} else {
		/* Generate sine wave */
		if ((bat->sinus_duration) && (load > bat->sinus_duration))
			return 1;

		err = generate_sine_wave(bat, frames, (void *)sndpcm->buffer);
		if (err != 0)
			return err;

		load += frames;
	}

	return 0;
}
Beispiel #3
0
/*
 * Generate buffer to be played either from input file or from generated data
 * Return value
 * <0 error
 * 0 ok
 * >0 break
 */
static int generate_input_data(struct snd_pcm_container sndpcm, int count,
                               struct bat *bat)
{
    int err;
    static int load;

    if (bat->playback.file != NULL) {
        /* From input file */
        load = 0;

        while (1) {
            err = fread(sndpcm.buffer + load, 1,
                        count - load, bat->fp);
            if (0 == err) {
                if (feof(bat->fp)) {
                    printf("End of playing.\n");
                    return 1;
                }
            }
            if (err < count - load) {
                if (ferror(bat->fp)) {
                    loge(E_READFILE, "%d", err);
                    return -1;
                }
                load += err;
            } else {
                break;
            }
        }
    } else {
        /* Generate sine wave */
        if ((bat->sinus_duration) && (load > bat->sinus_duration))
            return 1;

        void *buf;
        int max;
        /* Due to float conversion later on we need to get some margin
         * on max value in order to avoid sign inversion */
        switch (bat->sample_size) {
        case 1:
            buf = (int8_t *) sndpcm.buffer;
            max = INT8_MAX - 1;
            break;
        case 2:
            buf = (int16_t *) sndpcm.buffer;
            max = INT16_MAX - 10;
            break;
        case 3:
            buf = (int8_t *) sndpcm.buffer;
            max = (1 << 23) - 50;
            break;
        case 4:
            buf = (int32_t *) sndpcm.buffer;
            max = INT32_MAX - 100;
            break;
        default:
            loge(E_PARAMS S_PCMFORMAT, "size=%d", bat->sample_size);
            return -1;
        }

        generate_sine_wave(bat, count * 8 / sndpcm.frame_bits,
                           buf, max);

        load += (count * 8 / sndpcm.frame_bits);
    }

    bat->periods_played++;
    return 0;
}