void
replay_gain_filter_set_mixer(struct filter *_filter, struct mixer *mixer,
			     unsigned base)
{
	struct replay_gain_filter *filter =
		(struct replay_gain_filter *)_filter;

	assert(mixer == NULL || (base > 0 && base <= 100));

	filter->mixer = mixer;
	filter->base = base;

	replay_gain_filter_update(filter);
}
void
replay_gain_filter_set_info(struct filter *_filter,
			    const struct replay_gain_info *info)
{
	struct replay_gain_filter *filter =
		(struct replay_gain_filter *)_filter;

	if (info != NULL) {
		filter->info = *info;
		replay_gain_info_complete(&filter->info);
	} else
		replay_gain_info_init(&filter->info);

	replay_gain_filter_update(filter);
}
Example #3
0
static const void *
replay_gain_filter_filter(struct filter *_filter,
			  const void *src, size_t src_size,
			  size_t *dest_size_r, GError **error_r)
{
	struct replay_gain_filter *filter =
		(struct replay_gain_filter *)_filter;
	bool success;
	void *dest;
	enum replay_gain_mode rg_mode;

	/* check if the mode has been changed since the last call */
	rg_mode = replay_gain_get_real_mode();

	if (filter->mode != rg_mode) {
		g_debug("replay gain mode has changed %d->%d\n", filter->mode, rg_mode);
		filter->mode = rg_mode;
		replay_gain_filter_update(filter);
	}

	*dest_size_r = src_size;

	if (filter->volume == PCM_VOLUME_1)
		/* optimized special case: 100% volume = no-op */
		return src;

	dest = pcm_buffer_get(&filter->buffer, src_size);

	if (filter->volume <= 0) {
		/* optimized special case: 0% volume = memset(0) */
		/* XXX is this valid for all sample formats? What
		   about floating point? */
		memset(dest, 0, src_size);
		return dest;
	}

	memcpy(dest, src, src_size);

	success = pcm_volume(dest, src_size, &filter->audio_format,
			     filter->volume);
	if (!success) {
		g_set_error(error_r, replay_gain_quark(), 0,
			    "pcm_volume() has failed");
		return NULL;
	}

	return dest;
}