//// //// SMLinphoneConfig.m //// SiMiCloudShare //// //// Created by MAC_OSSS on 17/4/17. //// Copyright © 2017年 MAC_OSSS. All rights reserved. //// // //#import "SMLinphoneConfig.h" //#import "LinphoneManager.h" // //NSString *const ES_ON_REMOTE_OPEN_CEMERA = @"ES_ON_REMOTE_OPEN_CEMERA"; //NSString *const ES_ON_CALL_COMMING = @"ES_ON_CALL_COMMING"; //NSString *const ES_ON_CALL_END = @"ES_ON_CALL_END"; //NSString *const ES_ON_CALL_STREAM_UPDATE = @"ES_ON_CALL_STREAM_UPDATE"; // // ////static SMLinphoneConfig *linphoneCfg = nil; //@implementation SMLinphoneConfig // //static SMLinphoneConfig* _instance = nil; // //+(instancetype) instance //{ // static dispatch_once_t onceToken ; // dispatch_once(&onceToken, ^{ // _instance = [[super allocWithZone:NULL] init] ; // }) ; // // return _instance ; //} // //+(id)allocWithZone:(struct _NSZone *)zone //{ // return [SMLinphoneConfig instance]; //} // //-(id)copyWithZone:(struct _NSZone *)zone //{ // return [SMLinphoneConfig instance]; //} // //- (instancetype)init { // self = [super init]; // if (self) { // [[LinphoneManager instance] startLinphoneCore]; // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onCallUpdate:) name:kLinphoneCallUpdate object:nil]; // } // return self; //} // //- (void)dealloc { // [[NSNotificationCenter defaultCenter] removeObserver:self]; //} // ////+ (SMLinphoneConfig *)instance{ //// //// @synchronized(self) { //// //// if (linphoneCfg == nil) { //// //// linphoneCfg = [[SMLinphoneConfig alloc] init]; //// } //// } //// return linphoneCfg; ////} //#pragma mark - 注册 //- (void)registeByUserName:(NSString *)userName pwd:(NSString *)pwd domain:(NSString *)domain tramsport:(NSString *)transport{ // // //设置超时 // linphone_core_set_inc_timeout(LC, 60); // // //创建配置表 // LinphoneProxyConfig *proxyCfg = linphone_core_create_proxy_config(LC); // // //初始化电话号码 // linphone_proxy_config_normalize_phone_number(proxyCfg,userName.UTF8String); // // //创建地址 // NSString *address = [NSString stringWithFormat:@"sip:%@@%@",userName,domain];//如:sip:123456@sip.com // LinphoneAddress *identify = linphone_address_new(address.UTF8String); // // linphone_proxy_config_set_identity_address(proxyCfg, identify); // // linphone_proxy_config_set_route( // proxyCfg, // [NSString stringWithFormat:@"%s;transport=%s", domain.UTF8String, transport.lowercaseString.UTF8String] // .UTF8String); // linphone_proxy_config_set_server_addr( // proxyCfg, // [NSString stringWithFormat:@"%s;transport=%s", domain.UTF8String, transport.lowercaseString.UTF8String] // .UTF8String); // // linphone_proxy_config_enable_register(proxyCfg, TRUE); // // // //创建证书 // LinphoneAuthInfo *info = linphone_auth_info_new(userName.UTF8String, nil, pwd.UTF8String, nil, nil, linphone_address_get_domain(identify)); // // //添加证书 // linphone_core_add_auth_info(LC, info); // // //销毁地址 // linphone_address_unref(identify); // // LinphoneSipTransports stransportValue = {-1,-1,-1,-1}; // // linphone_core_set_sip_transports(LC, &stransportValue); // // //注册 // linphone_proxy_config_enable_register(proxyCfg, 1); // // // 设置一个SIP路线 外呼必经之路 // linphone_proxy_config_set_route(proxyCfg,domain.UTF8String); // // //添加到配置表,添加到linphone_core // linphone_core_add_proxy_config(LC, proxyCfg); // // //设置成默认配置表 // linphone_core_set_default_proxy_config(LC, proxyCfg); // // // //设置音频编码格式 //// [self synchronizeCodecs:linphone_core_get_audio_codecs(LC)]; // // [self synchronizeVideoCodecs:linphone_core_get_video_codecs(LC)]; // //} //#pragma mark - 设置音频编码格式 //- (void)synchronizeCodecs:(const MSList *)codecs { // // PayloadType *pt; // const MSList *elem; // // for (elem = codecs; elem != NULL; elem = elem->next) { // // pt = (PayloadType *)elem->data; // //// NSString *sreung = [NSString stringWithFormat:@"%s", pt->mime_type]; //// NSString *normalBt = [NSString stringWithFormat:@"%d",pt->clock_rate]; //// if ([sreung isEqualToString:@"G729"]) { // // linphone_core_enable_payload_type(LC,pt, YES); // //// } //// else //// { //// //// linphone_core_enable_payload_type(LC, pt, 0); //// } // // } //} //#pragma mark - 设置视频编码格式 //- (void)synchronizeVideoCodecs:(const MSList *)codecs { // // PayloadType *pt; // const MSList *elem; // // for (elem = codecs; elem != NULL; elem = elem->next) { // // pt = (PayloadType *)elem->data; // NSString *sreung = [NSString stringWithFormat:@"%s", pt->mime_type]; // if ([sreung isEqualToString:@"H264"]) { // // linphone_core_enable_payload_type(LC, pt, 1); // // }else { // // linphone_core_enable_payload_type(LC, pt, 0); // } // } //} // //- (NSMutableArray *)getAllEnableVideoCodec{ // // NSMutableArray *codeArray = [NSMutableArray array]; // // PayloadType *pt; // const MSList *elem; // // for (elem = linphone_core_get_video_codecs(LC); elem != NULL; elem = elem->next) { // // pt = (PayloadType *)elem->data; // // NSString *sreung = [NSString stringWithFormat:@"%s", pt->mime_type]; // if (linphone_core_payload_type_enabled(LC,pt)) { // [codeArray addObject:sreung]; // } // } // return codeArray; // //} //- (NSMutableArray *)getAllEnableAudioCodec{ // // NSMutableArray *codeArray = [NSMutableArray array]; // NSMutableSet *mutableSet = [NSMutableSet set]; // // PayloadType *pt; // const MSList *elem; // // for (elem = linphone_core_get_audio_codecs(LC); elem != NULL; elem = elem->next) { // // pt = (PayloadType *)elem->data; // // NSString *sreung = [NSString stringWithFormat:@"%s", pt->mime_type]; // if (linphone_core_payload_type_enabled(LC,pt)) { // [codeArray addObject:sreung]; // [mutableSet addObject:sreung]; // // } // } // // return codeArray; // //} //#pragma mark - 开启关闭视频编码 //- (void)enableVideoCodecWithString:(NSString *)codec enable:(BOOL)enable{ // // PayloadType *pt; // const MSList *elem; // // for (elem = linphone_core_get_video_codecs(LC); elem != NULL; elem = elem->next) { // // pt = (PayloadType *)elem->data; // NSString *sreung = [NSString stringWithFormat:@"%s", pt->mime_type]; // if ([sreung isEqualToString:codec]) { // // linphone_core_enable_payload_type(LC, pt, enable); // } // } //} //#pragma mark - 拨打电话 //- (void)callPhoneWithPhoneNumber:(NSString *)phone withVideo:(BOOL)video{ // // LinphoneProxyConfig *cfg = linphone_core_get_default_proxy_config(LC); // if (!cfg) { // return; // } // // LinphoneAddress *addr = [LinphoneManager.instance normalizeSipOrPhoneAddress:phone]; // linphone_core_enable_video_display(LC,video); // // [LinphoneManager.instance call:addr]; // if (addr) { // linphone_address_unref(addr); // } // //} // //- (void)switchCamera{ // // const char *currentCamId = (char *)linphone_core_get_video_device(LC); // const char **cameras = linphone_core_get_video_devices(LC); // const char *newCamId = NULL; // int i; // // for (i = 0; cameras[i] != NULL; ++i) { // if (strcmp(cameras[i], "StaticImage: Static picture") == 0) // continue; // if (strcmp(cameras[i], currentCamId) != 0) { // newCamId = cameras[i]; // break; // } // } // if (newCamId) { // // LOGI(@"Switching from [%s] to [%s]", currentCamId, newCamId); // linphone_core_set_video_device(LC, newCamId); // LinphoneCall *call = linphone_core_get_current_call(LC); // if (call != NULL) { // linphone_call_update(call, NULL); // } // } //} //- (void)acceptCall{ // // LinphoneCall *call = linphone_core_get_current_call(LC); // if (call) { // [[LinphoneManager instance] acceptCall:call evenWithVideo:YES]; // // } //} // // //- (void)hold{ // //} // //- (void)unhold{ // //} // //- (void)remoteAccount{ // //} // //- (void)haveCall{ // //} // //- (void)muteMic{ // //} // //- (void)enableSpeaker{ // //} // //- (void)tabeSnapshot{ // //} // //- (void)takePreviewSnapshot{ // //} // //- (void)setVideoSize{ // //} // //- (void)showVideo{ // // //} // //- (void)setRemoteVieoPreviewWindow:(UIView *)preview{ // // linphone_core_set_native_preview_window_id(LC, (__bridge void *)(preview)); //} // //- (void)setCurrentVideoPreviewWindow:(UIView *)preview{ // // linphone_core_set_native_video_window_id(LC, (__bridge void *)(preview)); //} //#pragma mark - 清除配置表 //- (void)clearProxyConfig { // // linphone_core_clear_proxy_config([LinphoneManager getLc]); // linphone_core_clear_all_auth_info([LinphoneManager getLc]); //} // //- (void) login: (NSString*) username password: (NSString*) password displayName: (NSString*) displayName domain: (NSString*) domain port: (NSString *) port withTransport: (NSString*) transport { // LinphoneProxyConfig *config = linphone_core_create_proxy_config(LC); // LinphoneAddress *addr = linphone_address_new(NULL); // LinphoneAddress *tmpAddr = linphone_address_new([NSString stringWithFormat:@"sip:%@",domain].UTF8String); // linphone_address_set_username(addr, username.UTF8String); // linphone_address_set_port(addr, linphone_address_get_port(tmpAddr)); // linphone_address_set_domain(addr, linphone_address_get_domain(tmpAddr)); // if (displayName && ![displayName isEqualToString:@""]) { // linphone_address_set_display_name(addr, displayName.UTF8String); // } // linphone_proxy_config_set_identity_address(config, addr); // if (transport) { // linphone_proxy_config_set_route( // config, // [NSString stringWithFormat:@"%s;transport=%s", domain.UTF8String, transport.lowercaseString.UTF8String] // .UTF8String); // linphone_proxy_config_set_server_addr( // config, // [NSString stringWithFormat:@"%s;transport=%s", domain.UTF8String, transport.lowercaseString.UTF8String] // .UTF8String); // } // // linphone_proxy_config_enable_publish(config, FALSE); // linphone_proxy_config_enable_register(config, TRUE); // // LinphoneAuthInfo *info = // linphone_auth_info_new(linphone_address_get_username(addr), // username // NULL, // user id // password.UTF8String, // passwd // NULL, // ha1 // linphone_address_get_domain(addr), // realm - assumed to be domain // linphone_address_get_domain(addr) // domain // ); // linphone_core_add_auth_info(LC, info); // linphone_address_unref(addr); // linphone_address_unref(tmpAddr); // // if (config) { // [[LinphoneManager instance] configurePushTokenForProxyConfig:config]; // if (linphone_core_add_proxy_config(LC, config) != -1) { // linphone_core_set_default_proxy_config(LC, config); // // reload address book to prepend proxy config domain to contacts' phone number // // todo: STOP doing that! //// [[LinphoneManager.instance fastAddressBook] fetchContactsInBackGroundThread]; // // [PhoneMainView.instance changeCurrentView:DialerView.compositeViewDescription]; // } else { // // [self displayAssistantConfigurationError]; // } // } else { // // [self displayAssistantConfigurationError]; // } // // NSLog(@"登陆信息配置成功!\nusername:%@,\npassword:%@,\ndisplayName:%@\ndomain:%@,\nport:%@\ntransport:%@", username, password, displayName, domain, port, transport); //} // //- (void) logout { // [[LinphoneManager instance] lpConfigSetBool:FALSE forKey:@"pushnotification_preference"]; // // LinphoneCore *lc = [LinphoneManager getLc]; // LCSipTransports transportValue = {5060,5060,-1,-1}; // // if (linphone_core_set_sip_transports(lc, &transportValue)) { // NSLog(@"cannot set transport"); // } // // [[LinphoneManager instance] lpConfigSetString:@"" forKey:@"sharing_server_preference"]; // [[LinphoneManager instance] lpConfigSetBool:FALSE forKey:@"ice_preference"]; // [[LinphoneManager instance] lpConfigSetString:@"" forKey:@"stun_preference"]; // linphone_core_set_stun_server(lc, NULL); // linphone_core_set_firewall_policy(lc, LinphonePolicyNoFirewall); //} // //- (LinphoneCall *)callByUsername:(NSString *)username { // LinphoneCore * lc = [LinphoneManager getLc]; // LinphoneAddress* linphoneAddress = linphone_core_interpret_url(lc, [username cStringUsingEncoding:[NSString defaultCStringEncoding]]); // if (linphoneAddress == NULL) { // return NULL; // } // LinphoneCall *call = linphone_core_invite_address(lc, linphoneAddress); // return call; //} // //- (void) call: (NSString*) username displayName: (NSString*) displayName { // // LinphoneCall *call = [self callByUsername:username]; // if (call == nil) { // NSLog(@"拨打失败"); // } else { // NSLog(@"正在拨叫...\naddress:%@,\ndisplayName:%@", username, displayName); // } //} //- (void) hangUpCall { // LinphoneCore* lc = [LinphoneManager getLc]; // LinphoneCall* currentcall = linphone_core_get_current_call(lc); // if (linphone_core_is_in_conference(lc) || // In conference // (linphone_core_get_conference_size(lc) > 0) // Only one conf // ) { // linphone_core_terminate_conference(lc); // } else if(currentcall != NULL) { // In a call // linphone_core_terminate_call(lc, currentcall); // } else { // const MSList* calls = linphone_core_get_calls(lc); // if (ms_list_size(calls) == 1) { // Only one call // linphone_core_terminate_call(lc,(LinphoneCall*)(calls->data)); // } // } // NSLog(@"挂断"); //} // ////- (void) configVideo: (UIView*) videoView cameraView: (UIView*) cameraView { //// if (videoView) { //// linphone_core_set_native_video_window_id([LinphoneManager getLc], (__bridge void *)(videoView)); //// } //// //// if(cameraView){ //// linphone_core_set_native_preview_window_id([LinphoneManager getLc], (__bridge void *)(cameraView)); //// } ////} // //- (void) requestOpenCamera { // // if (!linphone_core_video_display_enabled(LC)) // return; // // LinphoneCall *call = linphone_core_get_current_call(LC); // if (call) { // LinphoneCallAppData *callAppData = (__bridge LinphoneCallAppData *)linphone_call_get_user_data(call); // callAppData->videoRequested = TRUE; /* will be used later to notify user if video was not activated because of the linphone core*/ // LinphoneCallParams *call_params = linphone_core_create_call_params(LC,call); // linphone_call_params_enable_video(call_params, TRUE); // linphone_core_update_call(LC, call, call_params); // linphone_call_params_destroy(call_params); // } else { // NSLog(@"Cannot toggle video button, because no current call"); // } //} // //- (void) closeCamera { // if (!linphone_core_video_display_enabled(LC)) // return; // [LinphoneManager.instance setSpeakerEnabled:FALSE]; // // LinphoneCall *call = linphone_core_get_current_call(LC); // if (call) { // LinphoneCallParams *call_params = linphone_core_create_call_params(LC,call); // linphone_call_params_enable_video(call_params, FALSE); // linphone_core_update_call(LC, call, call_params); // linphone_call_params_destroy(call_params); // } else { // NSLog(@"Cannot toggle video button, because no current call"); // } //} // //- (BOOL) isVideoEnabled: (LinphoneCall*) call { // return linphone_call_params_video_enabled(linphone_call_get_current_params(call)); //} // // //- (void) onCallUpdate: (NSNotification*) notification { // NSDictionary* userInfo = [notification userInfo]; // NSValue* c = [userInfo valueForKey:@"call"]; // // int state = (int)[userInfo valueForKey:@"state"]; // LinphoneCallState state = [[userInfo objectForKey:@"state"] intValue]; // NSString* message = [userInfo valueForKey:@"message"]; // NSLog(@"========== onCallUpdatestate: %d, message: %@", state, message); // LinphoneCall* call = c.pointerValue; // // NSDictionary *dict = @{@"call" : [NSValue valueWithPointer:call], // @"state" : [NSNumber numberWithInt:state], // @"message" : message}; // // switch (state) { // case LinphoneCallIncomingReceived: // NSLog(@"========== onCallUpdatestate: 来电中..."); // [NSNotificationCenter.defaultCenter postNotificationName:ES_ON_CALL_COMMING object: self userInfo:dict]; // case LinphoneCallOutgoingInit: // case LinphoneCallConnected: // case LinphoneCallStreamsRunning: { // // check video // if (![self isVideoEnabled:call]) { // const LinphoneCallParams *param = linphone_call_get_current_params(call); // const LinphoneCallAppData *callAppData = // (__bridge const LinphoneCallAppData *)(linphone_call_get_user_data(call)); // if (state == LinphoneCallStreamsRunning && callAppData->videoRequested && // linphone_call_params_low_bandwidth_enabled(param)) { // // too bad video was not enabled because low bandwidth // // NSLog(@"带宽太低,无法开启视频通话"); // // callAppData->videoRequested = FALSE; /*reset field*/ // } // } // NSLog(@"========== onCallUpdatestate: ES_ON_CALL_STREAM_UPDATE..."); // [NSNotificationCenter.defaultCenter postNotificationName:ES_ON_CALL_STREAM_UPDATE object:self userInfo:dict]; // break; // } // case LinphoneCallUpdatedByRemote: { // const LinphoneCallParams *current = linphone_call_get_current_params(call); // const LinphoneCallParams *remote = linphone_call_get_remote_params(call); // // /* remote wants to add video */ // if ((linphone_core_video_display_enabled([LinphoneManager getLc]) && !linphone_call_params_video_enabled(current) && // linphone_call_params_video_enabled(remote)) && // (!linphone_core_get_video_policy([LinphoneManager getLc])->automatically_accept || // (([UIApplication sharedApplication].applicationState != UIApplicationStateActive) && // floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max))) { // linphone_core_defer_call_update([LinphoneManager getLc], call); // // NSLog(@"========== onCallUpdatestate: ES_ON_REMOTE_OPEN_CEMERA..."); // [NSNotificationCenter.defaultCenter postNotificationName:ES_ON_REMOTE_OPEN_CEMERA object: self userInfo:dict]; // // // [self allowToOpenCameraByRemote:call]; // // } else if (linphone_call_params_video_enabled(current) && !linphone_call_params_video_enabled(remote)) { // // } // break; // } // case LinphoneCallUpdating: // break; // case LinphoneCallPausing: // case LinphoneCallPaused: // break; // case LinphoneCallPausedByRemote: // break; // case LinphoneCallEnd://LinphoneCallEnd // [NSNotificationCenter.defaultCenter postNotificationName:ES_ON_CALL_END object: self userInfo:NULL]; // NSLog(@"========== onCallUpdatestate: 通话结束..."); // case LinphoneCallError: // default: // break; // } //} // //-(void) allowToOpenCameraByRemote: (ESCall*)call { // LinphoneCallParams *params = linphone_core_create_call_params([LinphoneManager getLc], call); // linphone_call_params_enable_video(params, TRUE); // linphone_call_accept_update(call, params); // linphone_call_params_destroy(params); //} // //-(void) refuseToOpenCameraByRemote: (ESCall*)call { // LinphoneCallParams *params = linphone_core_create_call_params(LC, call); // linphone_call_params_enable_video(params, FALSE); // linphone_call_accept_update(call, params); // linphone_call_params_destroy(params); //} // //@end