Tag Archives: Gtalk
It is a svn diff result, not a patch, actually.
So, what is Libjingle? Quoted from http://code.google.com/p/libjingle/:
Libjingle, the Google Talk Voice and P2P Interoperability Library, is a set of components we provide to interoperate with Google Talk's peer-to-peer file sharing and voice calling capabilities. The package includes source code for Google's implementation of Jingle and Jingle-Audio, two proposed extensions to the XMPP standard that are currently available in draft form.
You can check out the head revision of Libjingle from its svn repository using command:
svn checkout http://libjingle.googlecode.com/svn/trunk/ libjingle-read-only
Then ``./autogen.sh'' and ``make'' as we usually do for building a *nix software. You will find many errors during ``./autogen.sh'' and ``make''. To fix them, first, some LIBs should be installed:
sudo apt-get install build-essential libexpat1-dev libglib2.0-dev libogg-dev libssl-dev libasound2-dev libspeex-dev openssl libortp7-dev libmediastreamer0-dev libavcodec-dev
I am not very sure if these LIBs are enough. If you have some problem with this, please let me know.
Even if you have all of these LIBs installed, you will still get some errors such as:
../../talk/base/stringutils.h:272: error: extra qualification 'talk_base::Traits::' on member 'empty_str'
../../talk/base/base64.h:26: error: extra qualification ‘talk_base::Base64::’ on member ‘Base64Table’
../../talk/base/base64.h:27: error: extra qualification ‘talk_base::Base64::’ on member ‘DecodeTable’
So here is a patch for source code errors like this. IMPORTANT NOTE: gcc version 4.2.4 on Ubuntu 8.04, libortp7.
Index: talk/p2p/base/sessionmanager.h
===================================================================
--- talk/p2p/base/sessionmanager.h (revision 7)
+++ talk/p2p/base/sessionmanager.h (working copy)
@@ -156,7 +156,7 @@// Creates and returns an error message from the given components. The
// caller is responsible for deleting this.
- buzz::XmlElement* SessionManager::CreateErrorMessage(
+ buzz::XmlElement* CreateErrorMessage(
const buzz::XmlElement* stanza,
const buzz::QName& name,
const std::string& type,
Index: talk/session/phone/linphonemediaengine.cc
===================================================================
--- talk/session/phone/linphonemediaengine.cc (revision 7)
+++ talk/session/phone/linphonemediaengine.cc (working copy)
@@ -80,24 +80,24 @@
}
#endif
#ifdef HAVE_SPEEX
- if (i->name == speex_wb.mime_type && i->clockrate == speex_wb.clock_rate) {
- rtp_profile_set_payload(&av_profile, i->id, &speex_wb);
- } else if (i->name == speex_nb.mime_type && i->clockrate == speex_nb.clock_rate) {
- rtp_profile_set_payload(&av_profile, i->id, &speex_nb);
+ if (i->name == payload_type_speex_wb.mime_type && i->clockrate == payload_type_speex_wb.clock_rate) {
+ rtp_profile_set_payload(&av_profile, i->id, &payload_type_speex_wb);
+ } else if (i->name == payload_type_speex_nb.mime_type && i->clockrate == payload_type_speex_nb.clock_rate) {
+ rtp_profile_set_payload(&av_profile, i->id, &payload_type_speex_nb);
}
#endifif (i->id == 0)
- rtp_profile_set_payload(&av_profile, 0, &pcmu8000);
+ rtp_profile_set_payload(&av_profile, 0, &payload_type_pcmu8000);- if (i->name == telephone_event.mime_type) {
- rtp_profile_set_payload(&av_profile, i->id, &telephone_event);
+ if (i->name == payload_type_telephone_event.mime_type) {
+ rtp_profile_set_payload(&av_profile, i->id, &payload_type_telephone_event);
}
if (first) {
LOG(LS_INFO) << "Using " << i->name << "/" << i->clockrate;
pt_ = i->id;
- audio_stream_ = audio_stream_start(&av_profile, 2000, "127.0.0.1", 3000, i->id, 250);
+ audio_stream_ = audio_stream_start(&av_profile, 2000, (char *)"127.0.0.1", 3000, i->id, 250);
first = false;
}
}
@@ -106,7 +106,7 @@
// We're being asked to set an empty list of codecs. This will only happen when
// working with a buggy client; let's try PCMU.
LOG(LS_WARNING) << "Received empty list of codces; using PCMU/8000";
- audio_stream_ = audio_stream_start(&av_profile, 2000, "127.0.0.1", 3000, 0, 250);
+ audio_stream_ = audio_stream_start(&av_profile, 2000, (char *)"127.0.0.1", 3000, 0, 250);
}
}
@@ -114,12 +114,12 @@
bool LinphoneMediaEngine::FindCodec(const Codec &c) {
if (c.id == 0)
return true;
- if (c.name == telephone_event.mime_type)
+ if (c.name == payload_type_telephone_event.mime_type)
return true;
#ifdef HAVE_SPEEX
- if (c.name == speex_wb.mime_type && c.clockrate == speex_wb.clock_rate)
+ if (c.name == payload_type_speex_wb.mime_type && c.clockrate == payload_type_speex_wb.clock_rate)
return true;
- if (c.name == speex_nb.mime_type && c.clockrate == speex_nb.clock_rate)
+ if (c.name == payload_type_speex_nb.mime_type && c.clockrate == payload_type_speex_nb.clock_rate)
return true;
#endif
#ifdef HAVE_ILBC
@@ -171,8 +171,8 @@
#ifdef HAVE_SPEEX
ms_speex_codec_init();- codecs_.push_back(Codec(110, speex_wb.mime_type, speex_wb.clock_rate, 0, 1, 8));
- codecs_.push_back(Codec(111, speex_nb.mime_type, speex_nb.clock_rate, 0, 1, 7));
+ codecs_.push_back(Codec(110, payload_type_speex_wb.mime_type, payload_type_speex_wb.clock_rate, 0, 1, 8));
+ codecs_.push_back(Codec(111, payload_type_speex_nb.mime_type, payload_type_speex_nb.clock_rate, 0, 1, 7));
#endif@@ -181,8 +181,8 @@
codecs_.push_back(Codec(102, payload_type_ilbc.mime_type, payload_type_ilbc.clock_rate, 0, 1, 4));
#endif- codecs_.push_back(Codec(0, pcmu8000.mime_type, pcmu8000.clock_rate, 0, 1, 2));
- codecs_.push_back(Codec(101, telephone_event.mime_type, telephone_event.clock_rate, 0, 1, 1));
+ codecs_.push_back(Codec(0, payload_type_pcmu8000.mime_type, payload_type_pcmu8000.clock_rate, 0, 1, 2));
+ codecs_.push_back(Codec(101, payload_type_telephone_event.mime_type, payload_type_telephone_event.clock_rate, 0, 1, 1));
return true;
}Index: talk/xmpp/xmppclient.h
===================================================================
--- talk/xmpp/xmppclient.h (revision 7)
+++ talk/xmpp/xmppclient.h (working copy)
@@ -138,7 +138,7 @@
}
}- std::string XmppClient::GetStateName(int state) const {
+ std::string GetStateName(int state) const {
switch (state) {
case STATE_PRE_XMPP_LOGIN: return "PRE_XMPP_LOGIN";
case STATE_START_XMPP_LOGIN: return "START_XMPP_LOGIN";
Index: talk/third_party/mediastreamer/msrtprecv.c
===================================================================
--- talk/third_party/mediastreamer/msrtprecv.c (revision 7)
+++ talk/third_party/mediastreamer/msrtprecv.c (working copy)
@@ -26,7 +26,7 @@
MSMessage *msgb_2_ms_message(mblk_t* mp){
MSMessage *msg;
MSBuffer *msbuf;
- if (mp->b_datap->ref_count!=1) return NULL; /* cannot handle properly non-unique buffers*/
+ if (mp->b_datap->db_ref!=1) return NULL; /* cannot handle properly non-unique buffers*/
/* create a MSBuffer using the mblk_t buffer */
msg=ms_message_alloc();
msbuf=ms_buffer_alloc(0);
@@ -120,7 +120,7 @@
gint got=0;
/* we are connected with queues (surely for video)*/
/* use the sync system time to compute a timestamp */
- PayloadType *pt=rtp_profile_get_payload(r->rtpsession->profile,r->rtpsession->payload_type);
+ PayloadType *pt=rtp_profile_get_payload(r->rtpsession->rcv.profile,r->rtpsession->rcv.telephone_events_pt);
if (pt==NULL) {
ms_warning("ms_rtp_recv_process(): NULL RtpPayload- skipping.");
return;
Index: talk/third_party/mediastreamer/audiostream.c
===================================================================
--- talk/third_party/mediastreamer/audiostream.c (revision 7)
+++ talk/third_party/mediastreamer/audiostream.c (working copy)
@@ -112,7 +112,7 @@
RtpSession **recvsend){
RtpSession *rtpr;
rtpr=rtp_session_new(RTP_SESSION_SENDRECV);
- rtp_session_max_buf_size_set(rtpr,MAX_RTP_SIZE);
+ rtp_session_set_recv_buf_size(rtpr,MAX_RTP_SIZE);
rtp_session_set_profile(rtpr,profile);
rtp_session_set_local_addr(rtpr,get_local_addr_for(remip),locport);
if (remport>0) rtp_session_set_remote_addr(rtpr,remip,remport);
@@ -133,7 +133,7 @@
/* creates two rtp filters to recv send streams (remote part)*/
rtps=rtp_session_new(RTP_SESSION_SENDONLY);
- rtp_session_max_buf_size_set(rtps,MAX_RTP_SIZE);
+ rtp_session_set_recv_buf_size(rtps,MAX_RTP_SIZE);
rtp_session_set_profile(rtps,profile);
#ifdef INET6
rtp_session_set_local_addr(rtps,"::",locport+2);
@@ -147,7 +147,7 @@
rtp_session_set_jitter_compensation(rtps,jitt_comp);
rtpr=rtp_session_new(RTP_SESSION_RECVONLY);
- rtp_session_max_buf_size_set(rtpr,MAX_RTP_SIZE);
+ rtp_session_set_recv_buf_size(rtpr,MAX_RTP_SIZE);
rtp_session_set_profile(rtpr,profile);
#ifdef INET6
rtp_session_set_local_addr(rtpr,"::",locport);
@@ -217,8 +217,8 @@
ms_filter_set_property(stream->decoder,MS_FILTER_PROPERTY_FREQ,&pt->clock_rate);
ms_filter_set_property(stream->decoder,MS_FILTER_PROPERTY_BITRATE,&pt->normal_bitrate);
- ms_filter_set_property(stream->encoder,MS_FILTER_PROPERTY_FMTP, (void*)pt->fmtp);
- ms_filter_set_property(stream->decoder,MS_FILTER_PROPERTY_FMTP,(void*)pt->fmtp);
+ ms_filter_set_property(stream->encoder,MS_FILTER_PROPERTY_FMTP, (void*)pt->send_fmtp);
+ ms_filter_set_property(stream->decoder,MS_FILTER_PROPERTY_FMTP,(void*)pt->send_fmtp);
/* create the synchronisation source */
stream->timer=ms_timer_new();
Index: talk/third_party/mediastreamer/msrtpsend.c
===================================================================
--- talk/third_party/mediastreamer/msrtpsend.c (revision 7)
+++ talk/third_party/mediastreamer/msrtpsend.c (working copy)
@@ -85,7 +85,7 @@
{
guint32 clockts;
/* use the sync system time to compute a timestamp */
- PayloadType *pt=rtp_profile_get_payload(r->rtpsession->profile,r->rtpsession->payload_type);
+ PayloadType *pt=rtp_profile_get_payload(r->rtpsession->snd.profile,r->rtpsession->snd.telephone_events_pt);
g_return_val_if_fail(pt!=NULL,0);
clockts=(guint32)(((double)synctime * (double)pt->clock_rate)/1000.0);
ms_trace("ms_rtp_send_process: sync->time=%i clock=%i",synctime,clockts);
Index: talk/base/base64.h
===================================================================
--- talk/base/base64.h (revision 7)
+++ talk/base/base64.h (working copy)
@@ -23,8 +23,8 @@
static std::string decode(const std::string & data);
static std::string encodeFromArray(const char * data, size_t len);
private:
- static const std::string Base64::Base64Table;
- static const std::string::size_type Base64::DecodeTable[];
+ static const std::string Base64Table;
+ static const std::string::size_type DecodeTable[];
};} // namespace talk_base
Index: talk/base/stringutils.h
===================================================================
--- talk/base/stringutils.h (revision 7)
+++ talk/base/stringutils.h (working copy)
@@ -269,7 +269,7 @@
template<>
struct Traits<char> {
typedef std::string string;
- inline static const char* Traits<char>::empty_str() { return ""; }
+ inline static const char* empty_str() { return ""; }
};///////////////////////////////////////////////////////////////////////////////
You killed all these errors? Congratulations! You can start talking with your gtalk friends with command ``call'' in talk/examples/call/ !
PS: If you are working with GCC 4.3.x, more strict checking is applied on the code. However, most errors can be fixed by adding some C headers into the #include fields, such as: <cstdlib>, <cstring>.
由于我工作的机器配置实在太低,1.8GHz CPU, 256M 内存,40G 硬盘,跑一个 Ubuntu 也是非常吃力,我平常只敢开三四个程序,这样每次切换程序还要等个十几秒,唉!
虽然我 Ubuntu 里也装了 Stardict 星际译王,但我轻易不敢再开一个程序,太慢了!现在我发现一个非常有意思的东西解决了我的困扰,Gtalk 翻译机器人。其实这是我在尝试另一项服务 Google 词典时无意中发现的,很奇怪的是,我记得曾经看到一个 Google 官方的关于 Gtalk 翻译机器人的页面,怎么再也找不到了?只搜索到一个 Gtalk 开发组的博客上的新闻链接。
添加 Gtalk 翻译机器人很简单,就是选择添加好友,好友 email 为:语言缩写2语言缩写@bot.talk.google.com。比如汉英翻译的机器人名字是:zh2en@bot.talk.google.com,英汉翻译的机器人名字是:en2zh@bot.talk.google.com。当然了,还有更多,点上面的新闻链接可以查看。
用这个机器人有什么好处呢?一是方便,直接在聊天软件里就可以查词。就像我用那么落后的机器,打开一个词典软件能让它假死半分钟,而 IM 软件总是会开着的,打开一个聊天窗口显然方便和快很多;还有一个好处是 Google 将你的聊天内容记录到 Gmail 里,那么过一段时间整理一下聊天记录就是一个非常好的生词表 :)。查找聊天记录很简单,只需要在 Gmail 上方的搜索栏中输入:from: en2zh@bot.talk.google.com 再点搜索即可。
Goolge 词典也是非常好用的,但不知道为什么在 Google 首页上点 Language Tools 进去以后却没有词典的链接,只有到 more->even more 中找 Translate 才有。
这是一个网友问我的问题,当时我的回答是:大概 Jabber 协议不支持吧,这个问题你应该去问 Google。但是当我搜索了一下 Gtalk 的帮助和网络上的内容后,居然没有发现这个问题的解答(可能是我搜索技术不到家),这就变成了一个有趣的问题。 为什么 Gtalk … Continue reading
无意间发现 Google 推出了一个新功能,Google Talk 小徽章,把一个 iframe 放到网站上,这样网站的访客就能直接通过点击这个小徽章里的链接匿名和发布者聊天,不需要 Google … Continue reading
