You are viewing a plain text version of this content. The canonical link for it is here.
Posted to bluesky-commits@incubator.apache.org by pi...@apache.org on 2009/11/30 12:18:38 UTC
svn commit: r885395 [19/23] - in /incubator/bluesky/trunk/RealClass/Student:
./ autom4te.cache/ src/ src/.deps/ src/pic/
Added: incubator/bluesky/trunk/RealClass/Student/src/callbacks.cc
URL: http://svn.apache.org/viewvc/incubator/bluesky/trunk/RealClass/Student/src/callbacks.cc?rev=885395&view=auto
==============================================================================
--- incubator/bluesky/trunk/RealClass/Student/src/callbacks.cc (added)
+++ incubator/bluesky/trunk/RealClass/Student/src/callbacks.cc Mon Nov 30 12:18:34 2009
@@ -0,0 +1,730 @@
+/** \file callbacks.cc implementation for GUI operations
+*
+*
+*Licensed to the Apache Software Foundation (ASF) under one
+*or more contributor license agreements. See the NOTICE file
+*distributed with this work for additional information
+*regarding copyright ownership. The ASF licenses this file
+*to you under the Apache License, Version 2.0 (the
+*"License"); you may not use this file except in compliance
+*with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+*Unless required by applicable law or agreed to in writing,
+*software distributed under the License is distributed on an
+*"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*KIND, either express or implied. See the License for the
+*specific language governing permissions and limitations
+*under the License.
+*/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+
+#include <net/if.h>
+#include <net/if_arp.h>
+
+#include <errno.h>
+#include <iostream>
+#include <fstream>
+
+#include <gtk/gtk.h>
+#include <sys/types.h>
+
+#include <sys/socket.h>
+#include <stdio.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "client_communicate.h"
+#include <iostream>
+#include "ncclient.hh"
+#include "callbacks.hh"
+#include "interface.h"
+#include "support.hh"
+#include "errormessage.h"
+#include "stdafx.h"
+#include "en_de_audio.h"
+#include "en_de_video.h"
+#include "en_de_screen.h"
+
+#include <gdk/gdkx.h>
+
+#define ETH_NAME "eth0"
+#define ETH_NAME1 "eth1"
+int getip_tag = 0;
+using namespace std;
+extern CScreenReceiver g_teacher_screenreceiver;
+extern CVideoReceiver g_teacher_videoreceiver;
+extern CAudioReceiver g_teacher_audioreceiver;
+extern CVideoReceiver g_student_videoreceiver;
+extern CAudioReceiver g_student_audioreceiver;
+
+extern CV4LStuVideoSender g_student_videosender;
+extern CStuAudioSender g_student_audiosender;
+
+extern struct CRCLClientJoinInGroupR client_mcu_info;
+extern struct TRCClientLogin stulogin;
+extern GtkWidget *loadsys;
+extern GtkWidget *addclass;
+extern GtkWidget *loadtool;
+extern GtkWidget *clist1;
+extern GtkWidget *classdialog;
+extern GtkWidget *chatview;
+extern GtkWidget *chat_show;
+extern client_ts_communicate client_comm;
+extern DWORD TeacherMode;
+extern DWORD chatMode;
+extern DWORD Focus_student;
+extern GtkWidget *teachimage;
+extern GtkWidget *screenimage;
+extern GtkWidget *studimage;
+
+extern GtkTextBuffer *chat_buffer; //textbuf used in chatMode
+extern GtkTextIter chat_end;
+extern GtkTextIter chat_start;
+extern GtkTextBuffer *TeachChat_buffer; //textbuf used in teachMode
+extern GtkTextIter TeachChat_end;
+extern GtkTextIter TeachChat_start;
+extern GtkAdjustment *adj1, *adj2;
+
+extern GtkWidget *localIPentry;
+extern GtkWidget *teachaudioentry;
+extern GtkWidget *centerport_entry;
+
+char showchat[1000];
+
+gfloat upper1, page_size1, step, value;
+int loadflag = 0;
+int GroupID;
+int addclassflag = 0;
+extern char CenterIP[16];
+extern char CenterPort[8];
+extern GtkWidget *chatentry;
+CRCLMSG send_mes;
+
+char IP[30];
+int error_info_no = 0; //use by ncstudent_timer_callback()
+
+void on_about1_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ GtkWidget *about;
+ about = create_about_dialog();
+ gtk_widget_show(about);
+}
+
+void on_loadsys_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+
+ GtkWidget *loginwindow;
+ loginwindow = create_loaddialog();
+ gtk_widget_show(loginwindow);
+}
+
+void on_addclass_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ addclass_op();
+}
+
+void on_exitclass_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ exitclass_op();
+}
+
+void on_exitsys_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ exitsys_op();
+}
+
+void on_requestchange_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ exchange_op();
+}
+
+void on_cancelchange_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ cancelexchange_op();
+}
+
+void on_networkconfig_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ GtkWidget *networkwindow;
+ networkwindow = create_networkdialog();
+ gtk_widget_show(networkwindow);
+}
+
+void on_loadcancelbut_clicked(GtkObject *object, gpointer user_data)
+{
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+}
+
+void on_networkcancel_clicked(GtkObject *object, gpointer user_data)
+{
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+}
+
+void on_studimagebut_clicked(GtkButton *button, gpointer user_data)
+{
+ g_student_videosender.CloseXImage();
+ if (Focus_student == 0)
+ {
+ g_student_videosender.SetMode(CV4LStuVideoSender::ModeNone);
+ g_student_videosender.Stop();
+ }
+ else if (Focus_student == 1)
+ g_student_videosender.SetMode(CV4LStuVideoSender::ModeTransmit);
+
+ g_student_videoreceiver.Init();
+ g_student_videoreceiver.CreateXImage(GDK_WINDOW_XID(studimage->window), 2,
+ 345, 320 - 93, 240 - 40);
+ g_student_videoreceiver.Start(stulogin.SeMCU_SVPort);
+}
+
+void on_myimagebut_clicked(GtkButton *button, gpointer user_data)
+{
+ if (!g_student_videosender.IsInitialized())
+ g_student_videosender.Init(5560);
+
+ if (Focus_student == 0)
+ {
+ g_student_videosender.SetMode(CV4LStuVideoSender::ModeCapture);
+ g_student_videosender.Stop();
+ }
+ else if (Focus_student == 1)
+ g_student_videosender.SetMode(CV4LStuVideoSender::ModeTransmit);
+
+ g_student_videosender.CreateXImage(GDK_WINDOW_XID(studimage->window), 2,
+ 345, 320 - 93, 240 - 40);
+ g_student_videosender.Start();
+}
+
+void on_sendchatbut_clicked(GtkButton *button, gpointer user_data)
+{
+ sendmessage_op();
+}
+
+void on_loadokbutton_clicked(GtkButton *button, gpointer user_data)
+{
+ get_loadsys();
+ printf("student login is %s\n", stulogin.ClientName);
+ if (strcmp(stulogin.ClientName, "") == 0)
+ {
+
+ Error_dia(usename_error, usename_errorms);
+ return;
+ }
+ else if (strlen(stulogin.ClientName) > 200)
+ {
+
+ Error_dia(usename_error1, usename_error1ms);
+ return;
+
+ }
+ else
+ {
+ //setup TCP connect
+ LPCTSTR ts_addr = CenterIP;
+ UINT ts_port = atol(CenterPort);
+ CRCLMSG send_mes;
+ if (client_comm.establish_connect(ts_addr, ts_port) != (-1))
+ {
+ send_mes.rclType = 5020;
+ send_mes.msglen = sizeof(stulogin);
+ memcpy(send_mes.msg, &stulogin, sizeof(stulogin));
+
+ if (client_comm.send_mes(send_mes, send_mes.msglen + 8) < 0)
+ {
+ printf("\nsend failed!");
+ }
+ loadflag = 1;
+ }
+ else
+ {
+ Error_dia(load_error1, load_error1ms);
+ }
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+ }
+}
+
+void on_classcancelbut_clicked(GtkButton *button, gpointer user_data)
+{
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+}
+
+void on_classokbut_clicked(GtkButton *button, gpointer user_data)
+{
+ TRCClientJionInGroup JionGroup;
+ if (loadflag == 1) //client join group , send message code 10020
+ {
+ JionGroup.ClientID = client_comm.Rec_ClientID;
+ JionGroup.GroupID = GroupID;
+ JionGroup.C_TAPort = stulogin.SeMCU_TAPort;
+ JionGroup.C_TVPort = stulogin.SeMCU_TVPort;
+ JionGroup.C_TScrPort = stulogin.SeMCU_TSPort;
+ JionGroup.C_CAPort = stulogin.SeMCU_SAPort;
+ JionGroup.C_CVPort = stulogin.SeMCU_SVPort;
+ send_mes.rclType = 10020;
+ send_mes.msglen = sizeof(JionGroup);
+ memcpy(send_mes.msg, &JionGroup, sizeof(JionGroup));
+ printf("class ok button\n");
+ if (client_comm.send_mes(send_mes, send_mes.msglen + 8) < 0)
+ {
+ printf("\nsend failed!");
+ }
+ }
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+}
+
+void on_chatentry_activate(GtkWidget *widget, GtkWidget *entry)
+{
+ sendmessage_op();
+}
+
+void select_clist_row(GtkCList *clist, gint row, gint column, GdkEvent *event,
+ gpointer user_data)
+{
+ gint now_cur = GTK_CLIST(clist)->focus_row;
+ gchar *text;
+ gtk_clist_get_text(GTK_CLIST(clist1), now_cur, 0, &text);
+ GroupID = atoi(text);
+}
+
+void on_networktool_clicked(GtkToolButton *toolbutton, gpointer user_data)
+{
+ GtkWidget *networkwindow;
+ networkwindow = create_networkdialog();
+ gtk_widget_show(networkwindow);
+}
+
+void on_loadtool_clicked(GtkToolButton *toolbutton, gpointer user_data)
+{
+ GtkWidget *loginwindow;
+ loginwindow = create_loaddialog();
+ gtk_widget_show(loginwindow);
+}
+
+void on_addclasstool_clicked(GtkToolButton *toolbutton, gpointer user_data)
+{
+ addclass_op();
+}
+
+void on_exitclasstool_clicked(GtkToolButton *toolbutton, gpointer user_data)
+{
+ exitclass_op();
+}
+
+void on_exchangetool_clicked(GtkToolButton *toolbutton, gpointer user_data)
+{
+ exchange_op();
+}
+
+void on_cancelextool_clicked(GtkToolButton *toolbutton, gpointer user_data)
+{
+ cancelexchange_op();
+}
+
+void on_exittool_clicked(GtkToolButton *toolbutton, gpointer user_data)
+{
+ exitsys_op();
+}
+
+void on_Topconfigbutton_clicked(GtkButton *button, gpointer user_data)
+{
+ gtk_widget_set_sensitive(centerport_entry, TRUE);
+ gtk_widget_set_sensitive(localIPentry, TRUE);
+ gtk_widget_set_sensitive(teachaudioentry, TRUE);
+}
+
+void on_networkOk_clicked(GtkButton *button, gpointer user_data)
+{
+ get_networkconfig();
+ if (getip_tag == 1)
+ {
+ Error_dia(getIP_error, getIP_errorms);
+ getip_tag = 0;
+ return;
+ }
+ if (!(stulogin.SeMCU_TAPort % 2 == 0))
+ {
+ Error_dia(config_error1, config_error1ms);
+ return;
+ }
+ if (stulogin.SeMCU_TAPort < 1024)
+ {
+ Error_dia(port_error, port_errorms);
+ return;
+ }
+ else
+ {
+ gtk_widget_set_sensitive(loadsys, TRUE);
+ gtk_widget_set_sensitive(loadtool, TRUE);
+ gtk_widget_destroy( GTK_WIDGET(GTK_WIDGET( user_data)));
+ }
+}
+
+void addclass_op()
+{
+ TRCClientGetGroupInfo GetGroupInfo;
+ GtkWidget *classwindow;
+ classwindow = create_classdialog();
+ gtk_widget_show(classwindow);
+ if (loadflag == 1) //join successfully
+ {
+ GetGroupInfo.ClientID = client_comm.Rec_ClientID;
+ send_mes.rclType = 10050;
+ send_mes.msglen = sizeof(TRCClientGetGroupInfo);
+ memcpy(send_mes.msg, &GetGroupInfo, sizeof(TRCClientGetGroupInfo));
+
+ if (client_comm.send_mes(send_mes, send_mes.msglen + 8) < 0)
+ perror("send failed!");
+ }
+}
+
+void exitclass_op()
+{
+ GtkWidget* dialog1;
+ dialog1 = create_exit_class_dialog();
+ gtk_widget_show(dialog1);
+}
+
+void exitsys_op() //exit system
+{
+ GtkWidget* dialog2;
+ dialog2 = create_exit_system_dialog();
+ gtk_widget_show(dialog2);
+
+}
+
+void exchange_op()
+{
+ TCRCLClientApplyFocus ApplyFocus;
+ ApplyFocus.ClientID = client_comm.Rec_ClientID;
+ ApplyFocus.GroupID = GroupID;
+ send_mes.rclType = 1010;
+ send_mes.msglen = sizeof(ApplyFocus);
+ memcpy(send_mes.msg, &ApplyFocus, sizeof(ApplyFocus));
+
+ if (client_comm.send_mes(send_mes, send_mes.msglen + 8) < 0)
+ {
+ printf("\nsend failed!");
+ }
+}
+
+void cancelexchange_op()
+{
+ TCRCLClientDestroyFocus DestroyFocus;
+ DestroyFocus.ClientID = client_comm.Rec_ClientID;
+ DestroyFocus.GroupID = GroupID;
+ send_mes.rclType = 1020;
+ send_mes.msglen = sizeof(DestroyFocus);
+ memcpy(send_mes.msg, &DestroyFocus, sizeof(DestroyFocus));
+
+ if (client_comm.send_mes(send_mes, send_mes.msglen + 8) < 0)
+ {
+ printf("\nsend failed!");
+ }
+}
+
+void sendmessage_op()
+{
+ TCRCLClientTextBroadcast TextBroadcast;
+ const char*Text = gtk_entry_get_text(GTK_ENTRY(chatentry));
+ if ((addclassflag == 1) && (strcmp(Text, "") != 0) && (chatMode == 1))
+ {
+ TextBroadcast.ClientID = client_comm.Rec_ClientID;
+ TextBroadcast.GroupID = GroupID;
+
+ memset(TextBroadcast.Info, 0, 1024);
+ TextBroadcast.InfoLength = strlen(Text) >= 1000 ? 1000 : strlen(Text);
+
+ if (strlen(Text) >= 1000)
+ {
+
+ memcpy(TextBroadcast.Info, Text, 1000);
+
+ }
+ else
+ strcpy(TextBroadcast.Info, Text);
+
+ send_mes.rclType = 1030;
+ send_mes.msglen = sizeof(TextBroadcast);
+ memcpy(send_mes.msg, &TextBroadcast, sizeof(TextBroadcast));
+
+ if (client_comm.send_mes(send_mes, send_mes.msglen + 8) < 0)
+ {
+ perror("send failed!");
+
+ }
+ strcpy(showchat, stulogin.ClientName);
+ strcat(showchat, ":");
+ strcat(showchat, TextBroadcast.Info);
+ strcat(showchat, "\n");
+ client_comm.get_text_from_msg(showchat);
+ if (TeacherMode == 1)
+ {
+ upper1 = GTK_ADJUSTMENT(adj1)->upper;
+ page_size1 = GTK_ADJUSTMENT(adj1)->page_size;
+ step = GTK_ADJUSTMENT(adj1)->step_increment;
+ value = upper1 - page_size1 + step;
+ gtk_adjustment_set_value(GTK_ADJUSTMENT(adj1), value);
+ }
+
+ else if (TeacherMode == 0)
+ {
+ upper1 = GTK_ADJUSTMENT(adj2)->upper;
+ page_size1 = GTK_ADJUSTMENT(adj2)->page_size;
+ step = GTK_ADJUSTMENT(adj2)->step_increment;
+ value = upper1 - page_size1 + step;
+ gtk_adjustment_set_value(GTK_ADJUSTMENT(adj2), value);
+ }
+
+ }
+
+ gtk_entry_set_text(GTK_ENTRY(chatentry), "");
+}
+
+void on_stulist_cancelbut_clicked(GtkButton *button, gpointer user_data)
+{
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+}
+
+void on_stulist_okbut_clicked(GtkButton *button, gpointer user_data)
+{
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+}
+
+void on_about_clicked(GtkButton *button, gpointer user_data)
+{
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+}
+
+void on_error_calbut_clicked(GtkButton *button, gpointer user_data)
+{
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+}
+
+void on_error_okbut_clicked(GtkButton *button, gpointer user_data)
+{
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+}
+
+void get_stulist()
+{
+ if (addclassflag == 1)
+ {
+ CRCLClientGetClientInfo GetClientInfo;
+ send_mes.rclType = 1040;
+ GetClientInfo.ClientID = client_comm.Rec_ClientID;
+ GetClientInfo.GroupID = GroupID;
+ send_mes.msglen = sizeof(GetClientInfo);
+ memcpy(send_mes.msg, &GetClientInfo, sizeof(GetClientInfo));
+
+ if (client_comm.send_mes(send_mes, send_mes.msglen + 8) < 0)
+ {
+ perror("send failed!");
+ }
+ }
+}
+
+int getip()
+{
+ int sock;
+ struct sockaddr_in sin;
+ struct ifreq ifr;
+ sock = socket(AF_INET, SOCK_DGRAM, 0);
+
+ if (sock == -1)
+ {
+ perror("socket");
+ return -1;
+ }
+ strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);
+ ifr.ifr_name[IFNAMSIZ - 1] = 0;
+
+ if (ioctl(sock, SIOCGIFADDR, &ifr) < 0)
+ {
+ perror("ioctl");
+ strncpy(ifr.ifr_name, ETH_NAME1, IFNAMSIZ);
+ ifr.ifr_name[IFNAMSIZ - 1] = 0;
+ if (ioctl(sock, SIOCGIFADDR, &ifr) < 0)
+ {
+ getip_tag = 1;
+ return -1;
+ }
+ }
+ memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
+ strcpy(IP, inet_ntoa(sin.sin_addr));
+ printf("get IP %s\n", inet_ntoa(sin.sin_addr));
+ close(sock);
+ return 0;
+}
+
+gboolean timer_callback(void *para) //timer refresh to answer clientcommunicate.cc error message
+{
+ switch (error_info_no)
+ {
+ case 0:
+ return true;
+ case 1:
+ Error_dia(load_error2, load_error2ms);
+ error_info_no = 0;
+ break;
+
+ case 2:
+ Error_dia(load_error3, load_error3ms);
+ error_info_no = 0;
+ break;
+
+ case 3:
+ Error_dia(load_error4, load_error4ms);
+ error_info_no = 0;
+ break;
+
+ case 4:
+ Error_dia(getclasslist_error, getclasslist_errorms);
+ error_info_no = 0;
+ break;
+
+ case 5:
+ Error_dia(addclass_error, addclass_errorms);
+ error_info_no = 0;
+ break;
+
+ case 6:
+ Error_dia(addclass_error1, addclass_error1ms);
+ error_info_no = 0;
+ break;
+
+ case 7:
+ Error_dia(exitclass_error, exitclass_errorms);
+ error_info_no = 0;
+ break;
+
+ case 8:
+ Error_dia(focus_error1, focus_error1ms);
+ error_info_no = 0;
+ break;
+
+ case 9:
+ Error_dia(focus_error2, focus_error2ms);
+ error_info_no = 0;
+ break;
+
+ case 10:
+ Error_dia(killfocus_error, killfocus_errorms);
+ error_info_no = 0;
+ break;
+
+ case 11:
+ Error_dia(killfocus_error, killfocus_errorms);
+ error_info_no = 0;
+ break;
+
+ case 20:
+ upper1 = GTK_ADJUSTMENT(adj1)->upper;
+ page_size1 = GTK_ADJUSTMENT(adj1)->page_size;
+ value = upper1 - page_size1;
+ gtk_adjustment_set_value(GTK_ADJUSTMENT(adj1), value);
+ error_info_no = 0;
+ break;
+
+ case 21:
+
+ upper1 = GTK_ADJUSTMENT(adj2)->upper;
+ page_size1 = GTK_ADJUSTMENT(adj2)->page_size;
+ value = upper1 - page_size1;
+ gtk_adjustment_set_value(GTK_ADJUSTMENT(adj2), value);
+ error_info_no = 0;
+ break;
+
+ default:
+
+ break;
+ }
+}
+
+void scroll_set_value(GtkAdjustment *set)
+{
+
+ gtk_adjustment_set_value(set, 1010000);
+
+}
+
+void on_exit_class_cancel_clicked(GtkButton *button, gpointer user_data)
+{
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+
+}
+
+void on_exit_class_yes_clicked(GtkButton *button, gpointer user_data)
+{
+ TRCClientLeaveGroup LeaveGroup;
+ if (addclassflag == 1)
+ {
+ LeaveGroup.ClientID = client_comm.Rec_ClientID;
+ LeaveGroup.GroupID = GroupID;
+ send_mes.rclType = 10030;//exit message code
+ send_mes.msglen = sizeof(TRCClientLeaveGroup);
+ memcpy(send_mes.msg, &LeaveGroup, sizeof(TRCClientLeaveGroup));
+ if (client_comm.send_mes(send_mes, send_mes.msglen + 8) < 0)
+ perror("send failed!");
+ }
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+}
+void on_exit_system_cancel_clicked(GtkButton *button, gpointer user_data)
+{
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+}
+void on_exit_system_yes_clicked(GtkButton *button, gpointer user_data)
+{
+ TRCClientLogout logoutsys;
+ if (loadflag == 1)
+ {
+ logoutsys.ClientID = client_comm.Rec_ClientID;
+ send_mes.rclType = 5050; //send to Tserver
+ send_mes.msglen = sizeof(logoutsys);
+ memcpy(send_mes.msg, &logoutsys, sizeof(logoutsys));
+
+ if (client_comm.send_mes(send_mes, send_mes.msglen + 8) < 0)
+ {
+ printf("\nsend failed!");
+ }
+ }
+ gtk_widget_destroy(GTK_WIDGET(user_data));
+ gtk_main_quit();
+}
+
+gint mainwindow_delete_event(GtkWidget *widget, GdkEvent *event,
+ gpointer user_data)
+{
+
+ GtkWidget *dialog3;
+ dialog3 = create_exit_system_dialog();
+ gtk_widget_show(dialog3);
+
+ return TRUE;
+}
+
+void on_clearchatbut_clicked(GtkButton *button, gpointer user_data)
+{
+ if (TeacherMode == 1)
+ {
+ gtk_text_buffer_get_start_iter(TeachChat_buffer, &TeachChat_start);
+ gtk_text_buffer_delete(TeachChat_buffer, &TeachChat_start,
+ &TeachChat_end);
+ }
+ else if (TeacherMode == 0)
+ {
+ gtk_text_buffer_get_start_iter(chat_buffer, &chat_start);
+ gtk_text_buffer_delete(chat_buffer, &chat_start, &chat_end);
+ }
+
+}
Added: incubator/bluesky/trunk/RealClass/Student/src/callbacks.hh
URL: http://svn.apache.org/viewvc/incubator/bluesky/trunk/RealClass/Student/src/callbacks.hh?rev=885395&view=auto
==============================================================================
--- incubator/bluesky/trunk/RealClass/Student/src/callbacks.hh (added)
+++ incubator/bluesky/trunk/RealClass/Student/src/callbacks.hh Mon Nov 30 12:18:34 2009
@@ -0,0 +1,162 @@
+/** \file callbacks.h define GUI operations
+*
+*
+*Licensed to the Apache Software Foundation (ASF) under one
+*or more contributor license agreements. See the NOTICE file
+*distributed with this work for additional information
+*regarding copyright ownership. The ASF licenses this file
+*to you under the Apache License, Version 2.0 (the
+*"License"); you may not use this file except in compliance
+*with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+*Unless required by applicable law or agreed to in writing,
+*software distributed under the License is distributed on an
+*"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*KIND, either express or implied. See the License for the
+*specific language governing permissions and limitations
+*under the License.
+*/
+
+#include <gtk/gtk.h>
+//!about system_activate
+void
+on_about1_activate(GtkMenuItem *menuitem, gpointer user_data);
+//!load system_activate
+void
+on_loadsys_activate(GtkMenuItem *menuitem, gpointer user_data);
+//!add class_activate
+void
+on_addclass_activate(GtkMenuItem *menuitem, gpointer user_data);
+//!exit class_activate
+void
+on_exitclass_activate(GtkMenuItem *menuitem, gpointer user_data);
+//!exit system_activate
+void
+on_exitsys_activate(GtkMenuItem *menuitem, gpointer user_data);
+//!request change_activate
+void
+on_requestchange_activate(GtkMenuItem *menuitem, gpointer user_data);
+//!cancel change_activate
+void
+on_cancelchange_activate(GtkMenuItem *menuitem, gpointer user_data);
+//!Top config button_clicked
+void
+on_Topconfigbutton_clicked(GtkButton *button, gpointer user_data);
+//!network Ok_clicked
+void
+on_networkOk_clicked(GtkButton *button, gpointer user_data);
+//!network config_activate
+void
+on_networkconfig_activate(GtkMenuItem *menuitem, gpointer user_data);
+//!about_clicked
+void
+on_about_clicked(GtkButton *button, gpointer user_data);
+//!load cancel button_clicked
+void
+on_loadcancelbut_clicked(GtkObject *object, gpointer user_data);
+//!network cancel_clicked
+void
+on_networkcancel_clicked(GtkObject *object, gpointer user_data);
+//!send_clicked
+void
+on_send_clicked(GtkButton *button, gpointer user_data);
+//!student image button_clicked
+void
+on_studimagebut_clicked(GtkButton *button, gpointer user_data);
+//!my image button_clicked
+void
+on_myimagebut_clicked(GtkButton *button, gpointer user_data);
+//!send chat button_clicked
+void
+on_sendchatbut_clicked(GtkButton *button, gpointer user_data);
+//!load ok button_clicked
+void
+on_loadokbutton_clicked(GtkButton *button, gpointer user_data);
+//!class cancel button_clicked
+void
+on_classcancelbut_clicked(GtkButton *button, gpointer user_data);
+//!class cancel button_destroy
+void
+on_classcancelbut_destroy(GtkButton *button, gpointer user_data);
+//!class ok button_clicked
+void
+on_classokbut_clicked(GtkButton *button, gpointer user_data);
+//!select clist row
+void
+select_clist_row(GtkCList *clist, gint row, gint column, GdkEvent *event,
+ gpointer user_data);
+//!load tool_clicked
+void
+on_loadtool_clicked(GtkToolButton *toolbutton, gpointer user_data);
+//!add class tool_clicked
+void
+on_addclasstool_clicked(GtkToolButton *toolbutton, gpointer user_data);
+//!exit class tool_clicked
+void
+on_exitclasstool_clicked(GtkToolButton *toolbutton, gpointer user_data);
+//!exchange tool_clicked
+void
+on_exchangetool_clicked(GtkToolButton *toolbutton, gpointer user_data);
+//!cancel exit tool_clicked
+void
+on_cancelextool_clicked(GtkToolButton *toolbutton, gpointer user_data);
+//!network tool_clicked
+void
+on_networktool_clicked(GtkToolButton *toolbutton, gpointer user_data);
+//!exittool_clicked
+void
+on_exittool_clicked(GtkToolButton *toolbutton, gpointer user_data);
+//!student list cancel button_clicked
+void
+on_stulist_cancelbut_clicked(GtkButton *button, gpointer user_data);
+//!student list ok button_clicked
+void
+on_stulist_okbut_clicked(GtkButton *button, gpointer user_data);
+//!chat entry_activate
+void
+on_chatentry_activate(GtkWidget *widget, GtkWidget *entry);
+//!error cancel button_clicked
+void
+on_error_calbut_clicked(GtkButton *button, gpointer user_data);
+//!error ok button_clicked
+void
+on_error_okbut_clicked(GtkButton *button, gpointer user_data);
+//!exit_class cancel_clicked
+void
+on_exit_class_cancel_clicked(GtkButton *button, gpointer user_data);
+//!exit_class yes_clicked
+void
+on_exit_class_yes_clicked(GtkButton *button, gpointer user_data);
+//!exit_system cancel_clicked
+void
+on_exit_system_cancel_clicked(GtkButton *button, gpointer user_data);
+//!exit_system yes_clicked
+void
+on_exit_system_yes_clicked(GtkButton *button, gpointer user_data);
+gint mainwindow_delete_event(GtkWidget *widget, GdkEvent *event,
+ gpointer user_data);
+//!clear chat button_clicked
+void
+on_clearchatbut_clicked(GtkButton *button, gpointer user_data);
+//!add class operation
+void addclass_op();
+//!exit class operation
+void exitclass_op();
+//!exit system operation
+void exitsys_op();
+//!exchange operation
+void exchange_op();
+//!cancel operation
+void cancelexchange_op();
+//get student list operation
+void get_stulist();
+//!send message operation
+void sendmessage_op();
+//!get time
+gint timer_callback(void* para);
+//!get ip
+int getip();
+//!scroll set value
+void scroll_set_value(GtkAdjustment *set);
Added: incubator/bluesky/trunk/RealClass/Student/src/client_communicate.cc
URL: http://svn.apache.org/viewvc/incubator/bluesky/trunk/RealClass/Student/src/client_communicate.cc?rev=885395&view=auto
==============================================================================
--- incubator/bluesky/trunk/RealClass/Student/src/client_communicate.cc (added)
+++ incubator/bluesky/trunk/RealClass/Student/src/client_communicate.cc Mon Nov 30 12:18:34 2009
@@ -0,0 +1,503 @@
+/** \file client_communicate.cc implementation for the communicate with Tserver
+*
+*
+*Licensed to the Apache Software Foundation (ASF) under one
+*or more contributor license agreements. See the NOTICE file
+*distributed with this work for additional information
+*regarding copyright ownership. The ASF licenses this file
+*to you under the Apache License, Version 2.0 (the
+*"License"); you may not use this file except in compliance
+*with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+*Unless required by applicable law or agreed to in writing,
+*software distributed under the License is distributed on an
+*"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*KIND, either express or implied. See the License for the
+*specific language governing permissions and limitations
+*under the License.
+*/
+
+#include "client_communicate.h"
+#include "callbacks.hh"
+#include "interface.h"
+#include "errormessage.h"
+#include "en_de_video.h"
+#include "en_de_audio.h"
+#include "en_de_screen.h"
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+#include <string.h>
+#include <stdlib.h>
+#include <gdk/gdkx.h>
+
+extern GtkWidget *chatview;
+extern GtkWidget *chat_show;
+extern GtkWidget *clist1;
+extern DWORD TeacherMode;
+extern DWORD chatMode;
+extern DWORD Focus_student;
+extern client_ts_communicate client_comm;
+extern int loadflag;
+extern int addclassflag;
+extern GtkWidget *chatview;
+extern GtkWidget *stu_clist;
+extern GtkWidget *class1;
+extern GtkWidget *addclass;
+extern GtkWidget *exitclass;
+extern GtkWidget *addclasstool;
+extern GtkWidget *exitclasstool;
+extern GtkWidget *exchangetool;
+extern GtkWidget *cancelextool;
+//MCU connect with TServer
+extern GtkWidget *chat_show;
+extern GtkWidget *screenimage;
+extern GtkWidget *teachimage;
+
+extern GtkWidget *sendchatbut;
+extern GtkWidget *chatentry;
+
+extern GtkWidget *requestchange;//for apply focus
+extern GtkWidget *cancelchange;
+
+extern CScreenReceiver g_teacher_screenreceiver;
+extern CVideoReceiver g_teacher_videoreceiver;
+extern CAudioReceiver g_teacher_audioreceiver;
+
+extern CV4LStuVideoSender g_student_videosender;
+extern CStuAudioSender g_student_audiosender;
+
+extern CVideoReceiver g_student_videoreceiver;
+
+extern CAudioReceiver g_student_audioreceiver;
+
+extern struct TRCClientLogin stulogin; //initialise student login info
+
+extern GtkTextBuffer *chat_buffer;
+extern GtkTextIter chat_end;
+extern GtkTextIter chat_start;
+extern GtkTextBuffer *TeachChat_buffer;
+extern GtkTextIter TeachChat_end;
+extern GtkTextIter TeachChat_start;
+
+extern GtkWidget *networktool;
+extern GtkWidget *networkconfig;
+
+extern GtkWidget *loadsys;
+extern GtkWidget *loadtool;
+
+char *studentInfo[3];
+int clientcount;
+
+extern int error_info_no;
+
+client_ts_communicate::client_ts_communicate()
+{
+ textview_mutex.Init();
+}
+
+client_ts_communicate::~client_ts_communicate()
+{
+
+}
+
+int client_ts_communicate::close_socket(int nHow)
+{
+ if (client_socket.ShutDown(nHow) == false)
+ {
+ perror("close socket error!");
+ return -1;
+ }
+
+ return 0;
+}
+
+int client_ts_communicate::establish_connect(LPCTSTR ts_IP, UINT ts_Port,
+ UINT nSocketPort) //setup socket on MCU
+{
+ if (client_socket.Create(nSocketPort) != true)
+ {
+ printf("Create socket failed!/n");
+ return -1;
+ }
+
+ if (client_socket.Connect(ts_IP, ts_Port) != true)
+ {
+ perror("connet error!");
+ return -1;
+ }
+
+ client_socket_thread.Attach(&client_socket);
+
+ if (client_socket_thread.Init() != true)
+ {
+ printf("Fail to initilize thread!/n");
+ return -1;
+ }
+ client_socket_thread.Start();
+
+ return 0;
+
+}
+
+int client_ts_communicate::send_mes(CRCLMSG mes, int mes_length) //send message to Tserver
+{
+ if (client_socket.Send(&mes, mes_length) == -1)
+ {
+ return -1;
+ }
+ return 0;
+}
+
+int client_ts_communicate::recevie_msg(char *buf, int buf_length)//receive message from Tsever
+{
+ CRCLMSG * receive_str;
+ receive_str = (CRCLMSG *) buf;
+
+ printf("message ID is %d\n", receive_str->rclType);
+
+ switch (receive_str->rclType)
+ {
+ case 5021: //confirm login
+ TRCClientLoginR *loginReceive;
+ loginReceive = (TRCClientLoginR *) receive_str->msg;
+
+ if (loginReceive->ResponseType == 0)//login successfully
+ {
+ loadflag = 1;
+ Rec_ClientID = loginReceive->ClientID;
+ //change the status of menus
+ gtk_widget_set_sensitive(networktool, FALSE);
+ gtk_widget_set_sensitive(networkconfig, FALSE);
+ gtk_widget_set_sensitive(loadsys, FALSE);
+ gtk_widget_set_sensitive(loadtool, FALSE);
+ gtk_widget_set_sensitive(addclass, TRUE);
+ gtk_widget_set_sensitive(addclasstool, TRUE);
+ }
+ if (loginReceive->ResponseType == 2) //the user name have been used
+ error_info_no = 1;
+ if (loginReceive->ResponseType == 4) //network problem
+ error_info_no = 2;
+ if (loginReceive->ResponseType == 6) //reach the max num
+ error_info_no = 3;
+ break;
+ case 10051: //response to the client's request for group info
+ int index;
+ static char *classInfo[5];
+ static char tmp[10];
+ GetGroupInfoR = (TRCClientGetGroupInfoR *) receive_str->msg;
+ if (GetGroupInfoR->ResponseType == 0)
+ {
+ gtk_clist_clear( GTK_CLIST(clist1));
+ chatMode = GetGroupInfoR-> groupchatMode;
+ if (chatMode == 0)
+ {
+ gtk_widget_set_sensitive(sendchatbut, FALSE);
+ gtk_widget_set_sensitive(chatentry, FALSE);
+ }
+ for (index = 0; index < GetGroupInfoR->GroupCount; index++)
+ {
+ sprintf(tmp, "%d", GetGroupInfoR->GroupList[index].GroupID);
+ classInfo[0] = tmp;
+ classInfo[3] = "";
+ classInfo[4] = "";
+ classInfo[1] = GetGroupInfoR->GroupList[index].GroupName;
+ classInfo[2] = GetGroupInfoR->GroupList[index].TeacherName;
+ gtk_clist_freeze ( GTK_CLIST(clist1));
+ gtk_clist_append(GTK_CLIST(clist1), classInfo);
+ gtk_clist_thaw ( GTK_CLIST(clist1));
+ }
+ }
+ if (GetGroupInfoR->ResponseType == 60)//unable to get class list
+ error_info_no = 4;
+ break;
+
+ case 10021: //response to the student join class
+ CRCLClientJoinInGroupR *JoinInGroupR;
+ JoinInGroupR = (CRCLClientJoinInGroupR *) receive_str->msg;
+ printf("MCU's IP is %s\n", JoinInGroupR->MCUIP);
+ if (JoinInGroupR->ResponseType == 0)
+ {
+ addclassflag = 1;
+ TeacherMode = JoinInGroupR->RoomMode;
+ gtk_widget_set_sensitive(exitclass, TRUE);
+ gtk_widget_set_sensitive(exitclasstool, TRUE);
+ gtk_widget_set_sensitive(addclass, FALSE);
+ gtk_widget_set_sensitive(addclasstool, FALSE);
+ gtk_widget_set_sensitive(exchangetool, TRUE);
+ gtk_widget_set_sensitive(cancelextool, TRUE);
+ gtk_widget_set_sensitive(cancelchange, TRUE);
+ gtk_widget_set_sensitive(requestchange, TRUE);
+ gtk_widget_set_sensitive(loadsys, FALSE);
+ gtk_widget_set_sensitive(loadtool, FALSE);
+
+ client_mcu_info.GroupID = JoinInGroupR->GroupID;
+ strcpy(client_mcu_info.MCUIP, JoinInGroupR->MCUIP);
+ strcpy(client_mcu_info.SeMCUIP, JoinInGroupR->SeMCUIP);
+ client_mcu_info.TAPort = JoinInGroupR->TAPort;
+ client_mcu_info.TVPort = JoinInGroupR->TVPort;
+ client_mcu_info.TSPort = JoinInGroupR->TSPort;
+ client_mcu_info.CAPort = JoinInGroupR->CAPort;
+ client_mcu_info.CVPort = JoinInGroupR->CVPort;
+ client_mcu_info.RoomMode = JoinInGroupR->RoomMode;
+
+ g_student_audioreceiver.Init();
+ g_student_audioreceiver.Start(stulogin.SeMCU_SAPort);
+
+ if (TeacherMode == 1)
+ {
+ g_teacher_screenreceiver.Init();
+ g_teacher_screenreceiver.CreateXImage(GDK_WINDOW_XID(
+ teachimage->window), 240, 76, 782, 580);
+ g_teacher_screenreceiver.Start(stulogin.SeMCU_TSPort);
+
+ }
+ g_teacher_videoreceiver.Init();
+ g_teacher_videoreceiver.CreateXImage(GDK_WINDOW_XID(
+ teachimage->window), 2, 76, 320 - 90, 240 - 43);
+ g_teacher_videoreceiver.Start(stulogin.SeMCU_TVPort);
+ g_teacher_audioreceiver.Init();
+ g_teacher_audioreceiver.Start(stulogin.SeMCU_TAPort);
+
+ }
+ else if (JoinInGroupR->ResponseType == 20) //student fail to join class
+ error_info_no = 5;
+
+ else if (JoinInGroupR->ResponseType == 22) //the group reach the max num
+ error_info_no = 6;
+
+ break;
+
+ case 10031: //reponse the leave of student
+ TRCClientLeaveGroupR *LeaveGroupR;
+ LeaveGroupR = (TRCClientLeaveGroupR *) receive_str->msg;
+ if (LeaveGroupR->ResponseType == 0)
+ {
+ addclassflag = 0;
+
+ g_teacher_screenreceiver.Stop();
+ g_teacher_screenreceiver.CloseXImage();
+ g_teacher_videoreceiver.Stop();
+ g_teacher_videoreceiver.CloseXImage();
+ g_teacher_audioreceiver.Stop();
+
+ g_student_videosender.Stop();
+ g_student_videosender.CloseXImage();
+ g_student_audiosender.Pause();
+ g_student_videoreceiver.Stop();
+ g_student_videoreceiver.CloseXImage();
+
+ gtk_widget_set_sensitive(addclass, TRUE);
+ gtk_widget_set_sensitive(addclasstool, TRUE);
+ gtk_widget_set_sensitive(exitclass, FALSE);
+ gtk_widget_set_sensitive(exitclasstool, FALSE);
+ gtk_widget_set_sensitive(cancelchange, FALSE);
+ gtk_widget_set_sensitive(exchangetool, FALSE);
+ gtk_widget_set_sensitive(requestchange, FALSE);
+ gtk_widget_set_sensitive(cancelextool, FALSE);
+ }
+ else if (LeaveGroupR->ResponseType == 21)//student fail to exit class
+ error_info_no = 7;
+ break;
+
+ case 1011: //response to student's apply focus
+ TCRCLClientApplyFocusR *ApplyFocusR;
+ ApplyFocusR = (TCRCLClientApplyFocusR *) receive_str->msg;
+ if (GetGroupInfoR->ResponseType == 40) //already have one focus
+ error_info_no = 8;
+ else if (GetGroupInfoR->ResponseType == 41) //fail to get a focus
+ error_info_no = 9;
+
+ break;
+
+ case 1021: //response to student's cancel focus
+ TCRCLClientDestroyFocusR *DestroyFocusR;
+ DestroyFocusR = (TCRCLClientDestroyFocusR *) receive_str->msg;
+ if (DestroyFocusR->ResponseType == 0)
+ {
+ Focus_student = 0;
+ printf("The student destroy focus\n");
+ }
+ else if (DestroyFocusR->ResponseType == 42)//fail to cancel focus
+ error_info_no = 10;
+
+ break;
+
+ case 1052: //response to student get a focus
+ TCRCLTeacherAllowClientFocusRToMS *AllowClientFocusR;
+ AllowClientFocusR
+ = (TCRCLTeacherAllowClientFocusRToMS *) receive_str->msg;
+ {
+ Focus_student = 1;
+ unsigned long intIP2 = inet_addr(client_mcu_info.MCUIP);
+ intIP2 = ntohl(intIP2);
+ RTPIPv4Address rtpAddr1(intIP2, client_mcu_info.CAPort);
+ RTPIPv4Address rtpAddr2(intIP2, client_mcu_info.CVPort);
+
+ g_student_audioreceiver.Stop();
+
+ if (!g_student_videosender.IsInitialized())
+ {
+ g_student_videosender.Init(6102);
+ }
+
+ g_student_videosender.SetMode(CV4LStuVideoSender::ModeTransmit);
+ printf(
+ "\n g_student_videosender.AddDestination(rtpAddr2):problem!!!!!!!!!!!\n");
+ g_student_videosender.ClearDestinations();
+ g_student_videosender.AddDestination(rtpAddr2);
+ g_student_videosender.Start();
+
+ g_student_audiosender.Init(6004);
+ g_student_audiosender.ClearDestinations();
+ g_student_audiosender.AddDestination(rtpAddr1);
+ g_student_audiosender.Start();
+ g_student_audiosender.Resume();
+ }
+ break;
+
+ case 1062: //send to student that teacher have canceled a focus
+ TCRCLTeacherCancelClientFocusRToMS *TeacherCancelClientR;
+ TeacherCancelClientR
+ = (TCRCLTeacherCancelClientFocusRToMS *) receive_str->msg;
+ Focus_student = 0;
+ printf("cancel image OKKKKKKKKKKK\n");
+ g_student_audioreceiver.Init();
+ g_student_audioreceiver.Start(stulogin.SeMCU_SAPort);
+
+ g_student_videosender.Stop();
+ g_student_videosender.CloseXImage();
+ g_student_audiosender.Pause();
+ g_student_videoreceiver.Stop();
+ g_student_videoreceiver.CloseXImage();
+ break;
+
+ case 1031: //response to text chat
+ char Text[1024];
+ TCRCLClientTextBroadcastR *TextBroadcastR;
+ TextBroadcastR = (TCRCLClientTextBroadcastR *) receive_str->msg;
+ strcpy(Text, TextBroadcastR->ClientName);
+ strcat(Text, ":");
+ strcat(Text, TextBroadcastR->Info);
+ strcat(Text, "\n");
+ get_text_from_msg(Text);
+ flush_scrollar();
+ break;
+
+ case 1081: //change mode
+
+ TCRCLTeacherSwitchModeR *TeacherSwitchMode;
+ TeacherSwitchMode = (TCRCLTeacherSwitchModeR *) receive_str->msg;
+ if (TeacherSwitchMode->ModeType == 0)
+ {
+ g_teacher_screenreceiver.Stop();
+ g_teacher_screenreceiver.CloseXImage();
+ TeacherMode = 0;
+ chatMode = 1;
+ gtk_widget_set_sensitive(sendchatbut, TRUE);
+ gtk_widget_set_sensitive(chatentry, TRUE);
+ }
+ if (TeacherSwitchMode->ModeType == 1)
+ {
+ TeacherMode = 1;
+ chatMode = 1;
+ gtk_widget_set_sensitive(sendchatbut, TRUE);
+ gtk_widget_set_sensitive(chatentry, TRUE);
+ g_teacher_screenreceiver.Init();
+ g_teacher_screenreceiver.CreateXImage(GDK_WINDOW_XID(
+ teachimage->window), 240, 76, 782, 580);
+ g_teacher_screenreceiver.Start(stulogin.SeMCU_TSPort);
+ }
+
+ break;
+
+ case 10012: //cancel communication mode
+ TRCDestoryGroupRToClient *DestoryGroupRToClient;
+ DestoryGroupRToClient = (TRCDestoryGroupRToClient *) receive_str->msg;
+ addclassflag = 0;
+
+ g_teacher_screenreceiver.Stop();
+ g_teacher_screenreceiver.CloseXImage();
+ g_teacher_videoreceiver.Stop();
+ g_teacher_videoreceiver.CloseXImage();
+ g_teacher_audioreceiver.Stop();
+ g_student_videosender.Stop();
+ g_student_videosender.CloseXImage();
+ g_student_audiosender.Pause();
+ g_student_videoreceiver.Stop();
+ g_student_videoreceiver.CloseXImage();
+
+ gtk_widget_set_sensitive(addclass, TRUE);
+ gtk_widget_set_sensitive(addclasstool, TRUE);
+ gtk_widget_set_sensitive(exitclass, FALSE);
+ gtk_widget_set_sensitive(exitclasstool, FALSE);
+ gtk_widget_set_sensitive(cancelchange, FALSE);
+ gtk_widget_set_sensitive(exchangetool, FALSE);
+ gtk_widget_set_sensitive(requestchange, FALSE);
+ gtk_widget_set_sensitive(cancelextool, FALSE);
+
+ break;
+
+ case 1092: //teacher change to chat mode
+
+ TCRCLTeacherAgreeChat *TeacherAgreeChat;
+ TeacherAgreeChat = (TCRCLTeacherAgreeChat *) receive_str->msg;
+ if (TeacherAgreeChat->Agreechat == 0)
+ {
+ chatMode = 0;
+ gtk_widget_set_sensitive(sendchatbut, FALSE);
+ gtk_widget_set_sensitive(chatentry, FALSE);
+ }
+ else if (TeacherAgreeChat->Agreechat == 1)
+ {
+ chatMode = 1;
+ gtk_widget_set_sensitive(sendchatbut, TRUE);
+ gtk_widget_set_sensitive(chatentry, TRUE);
+ }
+
+ break;
+
+ case 1001: //get the message from teacher
+
+ char TeachMessage[1024];
+ TCRCLTeacherTextBroadcastR *TeacherTextR;
+ TeacherTextR = (TCRCLTeacherTextBroadcastR *) receive_str->msg;
+ strcpy(TeachMessage, "Teacher:");
+ strcat(TeachMessage, TeacherTextR->Info);
+ strcat(TeachMessage, "\n");
+ printf("Teacher message is %s\n", TeachMessage);
+ get_text_from_msg(TeachMessage);
+ flush_scrollar();
+
+ break;
+
+ default:
+
+ break;
+ }
+
+ return 0;
+
+}
+
+void client_ts_communicate::get_text_from_msg(char *Message)
+{
+ textview_mutex.Lock();
+ if (TeacherMode == 1)
+ gtk_text_buffer_insert(TeachChat_buffer, &TeachChat_end, Message, -1);
+ else if (TeacherMode == 0)
+ gtk_text_buffer_insert(chat_buffer, &chat_end, Message, -1);
+ textview_mutex.Unlock();
+
+}
+void client_ts_communicate::flush_scrollar()
+{
+ textview_mutex.Lock();
+ if (TeacherMode == 1)
+ error_info_no = 20;
+ else if (TeacherMode == 0)
+ error_info_no = 21;
+ textview_mutex.Unlock();
+}
Added: incubator/bluesky/trunk/RealClass/Student/src/client_communicate.h
URL: http://svn.apache.org/viewvc/incubator/bluesky/trunk/RealClass/Student/src/client_communicate.h?rev=885395&view=auto
==============================================================================
--- incubator/bluesky/trunk/RealClass/Student/src/client_communicate.h (added)
+++ incubator/bluesky/trunk/RealClass/Student/src/client_communicate.h Mon Nov 30 12:18:34 2009
@@ -0,0 +1,77 @@
+/** \file client_communicate.h class for the communicate with Tserver
+*
+*
+*Licensed to the Apache Software Foundation (ASF) under one
+*or more contributor license agreements. See the NOTICE file
+*distributed with this work for additional information
+*regarding copyright ownership. The ASF licenses this file
+*to you under the Apache License, Version 2.0 (the
+*"License"); you may not use this file except in compliance
+*with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+*Unless required by applicable law or agreed to in writing,
+*software distributed under the License is distributed on an
+*"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*KIND, either express or implied. See the License for the
+*specific language governing permissions and limitations
+*under the License.
+*/
+
+#ifndef CLIENT_COMMUNICATE_H
+#define CLIENT_COMMUNICATE_H
+
+#include "stdafx.h"
+#include "clientsocket.h"
+#include "singlecomm.h"
+#include "ncclient.hh"
+//!communicate with Tserver
+class client_ts_communicate
+{
+public:
+ //!Constructor
+ client_ts_communicate();
+ //!Destructor
+ ~client_ts_communicate();
+ //!establish a connection
+ int establish_connect(LPCTSTR, UINT, UINT nSocketPort = 0);
+ //!send messages
+ /*!
+ \param CRCLMSG the message
+ \param mes_length message length
+ */
+ int send_mes(struct CRCLMSG, int mes_length);
+ //!receive messages
+ /*!
+ \param buf the buffer to store messages
+ \param buf_length buffer size
+ */
+ int recevie_msg(char *buf, int buf_length);
+ //!get text from messages
+ /*!
+ \param Message the message
+ */
+ void get_text_from_msg(char *Message);
+ //!flush scrollar
+ void flush_scrollar();
+ //!close the socket
+ int close_socket(int nHow);
+ //!ClientID
+ DWORD Rec_ClientID;
+ //!TRCClient GetGroupInfoR list
+ TRCClientGetGroupInfoR *GetGroupInfoR;
+ //!TRCClient GetGroupInfoR list
+ struct CRCLClientJoinInGroupR client_mcu_info;
+
+private:
+ //!client socket
+ CClientSocket client_socket;
+ //!client socket thread
+ CSingleComm client_socket_thread;
+ //!mutex for text view
+ JMutex textview_mutex;
+
+};
+
+#endif
Added: incubator/bluesky/trunk/RealClass/Student/src/clientsocket.cpp
URL: http://svn.apache.org/viewvc/incubator/bluesky/trunk/RealClass/Student/src/clientsocket.cpp?rev=885395&view=auto
==============================================================================
--- incubator/bluesky/trunk/RealClass/Student/src/clientsocket.cpp (added)
+++ incubator/bluesky/trunk/RealClass/Student/src/clientsocket.cpp Mon Nov 30 12:18:34 2009
@@ -0,0 +1,77 @@
+/** \file clientsocket.cpp implementation of the CClientSocket class
+ *
+*Licensed to the Apache Software Foundation (ASF) under one
+*or more contributor license agreements. See the NOTICE file
+*distributed with this work for additional information
+*regarding copyright ownership. The ASF licenses this file
+*to you under the Apache License, Version 2.0 (the
+*"License"); you may not use this file except in compliance
+*with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+*Unless required by applicable law or agreed to in writing,
+*software distributed under the License is distributed on an
+*"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*KIND, either express or implied. See the License for the
+*specific language governing permissions and limitations
+*under the License.
+*/
+// ClientSocket.cpp: implementation of the CClientSocket class.
+//////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "clientsocket.h"
+#include "client_communicate.h"
+
+extern client_ts_communicate client_comm;
+
+CClientSocket::CClientSocket()
+{
+
+}
+
+CClientSocket::~CClientSocket()
+{
+}
+
+void CClientSocket::OnEvent()
+{
+ unsigned long len;
+ if (m_lEvent == 0)
+ return;
+ IOCtl(FIONREAD, &len);
+ if (len == 0)
+ {
+ Close();
+ printf("\nA client disconnected.");
+ return;
+ }
+
+ char buffer[10008] =
+ { '\0' };
+ int receive_length = 0;
+
+ memset(buffer, '\0', 10008);
+ if ((receive_length = Receive(buffer, 10008)) == -1)
+ {
+ perror("Receive failed!");
+ return;
+ }
+
+ CRCLMSG* pM = (CRCLMSG*) buffer;
+ printf("message lenth is %d\n", pM->msglen);
+ int index = receive_length;
+ int to_receive_length = pM->msglen + 8 - receive_length;
+ while (to_receive_length > 0)
+ {
+ receive_length = Receive(buffer + index, to_receive_length);
+ printf("recv a message lenth is %d\n", receive_length);
+ index += receive_length;
+ to_receive_length -= receive_length;
+ }
+
+ client_comm.recevie_msg(buffer, receive_length);
+
+ return;
+}
Added: incubator/bluesky/trunk/RealClass/Student/src/clientsocket.h
URL: http://svn.apache.org/viewvc/incubator/bluesky/trunk/RealClass/Student/src/clientsocket.h?rev=885395&view=auto
==============================================================================
--- incubator/bluesky/trunk/RealClass/Student/src/clientsocket.h (added)
+++ incubator/bluesky/trunk/RealClass/Student/src/clientsocket.h Mon Nov 30 12:18:34 2009
@@ -0,0 +1,40 @@
+/** \file clientsocket.h CClientSocket extends CAsyncSocketEx and handle socket event with users
+*
+*Licensed to the Apache Software Foundation (ASF) under one
+*or more contributor license agreements. See the NOTICE file
+*distributed with this work for additional information
+*regarding copyright ownership. The ASF licenses this file
+*to you under the Apache License, Version 2.0 (the
+*"License"); you may not use this file except in compliance
+*with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+*Unless required by applicable law or agreed to in writing,
+*software distributed under the License is distributed on an
+*"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*KIND, either express or implied. See the License for the
+*specific language governing permissions and limitations
+*under the License.
+*/
+
+#if !defined(CLIENTSOCKET_H)
+#define CLIENTSOCKET_H
+
+#include "asyncsocketex.h"
+//!Client Socket class
+class CClientSocket: public CAsyncSocketEx
+{
+public:
+ //Constructor
+ CClientSocket();
+ //!Destructor
+ virtual ~CClientSocket();
+
+protected:
+ //!listen to event and deal with corresponding events
+ virtual void OnEvent();
+
+};
+
+#endif // !defined(CLIENTSOCKET_H)
Added: incubator/bluesky/trunk/RealClass/Student/src/en_de_audio.cpp
URL: http://svn.apache.org/viewvc/incubator/bluesky/trunk/RealClass/Student/src/en_de_audio.cpp?rev=885395&view=auto
==============================================================================
--- incubator/bluesky/trunk/RealClass/Student/src/en_de_audio.cpp (added)
+++ incubator/bluesky/trunk/RealClass/Student/src/en_de_audio.cpp Mon Nov 30 12:18:34 2009
@@ -0,0 +1,1078 @@
+/** \file en_de_audio.cpp Implementation for audio operation:capture,encoder,decoder,sender,receiver
+*
+*
+*Licensed to the Apache Software Foundation (ASF) under one
+*or more contributor license agreements. See the NOTICE file
+*distributed with this work for additional information
+*regarding copyright ownership. The ASF licenses this file
+*to you under the Apache License, Version 2.0 (the
+*"License"); you may not use this file except in compliance
+*with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+*Unless required by applicable law or agreed to in writing,
+*software distributed under the License is distributed on an
+*"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*KIND, either express or implied. See the License for the
+*specific language governing permissions and limitations
+*under the License.
+*/
+#include "en_de_audio.h"
+//!CODEC_ID_MP2 for network transmission
+#define ENCODE_ID CODEC_ID_MP2//CODEC_ID_PCM_S16LE
+//!CODEC_ID_MP3 the codec for the saved file
+#define DECODE_ID CODEC_ID_MP3
+//!maxinum frames to store in the fifo buffer
+#define STATIC_AUDIO_FRAMES 10
+//!maxinum packet size
+#define MAX_PACKET_SIZE 10*1024
+//!maxinum audio packet size
+#define MAX_AUDIO_PACKET_SIZE (128 * 1024)
+
+//!Print the error text
+extern void PErrorText(const char* error);
+
+// For CAEncoder class.
+
+CAEncoder::CAEncoder() :
+ m_soundcard("/dev/dsp")
+{
+ m_pCodec = 0;
+ m_pCodecCtx = 0;
+ m_bInit = false;
+
+ m_audio_buf = 0;
+ m_fifo = 0;
+
+}
+
+CAEncoder::~CAEncoder()
+{
+ /*CAEncoder can't close audio device in ~CAEncoder(),
+ and close audio device in main()*/
+
+ m_bInit = false;
+ CloseAudio();
+
+ if (m_pCodecCtx)
+ {
+ avcodec_close( m_pCodecCtx);
+ m_pCodecCtx = 0;
+ }
+
+ if (m_audio_buf)
+ free( m_audio_buf);
+
+ if (m_fifo)
+ {
+ fifo_free( m_fifo);
+ free(m_fifo);
+ }
+
+}
+
+void CAEncoder::CloseAudio()
+{
+}
+
+bool CAEncoder::OpenAudio()
+{
+ if (m_soundcard.start_record() < 0)
+ {
+ printf("\nopen audio error.\n");
+ return false;
+ }
+
+ SOUNDPARAMS sp;
+ sp.format = 2;
+
+ sp.channels = 1;
+
+ sp.rate = AUDIO_ENCODE_sample_rate;
+
+ m_soundcard.setparams(&sp);
+
+ printf("\nopen audio success.\n");
+ return true;
+
+}
+
+
+bool CAEncoder::Init(enum CodecID nCodecID /*=CODEC_ID_MPEG4*/)
+{
+ m_bInit = false;
+
+ avienc_init();
+ av_register_all();
+
+ if (!OpenAudio())
+ return false;
+
+ /* find the mpeg4 video encoder */
+ m_pCodec = avcodec_find_encoder(nCodecID);
+ if (!m_pCodec)
+ {
+ PErrorText("codec not found");
+ return false;
+ }
+
+ if (m_pCodecCtx)
+ {
+ avcodec_close( m_pCodecCtx);
+ m_pCodecCtx = 0;
+ }
+
+ m_pCodecCtx = avcodec_alloc_context();
+ /* put sample parameters */
+ m_pCodecCtx->codec_id = nCodecID;
+ m_pCodecCtx->codec_type = CODEC_TYPE_AUDIO;
+ m_pCodecCtx->bit_rate = AUDIO_ENCODE_bit_rate;
+ m_pCodecCtx->sample_rate = AUDIO_ENCODE_sample_rate;
+ m_pCodecCtx->channels = 1;
+
+ /* open it */
+ if (avcodec_open(m_pCodecCtx, m_pCodec) < 0)
+ {
+ PErrorText("could not open codec");
+ return false;
+ }
+
+ if (0 == m_audio_buf)
+ m_audio_buf = (uint8_t*) av_malloc(2 * MAX_AUDIO_PACKET_SIZE);
+
+ if (m_fifo == 0)
+ {
+ m_fifo = (FifoBuffer*) malloc(sizeof(FifoBuffer));
+ fifo_init(m_fifo, 10000);
+ }
+
+ m_bInit = true;
+ return true;
+}
+
+int CAEncoder::EncodeProcess(uint8_t* data, uint8_t *pOutBuf[2], int nOutsize)
+{
+ int size_out = nOutsize;
+ int loop_times = 0;
+
+ if (!m_bInit)
+ return -1;
+
+ /* now encode as many frames as possible */
+ if (m_pCodecCtx->frame_size > 1)
+ {
+ fifo_write(m_fifo, data, nOutsize, &m_fifo->wptr);
+ int frame_bytes = m_pCodecCtx->frame_size * 2 * m_pCodecCtx->channels;
+ while (fifo_read(m_fifo, m_audio_buf, frame_bytes, &m_fifo->rptr) == 0)
+ {
+ m_encode_length[loop_times] = avcodec_encode_audio(m_pCodecCtx,
+ pOutBuf[loop_times], 4 * MAX_AUDIO_PACKET_SIZE,
+ (short *) m_audio_buf);
+ ++loop_times;
+ if (loop_times >= 2)
+ break;
+
+ }
+ }
+ else
+ {
+ switch (m_pCodecCtx->codec->id)
+ {
+ case CODEC_ID_PCM_S16LE:
+ case CODEC_ID_PCM_S16BE:
+ case CODEC_ID_PCM_U16LE:
+ case CODEC_ID_PCM_U16BE:
+ break;
+ default:
+ size_out = size_out >> 1;
+ break;
+ }
+ m_encode_length[0] = avcodec_encode_audio(m_pCodecCtx, pOutBuf[0],
+ size_out, (short *) data);
+ loop_times = 1;
+ printf("now encode here!\n");
+ }
+
+ return loop_times;
+
+}
+
+int CAEncoder::Capture(uint8_t** pOutBuf, int &size)
+{
+ int ret;
+ static uint8_t buf[10000];
+ if (!m_bInit)
+ return -1;
+ m_soundcard.sounddata(buf, ret);
+
+ if (ret > 0)
+ {
+ *pOutBuf = buf;
+ size = ret;
+ return ret;
+ }
+
+ return -1;
+}
+
+// For CADecoder class.
+CADecoder::CADecoder()
+{
+ m_pCodec = 0;
+ m_pCodecCtx = 0;
+ m_pSDLBuf = 0;
+ m_bInit = false;
+
+}
+
+CADecoder::~CADecoder()
+{
+
+ m_bInit = false;
+ CloseAudio();
+ if (m_pSDLBuf)
+ {
+ free( m_pSDLBuf);
+ m_pSDLBuf = 0;
+ }
+
+ if (m_pCodecCtx)
+ {
+ avcodec_close( m_pCodecCtx);
+ m_pCodecCtx = 0;
+ }
+
+}
+
+void CADecoder::CloseAudio()
+{
+
+}
+
+bool CADecoder::OpenAudio()
+{
+
+ return true;
+}
+
+bool CADecoder::Init(enum CodecID nCodecID/* = CODEC_ID_MP3*/, int nOutBufSize /*= SDLBufSize*/)
+{
+ m_bInit = false;
+
+ avcodec_init();
+ avcodec_register_all();
+
+ if (!OpenAudio())
+ {
+ printf("\n Open audio device faild!");
+ return false;
+ }
+ //malloc SDLBuf.
+ if (m_pSDLBuf)
+ {
+ free( m_pSDLBuf);
+ m_pSDLBuf = 0;
+ }
+
+ m_pSDLBuf = (uint8_t*) malloc(nOutBufSize * sizeof(uint8_t));
+ if (m_pSDLBuf == 0)
+ {
+ PErrorText("OutBuf malloc failed!");
+ return false;
+ }
+ // find the video decoder
+ m_pCodec = avcodec_find_decoder(nCodecID);
+ if (!m_pCodec)
+ {
+ PErrorText("Codec not found");
+ return false;
+ }
+
+ if (m_pCodecCtx)
+ {
+ avcodec_close( m_pCodecCtx);
+ m_pCodecCtx = 0;
+ }
+ m_pCodecCtx = avcodec_alloc_context();
+
+ // frames per second
+ m_pCodecCtx->frame_rate = A_DECODE_framerate;
+ m_pCodecCtx->frame_rate_base = A_DECODE_frame_rate_base;
+ // emit one intra frame every ten frames
+ m_pCodecCtx->gop_size = A_DECODE_gop_size;
+
+ m_pCodecCtx->bit_rate = AUDIO_DECODE_bit_rate;
+ m_pCodecCtx->sample_rate = AUDIO_DECODE_sample_rate;
+ m_pCodecCtx->channels = 1;
+
+ m_pCodecCtx->codec_type = CODEC_TYPE_AUDIO;
+
+ // we dont send complete frames
+ if (m_pCodec->capabilities & CODEC_CAP_TRUNCATED)
+ m_pCodecCtx->flags |= CODEC_FLAG_TRUNCATED;
+
+ // open it
+ if (avcodec_open(m_pCodecCtx, m_pCodec) < 0)
+ {
+ PErrorText("could not open codec");
+ return false;
+ }
+ m_bInit = true;
+ return true;
+}
+//!Set the capture params
+/*!
+\param fd file handle
+\param bits audio sample type
+\param chn channel
+\param hz frequency
+*/
+int SetFormat(unsigned int fd, unsigned int bits, unsigned int chn,
+ unsigned int hz)
+{
+ int ioctl_val;
+
+ /* set bit format */
+ ioctl_val = bits;
+ if (ioctl(fd, SNDCTL_DSP_SETFMT, &ioctl_val) == -1)
+ {
+ fprintf(stderr, "Set fmt to bit failed:\n");
+ return (-1);
+ }
+ if (ioctl_val != bits)
+ {
+ fprintf(stderr, "do not support bit supported \n");
+ return (-1);
+ }
+
+ /*set channel */
+ ioctl_val = chn;
+ if ((ioctl(fd, SNDCTL_DSP_CHANNELS, &ioctl_val)) == -1)
+ {
+ fprintf(stderr, "Set Audio Channels %d failed:\n", chn);
+ return (-1);
+ }
+ if (ioctl_val != chn)
+ {
+ fprintf(stderr, "do not support channel %d,supported\n", chn);
+ return (-1);
+ }
+
+ /*set speed */
+ ioctl_val = hz;
+ if (ioctl(fd, SNDCTL_DSP_SPEED, &ioctl_val) == -1)
+ {
+ fprintf(stderr, "Set speed to %d failed:\n", hz);
+ return (-1);
+ }
+ if (ioctl_val != hz)
+ {
+ fprintf(stderr, "do not support speed %d,supported is\n", hz);
+ return (-1);
+ }
+
+ return (0);
+}
+
+int CADecoder::DecodeProcess(uint8_t *encodeddata_a,
+ const int encodeddatasize_a)
+{
+
+ static JMutex writemutex;
+ int len;
+ int encodedAudioSize;
+ int outAudioBufSize;
+ int kkk;
+
+ if (!m_bInit)
+ {
+ return -1;
+ }
+
+ if (!writemutex.IsInitialized())
+ {
+ if (!writemutex.Init())
+ {
+ PErrorText("\nDecodeProcess: writemutex Init error\n");
+ return -1;
+
+ }
+ }
+
+ encodedAudioSize = encodeddatasize_a;
+ len = 0;
+ kkk = 0;
+ while (encodedAudioSize > 0)
+ {
+ len = avcodec_decode_audio(m_pCodecCtx, (short *) m_pSDLBuf,
+ &outAudioBufSize, encodeddata_a + kkk, encodedAudioSize);
+ if (len < 0)
+ {
+ PErrorText("Error While Decoding Audio");
+ return -2;
+ }
+
+ encodedAudioSize -= len;
+ kkk += len;
+ }
+ static int s_iloops = 0;
+ static char s_chAudioBuf[STATIC_AUDIO_FRAMES * 2 * 4096];
+ static int s_AudioBuflength = 0;
+ memcpy(s_chAudioBuf + s_AudioBuflength, m_pSDLBuf, outAudioBufSize);
+ s_AudioBuflength += outAudioBufSize;
+ s_iloops++;
+
+ if (outAudioBufSize > 0)
+ if (s_iloops >= STATIC_AUDIO_FRAMES)
+ {
+ writemutex.Lock();
+ static int64_t pre, cur, inteval;
+ pre = av_gettime();
+ //write
+ int fd2;
+ fd2 = open("/dev/dsp", O_WRONLY);
+ if (SetFormat(fd2, AFMT_S16_LE, 1, 44100) < 0)
+ {
+ fprintf(stderr, "cannot set............\n");
+ return (-1);
+ }
+ printf("here test 2 %d , %d ........\n", m_pCodecCtx->sample_rate,
+ fd2);
+ write(fd2, s_chAudioBuf, s_AudioBuflength);
+ close(fd2);
+
+ s_iloops = 0;
+ s_AudioBuflength = 0;
+ cur = av_gettime();
+ inteval = (cur - pre);
+
+ writemutex.Unlock();
+ }
+
+ return 0;
+}
+
+//CStuAudioSender class.
+
+CStuAudioSender::CStuAudioSender()
+{
+ stop = false;
+ m_bInit = 0;
+ m_sendpause = false;
+
+ m_pOutBuf[0] = 0;
+ m_pOutBuf[1] = 0;
+}
+
+CStuAudioSender::~CStuAudioSender()
+{
+ //first stop thread, because m_pOutBuf is being used by Thread();
+ Stop();
+
+ //free buffer.
+ if (m_pOutBuf[0] != 0)
+ free( m_pOutBuf[0]);
+ if (m_pOutBuf[1] != 0)
+ free( m_pOutBuf[1]);
+}
+//!Initialize
+/*!
+\param nPort the port for transmission
+*/
+bool CStuAudioSender::Init(int nPort)
+{
+ if (m_bInit)
+ return true;
+
+ //init rtpsession.
+ RTPSessionParams sessParams1;
+ sessParams1.SetOwnTimestampUnit(1.0 / 30.0); //30 video frames per second
+ sessParams1.SetUsePollThread(0); //background thread to call virtual callbacks - set by default, but just to be sure
+ sessParams1.SetMaximumPacketSize(MAX_PACKET_SIZE);
+ //setup transmission parameters
+ RTPUDPv4TransmissionParams transParams1;
+ transParams1.SetPortbase(nPort);
+ //CREATE THE SESSION
+ int status1 = m_fecrtpsession.Create(sessParams1, &transParams1);
+ if (status1)
+ {
+ // ReportError(status1);
+ return false; //unable to create the session
+ }
+ //must set for fec SendFECPacket.
+ m_fecrtpsession.SetDefaultMark(true);
+ m_fecrtpsession.SetDefaultPayloadType(1);
+ m_fecrtpsession.SetDefaultTimestampIncrement(0);
+
+ for (int i = 0; i <= 1; i++)
+ {
+ if (m_pOutBuf[i] == 0)
+ {
+ m_pOutBuf[i] = (uint8_t*) malloc(CAEncoder::A_OutBufSize);
+ if (m_pOutBuf[i] == 0)
+ {
+ return false;
+ }
+
+ }
+ }
+ //Init vencoder.
+ if (!m_aencoder.Init(ENCODE_ID))
+ {
+ return false;
+ }
+
+ m_bInit = true;
+ return m_bInit;
+}
+//!Start to send
+int CStuAudioSender::Start(char* szFile /* =0 */, bool bIsRecord /* =false */)
+{
+ if (!m_bInit)
+ return -1;
+
+ if (JThread::IsRunning())
+ return 0;
+
+ if (!stopmutex.IsInitialized())
+ {
+ if (stopmutex.Init() < 0)
+ return -2;
+ }
+
+ stop = false;
+
+ if (!m_sendpausemutex.IsInitialized())
+ {
+ if (m_sendpausemutex.Init() < 0)
+ return -2;
+ }
+
+ m_sendpause = false;
+
+ if (JThread::Start() < 0)
+ {
+ return -6;
+ }
+
+ return 0;
+}
+
+void CStuAudioSender::Stop()
+{
+ if (!IsRunning())
+ return;
+
+ stopmutex.Lock();
+ stop = true;
+ stopmutex.Unlock();
+
+ //wait for two minute;
+ sleep(1);
+ if (JThread::IsRunning())
+ {
+ JThread::Kill();
+ }
+ stop = false;
+
+}
+
+void CStuAudioSender::Pause()
+{
+ if (!m_bInit)
+ return;
+ m_sendpausemutex.Lock();
+ m_sendpause = true;
+ m_sendpausemutex.Unlock();
+
+}
+
+void CStuAudioSender::Resume()
+{
+ if (!m_bInit)
+ return;
+
+ m_sendpausemutex.Lock();
+ m_sendpause = false;
+ m_sendpausemutex.Unlock();
+
+}
+
+void *CStuAudioSender::Thread()
+{
+ uint8_t * data;
+ int datasize;
+ int OutBufSzie;
+ int status;
+
+ JThread::ThreadStarted();
+
+ bool stopthread;
+
+ stopmutex.Lock();
+ stopthread = stop;
+ stopmutex.Unlock();
+
+ bool sendpause;
+
+ m_sendpausemutex.Lock();
+ sendpause = m_sendpause;
+ m_sendpausemutex.Unlock();
+
+ int64_t pre_time, cur_time;
+ useconds_t delay;
+ pre_time = av_gettime();
+ while (!stopthread)
+ {
+
+ cur_time = av_gettime();
+ delay = cur_time - pre_time;
+ if (delay < 20000 * 2)
+ {
+ usleep(20000 * 2 - delay);
+ pre_time = av_gettime();
+ }
+
+ if ((status = m_aencoder.Capture(&data, datasize)) < 0)
+ {
+ printf("\naudio capture failed");
+ stopthread = true;
+ }
+ else
+ {
+ if (datasize <= 0)
+ continue;
+ OutBufSzie = datasize;
+ if ((status = m_aencoder.EncodeProcess(data, m_pOutBuf, OutBufSzie))
+ < 0)
+ {
+ printf("\naudio EncodeProcess failed");
+ stopthread = true;
+ }
+ else
+ {
+ if (status > 0)
+ {
+ if (!sendpause)
+ {
+ static int s_iTemp1 = 0;
+ s_iTemp1++;
+ for (int i = 0; i < status; i++)
+ {
+ static char temp_buf[1000];
+ int *temp_p = (int *) temp_buf;
+ static int s_iTemp1 = 0;
+ s_iTemp1++;
+
+ // printf("now send sequen is %d\n",s_iTemp1);
+ *temp_p = s_iTemp1;
+ memcpy(temp_buf + sizeof(int), m_pOutBuf[i],
+ m_aencoder.encodelength(i));
+ m_fecrtpsession.SendPacket(temp_buf,
+ m_aencoder.encodelength(i) + sizeof(int));
+ }
+ //usleep(20000);
+ }
+ }
+
+ m_sendpausemutex.Lock();
+ sendpause = m_sendpause;
+ m_sendpausemutex.Unlock();
+
+ stopmutex.Lock();
+ stopthread = stop;
+ stopmutex.Unlock();
+ }
+ }
+
+ }
+ printf("\nAudio capture thread stoped.\n");
+ return 0;
+}
+
+bool CStuAudioSender::AddDestination(const RTPIPv4Address &des)
+{
+ if (!m_bInit)
+ return false;
+ if (m_fecrtpsession.AddDestination(des) < 0)
+ return false;
+
+ return true;
+}
+
+void CStuAudioSender::ClearDestinations()
+{
+ if (!m_bInit)
+ return;
+ m_fecrtpsession.ClearDestinations();
+}
+
+//CAudioReceiver class.
+
+CAudioReceiver::CAudioReceiver()
+{
+ m_bInit = false;
+}
+
+CAudioReceiver::~CAudioReceiver()
+{
+
+}
+
+bool CAudioReceiver::Init()
+{
+ if (m_bInit)
+ return m_bInit;
+
+ //init video decoder.
+ if (!m_adecoder.Init(DECODE_ID))
+ {
+ return false;
+ }
+
+ m_bInit = true;
+ return m_bInit;
+
+}
+
+int CAudioReceiver::Start(int nPort)
+{
+ if (!m_bInit)
+ return -1;
+
+ if (IsActive())
+ return 0;
+
+ //init rtpsession.
+ RTPSessionParams sessParams1;
+ sessParams1.SetOwnTimestampUnit(1.0 / 30.0); //30 video frames per second
+ sessParams1.SetUsePollThread(1); //background thread to call virtual callbacks - set by default, but just to be sure
+ sessParams1.SetMaximumPacketSize(MAX_PACKET_SIZE);
+ //setup transmission parameters
+ RTPUDPv4TransmissionParams transParams1;
+ transParams1.SetPortbase(nPort);
+ //CREATE THE SESSION
+ int status1 = Create(sessParams1, &transParams1);
+ if (status1)
+ return -2; //unable to create the session
+
+ return 0;
+}
+
+void CAudioReceiver::Stop()
+{
+ Destroy();
+}
+
+void CAudioReceiver::OnRTPPacket(RTPPacket *pack, const RTPTime &receivetime,
+ const RTPAddress *senderaddress)
+{
+ int *iTemp = 0;
+ iTemp = (int *) pack->GetPayloadData();
+ printf("now receive audio sequen is %d\n", *iTemp);
+
+ m_adecoder.DecodeProcess(pack->GetPayloadData() + sizeof(int),
+ pack->GetPayloadLength() - sizeof(int));
+
+}
+
+/* ---------------------------------------------------------------------- */
+
+Soundcard::Soundcard(const char *dev)
+{
+ if (dev)
+ strcpy(devname, dev);
+ else
+ strcpy(devname, "/dev/dsp");
+
+ driver_name[0] = '\0';
+
+ stat = STATUS_CLOSED;
+ get_capabilities();
+ channels = 1;
+ rate = 22050;
+ fd = -1;
+}
+
+Soundcard::~Soundcard()
+{
+ /* nothing */
+ close_dev();
+}
+
+int Soundcard::start_record()
+{
+ switch (stat)
+ {
+ case STATUS_CLOSED:
+ if (!init_done)
+ get_capabilities();
+ if (!init_done)
+ return -1;
+ return open_dev(TRUE);
+ case STATUS_RECORD:
+ return 0;
+ case STATUS_PLAYBACK:
+ close_dev();
+ return open_dev(TRUE);
+ }
+ return -1;
+}
+
+int Soundcard::start_playback()
+{
+ switch (stat)
+ {
+ case STATUS_CLOSED:
+ if (!init_done)
+ get_capabilities();
+ if (!init_done)
+ return -1;
+ return open_dev(FALSE);
+ case STATUS_RECORD:
+ close_dev();
+ return open_dev(FALSE);
+ case STATUS_PLAYBACK:
+ return 0;
+ }
+ return -1;
+}
+
+void Soundcard::get_capabilities()
+{
+ int i, dsp;
+ int try_afmt;
+ int try_channels;
+
+ afmt = 0;
+ if (-1 != (dsp = open(devname, O_RDONLY)))
+ {
+
+ ioctl(dsp, SNDCTL_DSP_SETFMT, &afmt); /* current */
+ ioctl(dsp, SNDCTL_DSP_GETFMTS, &afmt_hw); /* hardware cap */
+ afmt_sw = 0;
+
+ for (i = 0; i < 16; i++)
+ {
+ try_afmt = (1 << i);
+ if (-1 == ioctl(dsp, SNDCTL_DSP_SETFMT, &try_afmt))
+ continue;
+ if (try_afmt != (1 << i))
+ continue;
+ afmt_sw |= try_afmt;
+ }
+
+ try_channels = 2;
+ if (-1 != ioctl(dsp, SNDCTL_DSP_CHANNELS, &try_channels) && 2
+ == try_channels)
+ channels_hw = 2;
+ else
+ channels_hw = 1;
+
+ close(dsp);
+ init_done = 1;
+
+ }
+ else
+ {
+ init_done = 0;
+ }
+}
+
+int Soundcard::open_dev(int record)
+{
+ struct SOUNDPARAMS p;
+ int frag, rrate;
+
+ if (-1 == (fd = open(devname, record ? O_RDONLY : O_WRONLY)))
+ goto err;
+ fcntl(fd, F_SETFD, FD_CLOEXEC);
+
+ /* try to get ~50 ms latency */
+ blocksize = 50 * channels * rate / 1000;
+ if (afmt == AFMT_U16_BE || afmt == AFMT_S16_BE || afmt == AFMT_U16_LE
+ || afmt == AFMT_S16_LE)
+ blocksize *= 2;
+ for (frag = 0; blocksize != 1; frag++)
+ blocksize >>= 1;
+#if 0
+ fprintf(stderr,"asking for %d byte blocksize\n",1 << frag);
+#endif
+ frag |= 0x7fff0000;
+ if (-1 == ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &frag))
+ perror("ioctl SNDCTL_DSP_SETFRAGMENT");
+
+ rrate = rate;
+ if (-1 == ioctl(fd, SNDCTL_DSP_SETFMT, &afmt))
+ {
+ perror("ioctl SNDCTL_DSP_SETFMT");
+ goto err;
+ }
+ if (-1 == ioctl(fd, SNDCTL_DSP_CHANNELS, &channels))
+ {
+ perror("ioctl SNDCTL_DSP_SETFMT");
+ goto err;
+ }
+ if (-1 == ioctl(fd, SNDCTL_DSP_SPEED, &rrate))
+ {
+ perror("ioctl SNDCTL_DSP_SETFMT");
+ goto err;
+ }
+ if (-1 == ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &blocksize))
+ {
+ perror("ioctl SNDCTL_DSP_SETFMT");
+ goto err;
+ }
+ if (0 == blocksize)
+ blocksize = 4096;
+ if (rrate != rate)
+ {
+ fprintf(stderr, "sample rate: asked for %d, hardware uses %d. ", rate,
+ rrate);
+ if (abs(rate - rrate) * 100 < rate)
+ {
+ fprintf(stderr, "that's fine (diff <1%%).\n");
+ }
+ else
+ {
+ fprintf(stderr, "way off, using hardware rate.\n");
+ rate = rrate;
+ }
+ }
+
+ latency = blocksize * 1000 / channels / rate;
+ if (afmt == AFMT_U16_BE || afmt == AFMT_S16_BE || afmt == AFMT_U16_LE
+ || afmt == AFMT_S16_LE)
+ latency = latency / 2;
+
+ stat = record ? STATUS_RECORD : STATUS_PLAYBACK;
+#if 0
+ fprintf(stderr,"%s (format=%d, %s, rate=%d, blocksize=%d, latency=%d ms)\n",
+ record ? "recording" : "playback",
+ afmt,
+ (channels == 2) ? "stereo" : "mono",
+ rate, blocksize, latency);
+#endif
+ p.channels = channels;
+ p.rate = rate;
+ p.blocksize = blocksize;
+ p.latency = latency;
+ switch (afmt)
+ {
+ case AFMT_U8:
+ p.format = FMT_8BIT;
+ break;
+ case AFMT_S16_LE:
+ p.format = FMT_16BIT;
+ break;
+ default:
+ fprintf(stderr, "oops(open): unsupported sound format\n");
+ exit(1);
+ }
+
+ if (record)
+ {
+ trigger = ~PCM_ENABLE_INPUT;
+ ioctl(fd, SNDCTL_DSP_SETTRIGGER, &trigger);
+ trigger = PCM_ENABLE_INPUT;
+ ioctl(fd, SNDCTL_DSP_SETTRIGGER, &trigger);
+ }
+ return 0;
+
+ err: if (-1 != fd)
+ close( fd);
+ stat = STATUS_CLOSED;
+ fd = -1;
+ return -1;
+}
+
+void Soundcard::close_dev()
+{
+ close( fd);
+ fd = -1;
+ stat = STATUS_CLOSED;
+
+ return;
+}
+
+void Soundcard::setparams(struct SOUNDPARAMS *p)
+{
+ rate = p->rate;
+ channels = p->channels;
+ switch (p->format)
+ {
+ case FMT_8BIT:
+ afmt = AFMT_U8;
+ break;
+ case FMT_16BIT:
+ afmt = AFMT_S16_LE;
+ break;
+ default:
+ fprintf(stderr, "oops(set): unsupported sound format\n");
+ exit(1);
+ }
+
+ switch (stat)
+ {
+ case STATUS_RECORD:
+ close_dev();
+ open_dev( TRUE);
+ break;
+ case STATUS_PLAYBACK:
+ close_dev();
+ open_dev( FALSE);
+ break;
+ case STATUS_CLOSED:
+ if (!init_done)
+ get_capabilities();
+ if (!init_done)
+ return;
+ if (0 == open_dev(TRUE))
+ close_dev();
+ break;
+ }
+ printf("\nchannels=%d\n", channels);
+ printf("\nrate=%d\n", rate);
+ printf("\nblocksize=%d\n", blocksize);
+ printf("\nlatency=%d\n", latency);
+
+}
+
+void
+//Soundcard::sounddata(int s)
+Soundcard::sounddata(uint8_t* buf, int &size)
+{
+ int rc, have;
+
+ switch (stat)
+ {
+ case STATUS_RECORD:
+ /* read */
+ for (have = 0; have < blocksize;)
+ {
+ rc = read(fd, buf + have, blocksize - have);
+ switch (rc)
+ {
+ case -1:
+ {
+ printf("\naudio capture failed\n");
+ size = -1;
+ return;
+ }
+ break;
+ case 0:
+ fprintf(stderr, "Huh? got 0 bytes from sound device?\n");
+ exit(1);
+ default:
+ have += rc;
+ }
+ }
+ size = have;
+ break;
+ case STATUS_PLAYBACK:
+ if (-1 != fd)
+ write(fd, buffer, blocksize);
+ break;
+ }
+}
Added: incubator/bluesky/trunk/RealClass/Student/src/en_de_audio.h
URL: http://svn.apache.org/viewvc/incubator/bluesky/trunk/RealClass/Student/src/en_de_audio.h?rev=885395&view=auto
==============================================================================
--- incubator/bluesky/trunk/RealClass/Student/src/en_de_audio.h (added)
+++ incubator/bluesky/trunk/RealClass/Student/src/en_de_audio.h Mon Nov 30 12:18:34 2009
@@ -0,0 +1,309 @@
+/** \file en_de_audio.h Classes for audio operation:capture,encoder,decoder,sender,receiver
+*
+*
+*Licensed to the Apache Software Foundation (ASF) under one
+*or more contributor license agreements. See the NOTICE file
+*distributed with this work for additional information
+*regarding copyright ownership. The ASF licenses this file
+*to you under the Apache License, Version 2.0 (the
+*"License"); you may not use this file except in compliance
+*with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+*Unless required by applicable law or agreed to in writing,
+*software distributed under the License is distributed on an
+*"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*KIND, either express or implied. See the License for the
+*specific language governing permissions and limitations
+*under the License.
+*/
+
+#include "fecrtpsession.h"
+#include <iostream>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <linux/types.h>
+#include <linux/videodev.h>
+#include <time.h>
+// FFmpeg
+#include <ffmpeg/avcodec.h>
+#include <ffmpeg/avformat.h>
+// X11
+#include <X11/Intrinsic.h>
+#include <X11/XWDFile.h>
+
+// Jthread and JMutex
+#include <jthread.h>
+#include <jmutex.h>
+
+// Audio
+#include <linux/soundcard.h>
+
+#define STATUS_CLOSED 0
+#define STATUS_RECORD 1
+#define STATUS_PLAYBACK 2
+
+#define FMT_UNDEFINED 0
+#define FMT_8BIT 1 /* unsigned */
+#define FMT_16BIT 2 /* signed - native byte order */
+#define FMT_MULAW 4 /* NOT SUPPORTED (yet) */
+#define FMT_ALAW 8 /* NOT SUPPORTED (yet) */
+
+#define FMT_MAX 2
+//!sound card params
+struct SOUNDPARAMS
+{
+ int format;
+ int channels;
+ int rate;
+ int blocksize;
+ int latency;
+};
+//!sound card operation
+class Soundcard
+{
+
+public:
+ /* sound card capabilities */
+ char devname[32];
+ int init_done;
+ int afmt_hw;
+ int afmt_sw;
+ int channels_hw;
+
+ int trigger;
+ char driver_name[64];
+
+ /* current settings */
+ int afmt;
+ int channels;
+ int rate;
+ int blocksize;
+ int latency;
+
+ //!file handle
+ int fd;
+ //!reference count
+ int stat;
+ char buffer[65536];
+
+ /* internal functions */
+ //!get capabilities
+ void get_capabilities();
+ //!open device
+ int open_dev(int record);
+ //close device
+ void close_dev();
+
+public:
+ //!constructor
+ Soundcard(const char *dev);
+ //!Destructor
+ ~Soundcard();
+ //!set sound card param
+ void setparams(struct SOUNDPARAMS *params);
+ //!start record
+ int start_record();
+ // strat playback
+ int start_playback();
+
+public:
+ //!set sound data
+ void sounddata(uint8_t* buf, int &size);
+
+};
+
+#if !defined(_EN_DE_AUDIO_H__INCLUDED_)
+#define _EN_DE_AUDIO_H__INCLUDED_
+
+//!Audio decoder class.
+class CADecoder
+{
+public:
+ //!constructor
+ CADecoder();
+ //!Destructor
+ virtual ~CADecoder();
+ //!Decode a frame
+ /*!
+ \param encodeddata_a the pointer to data
+ \param encodeddatasize_a data size
+ */
+ int DecodeProcess(uint8_t *encodeddata_a, const int encodeddatasize_a);
+ //!Initialize
+ /*!
+ \param nCodecID the specific CODEC_ID, use CODEC_ID_MP3
+ \param nOutBufSize the decoded data buffer size
+ */
+ bool Init(enum CodecID nCodecID = CODEC_ID_MP3, int nOutBufSize =
+ A_SDLBufSize);
+private:
+ enum ADECODERBUFSIZE
+ {
+ A_SDLBufSize = AVCODEC_MAX_AUDIO_FRAME_SIZE
+ };
+ //!Param for the ENCODEC
+ enum AUDIO_DECODEC_PARA
+ {
+ AUDIO_DECODE_bit_rate = 64000,
+ AUDIO_DECODE_sample_rate = 44100,
+ A_DECODE_framerate = 25,
+ A_DECODE_frame_rate_base = 1,
+ A_DECODE_gop_size = 12
+ };
+
+ //!Bool variable to mark the initiallise
+ bool m_bInit;
+ //!AVCodec Instance to store the codec
+ AVCodec *m_pCodec;
+ //!AVCodecContext Instance to store the codec content
+ AVCodecContext *m_pCodecCtx;
+ //!Buffer to store the decoded data
+ uint8_t *m_pSDLBuf;
+
+ //!open audio device
+ bool OpenAudio();
+ //!close audio device
+ void CloseAudio();
+
+};
+//!Audio Encoder class
+class CAEncoder
+{
+ friend class CStuAudioSender;
+public:
+ //!Constructor
+ CAEncoder();
+ //!Virtual Donstructor
+ virtual ~CAEncoder();
+ //!capture data
+ int Capture(uint8_t** pOutBuf, int &size);
+ //!Encode a frame
+ /*!
+ \param data the pointer to captured data
+ \param pOutBuf the buffer to store encoded data
+ \param nOutsize the encoded data size
+ */
+ int EncodeProcess(uint8_t* data, uint8_t *pOutBuf[2], int nOutsize);
+ //!Initialize
+ /*!
+ \param nCodecID the specific CODEC_ID, use CODEC_ID_MP3
+ */
+ bool Init(enum CodecID nCodecID = CODEC_ID_MP2);
+ //!Get the encoded data length
+ inline int encodelength(int i)
+ {
+ return m_encode_length[i];
+ }
+ //!Soundcard Instance
+ Soundcard m_soundcard;
+ //!Buffer for encode
+ uint8_t* m_audio_buf;
+ //!FifoBuffer to read the audio data to encode
+ FifoBuffer *m_fifo;
+private:
+ //!open audio device
+ bool OpenAudio();
+ //!close audio device
+ void CloseAudio();
+ //!Params for the ENCODEC
+ enum AUDIO_ENCODEC_PARA
+ {
+ AUDIO_ENCODE_bit_rate = 64000,
+ AUDIO_ENCODE_sample_rate = 44100,
+ A_ENCODE_framerate = 25,
+ A_ENCODE_frame_rate_base = 1,
+ A_ENCODE_gop_size = 12
+ };
+ //!Define encode buffer size
+ enum AENCODERBUFSIZE
+ {
+ A_OutBufSize = 4 * 128 * 1024
+ };//128000
+
+ //!Bool variable to mark the initiallise
+ bool m_bInit;
+ //!AVCodec Instance to store the codec
+ AVCodec *m_pCodec;
+ //!AVCodecContext Instance to store the codec content
+ AVCodecContext *m_pCodecCtx;
+ //!To store Encoded data
+ int m_encode_length[2];
+
+};
+//!Student Audio Sender class
+class CStuAudioSender: private JThread
+{
+public:
+ //!Constructor
+ CStuAudioSender();
+ //!Destructor
+ ~CStuAudioSender();
+
+ bool Init(int nPort);
+ //!Add Destination
+ bool AddDestination(const RTPIPv4Address &des);
+ //!Clear Destinations
+ void ClearDestinations();
+ int Start(char* szFile = 0, bool bIsRecord = false);
+ //!Pause to send
+ void Pause();
+ //!Resume to send
+ void Resume();
+private:
+ //!Stop to send
+ void Stop();
+ //!sender thread
+ void *Thread();
+ //!thread stop status
+ bool stop;
+ //!mutex for the thread stop
+ JMutex stopmutex;
+private:
+ //!CAEncoder Instance
+ CAEncoder m_aencoder;
+ //!store the data
+ uint8_t *m_pOutBuf[2]; //only record endcode data 2 times
+ //!RTPSession Instance
+ RTPSession m_fecrtpsession;
+ //!mark the init status
+ int m_bInit;
+ //!mark pause status
+ bool m_sendpause;
+ //!mutex for send pause
+ JMutex m_sendpausemutex;
+};
+
+//!Audio Receiver class
+class CAudioReceiver: public RTPSession
+{
+public:
+ //!Constructor
+ CAudioReceiver();
+ //!Virtual Destructor
+ virtual ~CAudioReceiver();
+ //!Initialize
+ bool Init();
+ //!Start Receive audio data
+ int Start(int nPort);
+ //!Stop receive audio data
+ void Stop();
+
+private:
+ //!Deal with the RTPPacket
+ virtual void OnRTPPacket(RTPPacket *pack, const RTPTime &receivetime,
+ const RTPAddress *senderaddress);
+
+private:
+ //!mark the init status
+ bool m_bInit;
+ CADecoder m_adecoder;
+};
+
+#endif // !defined(_EN_DE_AUDIO_H__INCLUDED_)