#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include "duration.h"
#include "misc.h"
Duration * duration_init(uint64_t nb_samples, uint64_t sample_rate)
{
Duration *ret = xmalloc(sizeof(Duration));
ret->nb_samples = nb_samples;
ret->sample_rate = sample_rate;
duration_invalid_formatted_cache(ret);
return ret;
}
void duration_free(const Duration *dur)
{
if (!dur)
return;
free((Duration *)dur);
}
void duration_invalid_formatted_cache(Duration *dur)
{
dur->formatted[0] = '\0';
}
/* Convert a duration in seconds to a HH:MM:SS timestamp and returns it. The
* returned string is allocated via malloc and should be freed. */
static void format_seconds(uint64_t secs, char *buf)
{
uint64_t mins, hours;
hours = secs / 3600;
secs %= 3600;
mins = secs / 60;
secs %= 60;
/* Max possible duration: "5124095576030431:xx:xx", length 22 */
snprintf(buf, MAX_FORMATTED_DURATION_LENGTH + 1,
"%02"PRIu64":%02"PRIu64":%02"PRIu64, hours, mins, secs);
}
const char * duration_get_formatted(Duration *dur)
{
if (dur->formatted[0] == '\0')
format_seconds(dur->nb_samples / dur->sample_rate, dur->formatted);
return dur->formatted;
}