Example #1
0
std::vector<atable_ptr_t> TableMerger::mergeToTable(atable_ptr_t dest,
                                                                     std::vector<c_atable_ptr_t > &input_tables,
                                                                     bool useValid, std::vector<bool> valid) const {

  // Check that the valid vector has the right size
  assert(!useValid || (useValid && valid.size() == functional::sum(input_tables, 0ul, [](c_atable_ptr_t& t){ return t->size(); })));

  // at least two tables
  if (input_tables.size() == 0) {
    throw std::runtime_error("Cannot call TableMerger with a less than two tables to merge");
  }

  merge_tables tables = _strategy->determineTablesToMerge(input_tables);
  assert(tables.tables_to_merge.size() >= 1);

  // Prepare modifiable output vector
  std::vector<atable_ptr_t> result;
  for(const auto& tab : tables.tables_not_to_merge)
    result.push_back(std::const_pointer_cast<AbstractTable>(tab));

  if (tables.tables_to_merge.size() > 0) {
    // copy metadata
    auto mapping = calculateMapping(tables.tables_to_merge.front(), dest);

    // do the merge
    auto newSize = _strategy->calculateNewSize(tables.tables_to_merge, useValid, valid);
    _merger->mergeValues(tables.tables_to_merge, dest, mapping, newSize, useValid, valid);

    // create result tables
    result.push_back(dest);
  }

  return result;
}
void AUD_ChannelMapperReader::read(int& length, bool& eos, sample_t* buffer)
{
	AUD_Channels channels = m_reader->getSpecs().channels;
	if(channels != m_source_channels)
	{
		m_source_channels = channels;
		calculateMapping();
	}

	if(m_source_channels == m_target_channels)
	{
		m_reader->read(length, eos, buffer);
		return;
	}

	m_buffer.assureSize(length * channels * sizeof(sample_t));

	sample_t* in = m_buffer.getBuffer();

	m_reader->read(length, eos, in);

	sample_t sum;

	for(int i = 0; i < length; i++)
	{
		for(int j = 0; j < m_target_channels; j++)
		{
			sum = 0;
			for(int k = 0; k < m_source_channels; k++)
				sum += m_mapping[j * m_source_channels + k] * in[i * m_source_channels + k];
			buffer[i * m_target_channels + j] = sum;
		}
	}
}
void AUD_ChannelMapperReader::setMonoAngle(float angle)
{
	if(angle != angle)
		angle = 0;
	m_mono_angle = angle;
	if(m_source_channels == AUD_CHANNELS_MONO)
		calculateMapping();
}
void AUD_ChannelMapperReader::setChannels(AUD_Channels channels)
{
	m_target_channels = channels;
	calculateMapping();
}