Date: 10/13/98
Name of group: Phonetics
Team members: Chin-Yu Hsu, Michael Shen
Task: Multiparty audio conferencing + whiteboard (#8)
Brief description [as per webpage]: The telephone network carries the voice between participants, and a shared whiteboard allows participants to share a graphic workspace. Existing whiteboard applications such as wb or Web-based whiteboards, may be reused. Weare to design and implement a conference control application to allow participants to join and leave conferences (some conferences may be private, and not allow random users to join), and to allow a speaker to cede control to one of a set of waiting speakers. The control scheme should also allow users who may not be accessible on the Internet to have an audio-only connection to a conference.
Pseudocode:
// Entry Point
main()
{
LogonUser(); // figure out who is using this program
ConfThreadList->Initialize;
CreateThread(RequestHandler);
Do While !User->Quit
If User->StartNewConf Then
NewCallHandler();
If User->ListAvailConf Then
// Call some conference list server and obtain conferences
// this user is allowed to join
Endif
End Do
}
// Add a caller to a conference(or start a new conference)
RequestHandler()
{
Do
If $Caller = Signal->NewTalkRequest() Then
$ConfNum = AskUser("Join which Conference?", $Caller);
if Exist ConfThreadList($ConfNum) AND
ConfThreadList($ConfNum)->Allow($Caller) Then
ConfThreadList($ConfNum)->AddNewClient( $Caller );
Else if $ConfNum = NULL Then
ConfThreadList($ConfNum)->Init(); // Init will ops the callee
ConfThreadList($ConfNum)->AddNewClient( $Caller );
Else
Signal->RejectCaller();
Endif
End if
End Do
}
// Start a new conference by calling someone else...
NewCallHandler()
{
$Caller = AskUser("Who do you want to call?");
$ConfNum = A conference ID not in ConfThreadList;
ConfThreadList($ConfNum)->InitAndCall( $Caller );
}
Let $X = 1 to (# of threads in ConfThreadList)
ConfThreadList($X)->Handler()
{
Do While !User->Quit
Switch User->Command()
GiveOp:
ASSERT( User->HasOps );
$UserToOp->HasOps = TRUE;
break;
DenyOp:
ASSERT( User->HasOps );
$UserToOp->HasOps = FALSE;
break;
GiveTalk:
ASSERT( User->HasOps );
$UserToTalk->CanTalk = TRUE;
break;
DenyTalk:
ASSERT( User->HasOps );
$UserToTalk->CanTalk = FALSE;
break;
GiveModWhiteBoard:
ASSERT( User->HasOps );
$UserToTalk->CanModWhiteBoard = TRUE;
break;
DenyModWhiteBoard:
ASSERT( User->HasOps );
$UserToTalk->CanModWhiteBoard = FALSE;
break;
Invite:
ASSERT( User->HasOps );
AddToAllowList( $UserToInvite );
break;
UnInvite:
ASSERT( User->HasOps );
DelFromAllowList( $UserToInvite );
break;
Ban:
ASSERT( User->HasOps );
AddToBanList( $UserToBan );
break;
UnBan:
ASSERT( User->HasOps );
DelFromBanList( $UserToBan );
break;
MakePrivate:
ASSERT( User->HasOps );
MakeConfPrivate($X);
break;
MakePublic:
ASSERT( User->HasOps );
MakeConfPublic($X);
break;
Talk:
ASSERT( User->CanTalk || User->HasOps );
SendVoicePacket( All Users in this Thread );
break;
ModifyWhiteBoard:
ASSERT( User->CanModWhiteBoard || User->HasOps );
SendWhiteBoardCommand( All Users in thread, White Board Modification );
break;
CallNewUser:
$Caller = AskUser("Who do you want to call?");
CallAndAddNewClient( $Caller );
break;
Exit:
GoodBye();
break;
End Switch
End Do
}
Interfaces to provide:
Our application does not provide any interfaces.
Interfaces used:
Directory Service – access of the user info in their database. We would need the following standard directory API functions to be implemented for our use:
Class DirectoryInfo {
// given a phone number, returns unique person ID
SearchPhoneNumber()
// given an IP, returns unique person ID
SearchIP()
// given unique person ID, returns location of person (IP and phone number)
LookupPerson()
}
Also, we require a data structure from the directory service that contains the ongoing conferences and the users who are currently in the conference:
Class ConferenceList{
// returns a listing of all ongoing conferences
ListAll();
// add unique user ID to list
AddToList();
// delete unique user ID from list
DeleteFromList();
}
Signal – initial handshake and confirmation between the telephone and the connection to teleconferencing. We would need the following API functions to be implemented for our use:
Class DesktopSignaling {
// returns unique person ID who wants to connect to the teleconferencing
RegisterUpcallForINcomingConnection();
// returns handle to the actual phone connection
Dial();
// ends telephone call
Hangup();
// allows the call
AcceptCall();
// disallow the call
RejectCall();
}
Data – transmission of packets over the Internet. We would need the following API functions to be implemented for our use:
Class Connection {
// given packet size, sends out packets of that set size
WriteData();
// given packet size, read packets of that set size
ReadData();
// given IP, creates the connection
Open();
// given handle to connection, close it
Close();
}
Schedule:
October:
1st week – compare and discuss project descriptions with all the other groups and make sure we agree on the specifications we requested. iron out and discrepancies.
2nd week – convert pseudo-code to working code
3rd week – convert pseudo-code to working code
4th week – convert pseudo-code to working code
November:
1st week – convert pseudo-code to working code
2nd week – convert pseudo-code to working code
3rd week – understand and test given interfaces (data, signal and directory) to make sure it works according to specification
4th week – debug our code with given interfaces
December:
1st week - continue to debug our code making sure it works according to specification in the overall presentation of project.
2nd week – finalize project: resolve any last minute unforeseen problems that may occur.
Materials needed:
Documentation/Help on implementation of real time full-duplex audio transmissions.
1. signaling provides info for billing
References: