]> git.sesse.net Git - nageru/blobdiff - audio_mixer.cpp
Support audio-only FFmpeg inputs. Somewhat wonky, though.
[nageru] / audio_mixer.cpp
index 6f6190a433f20d0b84bc2f85239cbc50ae354bd1..9e7dd59a0dbc64ab6398e30824c8dae6d676b912 100644 (file)
@@ -453,7 +453,10 @@ void AudioMixer::fill_audio_bus(const map<DeviceSpec, vector<float>> &samples_ca
                //   L' = R - D
                //   R' = L + D
                float w = 0.5f * stereo_width + 0.5f;
-               if (fabs(w) < 1e-3) {
+               if (bus.source_channel[0] == bus.source_channel[1]) {
+                       // Mono anyway, so no need to bother.
+                       w = 1.0f;
+               } else if (fabs(w) < 1e-3) {
                        // Perfect inverse.
                        swap(lsrc, rsrc);
                        swap(lstride, rstride);
@@ -1175,4 +1178,18 @@ void AudioMixer::reset_peak(unsigned bus_index)
        }
 }
 
+bool AudioMixer::is_mono(unsigned bus_index)
+{
+       lock_guard<timed_mutex> lock(audio_mutex);
+       const InputMapping::Bus &bus = input_mapping.buses[bus_index];
+       if (bus.device.type == InputSourceType::SILENCE) {
+               return true;
+       } else {
+               assert(bus.device.type == InputSourceType::CAPTURE_CARD ||
+                      bus.device.type == InputSourceType::ALSA_INPUT ||
+                      bus.device.type == InputSourceType::FFMPEG_VIDEO_INPUT);
+               return bus.source_channel[0] == bus.source_channel[1];
+       }
+}
+
 AudioMixer *global_audio_mixer = nullptr;