diff --git a/daemon/src/audio/alsa/alsalayer.cpp b/daemon/src/audio/alsa/alsalayer.cpp index d903bb5cdb26ec3d2fcc7a403a22bc26ede9ee99..c1e7620f8af80a1a062426e8d528d209e3a501f9 100644 --- a/daemon/src/audio/alsa/alsalayer.cpp +++ b/daemon/src/audio/alsa/alsalayer.cpp @@ -78,7 +78,7 @@ AlsaLayer::AlsaLayer() , ringtoneHandle_(NULL) , captureHandle_(NULL) , audioPlugin_(audioPref.getPlugin()) - , IDSoundCards_() + // , IDSoundCards_() , is_playback_prepared_(false) , is_capture_prepared_(false) , is_playback_running_(false) @@ -160,7 +160,7 @@ AlsaLayer::startStream() if (not is_playback_open_) Manager::instance().getDbusManager()->getConfigurationManager()->errorAlert(ALSA_PLAYBACK_DEVICE); - if (getIndexOut() != getIndexRing()) + if (getIndexPlayback() != getIndexRingtone()) if (!openDevice(&ringtoneHandle_, pcmr, SND_PCM_STREAM_PLAYBACK)) Manager::instance().getDbusManager()->getConfigurationManager()->errorAlert(ALSA_PLAYBACK_DEVICE); } @@ -432,7 +432,23 @@ AlsaLayer::buildDeviceTopo(const std::string &plugin, int card) } std::vector<std::string> -AlsaLayer::getSoundCardsInfo(int stream) +AlsaLayer::getAudioDeviceList(AudioStreamDirection dir) const +{ + std::vector<HwIDPair> deviceMap; + std::vector<std::string> audioDeviceList; + + deviceMap = getAudioDeviceIndexMap(dir); + + for(std::vector<HwIDPair>::const_iterator iter = deviceMap.begin(); iter != deviceMap.end(); iter++) { + audioDeviceList.push_back(iter->second); + } + + return audioDeviceList; +} + + +std::vector<HwIDPair> +AlsaLayer::getAudioDeviceIndexMap(AudioStreamDirection dir) const { snd_ctl_t* handle; snd_ctl_card_info_t *info; @@ -442,10 +458,10 @@ AlsaLayer::getSoundCardsInfo(int stream) int numCard = -1 ; - std::vector<std::string> cards_id; + std::vector<HwIDPair> audioDevice; if (snd_card_next(&numCard) < 0 || numCard < 0) - return cards_id; + return audioDevice; do { std::stringstream ss; @@ -455,10 +471,11 @@ AlsaLayer::getSoundCardsInfo(int stream) if (snd_ctl_open(&handle, name.c_str(), 0) == 0) { if (snd_ctl_card_info(handle, info) == 0) { snd_pcm_info_set_device(pcminfo , 0); - snd_pcm_info_set_stream(pcminfo, (stream == SFL_PCM_CAPTURE) ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK); + snd_pcm_info_set_stream(pcminfo, (dir == AUDIO_STREAM_CAPTURE) ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK); - if (snd_ctl_pcm_info(handle ,pcminfo) < 0) + if (snd_ctl_pcm_info(handle ,pcminfo) < 0) { DEBUG(" Cannot get info"); + } else { DEBUG("card %i : %s [%s]", numCard, @@ -467,9 +484,9 @@ AlsaLayer::getSoundCardsInfo(int stream) std::string description = snd_ctl_card_info_get_name(info); description.append(" - "); description.append(snd_pcm_info_get_name(pcminfo)); - cards_id.push_back(description); + // The number of the sound card is associated with a string description - IDSoundCards_.push_back(HwIDPair(numCard , description)); + audioDevice.push_back(HwIDPair(numCard , description)); } } @@ -478,7 +495,7 @@ AlsaLayer::getSoundCardsInfo(int stream) } while (snd_card_next(&numCard) >= 0 && numCard >= 0); - return cards_id; + return audioDevice; } @@ -503,9 +520,17 @@ AlsaLayer::soundCardIndexExists(int card, int stream) } int -AlsaLayer::soundCardGetIndex(const std::string &description) +AlsaLayer::getAudioDeviceIndex(const std::string &description) const { - for (std::vector<HwIDPair>::const_iterator iter = IDSoundCards_.begin(); iter != IDSoundCards_.end(); ++iter) + std::vector<HwIDPair> audioDeviceIndexMap; + + std::vector<HwIDPair> captureDevice = getAudioDeviceIndexMap(AUDIO_STREAM_CAPTURE); + std::vector<HwIDPair> playbackDevice = getAudioDeviceIndexMap(AUDIO_STREAM_PLAYBACK); + + audioDeviceIndexMap.insert(audioDeviceIndexMap.end(), captureDevice.begin(), captureDevice.end()); + audioDeviceIndexMap.insert(audioDeviceIndexMap.end(), playbackDevice.begin(), playbackDevice.end()); + + for (std::vector<HwIDPair>::const_iterator iter = audioDeviceIndexMap.begin(); iter != audioDeviceIndexMap.end(); ++iter) if (iter->second == description) return iter->first; diff --git a/daemon/src/audio/alsa/alsalayer.h b/daemon/src/audio/alsa/alsalayer.h index 083e7f2500b348783d1a4912588aac92cfca87dc..f15d0d333a5a3d9592ff6397df5f1ee5d30f22bf 100644 --- a/daemon/src/audio/alsa/alsalayer.h +++ b/daemon/src/audio/alsa/alsalayer.h @@ -65,14 +65,14 @@ class AlsaLayer : public AudioLayer { * The playback starts accordingly to its threshold * ALSA Library API */ - void startStream(); + virtual void startStream(); /** * Stop the playback and capture streams. * Drops the pending frames and put the capture and playback handles to PREPARED state * ALSA Library API */ - void stopStream(); + virtual void stopStream(); /** * Concatenate two strings. Used to build a valid pcm device name. @@ -90,7 +90,12 @@ class AlsaLayer : public AudioLayer { * SFL_PCM_BOTH * @return std::vector<std::string> The vector containing the string description of the card */ - std::vector<std::string> getSoundCardsInfo(int stream); + virtual std::vector<std::string> getAudioDeviceList(AudioStreamDirection dir) const; + + /** + * Returns a map of audio device hardware description and index + */ + std::vector<HwIDPair> getAudioDeviceIndexMap(AudioStreamDirection dir) const; /** * Check if the given index corresponds to an existing sound card and supports the specified streaming mode @@ -109,7 +114,7 @@ class AlsaLayer : public AudioLayer { * @param description The string description * @return int Its index */ - int soundCardGetIndex(const std::string &description); + int getAudioDeviceIndex(const std::string &description) const; void playback(int maxSamples); void capture(); @@ -121,7 +126,7 @@ class AlsaLayer : public AudioLayer { * @return int The index of the card used for capture * 0 for the first available card on the system, 1 ... */ - int getIndexIn() const { + int getIndexCapture() const { return indexIn_; } @@ -130,7 +135,7 @@ class AlsaLayer : public AudioLayer { * @return int The index of the card used for playback * 0 for the first available card on the system, 1 ... */ - int getIndexOut() const { + int getIndexPlayback() const { return indexOut_; } @@ -139,7 +144,7 @@ class AlsaLayer : public AudioLayer { * @return int The index of the card used for ringtone * 0 for the first available card on the system, 1 ... */ - int getIndexRing() const { + int getIndexRingtone() const { return indexRing_; } @@ -227,7 +232,7 @@ class AlsaLayer : public AudioLayer { std::string audioPlugin_; /** Vector to manage all soundcard index - description association of the system */ - std::vector<HwIDPair> IDSoundCards_; + // std::vector<HwIDPair> IDSoundCards_; bool is_playback_prepared_; bool is_capture_prepared_; diff --git a/daemon/src/audio/audiolayer.h b/daemon/src/audio/audiolayer.h index cc36e453745a342178cee867df424bfcca88dabb..87d76caf2576f3668e506688de03041f623af73f 100644 --- a/daemon/src/audio/audiolayer.h +++ b/daemon/src/audio/audiolayer.h @@ -54,6 +54,8 @@ namespace ost { class Time; } +enum AudioStreamDirection { AUDIO_STREAM_CAPTURE, AUDIO_STREAM_PLAYBACK }; + class AudioLayer { private: NON_COPYABLE(AudioLayer); @@ -62,6 +64,8 @@ class AudioLayer { AudioLayer(); virtual ~AudioLayer(); + virtual std::vector<std::string> getAudioDeviceList(AudioStreamDirection dir) const = 0; + /** * Start the capture stream and prepare the playback stream. * The playback starts accordingly to its threshold @@ -76,6 +80,9 @@ class AudioLayer { */ virtual void stopStream() = 0; + /** + * Determine wether or not the audio layer is active (i.e. stream opened) + */ bool isStarted() const { return isStarted_; } @@ -88,11 +95,18 @@ class AudioLayer { */ void putUrgent(void* buffer, int toCopy); + /** + * Flush main buffer + */ void flushMain(); + /** + * Flush urgent buffer + */ void flushUrgent(); + /** * Get the sample rate of the audio layer * @return unsigned int The sample rate @@ -109,6 +123,9 @@ class AudioLayer { return &mutex_; } + /** + * Emit an audio notification on incoming calls + */ void notifyincomingCall(); protected: diff --git a/daemon/src/audio/pulseaudio/audiostream.cpp b/daemon/src/audio/pulseaudio/audiostream.cpp index 3f29c187baccea7b2f011f70d2d11187b54f8267..387d31fcbc8cd84c9cfbf060310be99d1b186510 100644 --- a/daemon/src/audio/pulseaudio/audiostream.cpp +++ b/daemon/src/audio/pulseaudio/audiostream.cpp @@ -31,7 +31,7 @@ #include <audiostream.h> #include "pulselayer.h" -AudioStream::AudioStream(pa_context *c, pa_threaded_mainloop *m, const char *desc, int type, int smplrate, std::string *deviceName) +AudioStream::AudioStream(pa_context *c, pa_threaded_mainloop *m, const char *desc, int type, int smplrate, std::string& deviceName) : audiostream_(0), mainloop_(m) { static const pa_channel_map channel_map = { @@ -62,14 +62,14 @@ AudioStream::AudioStream(pa_context *c, pa_threaded_mainloop *m, const char *des attributes.fragsize = pa_usec_to_bytes(80 * PA_USEC_PER_MSEC, &sample_spec); attributes.minreq = (uint32_t) -1; - const char *name = deviceName ? deviceName->c_str() : NULL; - pa_threaded_mainloop_lock(mainloop_); if (type == PLAYBACK_STREAM || type == RINGTONE_STREAM) - pa_stream_connect_playback(audiostream_, name, &attributes, (pa_stream_flags_t)(PA_STREAM_ADJUST_LATENCY|PA_STREAM_AUTO_TIMING_UPDATE), NULL, NULL); + pa_stream_connect_playback(audiostream_, deviceName == "" ? NULL : deviceName.c_str(), &attributes, + (pa_stream_flags_t)(PA_STREAM_ADJUST_LATENCY|PA_STREAM_AUTO_TIMING_UPDATE), NULL, NULL); else if (type == CAPTURE_STREAM) - pa_stream_connect_record(audiostream_, name, &attributes, (pa_stream_flags_t)(PA_STREAM_ADJUST_LATENCY|PA_STREAM_AUTO_TIMING_UPDATE)); + pa_stream_connect_record(audiostream_, deviceName == "" ? NULL : deviceName.c_str(), &attributes, + (pa_stream_flags_t)(PA_STREAM_ADJUST_LATENCY|PA_STREAM_AUTO_TIMING_UPDATE)); pa_threaded_mainloop_unlock(mainloop_); diff --git a/daemon/src/audio/pulseaudio/audiostream.h b/daemon/src/audio/pulseaudio/audiostream.h index 8d484407b91962c00603f49dc824b2ca49aff8cc..f89fd7babe1a8a36de38ff2c08a4bad6c737ae76 100644 --- a/daemon/src/audio/pulseaudio/audiostream.h +++ b/daemon/src/audio/pulseaudio/audiostream.h @@ -55,7 +55,7 @@ class AudioStream { * @param audio sampling rate * @param device name */ - AudioStream(pa_context *, pa_threaded_mainloop *, const char *, int, int, std::string *); + AudioStream(pa_context *, pa_threaded_mainloop *, const char *, int, int, std::string&); ~AudioStream(); diff --git a/daemon/src/audio/pulseaudio/pulselayer.cpp b/daemon/src/audio/pulseaudio/pulselayer.cpp index 2568b3a08d9a62186291637ae719a7642a54b90e..74f2dbf47e4bcdd05ced33787121ea8ad32dd449 100644 --- a/daemon/src/audio/pulseaudio/pulselayer.cpp +++ b/daemon/src/audio/pulseaudio/pulselayer.cpp @@ -65,7 +65,6 @@ void stream_moved_callback(pa_stream *s, void *userdata UNUSED) } // end anonymous namespace - PulseLayer::PulseLayer() : playback_(0) , record_(0) @@ -148,6 +147,7 @@ void PulseLayer::context_state_callback(pa_context* c, void* user_data) PA_SUBSCRIPTION_MASK_SOURCE), NULL, pulse); pa_context_set_subscribe_callback(c, context_changed_callback, pulse); pulse->updateSinkList(); + pulse->updateSourceList(); break; case PA_CONTEXT_TERMINATED: @@ -187,30 +187,40 @@ bool PulseLayer::inSourceList(const std::string &deviceName) const return std::find(sourceList_.begin(), sourceList_.end(), deviceName) != sourceList_.end(); } +std::vector<std::string> PulseLayer::getAudioDeviceList(AudioStreamDirection dir) const +{ + if(AUDIO_STREAM_CAPTURE == dir) { + return sinkList_; + } + if(AUDIO_STREAM_PLAYBACK) { + return sourceList_; + } +} void PulseLayer::createStreams(pa_context* c) { std::string playbackDevice(audioPref.getDevicePlayback()); - std::string recordDevice(audioPref.getDeviceRecord()); + std::string captureDevice(audioPref.getDeviceRecord()); std::string ringtoneDevice(audioPref.getDeviceRingtone()); + std::string defaultDevice = ""; - DEBUG("PulseAudio: Devices: playback %s , record %s , ringtone %s", - playbackDevice.c_str(), recordDevice.c_str(), ringtoneDevice.c_str()); + DEBUG("PulseAudio: Devices:\n playback: %s\n record: %s\n ringtone: %s", + playbackDevice.c_str(), captureDevice.c_str(), ringtoneDevice.c_str()); playback_ = new AudioStream(c, mainloop_, "SFLphone playback", PLAYBACK_STREAM, audioSampleRate_, - inSinkList(playbackDevice) ? &playbackDevice : NULL); + inSourceList(playbackDevice) ? playbackDevice : defaultDevice); pa_stream_set_write_callback(playback_->pulseStream(), playback_callback, this); pa_stream_set_moved_callback(playback_->pulseStream(), stream_moved_callback, this); record_ = new AudioStream(c, mainloop_, "SFLphone capture", CAPTURE_STREAM, audioSampleRate_, - inSourceList(recordDevice) ? &recordDevice : NULL); + inSinkList(captureDevice) ? captureDevice : defaultDevice); pa_stream_set_read_callback(record_->pulseStream() , capture_callback, this); pa_stream_set_moved_callback(record_->pulseStream(), stream_moved_callback, this); ringtone_ = new AudioStream(c, mainloop_, "SFLphone ringtone", RINGTONE_STREAM, audioSampleRate_, - inSourceList(ringtoneDevice) ? &ringtoneDevice : NULL); + inSourceList(ringtoneDevice) ? ringtoneDevice : defaultDevice); pa_stream_set_write_callback(ringtone_->pulseStream(), ringtone_callback, this); pa_stream_set_moved_callback(ringtone_->pulseStream(), stream_moved_callback, this); @@ -512,7 +522,7 @@ void PulseLayer::source_input_info_callback(pa_context *c UNUSED, const pa_sourc { char s[PA_SAMPLE_SPEC_SNPRINT_MAX], cv[PA_CVOLUME_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX]; - if (!eol) + if (eol) return; DEBUG("Sink %u\n" diff --git a/daemon/src/audio/pulseaudio/pulselayer.h b/daemon/src/audio/pulseaudio/pulselayer.h index ae4092b1324b33ec21331ef386b6c11d929215e8..fc6c742a28d744ac21c614633165c328c7a4a6f0 100644 --- a/daemon/src/audio/pulseaudio/pulselayer.h +++ b/daemon/src/audio/pulseaudio/pulselayer.h @@ -62,9 +62,11 @@ class PulseLayer : public AudioLayer { bool inSourceList(const std::string &deviceName) const; - void startStream(); + virtual std::vector<std::string> getAudioDeviceList(AudioStreamDirection dir) const; - void stopStream(); + virtual void startStream(); + + virtual void stopStream(); private: static void context_state_callback(pa_context* c, void* user_data); @@ -106,8 +108,15 @@ class PulseLayer : public AudioLayer { */ AudioStream* ringtone_; - std::list<std::string> sinkList_; - std::list<std::string> sourceList_; + /** + * Contain the list of playback devices + */ + std::vector<std::string> sinkList_; + + /** + * Contain the list of capture devices + */ + std::vector<std::string> sourceList_; /* * Buffers used to avoid doing malloc/free in the audio thread diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp index e5505c897c27c94c8f83ec6a943b96d036bf5710..b62560d3986a30ed539ce1e9937f40012051fae5 100644 --- a/daemon/src/managerimpl.cpp +++ b/daemon/src/managerimpl.cpp @@ -1970,7 +1970,7 @@ std::vector<std::string> ManagerImpl::getAudioOutputDeviceList() AlsaLayer *alsalayer = dynamic_cast<AlsaLayer*>(audiodriver_); if (alsalayer) - devices = alsalayer->getSoundCardsInfo(SFL_PCM_PLAYBACK); + devices = alsalayer->getAudioDeviceList(AUDIO_STREAM_PLAYBACK); return devices; } @@ -1988,7 +1988,7 @@ std::vector<std::string> ManagerImpl::getAudioInputDeviceList() AlsaLayer *alsalayer = dynamic_cast<AlsaLayer *>(audiodriver_); if (alsalayer) - devices = alsalayer->getSoundCardsInfo(SFL_PCM_CAPTURE); + devices = alsalayer->getAudioDeviceList(AUDIO_STREAM_CAPTURE); return devices; } @@ -2006,11 +2006,11 @@ std::vector<std::string> ManagerImpl::getCurrentAudioDevicesIndex() if (alsa) { std::stringstream ssi, sso, ssr; - sso << alsa->getIndexOut(); + sso << alsa->getIndexPlayback(); v.push_back(sso.str()); - ssi << alsa->getIndexIn(); + ssi << alsa->getIndexCapture(); v.push_back(ssi.str()); - ssr << alsa->getIndexRing(); + ssr << alsa->getIndexRingtone(); v.push_back(ssr.str()); } @@ -2218,7 +2218,7 @@ int ManagerImpl::getAudioDeviceIndex(const std::string &name) AlsaLayer *alsalayer = dynamic_cast<AlsaLayer *>(audiodriver_); if (alsalayer) - soundCardIndex = alsalayer -> soundCardGetIndex(name); + soundCardIndex = alsalayer -> getAudioDeviceIndex(name); return soundCardIndex; } diff --git a/daemon/src/sip/sipaccount.cpp b/daemon/src/sip/sipaccount.cpp index fdd463449f0e624cae0ad0f99c1eca0473013fa3..efde26c18c528e5b3c463427eb14ffdaf1bcdacf 100644 --- a/daemon/src/sip/sipaccount.cpp +++ b/daemon/src/sip/sipaccount.cpp @@ -38,6 +38,7 @@ #include <sstream> #include <cassert> + SIPAccount::SIPAccount(const std::string& accountID) : Account(accountID, "SIP") , transport_(NULL) @@ -82,6 +83,7 @@ SIPAccount::SIPAccount(const std::string& accountID) , zrtpHelloHash_(true) , zrtpNotSuppWarning_(true) , registrationStateDetailed_() + , keepAliveTimer_() { link_ = SIPVoIPLink::instance(); } @@ -234,9 +236,9 @@ void SIPAccount::serialize(Conf::YamlEmitter *emitter) delete node->getValue(REALM); delete node; } -} - + +} void SIPAccount::unserialize(Conf::MappingNode *map) { @@ -567,6 +569,31 @@ void SIPAccount::unregisterVoIPLink() } } +void SIPAccount::startKeepAliveTimer() { + pj_time_val keepAliveDelay_; + + if (isTlsEnabled()) + return; + + keepAliveTimer_.cb = &SIPAccount::keepAliveRegistrationCb; + keepAliveTimer_.user_data = (void *)this; + + // expiration may no be determined when during the first registration request + if(registrationExpire_ == 0) { + keepAliveDelay_.sec = 60; + } + else { + keepAliveDelay_.sec = registrationExpire_; + } + keepAliveDelay_.msec = 0; + + reinterpret_cast<SIPVoIPLink *>(link_)->registerKeepAliveTimer(keepAliveTimer_, keepAliveDelay_); +} + +void SIPAccount::stopKeepAliveTimer() { + reinterpret_cast<SIPVoIPLink *>(link_)->cancelKeepAliveTimer(keepAliveTimer_); +} + pjsip_ssl_method SIPAccount::sslMethodStringToPjEnum(const std::string& method) { if (method == "Default") @@ -745,6 +772,25 @@ std::string SIPAccount::getContactHeader(const std::string& address, const std:: address + ":" + port + transport + ">"; } +void SIPAccount::keepAliveRegistrationCb(UNUSED pj_timer_heap_t *th, pj_timer_entry *te) +{ + SIPAccount *sipAccount = reinterpret_cast<SIPAccount *>(te->user_data); + + if (sipAccount->isTlsEnabled()) + return; + + if(sipAccount->isRegistered()) { + + // send a new register request + sipAccount->registerVoIPLink(); + + // make sure the current timer is deactivated + sipAccount->stopKeepAliveTimer(); + + // register a new timer + sipAccount->startKeepAliveTimer(); + } +} namespace { std::string computeMd5HashFromCredential( diff --git a/daemon/src/sip/sipaccount.h b/daemon/src/sip/sipaccount.h index 076fe6076c967e381219594d24a8eea01cd103eb..32d5671ddc3b7da07528e45b3f5815361bdff475 100644 --- a/daemon/src/sip/sipaccount.h +++ b/daemon/src/sip/sipaccount.h @@ -143,6 +143,19 @@ class SIPAccount : public Account { */ void unregisterVoIPLink(); + /** + * Start the keep alive function, once started, the account will be registered periodically + * a new REGISTER request is sent bey the client application. The account must be initially + * registered for this call to be effective. + */ + void startKeepAliveTimer(); + + /** + * Stop the keep alive timer. Once canceled, no further registration will be scheduled + */ + void stopKeepAliveTimer(); + + pjsip_cred_info *getCredInfo() const { return cred_; } @@ -174,6 +187,15 @@ class SIPAccount : public Account { return registrationExpire_; } + /** + * Set the expiration for this account as found in + * the "Expire" sip header or the Contact "expire" param. + */ + void setRegistrationExpire(int expire) { + if(expire > 0) + registrationExpire_ = expire; + } + /** * Doubles the Expiration Interval of Contact Addresses. */ @@ -188,10 +210,16 @@ class SIPAccount : public Account { bool userMatch(const std::string& username) const; bool hostnameMatch(const std::string& hostname) const; - /* Registration flag */ - bool isRegister() const { + /** + * Registration flag + */ + bool isRegistered() const { return bRegister_; } + + /** + * Set registration flag + */ void setRegister(bool result) { bRegister_ = result; } @@ -410,6 +438,12 @@ class SIPAccount : public Account { return zrtpHelloHash_; } + /** + * Timer used to periodically send re-register request based + * on the "Expire" sip header (or the "expire" Contact parameter) + */ + static void keepAliveRegistrationCb(pj_timer_heap_t *th, pj_timer_entry *te); + pjsip_transport* transport_; private: NON_COPYABLE(SIPAccount); @@ -442,9 +476,14 @@ class SIPAccount : public Account { */ static std::string getLoginName(); - // The pjsip client registration information + /** + * The pjsip client registration information + */ pjsip_regc *regc_; - // To check if the account is registered + + /** + * To check if the account is registered + */ bool bRegister_; // Network settings @@ -517,6 +556,17 @@ class SIPAccount : public Account { * This is a protocol Code:Description pair. */ std::pair<int, std::string> registrationStateDetailed_; + + /** + * Timer used to regularrly send re-register request based + * on the "Expire" sip header (or the "expire" Contact parameter) + */ + pj_timer_entry keepAliveTimer_; + + /** + * Delay coresponding to a registration interval + */ + // pj_time_val keepAliveDelay_; }; #endif diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp index 5564a55809f1a77a2a452c09afe97fb9866db740..5f556403f33bc2f3c65a15a4e62510990f361e55 100644 --- a/daemon/src/sip/sipvoiplink.cpp +++ b/daemon/src/sip/sipvoiplink.cpp @@ -346,6 +346,10 @@ void SIPVoIPLink::sendRegister(Account *a) pjsip_transport_dec_ref(account->transport_); account->setRegistrationInfo(regc); + + // start the periodic registration request based on Expire header + // account determines itself if a keep alive is required + account->startKeepAliveTimer(); } void SIPVoIPLink::sendUnregister(Account *a) @@ -353,11 +357,14 @@ void SIPVoIPLink::sendUnregister(Account *a) SIPAccount *account = dynamic_cast<SIPAccount *>(a); // This may occurs if account failed to register and is in state INVALID - if (!account->isRegister()) { + if (!account->isRegistered()) { account->setRegistrationState(Unregistered); return; } + // Make sure to cancel any ongoing timers before unregister + account->stopKeepAliveTimer(); + pjsip_regc *regc = account->getRegistrationInfo(); if (!regc) @@ -374,6 +381,21 @@ void SIPVoIPLink::sendUnregister(Account *a) account->setRegister(false); } +void SIPVoIPLink::registerKeepAliveTimer(pj_timer_entry& timer, pj_time_val& delay) +{ + pj_status_t status; + + status = pjsip_endpt_schedule_timer(endpt_, &timer, &delay); + if(status != PJ_SUCCESS) { + ERROR("Could not schedule new timer in pjsip endpoint"); + } +} + +void SIPVoIPLink::cancelKeepAliveTimer(pj_timer_entry& timer) +{ + pjsip_endpt_cancel_timer(endpt_, &timer); +} + Call *SIPVoIPLink::newOutgoingCall(const std::string& id, const std::string& toUrl) { SIPAccount *account = dynamic_cast<SIPAccount *>(Manager::instance().getAccount(Manager::instance().getAccountFromCall(id))); @@ -1599,6 +1621,8 @@ void registration_cb(struct pjsip_regc_cbparam *param) std::pair<int, std::string> details(param->code, state); // TODO: there id a race condition for this ressource when closing the application account->setRegistrationStateDetailed(details); + + account->setRegistrationExpire(param->expiration); } if (param->status != PJ_SUCCESS) { @@ -1642,7 +1666,7 @@ void registration_cb(struct pjsip_regc_cbparam *param) SIPVoIPLink::instance()->shutdownSipTransport(account); } else { - if (account->isRegister()) + if (account->isRegistered()) account->setRegistrationState(Registered); else { account->setRegistrationState(Unregistered); diff --git a/daemon/src/sip/sipvoiplink.h b/daemon/src/sip/sipvoiplink.h index 1c2fceb9bc8fe1f63814dd1cd071e8c1d748e965..665171e1d9e8cf1e3ebc581e11edee5043cafca4 100644 --- a/daemon/src/sip/sipvoiplink.h +++ b/daemon/src/sip/sipvoiplink.h @@ -99,6 +99,16 @@ class SIPVoIPLink : public VoIPLink { */ virtual void sendUnregister(Account *a); + /** + * Register a new keepalive registration timer to this endpoint + */ + void registerKeepAliveTimer(pj_timer_entry& timer, pj_time_val& delay); + + /** + * Abort currently registered timer + */ + void cancelKeepAliveTimer(pj_timer_entry& timer); + /** * Place a new call * @param id The call identifier diff --git a/gnome/src/config/audioconf.c b/gnome/src/config/audioconf.c index e22cea77efa3c115f6b29fa71de46e8c11a25dac..84d6b42c68a7d901519e2bedfd2c80a829a71722 100644 --- a/gnome/src/config/audioconf.c +++ b/gnome/src/config/audioconf.c @@ -152,32 +152,37 @@ preferences_dialog_fill_ringtone_audio_device_list() void select_active_output_audio_device() { - if (must_show_alsa_conf()) { - // Select active output device on server - gchar **devices = dbus_get_current_audio_devices_index(); - int currentDeviceIndex = atoi(devices[0]); - DEBUG("audio device index for output = %d", currentDeviceIndex); - GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(output)); + gboolean show_alsa = must_show_alsa_conf(); - // Find the currently set output device - GtkTreeIter iter; - gtk_tree_model_get_iter_first(model, &iter); + if(!show_alsa) + return; - do { - int deviceIndex; - gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1); + // Select active output device on server + gchar **devices = dbus_get_current_audio_devices_index(); + - if (deviceIndex == currentDeviceIndex) { - // Set current iteration the active one - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(output), &iter); - return; - } - } while (gtk_tree_model_iter_next(model, &iter)); + int currentDeviceIndex = atoi(devices[0]); + DEBUG("audio device index for output = %d", currentDeviceIndex); + GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(output)); - // No index was found, select first one - WARN("Warning : No active output device found"); - gtk_combo_box_set_active(GTK_COMBO_BOX(output), 0); - } + // Find the currently set output device + GtkTreeIter iter; + gtk_tree_model_get_iter_first(model, &iter); + + do { + int deviceIndex; + gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1); + + if (deviceIndex == currentDeviceIndex) { + // Set current iteration the active one + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(output), &iter); + return; + } + } while (gtk_tree_model_iter_next(model, &iter)); + + // No index was found, select first one + WARN("Warning : No active output device found"); + gtk_combo_box_set_active(GTK_COMBO_BOX(output), 0); } diff --git a/gnome/src/widget/imwidget.c b/gnome/src/widget/imwidget.c index 764d73e40a1462a1a87d8f93f3ff13c9a1018ca1..ec7a686168c73a77f42542a29dd244477bf253b1 100644 --- a/gnome/src/widget/imwidget.c +++ b/gnome/src/widget/imwidget.c @@ -238,7 +238,7 @@ im_widget_init(IMWidget *im) im->info_bar = gtk_info_bar_new(); /* A bar with the entry text and the button to send the message */ - GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10); gtk_text_view_set_editable(GTK_TEXT_VIEW(im->textarea), TRUE); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(textscrollwin), GTK_POLICY_NEVER, GTK_POLICY_NEVER); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(webscrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); @@ -269,6 +269,7 @@ im_widget_init(IMWidget *im) */ gtk_orientable_set_orientation (GTK_ORIENTABLE (im), GTK_ORIENTATION_VERTICAL); + } GType diff --git a/lang/ar.po b/lang/ar.po index fccb4c0fb4e4329550676a85d4231ad5903bf03e..bb1d3bfd644b922c65a06f3fca082dfe36e05c28 100644 --- a/lang/ar.po +++ b/lang/ar.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-06-17 19:24+0000\n" "Last-Translator: Zied ABID <ziedabid@gmail.com>\n" "Language-Team: Arabic <ar@li.org>\n" diff --git a/lang/ast.po b/lang/ast.po index 109d11f12c3a3f96cf37b7c576b6df6d195b3cda..7186adeca585a9bb4b67f165abd192e2335686cb 100644 --- a/lang/ast.po +++ b/lang/ast.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-07-15 23:42+0000\n" "Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n" "Language-Team: Asturian <ast@li.org>\n" @@ -566,8 +566,9 @@ msgid "days" msgstr "díes" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "_Activar tonos de llamada" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1250,9 +1251,8 @@ msgstr "" #, fuzzy #~ msgid "" -#~ "Unable to initialize.\n" -#~ "Make sure the daemon is running.\n" -#~ "Error: %s" +#~ "Unable to connect to the SFLphone server.\n" +#~ "Make sure the daemon is running." #~ msgstr "" #~ "Nun se puede coneutar col sirvidor SFLphone.\n" #~ "Compruebe qu'el daemon tea funcionando." diff --git a/lang/ca.po b/lang/ca.po index 6c499202fe02a23d85aa2291c0ea17404f0a8216..d9a52456f54bebcb2e18c891af35582445f91cd5 100644 --- a/lang/ca.po +++ b/lang/ca.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2011-03-10 12:31+0000\n" "Last-Translator: Pau Iranzo <Unknown>\n" "Language-Team: Catalan <ca@li.org>\n" @@ -568,8 +568,9 @@ msgid "days" msgstr "dies" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "Activa _els tons de trucada" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1246,11 +1247,9 @@ msgid "" "Codecs not found" msgstr "" -#, fuzzy #~ msgid "" -#~ "Unable to initialize.\n" -#~ "Make sure the daemon is running.\n" -#~ "Error: %s" +#~ "Unable to connect to the SFLphone server.\n" +#~ "Make sure the daemon is running." #~ msgstr "" #~ "No es pot connectar amb el servidor SFLphone.\n" #~ "Assegureu-vos que el dimoni s'està executant." @@ -1261,6 +1260,9 @@ msgstr "" #~ msgid "Bandwidth" #~ msgstr "Ample de Banda" +#~ msgid "_Echo Suppression" +#~ msgstr "_Envia la supressió" + #~ msgid "Custom commands on incoming calls with URL" #~ msgstr "Ordres personalitzdes a les trucades entrants amb un URL" diff --git a/lang/da.po b/lang/da.po index 23b925e63a7d9b7b0f9d71efccdd86967cf43353..c821e6b86b91727a954725a1263f4d8d624b4c60 100644 --- a/lang/da.po +++ b/lang/da.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-10-12 14:55+0000\n" "Last-Translator: Jonas Fonseca <fonseca@diku.dk>\n" "Language-Team: Danish <da@li.org>\n" @@ -565,8 +565,9 @@ msgid "days" msgstr "dage" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "Aktiver _ringetoner" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1261,6 +1262,9 @@ msgstr "" #~ msgid "Bandwidth" #~ msgstr "Båndbredde" +#~ msgid "_Echo Suppression" +#~ msgstr "_Fjernelse af ekko" + #~ msgid "Custom commands on incoming calls with URL" #~ msgstr "Brugerdefinerede kommandoer ved indgående opkald med webadresse" @@ -1328,9 +1332,6 @@ msgstr "" #~ msgid "Store SIP credentials as MD5 hash" #~ msgstr "Gem SIP-legitimationsoplysninger som _MD5-hash-værdi" -#~ msgid "_Echo Suppression" -#~ msgstr "_Fjernelse af ekko" - #~ msgid "Enable STUN" #~ msgstr "Aktiver STUN" diff --git a/lang/de.po b/lang/de.po index 8e0f979042621e3c50876f08ec257ba2de1dd9bb..cd31637d4e3b230019cdc7e927fdf22b9a4d3734 100644 --- a/lang/de.po +++ b/lang/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2011-03-20 19:51+0000\n" "Last-Translator: Felix Braun <Unknown>\n" "Language-Team: SavoirFaire Linux Inc <sflphoneteam@savoirfairelinux.com>\n" @@ -566,8 +566,9 @@ msgid "days" msgstr "Tage" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "Klingeltöne aktivieren" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1256,6 +1257,9 @@ msgstr "" #~ msgid "Bandwidth" #~ msgstr "Bandbreite" +#~ msgid "_Echo Suppression" +#~ msgstr "Echounterdrückung" + #~ msgid "Custom commands on incoming calls with URL" #~ msgstr "Eigene Befehle bei eingehenden Anrufen mit URL" @@ -1578,9 +1582,6 @@ msgstr "" #~ "nobodythere@gmail.com,,maxime.chambreuil@savoirfairelinux.com," #~ "Bananeweizen@gmx.de,,," -#~ msgid "_Echo Suppression" -#~ msgstr "Echounterdrückung" - #~ msgctxt "account state" #~ msgid "Registered" #~ msgstr "Registriert" diff --git a/lang/el.po b/lang/el.po index 87edb8e3fa0c737efad651d7aab15c27aaed6558..297fce70a09757c7ae2887d6577a1c1750bce286 100644 --- a/lang/el.po +++ b/lang/el.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-06-17 19:26+0000\n" "Last-Translator: jarlaxl lamat <sztaasz@gmail.com>\n" "Language-Team: Greek <el@li.org>\n" @@ -1237,9 +1237,8 @@ msgstr "" #, fuzzy #~ msgid "" -#~ "Unable to initialize.\n" -#~ "Make sure the daemon is running.\n" -#~ "Error: %s" +#~ "Unable to connect to the SFLphone server.\n" +#~ "Make sure the daemon is running." #~ msgstr "" #~ "Αδυναμία σύνδεσης στον εξυπηρετητη του SFLphone\n" #~ "Σιγουρευτείτε οτι τρέχει ο daemon" diff --git a/lang/es.po b/lang/es.po index 6dc56be4814ac38734579601e5b322ca00aa2611..ffa066fed551ee609b78d7fa086768cbe3b1a0b2 100644 --- a/lang/es.po +++ b/lang/es.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SFLphone 0.9.4\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-11-04 21:47+0000\n" "Last-Translator: Oliver Etchebarne <Unknown>\n" "Language-Team: SavoirFaireLinux Inc <sflphoneteam@savoirfairelinux.com>\n" @@ -566,8 +566,9 @@ msgid "days" msgstr "días" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "Habilitar tonos de llamada" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1264,6 +1265,9 @@ msgstr "" #~ msgid "Bandwidth" #~ msgstr "Ancho de banda" +#~ msgid "_Echo Suppression" +#~ msgstr "_Eliminación de Eco" + #~ msgid "Custom commands on incoming calls with URL" #~ msgstr "Comandos personalizados en llamada entrante con URL" @@ -1902,9 +1906,6 @@ msgstr "" #~ "daniel.mustieles@gmail.com,jorge@jorgee.net,,maxime." #~ "chambreuil@savoirfairelinux.com,nzahlut@live.com,,xuacusk8@gmail.com" -#~ msgid "_Echo Suppression" -#~ msgstr "_Eliminación de Eco" - #~ msgid "Transfer to : " #~ msgstr "Transferir a : " diff --git a/lang/fr.po b/lang/fr.po index f20900f53e6343edaeb7c8ceca5d74584589c2c2..9171f46bad13b995800dc17dfa90a1a8a66e9e29 100644 --- a/lang/fr.po +++ b/lang/fr.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: SFLphone 0.9.8\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-06-17 19:33+0000\n" "Last-Translator: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>\n" "Language-Team: SavoirFaireLinux Inc <sflphoneteam@savoirfairelinux.com>\n" @@ -568,8 +568,9 @@ msgid "days" msgstr "jours" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "Activer les sonneries" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1252,24 +1253,9 @@ msgid "" "Codecs not found" msgstr "" -#~ msgid "_Echo Suppression" -#~ msgstr "Suppression de l'écho" - -#~ msgid "Connection" -#~ msgstr "Connexion" - -#~ msgid "" -#~ "GConf error:\n" -#~ " %s" -#~ msgstr "" -#~ "Erreur GConf:\n" -#~ " %s" - -#, fuzzy #~ msgid "" -#~ "Unable to initialize.\n" -#~ "Make sure the daemon is running.\n" -#~ "Error: %s" +#~ "Unable to connect to the SFLphone server.\n" +#~ "Make sure the daemon is running." #~ msgstr "" #~ "Impossible de se connecter au serveur SFLphone.\n" #~ " Assurez-vous que le démon est lancé." @@ -1280,12 +1266,25 @@ msgstr "" #~ msgid "Bandwidth" #~ msgstr "Bande passante" +#~ msgid "_Echo Suppression" +#~ msgstr "Suppression de l'écho" + #~ msgid "Custom commands on incoming calls with URL" #~ msgstr "Commandes personnalisées lors d'appels entrants avec une URL" #~ msgid "%s will be replaced with the passed URL." #~ msgstr "%s sera remplacé par l'URL passé en argument." +#~ msgid "Connection" +#~ msgstr "Connexion" + +#~ msgid "" +#~ "GConf error:\n" +#~ " %s" +#~ msgstr "" +#~ "Erreur GConf:\n" +#~ " %s" + #~ msgctxt "account state" #~ msgid "Registered" #~ msgstr "Enregistré" diff --git a/lang/hu.po b/lang/hu.po index 9bca912d8b737546453f418c5a7f15a413977f55..71696b952f3ec57a57151e8f413c50f3953f2bee 100644 --- a/lang/hu.po +++ b/lang/hu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2011-01-07 19:33+0000\n" "Last-Translator: Balazs Radak <Unknown>\n" "Language-Team: Hungarian <hu@li.org>\n" @@ -562,8 +562,9 @@ msgid "days" msgstr "nap" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "_Csengőhangok engedélyezése" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1231,11 +1232,9 @@ msgid "" "Codecs not found" msgstr "" -#, fuzzy #~ msgid "" -#~ "Unable to initialize.\n" -#~ "Make sure the daemon is running.\n" -#~ "Error: %s" +#~ "Unable to connect to the SFLphone server.\n" +#~ "Make sure the daemon is running." #~ msgstr "" #~ "Hiba sz SFLphone szerverhez való csatlakozáskor.\n" #~ "Győződjön meg róla, hogy fut a daemon!" diff --git a/lang/it.po b/lang/it.po index 13337bcadd426e0966ee8cccf8594ea1eadb18c8..c8f03e50f78fca65cb667aaa88bf04ec88f8921c 100644 --- a/lang/it.po +++ b/lang/it.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-11-04 21:45+0000\n" "Last-Translator: Maxime Chambreuil (http://www.savoirfairelinux.com) <maxime." "chambreuil@savoirfairelinux.com>\n" @@ -568,8 +568,9 @@ msgid "days" msgstr "giorni" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "Abilita suonerie" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1261,6 +1262,15 @@ msgstr "" #~ msgid "Bandwidth" #~ msgstr "Banda" +#~ msgid "_Echo Suppression" +#~ msgstr "Soppressione _Eco" + +#~ msgid "Custom commands on incoming calls with URL" +#~ msgstr "Comandi personalizzati su chiamate entranti con URL" + +#~ msgid "%s will be replaced with the passed URL." +#~ msgstr "%s verrà sostituito con la URL passata." + #~ msgid "Codec" #~ msgstr "Codec" @@ -1439,15 +1449,6 @@ msgstr "" #~ "chambreuil@gmail.com,,,,maxime.chambreuil@gmail.com,milo@casagrande." #~ "name,,,,maxime.chambreuil@savoirfairelinux.com,milo@casagrande.name," -#~ msgid "_Echo Suppression" -#~ msgstr "Soppressione _Eco" - -#~ msgid "Custom commands on incoming calls with URL" -#~ msgstr "Comandi personalizzati su chiamate entranti con URL" - -#~ msgid "%s will be replaced with the passed URL." -#~ msgstr "%s verrà sostituito con la URL passata." - #~ msgctxt "account state" #~ msgid "Registered" #~ msgstr "Registrato" diff --git a/lang/ja.po b/lang/ja.po index d3e4a216937e3323365e0058e7d8a1f53256a74d..ef32c248643ec8493e7bcfad9661de0d3c85e90d 100644 --- a/lang/ja.po +++ b/lang/ja.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-06-17 19:19+0000\n" "Last-Translator: Launchpad Translations Administrators <rosetta@launchpad." "net>\n" @@ -564,8 +564,9 @@ msgid "days" msgstr "曜日" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "着信音可能" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1242,11 +1243,9 @@ msgid "" "Codecs not found" msgstr "" -#, fuzzy #~ msgid "" -#~ "Unable to initialize.\n" -#~ "Make sure the daemon is running.\n" -#~ "Error: %s" +#~ "Unable to connect to the SFLphone server.\n" +#~ "Make sure the daemon is running." #~ msgstr "" #~ "SFLphoneサーバに接続できません\n" #~ "デーモンを確認してください。" diff --git a/lang/ko.po b/lang/ko.po index 8750b7909e1728b8cc4beb5a0910eacddeb32aa3..614ce0747659e3df3d15fa6f52632c2bdbf4c83a 100644 --- a/lang/ko.po +++ b/lang/ko.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-06-17 19:27+0000\n" "Last-Translator: Bundo <bundo@bundo.biz>\n" "Language-Team: Korean <ko@li.org>\n" @@ -560,8 +560,9 @@ msgid "days" msgstr "일" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "착신음 가능(_E)" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1240,9 +1241,8 @@ msgstr "" #, fuzzy #~ msgid "" -#~ "Unable to initialize.\n" -#~ "Make sure the daemon is running.\n" -#~ "Error: %s" +#~ "Unable to connect to the SFLphone server.\n" +#~ "Make sure the daemon is running." #~ msgstr "" #~ "SFLphone 서버에 연결할 수 없습니다.\n" #~ "데몬이 실행중인지 확인하십시오." diff --git a/lang/oc.po b/lang/oc.po index 83383c492282236d69c779d71e97ac9c866808c6..3343d43dd6b1fc1408331b2289ce93cfa855a542 100644 --- a/lang/oc.po +++ b/lang/oc.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-06-17 19:25+0000\n" "Last-Translator: Cédric VALMARY (Tot en òc) <cvalmary@yahoo.fr>\n" "Language-Team: Occitan (post 1500) <oc@li.org>\n" @@ -561,8 +561,9 @@ msgid "days" msgstr "jorns" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "_Activar las sonariás" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy diff --git a/lang/pl.po b/lang/pl.po index 895a9904dff11f9121fd252659f44439913288ff..30abb54db33c0be0cd7ef2308e07be2d16c21d7a 100644 --- a/lang/pl.po +++ b/lang/pl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-11-06 13:49+0000\n" "Last-Translator: Sebastian Bujwid <Unknown>\n" "Language-Team: Polish <pl@li.org>\n" @@ -1225,13 +1225,16 @@ msgstr "" #, fuzzy #~ msgid "" -#~ "Unable to initialize.\n" -#~ "Make sure the daemon is running.\n" -#~ "Error: %s" +#~ "Unable to connect to the SFLphone server.\n" +#~ "Make sure the daemon is running." #~ msgstr "" #~ "Nie można połączyć się z serwerem SFLphone.\n" #~ "Upewnij się, że został uruchomiony daemon SFLphone" +#, fuzzy +#~ msgid "Codecs" +#~ msgstr "Kodek" + #~ msgctxt "account state" #~ msgid "Registered" #~ msgstr "Zarejestrowany" @@ -1239,9 +1242,6 @@ msgstr "" #~ msgid "IP call - %s" #~ msgstr "Telefonów IP - %s" -#~ msgid "Codec" -#~ msgstr "Kodek" - #~ msgctxt "NAME OF TRANSLATORS" #~ msgid "Your names" #~ msgstr "" diff --git a/lang/pt.po b/lang/pt.po index d1d45f1693573637769814053d31ef99a0081665..fa352d9cf5317102ceb955d7a7abe00cf1be134d 100644 --- a/lang/pt.po +++ b/lang/pt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-06-17 19:23+0000\n" "Last-Translator: Maxime Chambreuil (http://www.savoirfairelinux.com) <maxime." "chambreuil@savoirfairelinux.com>\n" diff --git a/lang/pt_BR.po b/lang/pt_BR.po index 8ff52c7a5f909dc0ff82e702ca79511cb739d93d..579ea783e9fca2b2637389a8ec86616e3941b7cc 100644 --- a/lang/pt_BR.po +++ b/lang/pt_BR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2011-03-04 17:18+0000\n" "Last-Translator: Claudio André <claudio.andre@correios.net.br>\n" "Language-Team: Brazilian Portuguese <pt_BR@li.org>\n" @@ -567,8 +567,9 @@ msgid "days" msgstr "dias" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "Habilitar ringtones" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1267,6 +1268,9 @@ msgstr "" #~ msgid "Bandwidth" #~ msgstr "Largura de banda" +#~ msgid "_Echo Suppression" +#~ msgstr "Supressão de _Eco" + #~ msgid "Custom commands on incoming calls with URL" #~ msgstr "Comandos padrões de ligações recebidas com URL" @@ -1617,9 +1621,6 @@ msgstr "" #~ "com,,maxime.chambreuil@savoirfairelinux.com,ricardo.macedo@yahoo.com.br,," #~ "kalibslack@gmail.com" -#~ msgid "_Echo Suppression" -#~ msgstr "Supressão de _Eco" - #~ msgid "Email address" #~ msgstr "Endereço de e-mail" diff --git a/lang/ru.po b/lang/ru.po index 629dbd72f18056b0bb59ab84ae2945c4a83ec5ea..bea458d1d1349f2a38f5bf117541ddcd037196fa 100644 --- a/lang/ru.po +++ b/lang/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SFLphone 0.9.6\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-07-01 20:28+0000\n" "Last-Translator: DMG <Unknown>\n" "Language-Team: Savoir-Faire Linux Inc <sflphoneteam@savoirfairelinux.com>\n" @@ -570,8 +570,9 @@ msgid "days" msgstr "дней" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "Задействовать мелодии вызова" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1268,6 +1269,9 @@ msgstr "" #~ msgid "Bandwidth" #~ msgstr "Полоса пропускания" +#~ msgid "_Echo Suppression" +#~ msgstr "Борьба с _эхо" + #~ msgid "Custom commands on incoming calls with URL" #~ msgstr "Пользовательская команда при входящих вызовах с URL" @@ -1584,9 +1588,6 @@ msgstr "" #~ "emmanuel.milou@savoirfairelinux.com,,,,maxime.chambreuil@savoirfairelinux." #~ "com,,sedov@webmail.perm.ru" -#~ msgid "_Echo Suppression" -#~ msgstr "Борьба с _эхо" - #~ msgid "Email address" #~ msgstr "Адрес эл. почты" diff --git a/lang/sflphone.pot b/lang/sflphone.pot index ef0aea4152f04258e3bf161c0b8ea2ee96925766..c5f871b297ee80c38926fdab2924e680ac4d9c93 100644 --- a/lang/sflphone.pot +++ b/lang/sflphone.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" diff --git a/lang/sv.po b/lang/sv.po index 1f91e104ebbfcbfac80b70ca3395e477b00ab90b..f7d745a477ec814781cee121591450c9d220170d 100644 --- a/lang/sv.po +++ b/lang/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2011-03-14 09:51+0000\n" "Last-Translator: Daniel Nylander <yeager@ubuntu.com>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" @@ -1243,6 +1243,19 @@ msgid "" "Codecs not found" msgstr "" +#~ msgid "" +#~ "Unable to connect to the SFLphone server.\n" +#~ "Make sure the daemon is running." +#~ msgstr "" +#~ "Kan inte ansluta till SFLphone-servern.\n" +#~ "Se till att daemonen är igång." + +#~ msgid "Codecs" +#~ msgstr "Kodekar" + +#~ msgid "Bandwidth" +#~ msgstr "Bandbredd" + #~ msgid "" #~ "GConf error:\n" #~ " %s" @@ -1259,19 +1272,6 @@ msgstr "" #~ "Försäkra dig om att demonen är igång.\n" #~ "Fel: %s" -#~ msgid "Codecs" -#~ msgstr "Kodekar" - -#~ msgid "Bandwidth" -#~ msgstr "Bandbredd" - -#~ msgid "" -#~ "Unable to connect to the SFLphone server.\n" -#~ "Make sure the daemon is running." -#~ msgstr "" -#~ "Kan inte ansluta till SFLphone-servern.\n" -#~ "Se till att daemonen är igång." - #~ msgctxt "NAME OF TRANSLATORS" #~ msgid "Your names" #~ msgstr " ,Launchpad Contributions:,Daniel Nylander,Gabriel Thörnblad" diff --git a/lang/te.po b/lang/te.po index 6f30cbcd39f164ac1ab9fab92eda16e4eb255bee..a0533e46444ca1746efdb401048d914b21b62e80 100644 --- a/lang/te.po +++ b/lang/te.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2011-03-07 16:09+0000\n" "Last-Translator: వీవెన్ (Veeven) <Unknown>\n" "Language-Team: Telugu <te@li.org>\n" diff --git a/lang/tr.po b/lang/tr.po index 77635021097938e334d3b0bf224167404419f12e..059beaac35560b25d2ca420a5393b8a9d3f4d634 100644 --- a/lang/tr.po +++ b/lang/tr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sflphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2010-10-31 18:09+0000\n" "Last-Translator: Translate it <Unknown>\n" "Language-Team: Turkish <tr@li.org>\n" diff --git a/lang/zh_CN.po b/lang/zh_CN.po index 9d89917d8ea8a638a4ebc02034b07f939a3f4d1f..8f07eac3d86fb3b9502f9e8e8f5f6cb4d280c064 100644 --- a/lang/zh_CN.po +++ b/lang/zh_CN.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SFLphone 0.9.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2011-03-08 13:53+0000\n" "Last-Translator: 英华 <wantinghard@gmail.com>\n" "Language-Team: SavoirFaireLinux Inc <sflphoneteam@savoirfairelinux.com>\n" @@ -559,8 +559,9 @@ msgid "days" msgstr "天" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "启用铃声" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1242,6 +1243,9 @@ msgstr "" #~ msgid "Bandwidth" #~ msgstr "带宽" +#~ msgid "_Echo Suppression" +#~ msgstr "回声抑制(_E)" + #~ msgid "Custom commands on incoming calls with URL" #~ msgstr "定制对带有URL的来电的处理" @@ -1812,9 +1816,6 @@ msgstr "" #~ "xu@gmail.com,emmanuel.milou@savoirfairelinux.com,,wzssyqa@gmail.com," #~ "rainofchaos@gmail.com,wantinghard@gmail.com" -#~ msgid "_Echo Suppression" -#~ msgstr "回声抑制(_E)" - #~ msgid "Email address" #~ msgstr "邮件地址" diff --git a/lang/zh_HK.po b/lang/zh_HK.po index 75ff8f9b03432b9a7791d66616b242f3438ae8f5..4bad78f69288201bcfbec768b61f2f8decb15a3f 100644 --- a/lang/zh_HK.po +++ b/lang/zh_HK.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SFLphone 0.9.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2011-03-08 13:53+0000\n" "Last-Translator: 英华 <wantinghard@gmail.com>\n" "Language-Team: SavoirFaireLinux Inc <sflphoneteam@savoirfairelinux.com>\n" @@ -559,8 +559,9 @@ msgid "days" msgstr "天" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "启用铃声" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1242,6 +1243,9 @@ msgstr "" #~ msgid "Bandwidth" #~ msgstr "带宽" +#~ msgid "_Echo Suppression" +#~ msgstr "回声抑制(_E)" + #~ msgid "Custom commands on incoming calls with URL" #~ msgstr "定制对带有URL的来电的处理" @@ -1813,9 +1817,6 @@ msgstr "" #~ "xu@gmail.com,emmanuel.milou@savoirfairelinux.com,,wzssyqa@gmail.com," #~ "rainofchaos@gmail.com,wantinghard@gmail.com" -#~ msgid "_Echo Suppression" -#~ msgstr "回声抑制(_E)" - #~ msgid "Email address" #~ msgstr "邮件地址" diff --git a/lang/zh_TW.po b/lang/zh_TW.po index 5a634aeeee6a0ae5d82d79c42252242671ec69b8..b3f3bc45628fca68937c17f49bb7218bed319186 100644 --- a/lang/zh_TW.po +++ b/lang/zh_TW.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SFLphone 0.9.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-02 11:43-0500\n" +"POT-Creation-Date: 2012-01-04 16:32-0500\n" "PO-Revision-Date: 2011-03-08 13:53+0000\n" "Last-Translator: 英华 <wantinghard@gmail.com>\n" "Language-Team: SavoirFaireLinux Inc <sflphoneteam@savoirfairelinux.com>\n" @@ -559,8 +559,9 @@ msgid "days" msgstr "天" #: ../gnome/src/config/preferencesdialog.c:253 +#, fuzzy msgid "Instant Messaging" -msgstr "" +msgstr "启用铃声" #: ../gnome/src/config/preferencesdialog.c:257 #, fuzzy @@ -1230,9 +1231,8 @@ msgstr "" #, fuzzy #~ msgid "" -#~ "Unable to initialize.\n" -#~ "Make sure the daemon is running.\n" -#~ "Error: %s" +#~ "Unable to connect to the SFLphone server.\n" +#~ "Make sure the daemon is running." #~ msgstr "" #~ "连接SFLphone服务器失败.\n" #~ "请检查daemon是否还在运行."