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(); }