{"id":17995840,"url":"https://github.com/doubangotelecom/idoubs","last_synced_at":"2025-10-24T14:31:47.727Z","repository":{"id":36756277,"uuid":"41062934","full_name":"DoubangoTelecom/idoubs","owner":"DoubangoTelecom","description":"SIP/IMS VideoPhone for iOS (iPhone, iPad and iPod Touch) and MAC OS X","archived":false,"fork":false,"pushed_at":"2018-09-06T19:11:02.000Z","size":5939,"stargazers_count":111,"open_issues_count":71,"forks_count":41,"subscribers_count":15,"default_branch":"master","last_synced_at":"2024-12-17T09:25:42.300Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://doubango.org","language":"Objective-C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DoubangoTelecom.png","metadata":{"files":{"readme":"readme.txt","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-08-19T22:30:46.000Z","updated_at":"2024-05-20T21:15:13.000Z","dependencies_parsed_at":"2022-07-29T21:39:10.065Z","dependency_job_id":null,"html_url":"https://github.com/DoubangoTelecom/idoubs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoubangoTelecom%2Fidoubs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoubangoTelecom%2Fidoubs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoubangoTelecom%2Fidoubs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoubangoTelecom%2Fidoubs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DoubangoTelecom","download_url":"https://codeload.github.com/DoubangoTelecom/idoubs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237986890,"owners_count":19397810,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-29T21:11:48.015Z","updated_at":"2025-10-24T14:31:42.683Z","avatar_url":"https://github.com/DoubangoTelecom.png","language":"Objective-C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"iOS NGN Stack\nThis version of the NGN stack is based on Doubango v2.x and has been developed from scratch. If you are using iDoubs v1.x you MUST know that it won't work with this NGN stack.\n\n1) == Building the source code ==\n\nTo build the source code you will need: xcode 3.x or later, iOS SDK 4.x or later and svn tools.\n\na) open new Terminal (Applications =\u003e Utilities =\u003e Terminal)\n\nb) from the command line, login as root\nsudo -i\n\nc) Create new directory named mydoubs anywhere in your disk\nmkdir mydoubs\ncd mydoubs\n\nd) checkout doubango source code (both trunk and branches) into mydoubs. Important: The destination folder MUST be named doubango.\nsvn checkout http://doubango.googlecode.com/svn/ doubango\n\ne) create new folder named iPhone into mydoubs\nmkdir iPhone\ncd iPhone\n\nf) checkout ios-ngn-stack source code into iPhone folder. Important: The destination folder MUST be named idoubs.\nsvn checkout http://idoubs.googlecode.com/svn/ idoubs\n\ng) change mydoubs folder permissions\ncd ../..\nchmod -R 777 mydoubs/*\n\nh) open mydoubs/iPhone/idoubs/branches/2.0/ios-ngn-stack.xcodeproj\n\t1) Very Important: make sure that the right base sdk is selected (iOS SDK x.y): Right click on \"ios-ngn-stack\" =\u003e \"Get Info\" =\u003e \"Build\" tab =\u003e From \"Architectures\" group adjust \"Base SDK\" and select \"iOS x.y\".\n\t2) build Doubango: Right click on \"Doubango\" aggregated target and select \"Build Doubango\"\n\t3) build the NGN stack: Right click on \"ios-ngn-stack\" target and select \"Build ios-ngn-stack\"\n\t4) build the audio test application: Right click on \"testAudioCall\" and select \"Build testAudioCall\". For now don't try to run the test application. See next section for more information.\n\n2) == Adjusting your credentials ==\nThe default credentials use sip2sip.info and should work for all users. Before changing these credentials you can try to use these credentials to be sure that there are no network issues.\na) From xcode, open Tests/testAudioCall/TestAudioCall.mm\nb) From line 13 to 19 you have the default credentials used by the test application. Change them to yours!\nc) Right click on \"testAudioCall\" target and select \"Build testAudioCall and Start\". If your credentials are correct then you should auto. login (green bar).\nEnter any phone number and press \"Audio Call\" to make a call.\n\n3) == Audio Quality ==\nThe NGN stack contains two audio system implementations: AudioQueue and AudioUnit. By default we use AudioUnit because this one contains a native echo canceler and Acoustic gain control. However, AudioUnit is under dev. and not so mature. If you experiment bad (outgoing) voice quality using AudioUnit then just switch to AudioQueue like this:\na) From xcode, right click on \"ios-ngn-stack\", select \"Get info\" then \"Build\" tab\nb) scroll to \"GCC x.y - Language\" and double click on \"Other C Flags\" value\nc) set -DHAVE_COREAUDIO_AUDIO_UNIT value to 0 and -DHAVE_COREAUDIO_AUDIO_QUEUE value to 1\nd) Rebuild both \"Doubango\" and \"ios-ngn-stack\" targets\nEt voilà\n\n4) == Short presentation for developers ==\nRight now the documentation is not ready yet but if you are already developing with \"android-ngn-stack\" you should not have any problem with \"ios-ngn-stack\" as we are using the same classes, functions, engine, philosophy, …\nThe best way to start programing with the NGN stack is to study the source code of \"testAudioCall\" application. In the coming days we will release the source code of iDoubs.\n\na) Including all header files\nin order to have access to all functions of the framework, you must include the stack header file: \n#import \"iOSNgnStack.h\"\n\nb) getting an instance of the engine and starting it\nNgnEngine* mEngine = [[NgnEngine getInstance] retain]; // do not forget to call -release when you no longer need this instance\nBOOL ok = [mEngine start];\nstaring the engine will start all underlying services (sip, configuration, contacts, …)\n\nc) getting the configuration service and setting the user credentials\nNgnBaseService\u003cINgnConfigurationService\u003e* mConfigurationService = [mEngine.configurationService retain]; // do not forget to call -release when you no longer need this instance\n[mConfigurationService setStringWithKey: IDENTITY_IMPI andValue: @\"johndoe\"];\n[mConfigurationService setStringWithKey: IDENTITY_IMPU andValue: @\"sip:johndoe@doubango.org\"];\n[mConfigurationService setStringWithKey: IDENTITY_PASSWORD andValue: @\"mysecret\"];\n[mConfigurationService setStringWithKey: NETWORK_REALM andValue: @\"doubango.org\"];\n[mConfigurationService setStringWithKey: NETWORK_PCSCF_HOST andValue: @\"192.168.0.1\"];\n[mConfigurationService setIntWithKey: NETWORK_PCSCF_PORT andValue: 5060];\n[mConfigurationService setBoolWithKey: NETWORK_USE_EARLY_IMS andValue: TRUE];\n\nd) observing registration state\n// declare the selector like this:\n-(void) onRegistrationEvent:(NSNotification*)notification {\n\tNgnRegistrationEventArgs* eargs = [notification object];\n\tswitch (eargs.eventType) {\n\t\tcase REGISTRATION_INPROGRESS:\n\t\tcase UNREGISTRATION_INPROGRESS:\n\t\tcase REGISTRATION_OK:\n\t\tcase REGISTRATION_NOK:\n\t\tcase UNREGISTRATION_OK:\n\t\tcase UNREGISTRATION_NOK:\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n// add the observer like this:\n[[NSNotificationCenter defaultCenter]\n\t addObserver:self selector:@selector(onRegistrationEvent:) name:kNgnRegistrationEventArgs_Name object:nil];\n// do not forget to remove the observer using -removeObserver when you no longer need it\n\ne) observing audio/video call state\n// declare the observer like this:\n-(void) onInviteEvent:(NSNotification*)notification {\n\tNgnInviteEventArgs* eargs = [notification object];\n\t\n\tswitch (eargs.eventType) {\n\t\tcase INVITE_EVENT_INCOMING:\n    \t\tcase INVITE_EVENT_INPROGRESS:\n    \t\tcase INVITE_EVENT_RINGING:\n    \t\tcase INVITE_EVENT_EARLY_MEDIA:\n    \t\tcase INVITE_EVENT_CONNECTED:\n    \t\tcase INVITE_EVENT_TERMWAIT:\n    \t\tcase INVITE_EVENT_TERMINATED:\n   \t\tcase INVITE_EVENT_LOCAL_HOLD_OK:\n    \t\tcase INVITE_EVENT_LOCAL_HOLD_NOK:\n    \t\tcase INVITE_EVENT_LOCAL_RESUME_OK:\n    \t\tcase INVITE_EVENT_LOCAL_RESUME_NOK:\n    \t\tcase INVITE_EVENT_REMOTE_HOLD:\n    \t\tcase INVITE_EVENT_REMOTE_RESUME:\n\t\t\tbreak;\n\t}\n}\n// add the observer like this:\n[[NSNotificationCenter defaultCenter]\n\t addObserver:self selector:@selector(onInviteEvent:) name:kNgnInviteEventArgs_Name object:nil];\n// do not forget to remove the observer using -removeObserver when you no longer need it\n\nf) Getting an instance of the sip service\nNgnBaseService\u003cINgnSipService\u003e* mSipService = [mEngine.sipService retain]; // do not forget to call -release when you no longer need this instance\n\ng) registering (login)\nBOOL ok = [mSipService registerIdentity];\nregistration progress will be notified to -onRegistrationEvent:\nat anytime you can check the registration state using -getRegistrationState (\u003cINgnSipService\u003e)\nunregistering : [mSipService unRegisterIdentity];\n\nh) making audio call to @\"007\"\nNgnAVSession* audioCall = [[NgnAVSession makeAudioCallWithRemoteParty: @\"sip:007@doubango.org\" \n\t\tandSipStack: [mSipService getSipStack]] retain]; // do not forget to call -release when you no longer need this instance\ncall progress will be notified to -onInviteEvent:\nwhen notification comes and -onInviteEvent is called, then you can compare the session ids to check if the notification is for YOUR \"audioCall\":\n// if(eargs.sessionId == audioCall.id) it's mine\nto hangup the call: [audioCall hangUpCall];\nto hold the call: [audioCall holdCall];\nto resume the call: [audioCall resumeCall];\nto send dtmf (e.g. \"1\"): [audioCall sendDTMF: 1];\netc etc...\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoubangotelecom%2Fidoubs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdoubangotelecom%2Fidoubs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoubangotelecom%2Fidoubs/lists"}