static void tvhdhomerun_device_create(struct hdhomerun_discover_device_t *dInfo) { tvhdhomerun_device_t *hd = calloc(1, sizeof(tvhdhomerun_device_t)); htsmsg_t *conf = NULL, *feconf = NULL; char uhex[UUID_HEX_SIZE]; int j, save = 0; struct hdhomerun_device_t *hdhomerun_tuner; dvb_fe_type_t type = DVB_TYPE_C; tvhdhomerun_device_calc_uuid(uhex, dInfo->device_id); hdhomerun_tuner = hdhomerun_device_create(dInfo->device_id, dInfo->ip_addr, 0, NULL); { const char *deviceModel = hdhomerun_device_get_model_str(hdhomerun_tuner); if(deviceModel != NULL) { hd->hd_info.deviceModel = strdup(deviceModel); } hdhomerun_device_destroy(hdhomerun_tuner); } conf = hts_settings_load("input/tvhdhomerun/adapters/%s", uhex); if ( conf != NULL ) { const char *override_type = htsmsg_get_str(conf, "fe_override"); if ( override_type != NULL) { if ( !strcmp(override_type, "ATSC" ) ) override_type = "ATSC-T"; type = dvb_str2type(override_type); if ( ! ( type == DVB_TYPE_C || type == DVB_TYPE_T || type == DVB_TYPE_ATSC_T || type == DVB_TYPE_ATSC_C ) ) { type = DVB_TYPE_C; } } } else { if (strstr(hd->hd_info.deviceModel, "_atsc")) type = DVB_TYPE_ATSC_T; } hd->hd_override_type = strdup(dvb_type2str(type)); tvhinfo(LS_TVHDHOMERUN, "Using Network type : %s", hd->hd_override_type); /* some sane defaults */ hd->hd_fullmux_ok = 1; hd->hd_pids_len = 127; hd->hd_pids_max = 32; hd->hd_pids_deladd = 1; if (!tvh_hardware_create0((tvh_hardware_t*)hd, &tvhdhomerun_device_class, uhex, conf)) return; TAILQ_INIT(&hd->hd_frontends); /* we may check if uuid matches, but the SHA hash should be enough */ if (hd->hd_info.uuid) free(hd->hd_info.uuid); char fName[128]; snprintf(fName, 128, "HDHomeRun(%08X)",dInfo->device_id); memset(&hd->hd_info.ip_address, 0, sizeof(hd->hd_info.ip_address)); hd->hd_info.ip_address.ss_family = AF_INET; ((struct sockaddr_in *)&hd->hd_info.ip_address)->sin_addr.s_addr = htonl(dInfo->ip_addr); hd->hd_info.uuid = strdup(uhex); hd->hd_info.friendlyname = strdup(fName); if (conf) feconf = htsmsg_get_map(conf, "frontends"); save = !conf || !feconf; for (j = 0; j < dInfo->tuner_count; ++j) { if (tvhdhomerun_frontend_create(hd, dInfo, feconf, type, j)) { tvhinfo(LS_TVHDHOMERUN, "Created frontend %08X tuner %d", dInfo->device_id, j); } else { tvherror(LS_TVHDHOMERUN, "Unable to create frontend-device. ( %08x-%d )", dInfo->device_id,j); } } if (save) tvhdhomerun_device_changed(hd); htsmsg_destroy(conf); }
static satip_device_t * satip_device_create( satip_device_info_t *info ) { satip_device_t *sd = calloc(1, sizeof(satip_device_t)); uuid_t uuid; htsmsg_t *conf = NULL, *feconf = NULL; char *argv[10]; int i, j, n, m, fenum, t2, save = 0; dvb_fe_type_t type; satip_device_calc_uuid(&uuid, info->uuid); conf = hts_settings_load("input/satip/adapters/%s", uuid.hex); /* some sane defaults */ sd->sd_fullmux_ok = 1; sd->sd_pids_len = 127; sd->sd_pids_max = 32; sd->sd_pids_deladd = 1; sd->sd_sig_scale = 240; if (!tvh_hardware_create0((tvh_hardware_t*)sd, &satip_device_class, uuid.hex, conf)) { free(sd); return NULL; } pthread_mutex_init(&sd->sd_tune_mutex, NULL); TAILQ_INIT(&sd->sd_frontends); /* we may check if uuid matches, but the SHA hash should be enough */ if (sd->sd_info.uuid) free(sd->sd_info.uuid); #define ASSIGN(x) sd->sd_info.x = info->x; info->x = NULL ASSIGN(myaddr); ASSIGN(addr); ASSIGN(uuid); ASSIGN(bootid); ASSIGN(configid); ASSIGN(deviceid); ASSIGN(server); ASSIGN(location); ASSIGN(friendlyname); ASSIGN(manufacturer); ASSIGN(manufacturerURL); ASSIGN(modeldesc); ASSIGN(modelname); ASSIGN(modelnum); ASSIGN(serialnum); ASSIGN(presentation); ASSIGN(tunercfg); #undef ASSIGN /* * device specific hacks */ satip_device_hack(sd); if (conf) feconf = htsmsg_get_map(conf, "frontends"); save = !conf || !feconf; n = http_tokenize(sd->sd_info.tunercfg, argv, 10, ','); for (i = 0, fenum = 1; i < n; i++) { type = DVB_TYPE_NONE; t2 = 0; if (strncmp(argv[i], "DVBS2-", 6) == 0) { type = DVB_TYPE_S; m = atoi(argv[i] + 6); } else if (strncmp(argv[i], "DVBT2-", 6) == 0) { type = DVB_TYPE_T; m = atoi(argv[i] + 6); t2 = 1; } else if (strncmp(argv[i], "DVBT-", 5) == 0) { type = DVB_TYPE_T; m = atoi(argv[i] + 5); } else if (strncmp(argv[i], "DVBC-", 5) == 0) { type = DVB_TYPE_C; m = atoi(argv[i] + 5); } if (type == DVB_TYPE_NONE) { tvhlog(LOG_ERR, "satip", "%s: bad tuner type [%s]", sd->sd_info.addr, argv[i]); } else if (m < 0 || m > 32) { tvhlog(LOG_ERR, "satip", "%s: bad tuner count [%s]", sd->sd_info.addr, argv[i]); } else { for (j = 0; j < m; j++) if (satip_frontend_create(feconf, sd, type, t2, fenum)) fenum++; } } if (save) satip_device_save(sd); htsmsg_destroy(conf); return sd; }
static satip_device_t * satip_device_create( satip_device_info_t *info ) { satip_device_t *sd = calloc(1, sizeof(satip_device_t)); tvh_uuid_t uuid; htsmsg_t *conf = NULL, *feconf = NULL; char *argv[10], *tunercfg; int i, j, n, m, fenum, v2, save = 0; dvb_fe_type_t type; char buf2[60]; sd->sd_inload = 1; satip_device_calc_uuid(&uuid, info->uuid); conf = hts_settings_load("input/satip/adapters/%s", uuid.hex); /* some sane defaults */ sd->sd_fast_switch = 1; sd->sd_fullmux_ok = 1; sd->sd_pids_len = 127; sd->sd_pids_max = 32; sd->sd_pids_deladd = 1; sd->sd_sig_scale = 240; sd->sd_dbus_allow = 1; if (!tvh_hardware_create0((tvh_hardware_t*)sd, &satip_device_class, uuid.hex, conf)) { /* Note: sd is freed in above fcn */ return NULL; } pthread_mutex_init(&sd->sd_tune_mutex, NULL); TAILQ_INIT(&sd->sd_frontends); /* we may check if uuid matches, but the SHA hash should be enough */ if (sd->sd_info.uuid) free(sd->sd_info.uuid); #define ASSIGN(x) sd->sd_info.x = info->x; info->x = NULL ASSIGN(myaddr); ASSIGN(addr); ASSIGN(uuid); ASSIGN(bootid); ASSIGN(configid); ASSIGN(deviceid); ASSIGN(server); ASSIGN(location); ASSIGN(friendlyname); ASSIGN(manufacturer); ASSIGN(manufacturerURL); ASSIGN(modeldesc); ASSIGN(modelname); ASSIGN(modelnum); ASSIGN(serialnum); ASSIGN(presentation); ASSIGN(tunercfg); #undef ASSIGN sd->sd_info.rtsp_port = info->rtsp_port; sd->sd_info.srcs = info->srcs; /* * device specific hacks */ satip_device_hack(sd); if (conf) feconf = htsmsg_get_map(conf, "frontends"); save = !conf || !feconf; tunercfg = sd->sd_tunercfg; if (tunercfg == NULL) tunercfg = sd->sd_tunercfg = strdup("Auto"); if (strncmp(tunercfg, "DVB", 3) && strncmp(tunercfg, "ATSC", 4)) tunercfg = sd->sd_info.tunercfg; n = http_tokenize(tvh_strdupa(tunercfg), argv, 10, ','); for (i = m = 0, fenum = 1; i < n; i++) { type = DVB_TYPE_NONE; v2 = 0; if (strncmp(argv[i], "DVBS2-", 6) == 0) { type = DVB_TYPE_S; m = atoi(argv[i] + 6); v2 = 1; } else if (strncmp(argv[i], "DVBS-", 5) == 0) { type = DVB_TYPE_S; m = atoi(argv[i] + 5); } else if (strncmp(argv[i], "DVBT2-", 6) == 0) { type = DVB_TYPE_T; m = atoi(argv[i] + 6); v2 = 1; } else if (strncmp(argv[i], "DVBT-", 5) == 0) { type = DVB_TYPE_T; m = atoi(argv[i] + 5); } else if (strncmp(argv[i], "DVBC2-", 6) == 0) { type = DVB_TYPE_C; m = atoi(argv[i] + 6); v2 = 1; } else if (strncmp(argv[i], "DVBC-", 5) == 0) { type = DVB_TYPE_C; m = atoi(argv[i] + 5); } else if (strncmp(argv[i], "ATSC-", 5) == 0) { type = DVB_TYPE_ATSC; m = atoi(argv[i] + 5); } else if (strncmp(argv[i], "DVBCB-", 6) == 0) { m = atoi(argv[i] + 6); v2 = 2; } if (type == DVB_TYPE_NONE) { tvhlog(LOG_ERR, "satip", "%s: bad tuner type [%s]", satip_device_nicename(sd, buf2, sizeof(buf2)), argv[i]); } else if (m < 0 || m > 32) { tvhlog(LOG_ERR, "satip", "%s: bad tuner count [%s]", satip_device_nicename(sd, buf2, sizeof(buf2)), argv[i]); } else { sd->sd_nosave = 1; for (j = 0; j < m; j++) if (satip_frontend_create(feconf, sd, type, v2, fenum)) fenum++; sd->sd_nosave = 0; } } if (save) satip_device_save(sd); sd->sd_inload = 0; htsmsg_destroy(conf); satip_device_dbus_notify(sd, "start"); return sd; }
static void tvhdhomerun_device_create(struct hdhomerun_discover_device_t *dInfo) { tvhdhomerun_device_t *hd = calloc(1, sizeof(tvhdhomerun_device_t)); htsmsg_t *conf = NULL, *feconf = NULL; tvh_uuid_t uuid; int j, save = 0; struct hdhomerun_device_t *hdhomerun_tuner; dvb_fe_type_t type = DVB_TYPE_C; struct in_addr ip_addr; tvhdhomerun_device_calc_uuid(&uuid, dInfo->device_id); hdhomerun_tuner = hdhomerun_device_create(dInfo->device_id, dInfo->ip_addr, 0, NULL); { const char *deviceModel = hdhomerun_device_get_model_str(hdhomerun_tuner); if(deviceModel != NULL) { hd->hd_info.deviceModel = strdup(deviceModel); } hdhomerun_device_destroy(hdhomerun_tuner); } conf = hts_settings_load("input/tvhdhomerun/adapters/%s", uuid.hex); if ( conf != NULL ) { const char *override_type = htsmsg_get_str(conf, "fe_override"); if ( override_type != NULL) { type = dvb_str2type(override_type); if ( ! ( type == DVB_TYPE_C || type == DVB_TYPE_T || type == DVB_TYPE_ATSC ) ) { type = DVB_TYPE_C; } } } else { if (strstr(hd->hd_info.deviceModel, "_atsc")) type = DVB_TYPE_ATSC; } hd->hd_override_type = strdup(dvb_type2str(type)); tvhlog(LOG_INFO, "tvheadend","Using Network type : %s", hd->hd_override_type); /* some sane defaults */ hd->hd_fullmux_ok = 1; hd->hd_pids_len = 127; hd->hd_pids_max = 32; hd->hd_pids_deladd = 1; if (!tvh_hardware_create0((tvh_hardware_t*)hd, &tvhdhomerun_device_class, uuid.hex, conf)) { free(hd); return; } TAILQ_INIT(&hd->hd_frontends); /* we may check if uuid matches, but the SHA hash should be enough */ if (hd->hd_info.uuid) free(hd->hd_info.uuid); char fName[128]; snprintf(fName, 128, "HDHomeRun(%08X)",dInfo->device_id); ip_addr.s_addr = htonl(dInfo->ip_addr); hd->hd_info.ip_address = strdup(inet_ntoa(ip_addr)); hd->hd_info.uuid = strdup(uuid.hex); hd->hd_info.friendlyname = strdup(fName); if (conf) feconf = htsmsg_get_map(conf, "frontends"); save = !conf || !feconf; for (j = 0; j < dInfo->tuner_count; ++j) { if (tvhdhomerun_frontend_create(hd, dInfo, feconf, type, j)) { tvhlog(LOG_INFO, "tvhdhomerun", "Created frontend %08X tuner %d", dInfo->device_id, j); } else { tvhlog(LOG_ERR, "tvhdhomerun", "Unable to create frontend-device. ( %08x-%d )", dInfo->device_id,j); } } if (save) tvhdhomerun_device_save(hd); htsmsg_destroy(conf); }