Merge generic part of Android microphone changes (#5624)
This commit is contained in:
parent
e6ef00b41d
commit
5f1eb7146d
|
@ -86,7 +86,7 @@ void CubebInput::StartSampling(const Frontend::Mic::Parameters& params) {
|
||||||
input_params.format = CUBEB_SAMPLE_S16LE;
|
input_params.format = CUBEB_SAMPLE_S16LE;
|
||||||
input_params.rate = params.sample_rate;
|
input_params.rate = params.sample_rate;
|
||||||
|
|
||||||
u32 latency_frames;
|
u32 latency_frames = 512; // Firefox default
|
||||||
if (cubeb_get_min_latency(impl->ctx, &input_params, &latency_frames) != CUBEB_OK) {
|
if (cubeb_get_min_latency(impl->ctx, &input_params, &latency_frames) != CUBEB_OK) {
|
||||||
LOG_ERROR(Audio, "Could not get minimum latency");
|
LOG_ERROR(Audio, "Could not get minimum latency");
|
||||||
}
|
}
|
||||||
|
@ -189,4 +189,11 @@ std::vector<std::string> ListCubebInputDevices() {
|
||||||
cubeb_destroy(ctx);
|
cubeb_destroy(ctx);
|
||||||
return device_list;
|
return device_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CubebFactory::~CubebFactory() = default;
|
||||||
|
|
||||||
|
std::unique_ptr<Frontend::Mic::Interface> CubebFactory::Create(std::string mic_device_name) {
|
||||||
|
return std::make_unique<CubebInput>(std::move(mic_device_name));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace AudioCore
|
} // namespace AudioCore
|
||||||
|
|
|
@ -31,4 +31,11 @@ private:
|
||||||
|
|
||||||
std::vector<std::string> ListCubebInputDevices();
|
std::vector<std::string> ListCubebInputDevices();
|
||||||
|
|
||||||
|
class CubebFactory final : public Frontend::Mic::RealMicFactory {
|
||||||
|
public:
|
||||||
|
~CubebFactory() override;
|
||||||
|
|
||||||
|
std::unique_ptr<Frontend::Mic::Interface> Create(std::string mic_device_name) override;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace AudioCore
|
} // namespace AudioCore
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
#include <array>
|
#include <array>
|
||||||
#include "core/frontend/mic.h"
|
#include "core/frontend/mic.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_CUBEB
|
||||||
|
#include "audio_core/cubeb_input.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Frontend::Mic {
|
namespace Frontend::Mic {
|
||||||
|
|
||||||
constexpr std::array<u8, 16> NOISE_SAMPLE_8_BIT = {0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
constexpr std::array<u8, 16> NOISE_SAMPLE_8_BIT = {0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
@ -57,4 +61,26 @@ Samples StaticMic::Read() {
|
||||||
return (sample_size == 8) ? CACHE_8_BIT : CACHE_16_BIT;
|
return (sample_size == 8) ? CACHE_8_BIT : CACHE_16_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RealMicFactory::~RealMicFactory() = default;
|
||||||
|
|
||||||
|
NullFactory::~NullFactory() = default;
|
||||||
|
|
||||||
|
std::unique_ptr<Interface> NullFactory::Create([[maybe_unused]] std::string mic_device_name) {
|
||||||
|
return std::make_unique<NullMic>();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_CUBEB
|
||||||
|
static std::unique_ptr<RealMicFactory> g_factory = std::make_unique<AudioCore::CubebFactory>();
|
||||||
|
#else
|
||||||
|
static std::unique_ptr<RealMicFactory> g_factory = std::make_unique<NullFactory>();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void RegisterRealMicFactory(std::unique_ptr<RealMicFactory> factory) {
|
||||||
|
g_factory = std::move(factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<Interface> CreateRealMic(std::string mic_device_name) {
|
||||||
|
return g_factory->Create(std::move(mic_device_name));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Frontend::Mic
|
} // namespace Frontend::Mic
|
||||||
|
|
|
@ -115,4 +115,23 @@ private:
|
||||||
std::vector<u8> CACHE_16_BIT;
|
std::vector<u8> CACHE_16_BIT;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Factory for creating a real Mic input device;
|
||||||
|
class RealMicFactory {
|
||||||
|
public:
|
||||||
|
virtual ~RealMicFactory();
|
||||||
|
|
||||||
|
virtual std::unique_ptr<Interface> Create(std::string mic_device_name) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class NullFactory final : public RealMicFactory {
|
||||||
|
public:
|
||||||
|
~NullFactory() override;
|
||||||
|
|
||||||
|
std::unique_ptr<Interface> Create(std::string mic_device_name) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
void RegisterRealMicFactory(std::unique_ptr<RealMicFactory> factory);
|
||||||
|
|
||||||
|
std::unique_ptr<Interface> CreateRealMic(std::string mic_device_name);
|
||||||
|
|
||||||
} // namespace Frontend::Mic
|
} // namespace Frontend::Mic
|
||||||
|
|
|
@ -3,9 +3,6 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include <boost/serialization/weak_ptr.hpp>
|
#include <boost/serialization/weak_ptr.hpp>
|
||||||
#ifdef HAVE_CUBEB
|
|
||||||
#include "audio_core/cubeb_input.h"
|
|
||||||
#endif
|
|
||||||
#include "common/archives.h"
|
#include "common/archives.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
|
@ -359,11 +356,7 @@ struct MIC_U::Impl {
|
||||||
new_mic = std::make_unique<Frontend::Mic::NullMic>();
|
new_mic = std::make_unique<Frontend::Mic::NullMic>();
|
||||||
break;
|
break;
|
||||||
case Settings::MicInputType::Real:
|
case Settings::MicInputType::Real:
|
||||||
#if HAVE_CUBEB
|
new_mic = Frontend::Mic::CreateRealMic(Settings::values.mic_input_device);
|
||||||
new_mic = std::make_unique<AudioCore::CubebInput>(Settings::values.mic_input_device);
|
|
||||||
#else
|
|
||||||
new_mic = std::make_unique<Frontend::Mic::NullMic>();
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case Settings::MicInputType::Static:
|
case Settings::MicInputType::Static:
|
||||||
new_mic = std::make_unique<Frontend::Mic::StaticMic>();
|
new_mic = std::make_unique<Frontend::Mic::StaticMic>();
|
||||||
|
|
Reference in New Issue