static void audio_line_place_data_pos(struct audio_line *line, const struct audio_data *data, size_t position) { bool planar = line->audio->planes > 1; size_t total_num = data->frames * (planar ? 1 : line->audio->channels); size_t total_size = data->frames * line->audio->block_size; for (size_t i = 0; i < line->audio->planes; i++) { da_copy_array(line->volume_buffers[i], data->data[i], total_size); uint8_t *array = line->volume_buffers[i].array; switch (line->audio->info.format) { case AUDIO_FORMAT_FLOAT: case AUDIO_FORMAT_FLOAT_PLANAR: mul_vol_float((float*)array, data->volume, total_num); break; default: blog(LOG_ERROR, "audio_line_place_data_pos: " "Unsupported or unknown format"); break; } circlebuf_place(&line->buffers[i], position, line->volume_buffers[i].array, total_size); } }
void audio_line_output(audio_line_t line, const struct audio_data *data) { if (!line->buffer.size) { line->base_timestamp = data->timestamp; circlebuf_push_back(&line->buffer, data->data, data->frames * line->audio->block_size); } else { uint64_t position = data->timestamp - line->base_timestamp; position = convert_to_sample_offset(line->audio, position); position *= line->audio->block_size; circlebuf_place(&line->buffer, (size_t)position, data->data, data->frames * line->audio->block_size); } }