Changeset 11066


Ignore:
Timestamp:
Oct 31, 2015, 2:56:42 PM (4 years ago)
Author:
theparasol
Message:

DVBAPI:

  • Some retrying while disabling filters and their fd's
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/module-dvbapi.c

    r11065 r11066  
    801801    }
    802802   
    803     int32_t i = 0, n = 0, devnum = -1, dmx_fd = 0, ret = 0, boxnum = sizeof(devices) / sizeof(struct box_devices);
     803    int32_t i = 0, n = 0, devnum = -1, dmx_fd = 0, ret = 0;
    804804    char device_path[128], device_path2[128];
    805805
    806     while (i < boxnum)
     806    while (i < BOX_COUNT)
    807807    {
    808808        snprintf(device_path2, sizeof(device_path2), devices[i].demux_device, 0);
     
    998998int32_t dvbapi_stop_filter(int32_t demux_index, int32_t type)
    999999{
    1000     int32_t g, ret = -1;
     1000    int32_t g, error = 0;
    10011001
    10021002    for(g = 0; g < MAX_FILTER; g++) // just stop them all, we dont want to risk leaving any stale filters running due to lowering of maxfilters
     
    10041004        if(demux[demux_index].demux_fd[g].type == type)
    10051005        {
    1006             ret = dvbapi_stop_filternum(demux_index, g);
    1007         }
    1008     }
    1009     if(ret == -1) { return 0; }  // on error return 0
    1010     else { return 1; }
     1006            if(dvbapi_stop_filternum(demux_index, g) == -1)
     1007            {
     1008                error = 1;
     1009            } 
     1010        }
     1011    }
     1012    return !error; // on error return 0, all ok 1
    10111013}
    10121014
    10131015int32_t dvbapi_stop_filternum(int32_t demux_index, int32_t num)
    10141016{
    1015     int32_t retfilter = -1, retfd = -1, fd = demux[demux_index].demux_fd[num].fd;
     1017    int32_t retfilter = -1, retfd = -1, fd = demux[demux_index].demux_fd[num].fd, try = 0;
    10161018    if(fd > 0)
    10171019    {
    1018         cs_log_dbg(D_DVBAPI, "Demuxer %d stop Filter %d (fd: %d api: %d, caid: %04X, provid: %06X, %spid: %04X)",
    1019                       demux_index, num + 1, fd, selected_api, demux[demux_index].demux_fd[num].caid, demux[demux_index].demux_fd[num].provid,
    1020                       (demux[demux_index].demux_fd[num].type == TYPE_ECM ? "ecm" : "emm"), demux[demux_index].demux_fd[num].pid);
    1021 
    1022         switch(selected_api)
    1023         {
    1024         case DVBAPI_3:
    1025             if (cfg.dvbapi_listenport || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX)
    1026                 retfilter = dvbapi_net_send(DVBAPI_DMX_STOP, demux[demux_index].socket_fd, demux_index, num, NULL, NULL, NULL);
    1027             else
     1020        do
     1021        {
     1022            if(try)
     1023            {
     1024                cs_sleepms(50);
     1025            }
     1026            try++;
     1027            cs_log_dbg(D_DVBAPI, "Demuxer %d stop filter %d try %d (fd: %d api: %d, caid: %04X, provid: %06X, %spid: %04X)", demux_index, num + 1, try,
     1028                        fd, selected_api, demux[demux_index].demux_fd[num].caid, demux[demux_index].demux_fd[num].provid,
     1029                        (demux[demux_index].demux_fd[num].type == TYPE_ECM ? "ecm" : "emm"), demux[demux_index].demux_fd[num].pid);
     1030
     1031            switch(selected_api)
     1032            {
     1033            case DVBAPI_3:
     1034                if (cfg.dvbapi_listenport || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX)
     1035                    retfilter = dvbapi_net_send(DVBAPI_DMX_STOP, demux[demux_index].socket_fd, demux_index, num, NULL, NULL, NULL);
     1036                else
     1037                    retfilter = dvbapi_ioctl(fd, DMX_STOP, NULL);
     1038                break;
     1039
     1040            case DVBAPI_1:
    10281041                retfilter = dvbapi_ioctl(fd, DMX_STOP, NULL);
    1029             break;
    1030 
    1031         case DVBAPI_1:
    1032             retfilter = dvbapi_ioctl(fd, DMX_STOP, NULL);
    1033             break;
     1042                break;
    10341043
    10351044#if defined(WITH_STAPI) || defined(WITH_STAPI5)
    1036         case STAPI:
    1037             retfilter = stapi_remove_filter(demux_index, num, demux[demux_index].pmt_file);
    1038             if(retfilter != 1)   // stapi returns 0 for error, 1 for all ok
    1039             {
    1040                 retfilter = -1;
    1041             }
    1042             break;
     1045            case STAPI:
     1046                retfilter = stapi_remove_filter(demux_index, num, demux[demux_index].pmt_file);
     1047                if(retfilter != 1)   // stapi returns 0 for error, 1 for all ok
     1048                {
     1049                    retfilter = -1;
     1050                }
     1051                break;
    10431052#endif
    10441053#if defined WITH_COOLAPI || defined WITH_COOLAPI2
    1045         case COOLAPI:
    1046             retfilter = coolapi_remove_filter(fd, num);
    1047             retfd = coolapi_close_device(fd);
    1048             break;
     1054            case COOLAPI:
     1055                retfilter = coolapi_remove_filter(fd, num);
     1056                if(retfilter >=0 )
     1057                {
     1058                    retfd = coolapi_close_device(fd);
     1059                }
     1060                break;
    10491061#endif
    1050         default:
    1051             break;
    1052         }
     1062            default:
     1063                break;
     1064            }
     1065        } while (retfilter < 0 && try < 10);
    10531066       
    10541067#if !defined WITH_COOLAPI && !defined WITH_COOLAPI2 // no fd close for coolapi and stapi, all others do close fd!
    1055         if (!cfg.dvbapi_listenport && cfg.dvbapi_boxtype != BOXTYPE_PC_NODMX)
    1056         {
    1057             if(selected_api == STAPI)
    1058             {
    1059                 retfd = 0;  // stapi closes its own filter fd!
    1060             } 
     1068        try = 0;
     1069        do
     1070        {
     1071            if(try)
     1072            {
     1073                cs_sleepms(50);
     1074            }
     1075            try++;
     1076            if (!cfg.dvbapi_listenport && cfg.dvbapi_boxtype != BOXTYPE_PC_NODMX)
     1077            {
     1078                if(selected_api == STAPI)
     1079                {
     1080                    retfd = 0;  // stapi closes its own filter fd!
     1081                } 
     1082                else
     1083                {
     1084                    flush_read_fd(demux_index, num, fd); // flush filter input buffer in attempt to avoid overflow receivers internal buffer
     1085                    retfd = close(fd);
     1086                    if(errno == 9) { retfd = 0; }  // no error on bad file descriptor
     1087                }
     1088            }
    10611089            else
    1062             {
    1063                 flush_read_fd(demux_index, num, fd); // flush filter input buffer in attempt to avoid overflow receivers internal buffer
    1064                 retfd = close(fd);
    1065                 if(errno == 9) { retfd = 0; }  // no error on bad file descriptor
    1066             }
    1067         }
    1068         else
    1069             retfd = 0;
     1090                retfd = 0;
     1091           
     1092        } while (retfd < 0 && try < 10);
    10701093#endif
    10711094    }
     
    10841107    {
    10851108        cs_log("ERROR: Demuxer %d could not close fd of Filter %d (fd=%d api:%d errno=%d %s)", demux_index, num + 1, fd,
    1086                selected_api, errno, strerror(errno));
     1109            selected_api, errno, strerror(errno));
    10871110        return retfd;
    10881111    }
Note: See TracChangeset for help on using the changeset viewer.