40 : isCaptureMuted_(
pref.getCaptureMuted())
41 , isPlaybackMuted_(
pref.getPlaybackMuted())
42 , captureGain_(
pref.getVolumemic())
43 , playbackGain_(
pref.getVolumespkr())
46 , audioFormat_(
Manager::instance().getRingBufferPool().getInternalAudioFormat())
47 , audioInputFormat_(
Manager::instance().getRingBufferPool().getInternalAudioFormat())
48 , urgentRingBuffer_(
"urgentRingBuffer_id", audioFormat_)
50 , lastNotificationTime_()
54 JAMI_LOG(
"[audiolayer] AGC: {:d}, noiseReduce: {:s}, VAD: {:d}, echoCancel: {:s}, audioProcessor: {:s}",
56 pref.getNoiseReduce(),
58 pref.getEchoCanceller(),
59 pref.getAudioProcessor());
114 std::lock_guard lock(audioProcessorMutex);
117 createAudioProcessor();
120 destroyAudioProcessor();
151 std::lock_guard lock(audioProcessorMutex);
154 if (audioProcessor) {
163 std::lock_guard lock(audioProcessorMutex);
166 if (audioProcessor) {
167 audioProcessor->enableNoiseSuppression(
174AudioLayer::createAudioProcessor()
179 sample_rate = std::clamp(sample_rate, 16000u, 48000u);
183 unsigned int frame_size;
186 frame_size = sample_rate / 50u;
188 frame_size = sample_rate / 100u;
193 JAMI_WARNING(
"Starting audio processor with: [{} Hz, {} channels, {} samples/frame]",
200 JAMI_WARN(
"[audiolayer] using WebRTCAudioProcessor");
203 JAMI_ERR(
"[audiolayer] audioProcessor preference is webrtc, but library not linked! "
204 "using null AudioProcessor instead");
205 audioProcessor.reset();
209 JAMI_WARN(
"[audiolayer] using SpeexAudioProcessor");
212 JAMI_ERR(
"[audiolayer] audioProcessor preference is Speex, but library not linked! "
213 "using null AudioProcessor instead");
214 audioProcessor.reset();
217 JAMI_WARN(
"[audiolayer] using null AudioProcessor");
218 audioProcessor.reset();
220 JAMI_ERR(
"[audiolayer] audioProcessor preference not recognized, using null AudioProcessor "
222 audioProcessor.reset();
225 if (audioProcessor) {
226 audioProcessor->enableNoiseSuppression(
239AudioLayer::destroyAudioProcessor()
242 audioProcessor.reset();
255 if (
not playIncomingCallBeep_)
258 auto now = std::chrono::system_clock::now();
261 if (
now < lastNotificationTime_ + std::chrono::seconds(5))
264 lastNotificationTime_ =
now;
274std::shared_ptr<AudioFrame>
291std::shared_ptr<AudioFrame>
314 std::lock_guard lock(audioProcessorMutex);
315 if (audioProcessor) {
318 audioProcessor->putPlayback(
silence);
324 std::lock_guard lock(audioProcessorMutex);
325 if (audioProcessor) {
341 std::lock_guard lock(audioProcessorMutex);
343 audioProcessor->putRecorded(std::move(
frame));
344 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 bool shouldUseAudioProcessorEchoCancel(bool hasNativeAEC, const std::string &echoCancellerPref)
static bool shouldUseAudioProcessorNoiseSuppression(bool hasNativeNS, const std::string &noiseSuppressionPref)
Tone sample (dial, busy, ring, congestion)
#define jami_tracepoint(...)