p26001-store-acs-soc-fw-app/video/core/AudioMixer.h
2026-09-28 21:33:04 +08:00

102 lines
2.5 KiB
C++

#ifndef AC195091_8442_4268_B843_700AB594416A
#define AC195091_8442_4268_B843_700AB594416A
/*
*******************************************************************************
* INCLUDE
*******************************************************************************
*/
#include "AudioAdaptablePipe.h"
#include "AbstractAudioInput.h"
#include "util/FactoryManager.h"
#include <unordered_map>
namespace Video
{
namespace Core
{
/*
*******************************************************************************
* CLASS DECLARE
*******************************************************************************
*/
class AudioMixerSelector
{
public:
static int select(const std::string&)
{
return 0;
}
};
class AudioMixer: public AbstractAudioInput,
public ::Util::FactoryManager<AudioMixer, int, AudioMixerSelector, const std::string&>
{
public:
using Ptr = Poco::AutoPtr<AudioMixer>;
class Channel: public AudioAdaptablePipe
{
public:
using Ptr = Poco::AutoPtr<Channel>;
protected:
Channel(AudioMixer::Ptr, uint32_t id);
public:
~Channel();
CONFIGURABLE_DECLARE_PARAMETER(Attach, bool)
CONFIGURABLE_DECLARE_PARAMETER(Input, AudioComponent::Ptr)
uint32_t id() const;
protected:
virtual void start() override;
virtual void stop() override;
void onConfigChanged(ParameterNames& names) override;
AudioMixer::Ptr mixer();
private:
AudioMixer::Ptr _pMixer;
uint32_t _id;
friend AudioMixer;
};
public:
AudioMixer(const std::string& name);
~AudioMixer();
Channel::Ptr getChannel(uint32_t id);
void syncConfigToChannel(Channel::Ptr pChannel);
protected:
void start() override;
void stop() override;
void onConfigChanged(ParameterNames& names) override;
Frame::Ptr readFrame() override;
void refreshOutputParams();
PROPERTY_DECLARE(FrameDuration, uint32_t, 0, protected, protected)
PROPERTY_DECLARE(Channels, uint32_t, 0, protected, protected)
PROPERTY_DECLARE(LineSize, uint32_t, 0, protected, protected)
private:
std::unordered_map<uint32_t, Channel::Ptr> _channels;
Frame::Ptr _mixFrame;
};
inline uint32_t AudioMixer::Channel::id() const
{
return _id;
}
inline AudioMixer::Ptr AudioMixer::Channel::mixer()
{
return _pMixer;
}
}
}
#endif