diff --git a/src/media/audio/sound/tonelist.cpp b/src/media/audio/sound/tonelist.cpp index ec2a107b4a92f37a6a344376f2eac036031ce656..9e52dbd6c16d58c9cd12a3c5b52ff73f0842eec3 100644 --- a/src/media/audio/sound/tonelist.cpp +++ b/src/media/audio/sound/tonelist.cpp @@ -91,14 +91,9 @@ TelephoneTone::getCountryId(const std::string& countryName) } TelephoneTone::TelephoneTone(const std::string& countryName, unsigned int sampleRate) : - currentTone_(Tone::TONE_NULL) + currentTone_(Tone::TONE_NULL), countryId_(getCountryId(countryName)) { - 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); + buildTones(sampleRate); } TelephoneTone::~TelephoneTone() @@ -116,6 +111,14 @@ TelephoneTone::setCurrentTone(Tone::TONEID toneId) currentTone_ = toneId; } +void +TelephoneTone::setSampleRate(unsigned int sampleRate) +{ + for (size_t i=0; i < Tone::TONE_NULL; i++) + delete tone_[i]; + buildTones(sampleRate); +} + Tone* TelephoneTone::getCurrentTone() { @@ -125,4 +128,13 @@ TelephoneTone::getCurrentTone() return tone_[currentTone_]; } +void +TelephoneTone::buildTones(unsigned int sampleRate) +{ + 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); +} + } // namespace ring diff --git a/src/media/audio/sound/tonelist.h b/src/media/audio/sound/tonelist.h index f57f4e3c5a618fd578a599254d86a9e985dba3dc..d1614c9f68317f0f7ea19b8aaae5e3d82dbceb08 100644 --- a/src/media/audio/sound/tonelist.h +++ b/src/media/audio/sound/tonelist.h @@ -46,6 +46,7 @@ class TelephoneTone { ~TelephoneTone(); void setCurrentTone(Tone::TONEID toneId); + void setSampleRate(unsigned int sampleRate); Tone* getCurrentTone(); private: @@ -53,6 +54,8 @@ class TelephoneTone { static COUNTRYID getCountryId(const std::string& countryName); + void buildTones(unsigned int sampleRate); + COUNTRYID countryId_; Tone* tone_[Tone::TONE_NULL]; Tone::TONEID currentTone_; }; diff --git a/src/media/audio/tonecontrol.cpp b/src/media/audio/tonecontrol.cpp index 06331a9bf9cbd28da52643dd1b4032ad74dcc1e4..a4a3ba16e56f5898091d1389a894da1865597bc5 100644 --- a/src/media/audio/tonecontrol.cpp +++ b/src/media/audio/tonecontrol.cpp @@ -44,7 +44,10 @@ ToneControl::setSampleRate(unsigned rate) { std::lock_guard<std::mutex> lk(mutex_); sampleRate_ = rate; - telephoneTone_.reset(new TelephoneTone(prefs_.getZoneToneChoice(), rate)); + if (!telephoneTone_) + telephoneTone_.reset(new TelephoneTone(prefs_.getZoneToneChoice(), rate)); + else + telephoneTone_->setSampleRate(rate); } AudioLoop*