Changeset 9319
- Timestamp:
- 01/13/14 19:59:44 (10 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi-stapi.c
r9301 r9319 270 270 if(ret == 1) 271 271 { 272 cs_debug_mask(D_DVBAPI, "filter #%d removed", num +1);272 cs_debug_mask(D_DVBAPI, "filter #%d removed", num); 273 273 } 274 274 else 275 275 { 276 cs_debug_mask(D_DVBAPI, "Error: filter #%d was not removed!", num +1);276 cs_debug_mask(D_DVBAPI, "Error: filter #%d was not removed!", num); 277 277 } 278 278 return ret; … … 511 511 #define DE_STOP 1 512 512 513 boolstapi_DescramblerAssociate(int32_t demux_id, uint16_t pid, int32_t mode, int32_t n)513 void stapi_DescramblerAssociate(int32_t demux_id, uint16_t pid, int32_t mode, int32_t n) 514 514 { 515 515 uint32_t Slot = 0; 516 516 int32_t ErrorCode = 0; 517 517 518 if(dev_list[n].SessionHandle == 0) { 519 cs_debug_mask(D_DVBAPI,"[DVBAPI] Demuxer #%d %s pid %04x on PTI#%d: %s Failed! (no session handle)",demux_id, 520 (mode == ASSOCIATE ? "enable" : "disable"), pid, n, dev_list[n].name); 521 return (mode == ASSOCIATE ? false : true); // return false on enable, true on disable 522 } 518 if(dev_list[n].SessionHandle == 0) { return; } 523 519 524 520 Slot = oscam_stapi_PidQuery(dev_list[n].name, pid); 525 if(!Slot) { 526 cs_debug_mask(D_DVBAPI,"[DVBAPI] Demuxer #%d %s pid %04x on PTI#%d: %s Failed! (no slot assigned)",demux_id, 527 (mode == ASSOCIATE ? "enable" : "disable"), pid, n, dev_list[n].name); 528 return (mode == ASSOCIATE ? false : true); // return false on enable, true on disable 529 } 530 531 if(demux[demux_id].DescramblerHandle[n] == 0) { 532 cs_debug_mask(D_DVBAPI,"[DVBAPI] Demuxer #%d %s pid %04x on PTI#%d: %s Failed! (no descramblerhandle)",demux_id, 533 (mode == ASSOCIATE ? "enable" : "disable"), pid, n, dev_list[n].name); 534 return (mode == ASSOCIATE ? false : true); // return false on enable, true on disable 535 } 521 if(!Slot) { return; } 522 523 if(demux[demux_id].DescramblerHandle[n] == 0) { return; } 536 524 537 525 if(mode == ASSOCIATE) … … 542 530 if(demux[demux_id].slot_assc[n][k] == Slot) 543 531 { 544 cs_debug_mask(D_DVBAPI,"[DVBAPI] Demuxer #%d enable pid %04x on PTI#%d: %s Skipped! (already present in slot %d)", 545 demux_id, pid, n, dev_list[n].name, Slot); 546 return true; 547 } 548 } 549 550 cs_debug_mask(D_DVBAPI, "[DVBAPI] Demuxer #%d enable pid %04x on PTI#%d: %s", demux_id, pid, n, dev_list[n].name); 532 return; 533 } 534 } 535 551 536 ErrorCode = oscam_stapi_DescramblerAssociate(demux[demux_id].DescramblerHandle[n], Slot); 552 if(ErrorCode != 0){ 553 cs_debug_mask(D_DVBAPI,"[DVBAPI] Demuxer #%d enable pid %04x on PTI#%d: %s Failed! (Errorcode = %d)", 554 demux_id, pid, n, dev_list[n].name, ErrorCode); 555 return false; 556 } 537 cs_debug_mask(D_DVBAPI, "set pid %04x on %s", pid, dev_list[n].name); 538 539 if(ErrorCode != 0) 540 { cs_log("DescramblerAssociate %d", ErrorCode); } 557 541 558 542 for(k = 0; k < SLOTNUM; k++) … … 561 545 { 562 546 demux[demux_id].slot_assc[n][k] = Slot; 563 return true;547 break; 564 548 } 565 549 } … … 567 551 else 568 552 { 569 cs_debug_mask(D_DVBAPI, "[DVBAPI] Demuxer #%d disable pid %04x on PTI#%d: %s", demux_id, pid, n, dev_list[n].name);570 553 ErrorCode = oscam_stapi_DescramblerDisassociate(demux[demux_id].DescramblerHandle[n], Slot); 571 if(ErrorCode != 0){ 572 cs_debug_mask(D_DVBAPI,"[DVBAPI] Demuxer #%d disable pid %04x on PTI#%d: %s Failed! (Errorcode = %d)", 573 demux_id, pid, n, dev_list[n].name, ErrorCode); 574 return false; 575 } 554 if(ErrorCode != 0) 555 { cs_debug_mask(D_DVBAPI, "DescramblerDisassociate %d", ErrorCode); } 556 557 cs_debug_mask(D_DVBAPI, "unset pid %04x on %s", pid, dev_list[n].name); 576 558 577 559 int32_t k; … … 581 563 { 582 564 demux[demux_id].slot_assc[n][k] = 0; 583 return true;584 } 585 } 586 } 587 588 return true;565 return; 566 } 567 } 568 } 569 570 return; 589 571 } 590 572 … … 596 578 { 597 579 uint32_t DescramblerHandle = 0; 598 cs_debug_mask(D_DVBAPI, "[DVBAPI] Demuxer #%d allocate descrambler on PTI#%d: %s", demux_id, dev_index, dev_list[dev_index].name);599 580 ErrorCode = oscam_stapi_DescramblerAllocate(dev_list[dev_index].SessionHandle, &DescramblerHandle); 600 581 if(ErrorCode != 0) … … 609 590 if(mode == DE_STOP && demux[demux_id].DescramblerHandle[dev_index] > 0) 610 591 { 611 cs_debug_mask(D_DVBAPI, "[DVBAPI] Demuxer #%d deallocate descrambler on PTI#%d: %s", demux_id, dev_index, dev_list[dev_index].name);612 592 ErrorCode = oscam_stapi_DescramblerDeallocate(demux[demux_id].DescramblerHandle[dev_index]); 613 593 … … 621 601 } 622 602 623 int32_t stapi_set_pid(int32_t demux_id, int32_t idx, uint16_t pid, bool enable, char *pmtfile)603 int32_t stapi_set_pid(int32_t demux_id, int32_t UNUSED(num), int32_t idx, uint16_t UNUSED(pid), char *UNUSED(pmtfile)) 624 604 { 625 605 int32_t n; 626 606 627 if(!pmtfile) 628 { 629 cs_debug_mask(D_DVBAPI, "[DVBAPI] Demuxer #%d no valid pmtfile!", demux_id); 630 return -1; 631 } 632 633 bool actionneeded = false; 634 struct s_dvbapi_priority *p; 635 636 for(p = dvbapi_priority; p != NULL; p = p->next){ 637 if(p->type != 's') { continue; } 638 if(strcmp(pmtfile, p->pmtfile) != 0) { continue; } // pmtfile and device pmt doesnt match -> skip! 639 640 for(n = 0; n < PTINUM; n++){ 641 if(strcmp(dev_list[n].name, p->devname) == 0){ // devicename and specified devicename in oscam.dvbapi do match -> found! 642 break; // lets do some action with this matching device 643 } 644 } 645 if(p == NULL) continue; // no matching device found -> skip, check next! 646 647 /*/ Do matching stapi device actions /*/ 648 649 if(enable){ 650 if(dev_list[n].SessionHandle == 0) { continue; } 651 if(demux[demux_id].DescramblerHandle[n] == 0){ // we dont have descrambler handler -> start one! 652 cs_debug_mask(D_DVBAPI, "[DVBAPI] Demuxer #%d start descrambling PTI#%d: %s", demux_id, n, dev_list[n].name); 653 stapi_startdescrambler(demux_id, n, DE_START); 654 } 655 656 if(demux[demux_id].DescramblerHandle[n] == 0) { continue; } // starting descrambler failed! 657 if(stapi_DescramblerAssociate(demux_id, pid, ASSOCIATE, n)){ // starting descrambler successful -> try to add pid 658 actionneeded = update_streampid_list(n, pid, idx); // successful added pid -> register pid as active 659 } 660 } 661 if(!enable){ 607 if(idx == -1) 608 { 609 for(n = 0; n < PTINUM; n++) 610 { 662 611 if(demux[demux_id].DescramblerHandle[n] == 0) { continue; } 663 664 if(idx == -1){ // stop descrambling this channel! 665 cs_debug_mask(D_DVBAPI, "[DVBAPI] Demuxer #%d stop descrambling PTI#%d: %s", demux_id, n, dev_list[n].name); 666 stapi_startdescrambler(demux_id, n, DE_STOP); 667 actionneeded = remove_streampid_from_list(n, pid, idx); // stop descramble -> remove all registered pids! 668 memset(demux[demux_id].slot_assc[n], 0, sizeof(demux[demux_id].slot_assc[n])); 669 continue; // stop descreambling done, check next device! 670 } 671 672 if(stapi_DescramblerAssociate(demux_id, pid, DISASSOCIATE, n)){ // try remove this pid 673 actionneeded = remove_streampid_from_list(n, pid, idx); // remove pid successful -> register this pid as inactive 674 } 612 613 cs_debug_mask(D_DVBAPI, "stop descrambling PTI: %s", dev_list[n].name); 614 stapi_startdescrambler(demux_id, n, DE_STOP); 615 memset(demux[demux_id].slot_assc[n], 0, sizeof(demux[demux_id].slot_assc[n])); 675 616 } 676 617 } … … 679 620 } 680 621 681 int32_t stapi_write_cw(int32_t demux_id, uchar *cw, int32_t pid)682 { 683 int32_t ErrorCode, l, n ;622 int32_t stapi_write_cw(int32_t demux_id, uchar *cw, uint16_t *STREAMpids, int32_t STREAMpidcount, char *pmtfile) 623 { 624 int32_t ErrorCode, l, n, k; 684 625 unsigned char nullcw[8]; 685 626 memset(nullcw, 0, 8); 686 627 char *text[] = { "even", "odd" }; 687 688 dvbapi_ca_setpid(demux_id, pid); // prepare descrambler 628 629 if(!pmtfile) { return 0; } 630 631 for(n = 0; n < PTINUM; n++) 632 { 633 if(dev_list[n].SessionHandle == 0) { continue; } 634 if(demux[demux_id].DescramblerHandle[n] == 0) 635 { 636 struct s_dvbapi_priority *p; 637 638 for(p = dvbapi_priority; p != NULL; p = p->next) 639 { 640 if(p->type != 's') { continue; } 641 if(strcmp(pmtfile, p->pmtfile) != 0) 642 { continue; } 643 644 if(strcmp(dev_list[n].name, p->devname) == 0) 645 { 646 cs_debug_mask(D_DVBAPI, "start descrambling PTI: %s", dev_list[n].name); 647 stapi_startdescrambler(demux_id, n, DE_START); 648 } 649 } 650 } 651 652 if(demux[demux_id].DescramblerHandle[n] == 0) { continue; } 653 for(k = 0; k < STREAMpidcount; k++) 654 { 655 stapi_DescramblerAssociate(demux_id, STREAMpids[k], ASSOCIATE, n); 656 } 657 } 689 658 690 659 for(l = 0; l < 2; l++) … … 695 664 { 696 665 if(demux[demux_id].DescramblerHandle[n] == 0) { continue; } 697 cs_debug_mask(D_DVBAPI, "[DVBAPI] Demuxer #%d write cw %s part PTI#%d: %s", demux_id, text[l], n, dev_list[n].name); 666 698 667 ErrorCode = oscam_stapi_DescramblerSet(demux[demux_id].DescramblerHandle[n], l, cw + (l * 8)); 699 668 if(ErrorCode != 0) … … 701 670 702 671 memcpy(demux[demux_id].lastcw[l], cw + (l * 8), 8); 672 cs_debug_mask(D_DVBAPI, "write cw %s index: %d %s", text[l], demux_id, dev_list[n].name); 703 673 } 704 674 } -
trunk/module-dvbapi-stapi.h
r9157 r9319 51 51 int32_t stapi_set_filter(int32_t demux_id, uint16_t pid, uchar *filter, uchar *mask, int32_t num, char *pmtfile); 52 52 int32_t stapi_remove_filter(int32_t demux_id, int32_t num, char *pmtfile); 53 int32_t stapi_set_pid(int32_t demux_id, int32_t idx, uint16_t pid, bool enable, char *pmtfile);54 int32_t stapi_write_cw(int32_t demux_id, uchar *cw, int32_t pid);53 int32_t stapi_set_pid(int32_t demux_id, int32_t num, int32_t idx, uint16_t pid, char *pmtfile); 54 int32_t stapi_write_cw(int32_t demux_id, uchar *cw, uint16_t *, int32_t, char *pmtfile); 55 55 int32_t stapi_do_set_filter(int32_t demux_id, FILTERTYPE *filter, uint16_t *pids, int32_t pidcount, uchar *filt, uchar *mask, int32_t dev_id); 56 56 int32_t stapi_do_remove_filter(int32_t demux_id, FILTERTYPE *filter, int32_t dev_id); -
trunk/module-dvbapi.c
r9311 r9319 1179 1179 #ifdef WITH_STAPI 1180 1180 case STAPI: 1181 if (idx != -1) idx = 1; // use always indexer 1 for start or stop exeception = -1 disable all (stapi doesnt use indexers!)1182 stapi_set_pid(demux_id, idx, demux[demux_id].STREAMpids[num], enable, demux[demux_id].pmt_file);1181 if(!enable) idx = -1; 1182 stapi_set_pid(demux_id, num, idx, demux[demux_id].STREAMpids[num], demux[demux_id].pmt_file); // only used to disable pids!!! 1183 1183 break; 1184 1184 #endif … … 1268 1268 if(i < 0) { i = 0; } 1269 1269 int32_t idx = demux[demux_id].ECMpids[i].index; 1270 #ifdef WITH_STAPI1271 idx = 0; // 0-1 = -1 means remove all!1272 #endif1273 1270 get_servicename(dvbapi_client, demux[demux_id].program_number, demux[demux_id].ECMpidcount > 0 ? demux[demux_id].ECMpids[i].CAID : 0, channame); 1274 1271 cs_debug_mask(D_DVBAPI, "[DVBAPI] Demuxer #%d stop descrambling program number %04X (%s)", demux_id, demux[demux_id].program_number, channame); … … 2379 2376 demux_id = i; 2380 2377 2381 #if defined WITH_ COOLAPI || defined WITH_MCA || defined WITH_AZBOX2378 #if defined WITH_STAPI || defined WITH_COOLAPI || defined WITH_MCA || defined WITH_AZBOX 2382 2379 dvbapi_stop_descrambling(i); // stop descrambling for all boxes except dvbapi based boxes 2383 2380 #else … … 2622 2619 if(demux[demux_id].ECMpidcount == 0) { return demux_id; } // for FTA it ends here! 2623 2620 2624 #if !defined WITH_ COOLAPI && !defined WITH_MCA && !defined WITH_AZBOX2621 #if !defined WITH_STAPI && !defined WITH_COOLAPI && !defined WITH_MCA && !defined WITH_AZBOX 2625 2622 if (running) disable_unused_streampids(demux_id); // disable all streampids not in use anymore 2626 2623 #endif … … 4059 4056 { 4060 4057 #ifdef WITH_STAPI 4061 case STAPI: 4062 stapi_write_cw(i, er->cw, j);4058 case STAPI: 4059 stapi_write_cw(i, er->cw, demux[i].STREAMpids, demux[i].STREAMpidcount, demux[i].pmt_file); 4063 4060 break; 4064 4061 #endif … … 4505 4502 struct s_streampid *listitem; 4506 4503 // search for old enabled streampids on all ca devices that have to be disabled, index 0 is skipped as it belongs to fta! 4507 #ifdef WITH_STAPI4508 idx = 2; // idx-1 = 2-1 = 1 = used indexer for starting pids on stapi4509 for(i = 0; i < PTINUM; i++){4510 #else4511 4504 for(i = 0; i < 8 && idx; i++){ 4512 4505 if(!(demux[demux_id].ca_mask & (1 << i))) continue; // continue if ca is unused by this demuxer 4513 #endif4506 4514 4507 LL_ITER itr; 4515 4508 itr = ll_iter_create(ll_activestreampids);
Note:
See TracChangeset
for help on using the changeset viewer.