static bool audio_line_place_data(struct audio_line *line, const struct audio_data *data) { int64_t pos; uint64_t timestamp = smooth_ts(line, data->timestamp); pos = ts_diff_bytes(line->audio, timestamp, line->base_timestamp); if (pos < 0) { return false; } line->next_ts_min = timestamp + conv_frames_to_time(line->audio, data->frames); #ifdef DEBUG_AUDIO blog(LOG_DEBUG, "data->timestamp: %llu, line->base_timestamp: %llu, " "pos: %lu, bytes: %lu, buf size: %lu", timestamp, line->base_timestamp, pos, data->frames * line->audio->block_size, line->buffers[0].size); #endif audio_line_place_data_pos(line, data, (size_t)pos); return true; }
/* this only really happens with the very initial data insertion. can be * ignored safely. */ static inline void clear_excess_audio_data(struct audio_line *line, uint64_t prev_time) { size_t size = (size_t)ts_diff_bytes(line->audio, prev_time, line->base_timestamp); /*blog(LOG_DEBUG, "Excess audio data for audio line '%s', somehow " "audio data went back in time by %"PRIu32" bytes. " "prev_time: %"PRIu64", line->base_timestamp: %"PRIu64, line->name, (uint32_t)size, prev_time, line->base_timestamp);*/ if (!line->audio_getting_cut_off) { blog(LOG_WARNING, "Audio line '%s' audio data currently " "getting cut off. This could be due to a " "negative sync offset that's larger than " "the current audio buffering time.", line->name); line->audio_getting_cut_off = true; } for (size_t i = 0; i < line->audio->planes; i++) { size_t clear_size = (size < line->buffers[i].size) ? size : line->buffers[i].size; circlebuf_pop_front(&line->buffers[i], NULL, clear_size); } }
static void audio_line_place_data(struct audio_line *line, const struct audio_data *data) { size_t pos = ts_diff_bytes(line->audio, data->timestamp, line->base_timestamp); #ifdef DEBUG_AUDIO blog(LOG_DEBUG, "data->timestamp: %llu, line->base_timestamp: %llu, " "pos: %lu, bytes: %lu, buf size: %lu", data->timestamp, line->base_timestamp, pos, data->frames * line->audio->block_size, line->buffers[0].size); #endif audio_line_place_data_pos(line, data, pos); }
/* this only really happens with the very initial data insertion. can be * ignored safely. */ static inline void clear_excess_audio_data(struct audio_line *line, uint64_t prev_time) { size_t size = ts_diff_bytes(line->audio, prev_time, line->base_timestamp); /*blog(LOG_DEBUG, "Excess audio data for audio line '%s', somehow " "audio data went back in time by %"PRIu32" bytes. " "prev_time: %"PRIu64", line->base_timestamp: %"PRIu64, line->name, (uint32_t)size, prev_time, line->base_timestamp);*/ for (size_t i = 0; i < line->audio->planes; i++) { size_t clear_size = (size < line->buffers[i].size) ? size : line->buffers[i].size; circlebuf_pop_front(&line->buffers[i], NULL, clear_size); } }
static inline bool mix_audio_line(struct audio_output *audio, struct audio_line *line, size_t size, uint64_t timestamp) { size_t time_offset = (size_t)ts_diff_bytes(audio, line->base_timestamp, timestamp); if (time_offset > size) return false; size -= time_offset; #ifdef DEBUG_AUDIO blog(LOG_DEBUG, "shaved off %lu bytes", size); #endif for (size_t i = 0; i < audio->planes; i++) { size_t pop_size = min_size(size, line->buffers[i].size); mix_float(audio, line, pop_size, time_offset, i); } return true; }