41 : isCaptureMuted_(
pref.getCaptureMuted())
42 , isPlaybackMuted_(
pref.getPlaybackMuted())
43 , captureGain_(
pref.getVolumemic())
44 , playbackGain_(
pref.getVolumespkr())
48 , audioFormat_(
Manager::instance().getRingBufferPool().getInternalAudioFormat())
49 , audioInputFormat_(
Manager::instance().getRingBufferPool().getInternalAudioFormat())
50 , urgentRingBuffer_(
"urgentRingBuffer_id",
SIZEBUF, audioFormat_)
52 , lastNotificationTime_()
56 JAMI_LOG(
"[audiolayer] AGC: {:d}, noiseReduce: {:s}, VAD: {:d}, echoCancel: {:s}, audioProcessor: {:s}",
58 pref.getNoiseReduce(),
60 pref.getEchoCanceller(),
61 pref.getAudioProcessor());
116 std::lock_guard lock(audioProcessorMutex);
119 createAudioProcessor();
122 destroyAudioProcessor();
152 JAMI_INFO(
"[audiolayer] setHasNativeAEC: %d", hasNativeAEC);
153 std::lock_guard lock(audioProcessorMutex);
156 if (audioProcessor) {
157 audioProcessor->enableEchoCancel(
165 JAMI_INFO(
"[audiolayer] setHasNativeNS: %d", hasNativeNS);
166 std::lock_guard lock(audioProcessorMutex);
169 if (audioProcessor) {
170 audioProcessor->enableNoiseSuppression(
177AudioLayer::createAudioProcessor()
182 sample_rate = std::clamp(sample_rate, 16000u, 48000u);
186 unsigned int frame_size;
189 frame_size = sample_rate / 50u;
191 frame_size = sample_rate / 100u;
196 JAMI_WARNING(
"Starting audio processor with: [{} Hz, {} channels, {} samples/frame]",
203 JAMI_WARN(
"[audiolayer] using WebRTCAudioProcessor");
206 JAMI_ERR(
"[audiolayer] audioProcessor preference is webrtc, but library not linked! "
207 "using null AudioProcessor instead");
208 audioProcessor.reset();
212 JAMI_WARN(
"[audiolayer] using SpeexAudioProcessor");
215 JAMI_ERR(
"[audiolayer] audioProcessor preference is Speex, but library not linked! "
216 "using null AudioProcessor instead");
217 audioProcessor.reset();
220 JAMI_WARN(
"[audiolayer] using null AudioProcessor");
221 audioProcessor.reset();
223 JAMI_ERR(
"[audiolayer] audioProcessor preference not recognized, using null AudioProcessor "
225 audioProcessor.reset();
228 if (audioProcessor) {
229 audioProcessor->enableNoiseSuppression(
234 audioProcessor->enableEchoCancel(
243AudioLayer::destroyAudioProcessor()
246 audioProcessor.reset();
259 if (
not playIncomingCallBeep_)
262 auto now = std::chrono::system_clock::now();
265 if (
now < lastNotificationTime_ + std::chrono::seconds(5))
268 lastNotificationTime_ =
now;
278std::shared_ptr<AudioFrame>
294std::shared_ptr<AudioFrame>
317 std::lock_guard lock(audioProcessorMutex);
318 if (audioProcessor) {
321 audioProcessor->putPlayback(
silence);
327 std::lock_guard lock(audioProcessorMutex);
328 if (audioProcessor) {
344 std::lock_guard lock(audioProcessorMutex);
346 audioProcessor->putRecorded(std::move(
frame));
347 while (
auto rec = audioProcessor->getProcessed()) {
std::shared_ptr< RingBuffer > mainRingBuffer_
Buffers for audio processing.
std::unique_ptr< Resampler > resampler_
Manage sampling rate conversion.
RingBuffer urgentRingBuffer_
Urgent ring buffer used for ringtones.
void playbackChanged(bool started)
void notifyIncomingCall()
Emit an audio notification (beep) on incoming calls.
void setHasNativeNS(bool hasNS)
void hardwareFormatAvailable(AudioFormat playback, size_t bufSize=0)
Callback to be called by derived classes when the audio output is opened.
std::shared_ptr< AudioFrame > getToRing(AudioFormat format, size_t writableSamples)
void flushUrgent()
Flush urgent buffer.
AudioLayer(const AudioPreference &)
void hardwareInputFormatAvailable(AudioFormat capture)
Set the input format on necessary objects.
std::unique_ptr< AudioFrameResizer > playbackQueue_
void setHasNativeAEC(bool hasEAC)
std::shared_ptr< AudioFrame > getToPlay(AudioFormat format, size_t writableSamples)
bool isRingtoneMuted_
True if ringtone should be muted.
void recordChanged(bool started)
AudioFormat audioFormat_
Sample Rate that should be sent to the sound card.
void flushMain()
Flush main buffer.
unsigned int getSampleRate() const
Get the sample rate of the audio layer.
const AudioPreference & pref_
AudioFormat audioInputFormat_
Sample Rate for input.
void putRecorded(std::shared_ptr< AudioFrame > &&frame)
void putUrgent(std::shared_ptr< AudioFrame > buffer)
Send a chunk of data to the hardware buffer to start the playback Copy data in the urgent buffer.
bool getVadEnabled() const
bool isAGCEnabled() const
const std::string & getEchoCanceller() const
const std::string & getNoiseReduce() const
const std::string & getAudioProcessor() const
Manager (controller) of daemon.
static LIBJAMI_TEST_EXPORT Manager & instance()
RingBufferPool & getRingBufferPool()
Return a pointer to the instance of the RingBufferPool.
AudioFormat hardwareAudioFormatChanged(AudioFormat format)
Callback called when the audio layer initialised with its preferred format.
Wrapper class for libswresample.
size_t discard(size_t toDiscard, const std::string &ringbufferId)
static const char *const DEFAULT_ID
void setFormat(const AudioFormat &format)
void createReadOffset(const std::string &ringbufferId)
Add a new readoffset for this ringbuffer.
std::shared_ptr< AudioFrame > get(const std::string &ringbufferId)
Get data in the ring buffer.
void put(std::shared_ptr< AudioFrame > &&data)
Write data in the ring buffer.
#define JAMI_WARNING(formatstr,...)
#define JAMI_LOG(formatstr,...)
void fillWithSilence(AVFrame *frame)
void emitSignal(Args... args)
static constexpr size_t SIZEBUF
static bool shouldUseAudioProcessorEchoCancel(bool hasNativeAEC, const std::string &echoCancellerPref)
static bool shouldUseAudioProcessorNoiseSuppression(bool hasNativeNS, const std::string &noiseSuppressionPref)
#define jami_tracepoint(...)