0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-20 13:08:50 +02:00

libobs: Fix force mono channel count

I unintentionally made it use obs_source::sample_info instead of using
the actual target channel count, which is designated by the OBS output
sampler info.  obs_source::sample_info is actually used to indicate the
currently set sampler information for incoming samples.  So if a source
is outputting 5.1 channel 48khz audio, and OBS is running at stereo
44.1khz, then the obs_source::sample_info value would be set to
5.1/48khz, not the other way around.  It indicates what the source
itself is running at, not what OBS is running at.

I suppose the variable needs a better name because even I used it
incorrectly despite actually having been the one who wrote it.
This commit is contained in:
jp9000 2014-12-28 03:51:06 -08:00
parent 6fc52dfb16
commit caa6251054

View File

@ -1474,11 +1474,11 @@ static void copy_audio_data(obs_source_t *source,
/* TODO: SSE optimization */
static void downmix_to_mono_planar(struct obs_source *source, uint32_t frames)
{
uint32_t channels = get_audio_channels(source->sample_info.speakers);
size_t channels = audio_output_get_channels(obs->audio.audio);
const float channels_i = 1.0f / (float)channels;
float **data = (float**)source->audio_data.data;
for (uint32_t channel = 1; channel < channels; channel++) {
for (size_t channel = 1; channel < channels; channel++) {
for (uint32_t frame = 0; frame < frames; frame++)
data[0][frame] += data[channel][frame];
}
@ -1486,7 +1486,7 @@ static void downmix_to_mono_planar(struct obs_source *source, uint32_t frames)
for (uint32_t frame = 0; frame < frames; frame++)
data[0][frame] *= channels_i;
for (uint32_t channel = 1; channel < channels; channel++) {
for (size_t channel = 1; channel < channels; channel++) {
for (uint32_t frame = 0; frame < frames; frame++)
data[channel][frame] = data[0][frame];
}
@ -1495,14 +1495,14 @@ static void downmix_to_mono_planar(struct obs_source *source, uint32_t frames)
static void downmix_to_mono_interleaved(struct obs_source *source,
uint32_t frames)
{
uint32_t channels = get_audio_channels(source->sample_info.speakers);
size_t channels = audio_output_get_channels(obs->audio.audio);
const float channels_i = 1.0f / (float)channels;
float *data = (float*)source->audio_data.data[0];
for (uint32_t frame = 0; frame < frames; frame++) {
uint32_t pos = frame * channels;
size_t pos = frame * channels;
for (uint32_t channel = 1; channel < channels; channel++)
for (size_t channel = 1; channel < channels; channel++)
data[pos] += data[pos + channel];
}
@ -1510,9 +1510,9 @@ static void downmix_to_mono_interleaved(struct obs_source *source,
data[frame * channels] *= channels_i;
for (uint32_t frame = 0; frame < frames; frame++) {
uint32_t pos = frame * channels;
size_t pos = frame * channels;
for (uint32_t channel = 1; channel < channels; channel++)
for (size_t channel = 1; channel < channels; channel++)
data[pos + channel] = data[pos];
}
}