mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-07-14 23:34:08 +00:00
libobs: Allow encoders to request unclamped audio mix
This is useful for formats such as 32-bit float PCM which providers greater flexibility in editing by retaining information that would otherwise be clipped.
This commit is contained in:
parent
cf837fa38a
commit
dcee4fc61a
|
@ -59,6 +59,7 @@ static inline void audio_input_free(struct audio_input *input)
|
|||
struct audio_mix {
|
||||
DARRAY(struct audio_input) inputs;
|
||||
float buffer[MAX_AUDIO_CHANNELS][AUDIO_OUTPUT_FRAMES];
|
||||
float buffer_unclamped[MAX_AUDIO_CHANNELS][AUDIO_OUTPUT_FRAMES];
|
||||
};
|
||||
|
||||
struct audio_output {
|
||||
|
@ -116,8 +117,12 @@ static inline void do_audio_output(struct audio_output *audio, size_t mix_idx,
|
|||
for (size_t i = mix->inputs.num; i > 0; i--) {
|
||||
struct audio_input *input = mix->inputs.array + (i - 1);
|
||||
|
||||
float(*buf)[AUDIO_OUTPUT_FRAMES] =
|
||||
input->conversion.allow_clipping ? mix->buffer_unclamped
|
||||
: mix->buffer;
|
||||
for (size_t i = 0; i < audio->planes; i++)
|
||||
data.data[i] = (uint8_t *)mix->buffer[i];
|
||||
data.data[i] = (uint8_t *)buf[i];
|
||||
|
||||
data.frames = frames;
|
||||
data.timestamp = timestamp;
|
||||
|
||||
|
@ -142,6 +147,8 @@ static inline void clamp_audio_output(struct audio_output *audio, size_t bytes)
|
|||
for (size_t plane = 0; plane < audio->planes; plane++) {
|
||||
float *mix_data = mix->buffer[plane];
|
||||
float *mix_end = &mix_data[float_size];
|
||||
/* Unclamped mix is copied directly. */
|
||||
memcpy(mix->buffer_unclamped[plane], mix_data, bytes);
|
||||
|
||||
while (mix_data < mix_end) {
|
||||
float val = *mix_data;
|
||||
|
|
|
@ -105,6 +105,7 @@ struct audio_convert_info {
|
|||
uint32_t samples_per_sec;
|
||||
enum audio_format format;
|
||||
enum speaker_layout speakers;
|
||||
bool allow_clipping;
|
||||
};
|
||||
|
||||
static inline uint32_t get_audio_channels(enum speaker_layout speakers)
|
||||
|
|
Loading…
Reference in a new issue