Example #1
0
void audio_chunk::set_data(const audio_sample * src,t_size samples,unsigned nch,unsigned srate,unsigned channel_config)
{
	t_size size = samples * nch;
	set_data_size(size);
	if (src)
		pfc::memcpy_t(get_data(),src,size);
	else
		pfc::memset_t(get_data(),(audio_sample)0,size);
	set_sample_count(samples);
	set_channels(nch,channel_config);
	set_srate(srate);
}
Example #2
0
bool audio_chunk::set_data(const audio_sample * src,unsigned samples,unsigned nch,unsigned srate)
{
	bool rv = false;
	unsigned size = samples * nch;
	audio_sample * out = check_data_size(size);
	if (out)
	{
		if (src)
			mem_ops<audio_sample>::copy(out,src,size);
		else
			mem_ops<audio_sample>::set(out,0,size);
		set_sample_count(samples);
		set_channels(nch);
		set_srate(srate);
		rv = true;
	}
	else reset();
	return rv;
}
Example #3
0
// --------------------------------------------------------------------- init --
int SpectacleBase::init(int fftlen, int windowlen, int overlap, float srate)
{
	_fftlen = fftlen;
	_window_len = windowlen;
	_overlap = overlap;

	// Make sure FFT length is a power of 2 <= kMaxFFTLen.
	bool valid = false;
	for (int x = 1; x <= kMaxFFTLen; x *= 2) {
		if (_fftlen == x) {
			valid = true;
			break;
		}
	}
	if (!valid) {
		post("%s: FFT length must be a power of two <= %d. Setting to 1024...",
			instname(), kMaxFFTLen);
		_fftlen = 1024;
	}

	_half_fftlen = _fftlen / 2;

	// Make sure window length is a power of 2 >= FFT length.
	valid = false;
	for (int x = _fftlen; x <= kMaxWindowLen; x *= 2) {
		if (_window_len == x) {
			valid = true;
			break;
		}
	}
	if (!valid) {
		post("%s: Window length must be a power of two >= FFT length (%d)\n"
		           "and <= %d. Setting to 2048...",
				instname(), _fftlen, kMaxWindowLen);
		_window_len = _fftlen * 2;
	}

	// Make sure _overlap is a power of 2 in allowed range.
	valid = false;
	for (int x = kMinOverlap; x <= kMaxOverlap; x *= 2) {
		if (_overlap == x) {
			valid = true;
			break;
		}
	}
	if (!valid) {
		post("%s: Overlap must be a power of two between %d and %d. "
				"Setting to 2...",
		      instname(), kMinOverlap, kMaxOverlap);
		_overlap = 2;
	}

	_bin_groups = new int [_half_fftlen];

	set_srate(srate);
	set_freqrange(0.0f, 0.0f);

	// derive decimation from overlap
	_decimation = int(_fftlen / _overlap);

	_window_len_minus_decimation = _window_len - _decimation;

	DPRINT2("_fftlen=%d, _decimation=%d", _fftlen, _decimation);

	_input = new float [_window_len];            // interior input buffer
	_output = new float [_window_len];           // interior output buffer
	if (_input == NULL || _output == NULL)
		return -1;
	for (int i = 0; i < _window_len; i++)
		_input[i] = _output[i] = 0.0f;

	// Read index chases write index by _decimation; add 2 extra locations to
	// keep read point from stepping on write point.  Verify with asserts in
	// increment_out_*_index().
	_outframes = _decimation + 2;
	_out_read_index = _outframes - _decimation;
	_out_write_index = 0;
	_outbuf = new float [_outframes];
	if (_outbuf == NULL)
		return -1;
	for (int i = 0; i < _outframes; i++)
		_outbuf[i] = 0.0f;
	DPRINT1("_outframes: %d", _outframes);

	_anal_window = new float [_window_len];
	_synth_window = new float [_window_len];
	if (_anal_window == NULL || _synth_window == NULL)
		return -1;
	if (make_windows() != 0)
		return -1;

	_bucket = new Obucket(_decimation, process_wrapper, (void *) this);

	_fft = new Offt(_fftlen);
	_fft_buf = _fft->getbuf();

	return 0;
}