diff --git a/daemon/src/audio/audiolayer.cpp b/daemon/src/audio/audiolayer.cpp index ca0342e2e88793582c59424faaa1b437179937fe..33b7bbdcc4c93ca9e13f710b5552fec1e72efa2a 100644 --- a/daemon/src/audio/audiolayer.cpp +++ b/daemon/src/audio/audiolayer.cpp @@ -86,7 +86,7 @@ void AudioLayer::applyGain(SFLDataFormat *src , int samples, int gain) // Notify (with a beep) an incoming call when there is already a call in progress void AudioLayer::notifyIncomingCall() { - if (!Manager::instance().incomingCallWaiting()) + if (!Manager::instance().incomingCallsWaiting()) return; time_t now = time(NULL); diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp index 0b20dd318942de418582d63a742c68a2dea9176e..a7baefa4346cf4ca0d89df27e37ecf1339951f34 100644 --- a/daemon/src/managerimpl.cpp +++ b/daemon/src/managerimpl.cpp @@ -91,13 +91,13 @@ ManagerImpl::ManagerImpl() : hasTriedToRegister_(false), audioCodecFactory(), dbus_(), config_(), currentCallId_(), currentCallMutex_(), audiodriver_(0), dtmfKey_(), toneMutex_(), telephoneTone_(), audiofile_(), audioLayerMutex_(), - waitingCall_(), waitingCallMutex_(), nbIncomingWaitingCall_(0), path_(), + waitingCalls_(), waitingCallsMutex_(), path_(), IPToIPMap_(), mainBuffer_(), conferenceMap_(), history_(), finished_(false) { pthread_mutex_init(¤tCallMutex_, NULL); pthread_mutex_init(&toneMutex_, NULL); pthread_mutex_init(&audioLayerMutex_, NULL); - pthread_mutex_init(&waitingCallMutex_, NULL); + pthread_mutex_init(&waitingCallsMutex_, NULL); // initialize random generator for call id srand(time(NULL)); } @@ -105,7 +105,7 @@ ManagerImpl::ManagerImpl() : ManagerImpl::~ManagerImpl() { // destroy in reverse order of initialization - pthread_mutex_destroy(&waitingCallMutex_); + pthread_mutex_destroy(&waitingCallsMutex_); pthread_mutex_destroy(&audioLayerMutex_); pthread_mutex_destroy(&toneMutex_); pthread_mutex_destroy(¤tCallMutex_); @@ -1440,24 +1440,22 @@ void ManagerImpl::playDtmf(char code) } // Multi-thread -bool ManagerImpl::incomingCallWaiting() const +bool ManagerImpl::incomingCallsWaiting() { - return nbIncomingWaitingCall_ > 0; + sfl::ScopedLock m(waitingCallsMutex_); + return not waitingCalls_.empty(); } void ManagerImpl::addWaitingCall(const std::string& id) { - sfl::ScopedLock m(waitingCallMutex_); - waitingCall_.insert(id); - nbIncomingWaitingCall_++; + sfl::ScopedLock m(waitingCallsMutex_); + waitingCalls_.insert(id); } void ManagerImpl::removeWaitingCall(const std::string& id) { - sfl::ScopedLock m(waitingCallMutex_); - - if (waitingCall_.erase(id)) - nbIncomingWaitingCall_--; + sfl::ScopedLock m(waitingCallsMutex_); + waitingCalls_.erase(id); } /////////////////////////////////////////////////////////////////////////////// @@ -1685,6 +1683,9 @@ void ManagerImpl::peerHungupCall(const std::string& call_id) dbus_.getCallManager()->callStateChanged(call_id, "HUNGUP"); removeWaitingCall(call_id); + if (not incomingCallsWaiting()) + stopTone(); + checkAudio(); removeStream(call_id); } diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h index f06c6b3666603083b59e1adbbc40a7d16e54c627..28bacf5a7ef419d4bf40c5518085cae6d3b67430 100644 --- a/daemon/src/managerimpl.h +++ b/daemon/src/managerimpl.h @@ -754,7 +754,7 @@ class ManagerImpl { * @return true is there is one or many incoming call waiting * new call, not anwsered or refused */ - bool incomingCallWaiting() const; + bool incomingCallsWaiting(); /** * Return a new random callid that is not present in the list @@ -871,17 +871,12 @@ class ManagerImpl { /** * Waiting Call Vectors */ - CallIDSet waitingCall_; + CallIDSet waitingCalls_; /** * Protect waiting call list, access by many voip/audio threads */ - pthread_mutex_t waitingCallMutex_; - - /** - * Number of waiting call, synchronize with waitingcall callidvector - */ - unsigned int nbIncomingWaitingCall_; + pthread_mutex_t waitingCallsMutex_; /** * Add incoming callid to the waiting list