diff --git a/daemon/src/audio/audioloop.cpp b/daemon/src/audio/audioloop.cpp index 38a6b7e9c5623803d21d8944fa3a3189c717d6e2..445060a62a1f07c24fa3b92d61e961fc337832f1 100644 --- a/daemon/src/audio/audioloop.cpp +++ b/daemon/src/audio/audioloop.cpp @@ -35,6 +35,7 @@ #include "audioloop.h" #include <math.h> #include <cstring> +#include <cassert> AudioLoop::AudioLoop() :_buffer (0), _size (0), _pos (0), _sampleRate (0) { @@ -46,9 +47,11 @@ AudioLoop::~AudioLoop() } void -AudioLoop::getNext (SFLDataFormat* output, int total_samples, short volume) +AudioLoop::getNext (SFLDataFormat* output, size_t total_samples, short volume) { - int pos = _pos; + size_t pos = _pos; + + assert(_size); if(_size == 0) { _error("AudioLoop: Error: Audio loop size is 0"); @@ -56,7 +59,7 @@ AudioLoop::getNext (SFLDataFormat* output, int total_samples, short volume) } while (total_samples) { - int samples = total_samples; + size_t samples = total_samples; if (samples > (_size-pos)) { samples = _size-pos; @@ -65,7 +68,7 @@ AudioLoop::getNext (SFLDataFormat* output, int total_samples, short volume) memcpy(output, _buffer+pos, samples*sizeof (SFLDataFormat)); // short>char conversion if (volume!=100) { - for (int i=0; i<samples; i++) { + for (size_t i=0; i<samples; i++) { *output = (*output * volume) /100; output++; } @@ -73,7 +76,6 @@ AudioLoop::getNext (SFLDataFormat* output, int total_samples, short volume) output += samples; // this is the destination... } - // should adjust sound here, in output??? pos = (pos + samples) % _size; total_samples -= samples; diff --git a/daemon/src/audio/audioloop.h b/daemon/src/audio/audioloop.h index 5e6616e710c825fba5c2243adcdf642c84f89318..58e8f83c211561c92e0123d33c5d418d10d6e62c 100644 --- a/daemon/src/audio/audioloop.h +++ b/daemon/src/audio/audioloop.h @@ -61,7 +61,7 @@ class AudioLoop * @param nb of int16 to send * @param volume The volume */ - void getNext (SFLDataFormat* output, int samples, short volume=100); + void getNext (SFLDataFormat* output, size_t samples, short volume=100); /** * Reset the pointer position @@ -74,7 +74,7 @@ class AudioLoop * Accessor to the size of the buffer * @return unsigned int The size */ - unsigned int getSize() { + size_t getSize() { return _size; } @@ -84,10 +84,10 @@ class AudioLoop SFLDataFormat* _buffer; /** Number of samples inside the buffer */ - int _size; + size_t _size; /** current position, set to 0, when initialize */ - int _pos; + size_t _pos; /** Sample rate */ unsigned int _sampleRate; diff --git a/daemon/src/audio/sound/tone.h b/daemon/src/audio/sound/tone.h index c17d9d7a66d5f760f8b2174f60f0df423bf4ab6e..1cfa3348411298b0afef9b042ee6065202c06666 100644 --- a/daemon/src/audio/sound/tone.h +++ b/daemon/src/audio/sound/tone.h @@ -36,9 +36,6 @@ #include <string> #include "audio/audioloop.h" -#define TONE_NBTONE 4 -#define TONE_NBCOUNTRY 7 - #define TABLE_LENGTH 4096 /** diff --git a/daemon/src/audio/sound/tonelist.cpp b/daemon/src/audio/sound/tonelist.cpp index 8f904cc10baf85281a9d96dbba7489758443024d..c08dba566f1c3653701a9466a8d262dc1629428b 100644 --- a/daemon/src/audio/sound/tonelist.cpp +++ b/daemon/src/audio/sound/tonelist.cpp @@ -32,120 +32,87 @@ */ #include "tonelist.h" -ToneList::ToneList() : _nbTone (TONE_NBTONE) , - _nbCountry (TONE_NBCOUNTRY), - _defaultCountryId (ZID_NORTH_AMERICA) +static const char *toneZone[TelephoneTone::ZID_COUNTRIES][Tone::TONE_NULL] = { + { // ZID_NORTH_AMERICA + "350+440", //Tone::TONE_DIALTONE + "480+620/500,0/500", //Tone::TONE_BUSY + "440+480/2000,0/4000", //Tone::TONE_RINGTONE + "480+620/250,0/250", //Tone::TONE_CONGESTION + }, + { //ZID_FRANCE + "440", + "440/500,0/500", + "440/1500,0/3500", + "440/250,0/250", + }, + { //ZID_AUSTRALIA + "413+438", + "425/375,0/375", + "413+438/400,0/200,413+438/400,0/2000", + "425/375,0/375,420/375,8/375", + }, + { //ZID_UNITED_KINGDOM + "350+440", + "400/375,0/375", + "400+450/400,0/200,400+450/400,0/2000", + "400/400,0/350,400/225,0/525", + }, + { //ZID_SPAIN + "425", + "425/200,0/200", + "425/1500,0/3000", + "425/200,0/200,425/200,0/200,425/200,0/600", + }, + { //ZID_ITALY + "425/600,0/1000,425/200,0/200", + "425/500,0/500", + "425/1000,0/4000", + "425/200,0/200", + }, + { //ZID_JAPAN + "400", + "400/500,0/500", + "400+15/1000,0/2000", + "400/500,0/500", + } +}; + + +TelephoneTone::COUNTRYID +TelephoneTone::getCountryId (const std::string& countryName) { - initToneDefinition(); -} - -ToneList::~ToneList() -{ -} - -void -ToneList::initToneDefinition() -{ - _toneZone[ZID_NORTH_AMERICA][Tone::TONE_DIALTONE] = "350+440"; - _toneZone[ZID_NORTH_AMERICA][Tone::TONE_BUSY] = "480+620/500,0/500"; - _toneZone[ZID_NORTH_AMERICA][Tone::TONE_RINGTONE] = "440+480/2000,0/4000"; - _toneZone[ZID_NORTH_AMERICA][Tone::TONE_CONGESTION] = "480+620/250,0/250"; - - _toneZone[ZID_FRANCE][Tone::TONE_DIALTONE] = "440"; - _toneZone[ZID_FRANCE][Tone::TONE_BUSY] = "440/500,0/500"; - _toneZone[ZID_FRANCE][Tone::TONE_RINGTONE] = "440/1500,0/3500"; - _toneZone[ZID_FRANCE][Tone::TONE_CONGESTION] = "440/250,0/250"; - - _toneZone[ZID_AUSTRALIA][Tone::TONE_DIALTONE] = "413+438"; - _toneZone[ZID_AUSTRALIA][Tone::TONE_BUSY] = "425/375,0/375"; - _toneZone[ZID_AUSTRALIA][Tone::TONE_RINGTONE] = - "413+438/400,0/200,413+438/400,0/2000"; - _toneZone[ZID_AUSTRALIA][Tone::TONE_CONGESTION] = "425/375,0/375,420/375,8/375"; - - _toneZone[ZID_UNITED_KINGDOM][Tone::TONE_DIALTONE] = "350+440"; - _toneZone[ZID_UNITED_KINGDOM][Tone::TONE_BUSY] = "400/375,0/375"; - _toneZone[ZID_UNITED_KINGDOM][Tone::TONE_RINGTONE] = - "400+450/400,0/200,400+450/400,0/2000"; - _toneZone[ZID_UNITED_KINGDOM][Tone::TONE_CONGESTION] = - "400/400,0/350,400/225,0/525"; - - _toneZone[ZID_SPAIN][Tone::TONE_DIALTONE] = "425"; - _toneZone[ZID_SPAIN][Tone::TONE_BUSY] = "425/200,0/200"; - _toneZone[ZID_SPAIN][Tone::TONE_RINGTONE] = "425/1500,0/3000"; - _toneZone[ZID_SPAIN][Tone::TONE_CONGESTION] = - "425/200,0/200,425/200,0/200,425/200,0/600"; - - _toneZone[ZID_ITALY][Tone::TONE_DIALTONE] = "425/600,0/1000,425/200,0/200"; - _toneZone[ZID_ITALY][Tone::TONE_BUSY] = "425/500,0/500"; - _toneZone[ZID_ITALY][Tone::TONE_RINGTONE] = "425/1000,0/4000"; - _toneZone[ZID_ITALY][Tone::TONE_CONGESTION] = "425/200,0/200"; - - _toneZone[ZID_JAPAN][Tone::TONE_DIALTONE] = "400"; - _toneZone[ZID_JAPAN][Tone::TONE_BUSY] = "400/500,0/500"; - _toneZone[ZID_JAPAN][Tone::TONE_RINGTONE] = "400+15/1000,0/2000"; - _toneZone[ZID_JAPAN][Tone::TONE_CONGESTION] = "400/500,0/500"; -} - -std::string -ToneList::getDefinition (COUNTRYID countryId, Tone::TONEID toneId) -{ - if (toneId == Tone::TONE_NULL) { - return ""; - } - - return _toneZone[countryId][toneId]; -} - -ToneList::COUNTRYID -ToneList::getCountryId (const std::string& countryName) -{ - if (countryName.compare ("North America") == 0) { - return ZID_NORTH_AMERICA; - } else if (countryName.compare ("France") == 0) { - return ZID_FRANCE; - } else if (countryName.compare ("Australia") == 0) { - return ZID_AUSTRALIA; - } else if (countryName.compare ("United Kingdom") == 0) { - return ZID_UNITED_KINGDOM; - } else if (countryName.compare ("Spain") == 0) { - return ZID_SPAIN; - } else if (countryName.compare ("Italy") == 0) { - return ZID_ITALY; - } else if (countryName.compare ("Japan") == 0) { - return ZID_JAPAN; - } else { - return _defaultCountryId; // default, we don't want segmentation fault - } + if (countryName == "North America") return ZID_NORTH_AMERICA; + if (countryName == "France") return ZID_FRANCE; + if (countryName == "Australia") return ZID_AUSTRALIA; + if (countryName == "United Kingdom") return ZID_UNITED_KINGDOM; + if (countryName == "Spain") return ZID_SPAIN; + if (countryName == "Italy") return ZID_ITALY; + if (countryName == "Japan") return ZID_JAPAN; + return ZID_NORTH_AMERICA; // default } TelephoneTone::TelephoneTone (const std::string& countryName, unsigned int sampleRate) : - _currentTone (Tone::TONE_NULL), - _toneList() + _currentTone (Tone::TONE_NULL) { - _debug ("TelephoneTone: Generate new telephone tones at %u Hz", sampleRate); - - ToneList::COUNTRYID countryId = _toneList.getCountryId (countryName); - _tone[Tone::TONE_DIALTONE] = new Tone (_toneList.getDefinition (countryId, Tone::TONE_DIALTONE), sampleRate); - _tone[Tone::TONE_BUSY] = new Tone (_toneList.getDefinition (countryId, Tone::TONE_BUSY), sampleRate); - _tone[Tone::TONE_RINGTONE] = new Tone (_toneList.getDefinition (countryId, Tone::TONE_RINGTONE), sampleRate); - _tone[Tone::TONE_CONGESTION] = new Tone (_toneList.getDefinition (countryId, Tone::TONE_CONGESTION), sampleRate); + TelephoneTone::COUNTRYID countryId = getCountryId (countryName); + _tone[Tone::TONE_DIALTONE] = new Tone (toneZone[countryId][Tone::TONE_DIALTONE], sampleRate); + _tone[Tone::TONE_BUSY] = new Tone (toneZone[countryId][Tone::TONE_BUSY], sampleRate); + _tone[Tone::TONE_RINGTONE] = new Tone (toneZone[countryId][Tone::TONE_RINGTONE], sampleRate); + _tone[Tone::TONE_CONGESTION] = new Tone (toneZone[countryId][Tone::TONE_CONGESTION], sampleRate); } TelephoneTone::~TelephoneTone() { - for (int i=0; i<_toneList.getNbTone(); i++) { + for (size_t i=0; i < Tone::TONE_NULL; i++) delete _tone[i]; - _tone[i] = 0; - } } void TelephoneTone::setCurrentTone (Tone::TONEID toneId) { - if (toneId != Tone::TONE_NULL && _currentTone != toneId) { + if (toneId != Tone::TONE_NULL && _currentTone != toneId) _tone[toneId]->reset(); - } _currentTone = toneId; } @@ -153,17 +120,8 @@ TelephoneTone::setCurrentTone (Tone::TONEID toneId) Tone* TelephoneTone::getCurrentTone() { - if (_currentTone == Tone::TONE_NULL) { - return 0; - } + if (_currentTone == Tone::TONE_NULL) + return NULL; return _tone[_currentTone]; } - -bool -TelephoneTone::shouldPlay() -{ - return ( (_currentTone != Tone::TONE_NULL) ? true : false); -} - - diff --git a/daemon/src/audio/sound/tonelist.h b/daemon/src/audio/sound/tonelist.h index e3feecc63b2aa3de9894b6fbfb80d1e16ef093e1..cc8f20e78ba17e38768717c9751696f8db70cd42 100644 --- a/daemon/src/audio/sound/tonelist.h +++ b/daemon/src/audio/sound/tonelist.h @@ -5,6 +5,7 @@ * Inspired by tonegenerator of * Laurielle Lea <laurielle.lea@savoirfairelinux.com> (2004) * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or @@ -36,96 +37,28 @@ #include "tone.h" -/** - * @file tonelist.h - * @brief Manages the different kind of tones according to the country - */ -class ToneList +class TelephoneTone { public: - /** - * Constructor - */ - ToneList(); - - /** - * Destructor - */ - ~ToneList(); - - - /** Countries */ - enum COUNTRYID { - ZID_NORTH_AMERICA = 0, - ZID_FRANCE, - ZID_AUSTRALIA, - ZID_UNITED_KINGDOM, - ZID_SPAIN, - ZID_ITALY, - ZID_JAPAN - }; - - /** - * Get the string definition of a tone - * return the default country or default tone if id are invalid - * @param countryId The country Id, see ToneList constructor for the list - * @param toneId The toneId - * @return std::string A string definition of the tone - */ - std::string getDefinition (COUNTRYID countryId, Tone::TONEID toneId); - - /** - * Get the country id associate to a country name - * return the default country id if not found - * The default tone/country are set inside the ToneList constructor - * @param countryName countryName, see the ToneList constructor list - * @return COUNTRYID Country Id or default Id - */ - COUNTRYID getCountryId (const std::string& countryName); - - /** @return int The number of tones */ - int getNbTone() { - return _nbTone; - } - - private: - - // Copy Constructor - ToneList (const ToneList& rh); - - // Assignment Operator - ToneList& operator= (const ToneList& rh); - void initToneDefinition(); - std::string _toneZone[TONE_NBCOUNTRY][TONE_NBTONE]; - int _nbTone; - int _nbCountry; - COUNTRYID _defaultCountryId; -}; + /** Countries */ + enum COUNTRYID { + ZID_NORTH_AMERICA = 0, + ZID_FRANCE, + ZID_AUSTRALIA, + ZID_UNITED_KINGDOM, + ZID_SPAIN, + ZID_ITALY, + ZID_JAPAN, + ZID_COUNTRIES, + }; -/** - * @author Yan Morin <yan.morin@savoirfairelinux.com> - */ -class TelephoneTone -{ - public: - /** Initialize the toneList and set the current tone to null */ TelephoneTone (const std::string& countryName, unsigned int sampleRate); ~TelephoneTone(); - - /** send TONE::ZT_TONE_NULL to stop the playing */ void setCurrentTone (Tone::TONEID toneId); - - /** - * @return the currentTone after setting it with setCurrentTone - * 0 if the current tone is null - */ Tone* getCurrentTone(); - /** @return true if you should play the tone (CurrentTone is not NULL) */ - bool shouldPlay(); - private: // Copy Constructor TelephoneTone (const TelephoneTone& rh); @@ -133,9 +66,10 @@ class TelephoneTone // Assignment Operator TelephoneTone& operator= (const TelephoneTone& rh); - Tone* _tone[TONE_NBTONE]; + static COUNTRYID getCountryId (const std::string& countryName); + + Tone* _tone[Tone::TONE_NULL]; Tone::TONEID _currentTone; - ToneList _toneList; }; #endif diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp index cf1fd4b41f047847ab147e2ad29a8d5a4259f77b..1724cba6b26af62fd42764aab36fbe67a3789afb 100644 --- a/daemon/src/managerimpl.cpp +++ b/daemon/src/managerimpl.cpp @@ -211,7 +211,8 @@ bool ManagerImpl::outgoingCall (const std::string& account_id, std::string to_cleaned(NumberCleaner::clean(to, prefix)); - Call::CallConfiguration callConfig = checkCallConfiguration (call_id, to_cleaned); + Call::CallConfiguration callConfig = (to_cleaned.find (SIP_SCHEME) == 0 or to_cleaned.find (SIPS_SCHEME) == 0) ? Call::IPtoIP : Call::Classic; + associateConfigToCall(call_id, callConfig); // in any cases we have to detach from current communication @@ -2905,11 +2906,6 @@ void ManagerImpl::setHookSettings (const std::map<std::string, std::string>& set // saveConfig(); } -Call::CallConfiguration ManagerImpl::checkCallConfiguration (const std::string& id, const std::string &to) -{ - return (to.find (SIP_SCHEME) == 0 or to.find (SIPS_SCHEME) == 0) ? Call::IPtoIP : Call::Classic; -} - bool ManagerImpl::associateConfigToCall (const std::string& callID, Call::CallConfiguration config) { diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h index 7917303b53d75f3cc9c7b2ff3f1dab1ce627dafe..616def92beddd00191c4882e52dcf60b41bca0bb 100644 --- a/daemon/src/managerimpl.h +++ b/daemon/src/managerimpl.h @@ -1224,11 +1224,6 @@ class ManagerImpl */ sfl::InstantMessaging *_imModule; - /** - * Check if the call is a classic call or a direct IP-to-IP call - */ - Call::CallConfiguration checkCallConfiguration (const std::string& id, const std::string& to); - Conf::YamlEmitter *emitter; };