2
* Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
2
* Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
3
3
* Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
4
4
* Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
33
33
#include "audiolayer.h"
34
34
#include "audio/dcblocker.h"
35
35
#include "manager.h"
36
#include "scoped_lock.h"
38
unsigned int AudioLayer::captureGain_ = 100;
39
unsigned int AudioLayer::playbackGain_ = 100;
41
AudioLayer::AudioLayer()
37
AudioLayer::AudioLayer(const AudioPreference &pref)
38
: isCaptureMuted_(pref.getCaptureMuted())
39
, isPlaybackMuted_(pref.getPlaybackMuted())
40
, captureGain_(pref.getVolumemic())
41
, playbackGain_(pref.getVolumespkr())
44
43
, urgentRingBuffer_(SIZEBUF, MainBuffer::DEFAULT_ID)
45
44
, sampleRate_(Manager::instance().getMainBuffer().getInternalSamplingRate())
48
47
, converter_(sampleRate_)
49
48
, lastNotificationTime_(0)
51
pthread_mutex_init(&mutex_, NULL);
52
50
urgentRingBuffer_.createReadPointer(MainBuffer::DEFAULT_ID);
55
53
AudioLayer::~AudioLayer()
57
pthread_mutex_destroy(&mutex_);
60
56
void AudioLayer::flushMain()
62
sfl::ScopedLock guard(mutex_);
58
std::lock_guard<std::mutex> lock(mutex_);
63
59
// should pass call id
64
60
Manager::instance().getMainBuffer().flushAllBuffers();
67
63
void AudioLayer::flushUrgent()
69
sfl::ScopedLock guard(mutex_);
65
std::lock_guard<std::mutex> lock(mutex_);
70
66
urgentRingBuffer_.flushAll();
73
void AudioLayer::putUrgent(void* buffer, int toCopy)
75
sfl::ScopedLock guard(mutex_);
76
urgentRingBuffer_.put(buffer, toCopy);
79
void AudioLayer::applyGain(SFLDataFormat *src , int samples, int gain)
82
for (int i = 0 ; i < samples; i++)
83
src[i] = src[i] * gain* 0.01;
69
void AudioLayer::putUrgent(AudioBuffer& buffer)
71
std::lock_guard<std::mutex> lock(mutex_);
72
urgentRingBuffer_.put(buffer);
86
75
// Notify (with a beep) an incoming call when there is already a call in progress
87
76
void AudioLayer::notifyIncomingCall()
89
if (!Manager::instance().incomingCallWaiting())
78
if (!Manager::instance().incomingCallsWaiting())
92
81
time_t now = time(NULL);
104
93
Tone tone("440/160", getSampleRate());
105
94
unsigned int nbSample = tone.getSize();
106
SFLDataFormat buf[nbSample];
107
tone.getNext(buf, nbSample);
95
AudioBuffer buf(nbSample, 1, 8000);
96
tone.getNext(buf, 1.0);
109
98
/* Put the data in the urgent ring buffer */
111
putUrgent(buf, sizeof buf);