54 lines
1.1 KiB
C++
54 lines
1.1 KiB
C++
#include "captions-handler.hpp"
|
|
|
|
captions_handler::captions_handler(
|
|
captions_cb callback,
|
|
enum audio_format format,
|
|
uint32_t sample_rate)
|
|
: cb(callback)
|
|
{
|
|
if (!reset_resampler(format, sample_rate))
|
|
throw CAPTIONS_ERROR_GENERIC_FAIL;
|
|
}
|
|
|
|
bool captions_handler::reset_resampler(
|
|
enum audio_format format,
|
|
uint32_t sample_rate)
|
|
try {
|
|
obs_audio_info ai;
|
|
if (!obs_get_audio_info(&ai))
|
|
throw std::string("Failed to get OBS audio info");
|
|
|
|
resample_info src = {
|
|
ai.samples_per_sec,
|
|
AUDIO_FORMAT_FLOAT_PLANAR,
|
|
ai.speakers
|
|
};
|
|
resample_info dst = {
|
|
sample_rate,
|
|
format,
|
|
SPEAKERS_MONO
|
|
};
|
|
|
|
if (!resampler.reset(dst, src))
|
|
throw std::string("Failed to create audio resampler");
|
|
|
|
return true;
|
|
|
|
} catch (std::string text) {
|
|
blog(LOG_WARNING, "%s: %s", __FUNCTION__, text.c_str());
|
|
return false;
|
|
}
|
|
|
|
void captions_handler::push_audio(const audio_data *audio)
|
|
{
|
|
uint8_t *out[MAX_AV_PLANES];
|
|
uint32_t frames;
|
|
uint64_t ts_offset;
|
|
bool success;
|
|
|
|
success = audio_resampler_resample(resampler,
|
|
out, &frames, &ts_offset,
|
|
(const uint8_t *const *)audio->data, audio->frames);
|
|
if (success)
|
|
pcm_data(out[0], frames);
|
|
}
|