obs-StreamFX/source/source-mirror.h
Michael Fabian 'Xaymar' Dirks 410ba9df88 source-mirror: Implement mirroring of Source Audio
From this point on, Source Mirror is now capable of real-time mirroring of Video and Audio. This can help if you need different filters per scene for your microphone or voice chat, depending on the scene (audio ducking for pause scene, no audio ducking for live gaming).
2018-04-27 23:38:49 +02:00

104 lines
3 KiB
C++

/*
* Modern effects for a modern Streamer
* Copyright (C) 2017 Michael Fabian Dirks
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#pragma once
#include "plugin.h"
#include "gs-rendertarget.h"
#include "gs-sampler.h"
#include "gfx-source-texture.h"
#include "obs-audio-capture.h"
#include <memory>
#include <obs-source.h>
#include <vector>
#include <thread>
#include <mutex>
#include <condition_variable>
namespace Source {
class MirrorAddon {
obs_source_info osi;
public:
MirrorAddon();
~MirrorAddon();
static const char *get_name(void *);
static void get_defaults(obs_data_t *);
static bool modified_properties(obs_properties_t *, obs_property_t *, obs_data_t *);
static obs_properties_t *get_properties(void *);
static void *create(obs_data_t *, obs_source_t *);
static void destroy(void *);
static uint32_t get_width(void *);
static uint32_t get_height(void *);
static void update(void *, obs_data_t *);
static void activate(void *);
static void deactivate(void *);
static void video_tick(void *, float);
static void video_render(void *, gs_effect_t *);
static void enum_active_sources(void *, obs_source_enum_proc_t, void *);
};
class Mirror {
bool m_active;
obs_source_t* m_source = nullptr;
float_t m_tick = 0;
// Input Source
std::string m_mirrorName;
std::unique_ptr<gfx::source_texture> m_mirrorSource;
// Scaling
bool m_rescale = false;
uint32_t m_width, m_height;
gs_effect_t* m_scalingEffect = nullptr;
bool m_keepOriginalSize = false;
std::unique_ptr<gs::rendertarget> m_renderTargetScale;
std::shared_ptr<gs::sampler> m_sampler;
// Audio
bool m_enableAudio = false;
std::unique_ptr<obs::audio_capture> m_mirrorAudio;
std::mutex m_audioLock;
std::condition_variable m_audioNotify;
obs_source_audio m_audioOutput;
std::vector<std::vector<float_t>> m_audioData;
std::thread m_audioThread;
bool m_audioKill = false;
bool m_audioExists = false;
public:
Mirror(obs_data_t*, obs_source_t*);
~Mirror();
uint32_t get_width();
uint32_t get_height();
void update(obs_data_t*);
void activate();
void deactivate();
void video_tick(float);
void video_render(gs_effect_t*);
void audio_capture_cb(void* data, const audio_data* audio, bool muted);
void audio_output_cb();
void enum_active_sources(obs_source_enum_proc_t, void *);
};
};