static void coolapi_read_data(dmx_t *dmx, dmx_callback_data_t *data) { if(!dmx) { cs_log_dbg(D_DVBAPI, "handle is NULL!"); return; } int32_t ret; uchar buffer[4096]; SAFE_SETSPECIFIC(getclient, dvbapi_client); SAFE_MUTEX_LOCK(&dmx->mutex); memset(buffer, 0, sizeof(buffer)); ret = coolapi_read(dmx, data, buffer); SAFE_MUTEX_UNLOCK(&dmx->mutex); if(ret > -1) { uint16_t filters = data->num; uint16_t flt; for (flt = 0; flt < filters; flt++) { uint32_t n = (uint32_t)data->tags[flt]; S_COOL_FILTER *filter = find_filter_by_channel(data->channel, n); if (!filter || data->filters[flt] != filter->filter) { cs_log_dbg(D_DVBAPI, "filter not found in notification!!!!"); continue; } dvbapi_process_input(dmx->demux_id, n, buffer, data->len); } } }
void coolapi_read_data(dmx_t * dmx, dmx_callback_data_t * data) { if(!dmx) { cs_debug_mask(D_DVBAPI, "handle is NULL!"); return; } int32_t ret; pthread_setspecific(getclient, dvbapi_client); pthread_mutex_lock(&dmx->mutex); memset(dmx->buffer,0,4096); ret = coolapi_read(dmx, data); pthread_mutex_unlock(&dmx->mutex); if (ret > -1) dvbapi_process_input(dmx->demux_id, dmx->filter_num, dmx->buffer, data->len); }
void coolapi_read_data(int32_t fd, int32_t len) { int32_t ret; unsigned char buffer[4096]; dmx_t * dmx = find_demux(fd, 0); if(!dmx) { cs_debug_mask(D_DVBAPI, "handle is NULL!"); return; } pthread_setspecific(getclient, dvbapi_client); pthread_mutex_lock(&dmx->mutex); ret = coolapi_read(dmx->fd, buffer, len); pthread_mutex_unlock(&dmx->mutex); dvbapi_process_input(dmx->demux_id, dmx->filter_num, buffer, len); }
void *stapi_read_thread(void *sparam) { int32_t dev_index, ErrorCode, i, j, CRCValid; uint32_t QueryBufferHandle = 0, DataSize = 0; uchar buf[BUFFLEN]; struct read_thread_param *para = sparam; dev_index = para->id; pthread_setspecific(getclient, para->cli); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); pthread_cleanup_push(stapi_cleanup_thread, (void*) dev_index); int32_t error_count = 0; while (1) { QueryBufferHandle = 0; ErrorCode = oscam_stapi_SignalWaitBuffer(dev_list[dev_index].SignalHandle, &QueryBufferHandle, 1000); switch (ErrorCode) { case 0: // NO_ERROR: break; case 852042: // ERROR_SIGNAL_ABORTED cs_log("Caught abort signal"); pthread_exit(NULL); break; case 11: // ERROR_TIMEOUT: //cs_log("timeout %d", dev_index); //TODO: if pidindex == -1 try next continue; break; default: if (QueryBufferHandle != 0) { cs_log("SignalWaitBuffer error: %d", ErrorCode); oscam_stapi_BufferFlush(QueryBufferHandle); continue; } cs_log("SignalWaitBuffer: index %d ErrorCode: %d - QueryBuffer: %x", dev_index, ErrorCode, QueryBufferHandle); error_count++; if (error_count>10) { cs_log("Too many errors in reader thread %d, quitting.", dev_index); pthread_exit(NULL); } continue; break; } uint32_t NumFilterMatches = 0; int32_t demux_id = 0, filter_num = 0; DataSize = 0; uint32_t k; uint32_t MatchedFilterList[10]; ErrorCode = oscam_stapi_BufferReadSection(QueryBufferHandle, MatchedFilterList, 10, &NumFilterMatches, &CRCValid, buf, BUFFLEN, &DataSize); if (ErrorCode != 0) { cs_log("BufferRead: index: %d ErrorCode: %d", dev_index, ErrorCode); cs_sleepms(1000); continue; } if (DataSize<=0) continue; pthread_mutex_lock(&filter_lock); // don't use cs_lock() here; multiple threads using same s_client struct for(k=0;k<NumFilterMatches;k++) { for (i=0;i<MAX_DEMUX;i++) { for (j=0;j<MAX_FILTER;j++) { if (dev_list[dev_index].demux_fd[i][j].fd == MatchedFilterList[k]) { demux_id=i; filter_num=j; dvbapi_process_input(demux_id, filter_num, buf, DataSize); } } } } pthread_mutex_unlock(&filter_lock); } pthread_cleanup_pop(0); }