static inline void reset_resampler(obs_source_t source, const struct source_audio *audio) { const struct audio_info *obs_info; struct resample_info output_info; obs_info = audio_output_getinfo(obs->audio.audio); output_info.format = obs_info->format; output_info.samples_per_sec = obs_info->samples_per_sec; output_info.speakers = obs_info->speakers; source->sample_info.format = audio->format; source->sample_info.samples_per_sec = audio->samples_per_sec; source->sample_info.speakers = audio->speakers; if (source->sample_info.samples_per_sec == obs_info->samples_per_sec && source->sample_info.format == obs_info->format && source->sample_info.speakers == obs_info->speakers) { source->audio_failed = false; return; } audio_resampler_destroy(source->resampler); source->resampler = audio_resampler_create(&output_info, &source->sample_info); source->audio_failed = source->resampler == NULL; if (source->resampler == NULL) blog(LOG_ERROR, "creation of resampler failed"); }
/* unless the value is 3+ hours worth of frames, this won't overflow */ static inline uint64_t conv_frames_to_time(size_t frames) { const struct audio_output_info *info; info = audio_output_getinfo(obs->audio.audio); return (uint64_t)frames * 1000000000ULL / (uint64_t)info->samples_per_sec; }
static inline uint64_t conv_frames_to_time(obs_source_t source, size_t frames) { const struct audio_output_info *info; double sps_to_ns; info = audio_output_getinfo(obs->audio.audio); sps_to_ns = 1000000000.0 / (double)info->samples_per_sec; return (uint64_t)((double)frames * sps_to_ns); }
static void init_sizes(struct aac_encoder *enc, audio_t audio) { const struct audio_output_info *aoi; enum audio_format format; aoi = audio_output_getinfo(audio); format = convert_ffmpeg_sample_format(enc->context->sample_fmt); enc->audio_planes = get_audio_planes(format, aoi->speakers); enc->audio_size = get_audio_size(format, aoi->speakers, 1); }
bool obs_get_audio_info(struct audio_output_info *aoi) { struct obs_core_audio *audio = &obs->audio; const struct audio_output_info *info; if (!obs || !audio->audio) return false; info = audio_output_getinfo(audio->audio); memcpy(aoi, info, sizeof(struct audio_output_info)); return true; }
static inline struct audio_convert_info *get_audio_info( struct obs_encoder *encoder, struct audio_convert_info *info) { const struct audio_output_info *aoi; aoi = audio_output_getinfo(encoder->media); memset(info, 0, sizeof(struct audio_convert_info)); if (encoder->info.audio_info) encoder->info.audio_info(encoder->context.data, info); if (info->format == AUDIO_FORMAT_UNKNOWN) info->format = aoi->format; if (!info->samples_per_sec) info->samples_per_sec = aoi->samples_per_sec; if (info->speakers == SPEAKERS_UNKNOWN) info->speakers = aoi->speakers; return info; }