source-mirror: Switch to obs::source audio capture

This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2019-04-02 19:44:48 +02:00
parent 8fb7d193f5
commit bcf5b56c44
2 changed files with 43 additions and 54 deletions

View File

@ -307,10 +307,6 @@ void source::mirror::mirror_instance::release_input()
obs_sceneitem_remove(this->m_source_item); obs_sceneitem_remove(this->m_source_item);
this->m_source_item = nullptr; this->m_source_item = nullptr;
} }
{
std::unique_lock<std::mutex> audio_lock(this->m_audio_lock);
this->m_source_audio.reset();
}
this->m_source.reset(); this->m_source.reset();
} }
@ -351,14 +347,10 @@ void source::mirror::mirror_instance::acquire_input(std::string source_name)
this->m_source = std::move(new_source); this->m_source = std::move(new_source);
this->m_source->events.rename += std::bind(&source::mirror::mirror_instance::on_source_rename, this, this->m_source->events.rename += std::bind(&source::mirror::mirror_instance::on_source_rename, this,
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
try { if (m_audio_enabled) {
// Audio this->m_source->events.audio_data +=
this->m_source_audio = std::make_shared<obs::audio_capture>(this->m_source); std::bind(&source::mirror::mirror_instance::on_audio_data, this, std::placeholders::_1,
this->m_source_audio->on.data += std::bind(&source::mirror::mirror_instance::audio_capture_cb, this, std::placeholders::_2, std::placeholders::_3);
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
} catch (...) {
P_LOG_ERROR("<Source Mirror:%s> Unexpected error during registering audio callback for '%s'.",
source_name.c_str());
} }
} }
@ -580,45 +572,6 @@ void source::mirror::mirror_instance::video_render(gs_effect_t* effect)
} }
} }
void source::mirror::mirror_instance::audio_capture_cb(std::shared_ptr<obs::source> source,
audio_data const* const audio, bool)
{
std::unique_lock<std::mutex> ulock(this->m_audio_lock);
if (!this->m_audio_enabled) {
return;
}
audio_t* aud = obs_get_audio();
if (!aud) {
return;
}
audio_output_info const* aoi = audio_output_get_info(aud);
if (!aoi) {
return;
}
std::bitset<8> layout;
for (size_t plane = 0; plane < MAX_AV_PLANES; plane++) {
float* samples = (float*)audio->data[plane];
if (!samples) {
this->m_audio_output.data[plane] = nullptr;
continue;
}
layout.set(plane);
memcpy(this->m_audio_data[plane].data(), audio->data[plane], audio->frames * sizeof(float_t));
this->m_audio_output.data[plane] = reinterpret_cast<uint8_t*>(this->m_audio_data[plane].data());
}
this->m_audio_output.format = aoi->format;
this->m_audio_output.frames = audio->frames;
this->m_audio_output.timestamp = audio->timestamp;
this->m_audio_output.samples_per_sec = aoi->samples_per_sec;
this->m_audio_output.speakers = aoi->speakers;
this->m_audio_have_output = true;
this->m_audio_notify.notify_all();
}
void source::mirror::mirror_instance::audio_output_cb() void source::mirror::mirror_instance::audio_output_cb()
{ {
std::unique_lock<std::mutex> ulock(this->m_audio_lock); std::unique_lock<std::mutex> ulock(this->m_audio_lock);
@ -658,3 +611,41 @@ void source::mirror::mirror_instance::on_source_rename(obs::source* source, std:
obs_source_update(this->m_self, ref); obs_source_update(this->m_self, ref);
obs_data_release(ref); obs_data_release(ref);
} }
void source::mirror::mirror_instance::on_audio_data(obs::source* source, const audio_data* audio, bool muted)
{
std::unique_lock<std::mutex> ulock(this->m_audio_lock);
if (!this->m_audio_enabled) {
return;
}
audio_t* aud = obs_get_audio();
if (!aud) {
return;
}
audio_output_info const* aoi = audio_output_get_info(aud);
if (!aoi) {
return;
}
std::bitset<8> layout;
for (size_t plane = 0; plane < MAX_AV_PLANES; plane++) {
float* samples = (float*)audio->data[plane];
if (!samples) {
this->m_audio_output.data[plane] = nullptr;
continue;
}
layout.set(plane);
memcpy(this->m_audio_data[plane].data(), audio->data[plane], audio->frames * sizeof(float_t));
this->m_audio_output.data[plane] = reinterpret_cast<uint8_t*>(this->m_audio_data[plane].data());
}
this->m_audio_output.format = aoi->format;
this->m_audio_output.frames = audio->frames;
this->m_audio_output.timestamp = audio->timestamp;
this->m_audio_output.samples_per_sec = aoi->samples_per_sec;
this->m_audio_output.speakers = aoi->speakers;
this->m_audio_have_output = true;
this->m_audio_notify.notify_all();
}

View File

@ -26,7 +26,6 @@
#include "gfx/gfx-source-texture.hpp" #include "gfx/gfx-source-texture.hpp"
#include "obs/gs/gs-rendertarget.hpp" #include "obs/gs/gs-rendertarget.hpp"
#include "obs/gs/gs-sampler.hpp" #include "obs/gs/gs-sampler.hpp"
#include "obs/obs-audio-capture.hpp"
#include "obs/obs-source.hpp" #include "obs/obs-source.hpp"
#include "plugin.hpp" #include "plugin.hpp"
@ -110,7 +109,6 @@ namespace source {
std::shared_ptr<obs::source> m_source; std::shared_ptr<obs::source> m_source;
obs_sceneitem_t* m_source_item; obs_sceneitem_t* m_source_item;
std::string m_source_name; std::string m_source_name;
std::shared_ptr<obs::audio_capture> m_source_audio;
private: private:
void release_input(); void release_input();
@ -128,13 +126,13 @@ namespace source {
void deactivate(); void deactivate();
void video_tick(float); void video_tick(float);
void video_render(gs_effect_t*); void video_render(gs_effect_t*);
void audio_capture_cb(std::shared_ptr<obs::source> source, audio_data const* const audio, bool muted);
void audio_output_cb(); void audio_output_cb();
void enum_active_sources(obs_source_enum_proc_t, void*); void enum_active_sources(obs_source_enum_proc_t, void*);
void load(obs_data_t*); void load(obs_data_t*);
void save(obs_data_t*); void save(obs_data_t*);
void on_source_rename(obs::source* source, std::string new_name, std::string old_name); void on_source_rename(obs::source* source, std::string new_name, std::string old_name);
void on_audio_data(obs::source* source, const audio_data* audio, bool muted);
}; };
} // namespace mirror } // namespace mirror
}; // namespace source }; // namespace source