DSMCC  17.9.0
 All Data Structures Files Functions Typedefs
siq_cache.c
Go to the documentation of this file.
1 /*******************************************************************************
2  * Copyright © 2014 The DTVKit Open Software Foundation Ltd (www.dtvkit.org)
3  * Copyright © 2004 Ocean Blue Software Ltd
4  *
5  * This file is part of a DTVKit Software Component
6  * You are permitted to copy, modify or distribute this file subject to the terms
7  * of the DTVKit 1.0 Licence which can be found in licence.txt or at www.dtvkit.org
8  *
9  * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
10  * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES
11  * OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
12  *
13  * If you or your organisation is not a member of DTVKit then you have access
14  * to this source code outside of the terms of the licence agreement
15  * and you are expected to delete this and any associated files immediately.
16  * Further information on DTVKit, membership and terms can be found at www.dtvkit.org
17  *******************************************************************************/
24 /*---includes for this file--------------------------------------------------*/
25 #include <string.h>
26 
27 /* third party header files */
28 /* SIQ header files */
29 #include "siq_debug.h"
30 #include "siq_cache.h"
31 #include "siq_main.h"
32 
33 #include "cldsmcc.h"
34 
35 
36 /*---constant definitions for this file--------------------------------------*/
37 
38 #define SIQ_DEFAULT_PMT_TOTAL 64
39 #define VERSION_CHANGED 0xff
40 #define PMT_TID 0x02
41 
42 /*---local typedef structs for this file-------------------------------------*/
43 
44 typedef struct s_SiqCachePat
45 {
46  struct s_SiqCachePat *next;
47  U16BIT transId;
48  U16BIT serviceTotal;
49  U8BIT version;
50 } S_SiqCachePat;
51 
52 typedef struct s_SiqCachePmt
53 {
54  H_SiqPmtTable table;
55  U32BIT requestId;
56  U16BIT serviceId;
57  U16BIT pmtpid;
58  U16BIT accessed;
59  U8BIT subscribed;
60  U8BIT querying;
61  U8BIT refresh;
62  U8BIT version;
63 } S_SiqCachePmt;
64 
65 
66 /*---local (static) variable declarations for this file----------------------*/
67 /* (internal variables declared static to make them local) */
68 
69 /*------------Local function definitions for this file-----------------------*/
70 /* (internal functions declared static to make them local) */
71 
72 
73 static S_SiqCachePat* FindPat( S_SiqInstance *siq, U16BIT transId )
74 {
75  S_SiqCachePat *pPat = siq->patList;
76  while (pPat != NULL && pPat->transId != transId)
77  {
78  pPat = pPat->next;
79  }
80  return pPat;
81 }
82 
83 static void ClearPmts( S_SiqInstance *siq, S_SiqCachePmt *pPmt, U16BIT total )
84 {
85  while (total--)
86  {
87  if (pPmt->table != NULL)
88  {
89  DBGLOG(DS_CACHE, "pPmt=%p serviceId=%d", pPmt, pPmt->serviceId )
90  SIQ_PmtDestroyTable( siq, pPmt->table );
91  pPmt->table = NULL;
92  }
93  pPmt++;
94  }
95 }
96 
97 static void RemovePat( S_SiqInstance *siq, S_SiqCachePat *pPat )
98 {
99  S_SiqCachePat **ppPat;
100  ppPat = &(siq->patList);
101  while (*ppPat != NULL)
102  {
103  if (pPat == *ppPat)
104  {
105  //ClearPmts( siq, (S_SiqCachePmt*)(pPat + 1), pPat->serviceTotal );
106  *ppPat = pPat->next;
107  siq->setup.memFree( pPat );
108  break;
109  }
110  ppPat = &((*ppPat)->next);
111  }
112 }
113 
114 static void ClearPmtArray( S_SiqInstance *siq )
115 {
116  S_SiqCachePmt *pPmt;
117  U16BIT total;
118 
119  FUNCTION_START(ClearPmtArray)
120  pPmt = siq->pmtArray;
121  if (pPmt == NULL)
122  {
123  ERRLOG("")
124  ASSERT( siq->pmtTotal == 0 )
125  }
126  else if (siq->pmtCount != 0)
127  {
128  total = siq->pmtTotal;
129  while (total--)
130  {
131  if (pPmt->table != NULL)
132  {
133  DBGLOG(DS_CACHE, "pPmt=%p serviceId=%d", pPmt, pPmt->serviceId )
134  SIQ_PmtDestroyTable( siq, pPmt->table );
135  pPmt->table = NULL;
136  siq->pmtCount--;
137  if (siq->patList == NULL)
138  {
139  /* Default Pmt array */
140  pPmt->serviceId = 0;
141  }
142  if (siq->pmtCount == 0)
143  {
144  break;
145  }
146  }
147  pPmt++;
148  }
149  }
150  FUNCTION_FINISH(ClearPmtArray)
151 }
152 
153 static S_SiqCachePmt* GetCachePmt( S_SiqInstance *siq, U16BIT serviceId )
154 {
155  S_SiqCachePmt *pPmt, *result;
156  U16BIT total;
157 
158  FUNCTION_START(GetCachePmt)
159  result = NULL;
160  pPmt = siq->pmtArray;
161  total = siq->pmtTotal;
162  if (pPmt == NULL)
163  {
164  ERRLOG("")
165  ASSERT( total == 0 )
166  }
167  while (total--)
168  {
169  if (pPmt->serviceId == serviceId)
170  {
171  result = pPmt;
172  break;
173  }
174  pPmt++;
175  }
176  if (result == NULL)
177  {
178  /* this should only happen if not receiving PAT data */
179  pPmt = siq->pmtArray;
180  total = siq->pmtTotal;
181  while (total--)
182  {
183  if (pPmt->serviceId == 0)
184  {
185  result = pPmt;
186  pPmt->serviceId = serviceId;
187  break;
188  }
189  pPmt++;
190  }
191  }
192  FUNCTION_FINISH(GetCachePmt)
193  return result;
194 }
195 
203 static void ServiceRemoved( H_SiqInstance siq, S_SiqCachePmt *pCachePmt )
204 {
205  if (pCachePmt->table != NULL)
206  {
207  DBGLOG(DS_CACHE, "pPmt=%p serviceId=%d", pCachePmt, pCachePmt->serviceId )
208  SIQ_PmtDestroyTable( siq, pCachePmt->table );
209  pCachePmt->table = NULL;
210  siq->pmtCount--;
211  }
212  if (pCachePmt->subscribed)
213  {
214  CDSM_SysProcessSIChangeEvent( siq->dsmInstance, SICHANGE_SERVICE_DELETED, pCachePmt->serviceId, 0 );
215  pCachePmt->subscribed = 0;
216  }
217  if (pCachePmt->requestId)
218  {
219  siq->setup.dvpCancelTable( siq->setup.pmtref, pCachePmt->requestId ) ;
220  pCachePmt->requestId = 0;
221  pCachePmt->refresh = 0;
222  }
223  /* Delete outstanding queries for this service ? */
224  SIQ_DeleteQueriesOnService( siq, pCachePmt->serviceId );
225  pCachePmt->serviceId = 0;
226  pCachePmt->accessed = 0;
227 }
228 
229 /*------------GLOBAL function definitions for this file----------------------*/
230 
231 BOOLEAN SIQ_CacheInit( S_SiqInstance *siq )
232 {
233  BOOLEAN result = TRUE;
234  /* add default PMT array */
235  siq->pmtArray = siq->setup.memAlloc( SIQ_DEFAULT_PMT_TOTAL * sizeof(S_SiqCachePmt));
236  if (siq->pmtArray == NULL)
237  {
238  result = FALSE;
239  }
240  else
241  {
242  memset( siq->pmtArray, 0, SIQ_DEFAULT_PMT_TOTAL * sizeof(S_SiqCachePmt));
243  siq->pmtTotal = SIQ_DEFAULT_PMT_TOTAL;
244  }
245  return result;
246 }
247 
248 void SIQ_CacheExit( S_SiqInstance *siq )
249 {
250  S_SiqCachePat *pPat, *pNxt;
251  S_SiqCachePmt *pPmt;
252  U16BIT total;
253 
254  FUNCTION_START(SIQ_CacheExit)
255  pPmt = siq->pmtArray;
256  total = siq->pmtTotal;
257  while (total--)
258  {
259  if (pPmt->subscribed)
260  {
261  ERRLOG("Leaked SI change subscribe srv_id=%d", pPmt->serviceId)
262  }
263  if (pPmt->requestId)
264  {
265  siq->setup.dvpCancelTable( siq->setup.pmtref, pPmt->requestId );
266  }
267  if (pPmt->table != NULL)
268  {
269  SIQ_PmtDestroyTable(siq, pPmt->table);
270  pPmt->table = NULL;
271  }
272  pPmt++;
273  }
274  pPat = siq->patList;
275  if (pPat != NULL)
276  {
277  do
278  {
279  ClearPmts( siq, (S_SiqCachePmt *)(pPat + 1), pPat->serviceTotal );
280  pNxt = pPat->next;
281  siq->setup.memFree( pPat );
282  pPat = pNxt;
283  }
284  while (pPat != NULL);
285  }
286  else if (siq->pmtArray != NULL)
287  {
288  siq->setup.memFree(siq->pmtArray);
289  }
290  FUNCTION_FINISH(SIQ_CacheExit)
291 }
292 
301 void SIQ_UpdatePat( H_SiqInstance siq, U8BIT *dptr )
302 {
303  S_SiqCachePat *pPat, *pCachePat;
304  S_SiqCachePmt *pPmt;
305  S_SiqCachePmt *pCachePmt;
306  U16BIT id, len;
307  U8BIT version;
308  len = ((dptr[1] & 0x0F) << 8 | dptr[2]);
309  if (len < 9)
310  {
311  ERRLOG("PAT length too small %d", len)
312  }
313  else
314  {
315  id = dptr[3] << 8 | dptr[4];
316  version = (dptr[5] >> 1) & 0x1f;
317  pCachePat = FindPat( siq, id );
318  if (pCachePat == NULL || pCachePat->version != version)
319  {
320  len -= 9;
321  len >>= 2;
322  dptr += 8;
323  pPat = siq->setup.memAlloc( sizeof(S_SiqCachePat) + (len * sizeof(S_SiqCachePmt)));
324  if (pPat != NULL)
325  {
326  pPat->transId = id;
327  pPat->version = version;
328  pPat->serviceTotal = 0;
329  pPmt = (S_SiqCachePmt *)(pPat + 1);
330  for (; len--; dptr += 4)
331  {
332  id = (dptr[0] << 8) | dptr[1];
333  if (id != 0)
334  {
335  pPat->serviceTotal++;
336  pCachePmt = GetCachePmt( siq, id );
337  if (pCachePmt)
338  {
339  *pPmt = *pCachePmt;
340  pCachePmt->table = NULL;
341  pCachePmt->serviceId = 0;
342  }
343  else
344  {
345  pPmt->serviceId = id;
346  pPmt->subscribed = 0;
347  pPmt->querying = 0;
348  pPmt->requestId = 0;
349  pPmt->accessed = 0;
350  pPmt->refresh = 0;
351  pPmt->version = 0;
352  pPmt->table = NULL;
353  }
354  pPmt->pmtpid = ((dptr[2] & 0x1f) << 8) | dptr[3];
355  pPmt++;
356  }
357  }
358  for (pPmt = siq->pmtArray, len = siq->pmtTotal; len--; pPmt++)
359  {
360  if (pPmt->serviceId != 0)
361  {
362  /* Service not found in new PAT */
363  ServiceRemoved( siq, pPmt );
364  }
365  }
366  if (siq->patList == NULL && siq->pmtArray != NULL)
367  {
368  /* First time received a PAT - clear default list */
369  siq->setup.memFree( siq->pmtArray );
370  }
371  else if (pCachePat != NULL)
372  {
373  RemovePat(siq, pCachePat);
374  }
375  pPat->next = siq->patList;
376  siq->patList = pPat;
377  siq->pmtArray = (H_SiqCachePmt)(pPat + 1);
378  siq->pmtTotal = pPat->serviceTotal;
379  }
380  }
381  }
382 }
383 
391 void SIQ_TransportChanged( H_SiqInstance siq, U16BIT origNetworkId, U16BIT transportId )
392 {
393  if (siq->origNetworkId != origNetworkId ||
394  siq->transportId != transportId)
395  {
396  siq->origNetworkId = origNetworkId;
397  siq->transportId = transportId;
398  SIQ_CacheClear( siq );
399  }
400 }
401 
409 void SIQ_ServiceRemoved( H_SiqInstance siq, U16BIT serviceId )
410 {
411  S_SiqCachePmt *pCachePmt;
412  pCachePmt = GetCachePmt( siq, serviceId );
413  if (pCachePmt == NULL)
414  {
415  ERRLOG("No Cache slot for serviceId=0x%x", serviceId)
416  }
417  else
418  {
419  ServiceRemoved( siq, pCachePmt );
420  }
421 }
422 
433 E_SIQ_STATUS SIQ_RequirePmt( H_SiqInstance siq, U8BIT *pmt,
434  U16BIT *pSid, U8BIT *pVer )
435 {
436  S_SiqCachePmt *pCachePmt;
437  U8BIT version;
438  U16BIT serviceId;
439  E_SIQ_STATUS status;
440 
441  if (pmt == NULL)
442  {
443  ERRLOG("NULL PMT data")
444  status = SIQ_ERROR;
445  }
446  else if (*pmt != PMT_TID)
447  {
448  ERRLOG("Bad PMT data! (table id=0x%x)", *pmt )
449  status = SIQ_ERROR;
450  }
451  else
452  {
453  serviceId = pmt[3] << 8 | pmt[4];
454  pCachePmt = GetCachePmt( siq, serviceId );
455  if (pCachePmt == NULL)
456  {
457  ERRLOG("No Cache slot for serviceId=0x%x", serviceId)
458  status = SIQ_ERROR;
459  }
460  else
461  {
462  if (siq->patList == NULL)
463  {
464  DBGLOG(DS_PAT, "Not received PAT")
465  }
466  version = (pmt[5] >> 1) & 0x1f;
467  if (pCachePmt->table != NULL && pCachePmt->version == version)
468  {
469  DBGLOG(DS_CACHE, "Ignore PMT srv_id=0x%x vers=%d", serviceId, version)
470  status = SIQ_IGNORE;
471  }
472  else
473  {
474  DBGLOG(DS_CACHE, "new PMT srv_id=0x%x vers=%d, was v=%d tbl=%p", serviceId, version, pCachePmt->version, pCachePmt->table)
475  status = SIQ_UPDATE;
476  *pSid = serviceId;
477  *pVer = version;
478  }
479  }
480  }
481  return status;
482 }
483 
494 H_SiqPmtTable SIQ_ParsePmt( H_SiqInstance siq, U8BIT *pmt )
495 {
496  return SIQ_PmtCreateTable( siq, pmt );
497 }
498 
509 void SIQ_ProcessPmt( H_SiqInstance siq, H_SiqPmtTable hNewTable,
510  U16BIT serviceId, U8BIT version )
511 {
512  H_SiqCachePmt pCachePmt;
513  H_SiqPmtTable hOldTable;
514 
515  pCachePmt = GetCachePmt( siq, serviceId );
516  if (pCachePmt == NULL)
517  {
518  ERRLOG("No Cache PMT!")
519  }
520  else
521  {
522  hOldTable = pCachePmt->table;
523  DBGLOG(DS_CACHE, "new PMT srv_id=0x%x vers=%d old=%p requestId=%x",
524  serviceId, version, hOldTable, pCachePmt->requestId )
525  DBGLOG(DS_CACHE, "pPmt=%p newTable=%p", pCachePmt, hNewTable )
526  pCachePmt->table = hNewTable;
527  pCachePmt->version = version;
528  if (hOldTable != NULL)
529  {
530  ASSERT( !pCachePmt->querying );
531  if (pCachePmt->subscribed)
532  {
533  SIQ_PmtCheckTableChange( siq, hOldTable, hNewTable, serviceId );
534  }
535  SIQ_PmtDestroyTable( siq, hOldTable );
536  }
537  else
538  {
539  siq->pmtCount++;
540  if (pCachePmt->requestId)
541  {
542  ASSERT( hOldTable == NULL );
543  pCachePmt->querying = 0;
544  SIQ_QueryPmtReceive( siq, serviceId, hNewTable );
545  if (!pCachePmt->subscribed)
546  {
547  siq->setup.dvpCancelTable( siq->setup.pmtref, pCachePmt->requestId );
548  pCachePmt->requestId = 0;
549  }
550  }
551  }
552  }
553 }
554 
555 H_SiqPmtTable SIQ_CacheRetrievePmt( S_SiqInstance *siq, U16BIT serviceId, U32BIT *gettingPmt )
556 {
557  S_SiqCachePmt *pCachePmt;
558  H_SiqPmtTable result;
559 
560  FUNCTION_START(SIQ_CacheRetrievePmt)
561  pCachePmt = GetCachePmt( siq, serviceId );
562  if (pCachePmt == NULL)
563  {
564  result = NULL;
565  *gettingPmt = 0;
566  }
567  else
568  {
569  pCachePmt->accessed = ++(siq->cacheAccess);
570  result = pCachePmt->table;
571  if (result != NULL)
572  {
573  *gettingPmt = 0;
574  }
575  else
576  {
577  if (!pCachePmt->requestId)
578  {
579  pCachePmt->querying = 1;
580  pCachePmt->requestId = siq->setup.dvpRequestTable(siq->setup.pmtref, pCachePmt->pmtpid, serviceId, PMT_TID );
581  }
582  *gettingPmt = pCachePmt->requestId;
583  }
584  }
585  FUNCTION_FINISH(SIQ_CacheRetrievePmt)
586  return result;
587 }
588 
595 void SIQ_CacheClearPmt( H_SiqInstance siq, U16BIT serviceId )
596 {
597  S_SiqCachePmt *pPmt;
598  U16BIT total;
599 
600  FUNCTION_START(SIQ_CacheClearPmt)
601  pPmt = siq->pmtArray;
602  total = siq->pmtTotal;
603  if (pPmt == NULL)
604  {
605  ERRLOG("")
606  ASSERT( total == 0 )
607  }
608  while (total--)
609  {
610  if (pPmt->serviceId == serviceId)
611  {
612  DBGLOG(DS_CACHE, "pPmt=%p serviceId=%d", pPmt, pPmt->serviceId )
613  SIQ_PmtDestroyTable( siq, pPmt->table );
614  pPmt->table = NULL;
615  pPmt->refresh = 1;
616  siq->pmtCount--;
617  if (siq->patList == NULL)
618  {
619  /* Default Pmt array */
620  pPmt->serviceId = 0;
621  }
622  break;
623  }
624  pPmt++;
625  }
626  FUNCTION_FINISH(SIQ_CacheClearPmt)
627 }
628 
629 void SIQ_CacheClear( S_SiqInstance *siq )
630 {
631  S_SiqCachePat *pPat = siq->patList;
632  if (pPat == NULL)
633  {
634  ClearPmtArray(siq);
635  }
636  else
637  {
638  ClearPmts( siq, (S_SiqCachePmt *)(pPat + 1), pPat->serviceTotal );
639  }
640 }
641 
649 E_DscError SIQ_ServiceInfoChangeSubscribe( S_SiqInstance *siq, U16BIT serviceId )
650 {
651  S_SiqCachePmt *pCachePmt;
652  E_DscError err;
653 
654  FUNCTION_START(SIQ_ServiceInfoChangeSubscribe)
655  pCachePmt = GetCachePmt( siq, serviceId );
656  if (pCachePmt == NULL)
657  {
658  err = CLDSM_ERR_SI_SUBSCRIBE_FAILURE;
659  }
660  else
661  {
662  if (pCachePmt->refresh)
663  {
664  pCachePmt->refresh = 0;
665  if (pCachePmt->requestId)
666  {
667  siq->setup.dvpCancelTable( siq->setup.pmtref, pCachePmt->requestId );
668  pCachePmt->requestId = 0;
669  }
670  }
671  if (!pCachePmt->requestId)
672  {
673  pCachePmt->requestId = siq->setup.dvpRequestTable( siq->setup.pmtref, pCachePmt->pmtpid, serviceId, PMT_TID );
674  }
675  if (pCachePmt->requestId)
676  {
677  err = CLDSM_OK;
678  pCachePmt->subscribed++;
679  }
680  else
681  {
682  err = CLDSM_ERR_SI_SUBSCRIBE_FAILURE;
683  }
684  }
685  FUNCTION_FINISH(SIQ_ServiceInfoChangeSubscribe)
686  return err;
687 }
688 
696 void SIQ_ServiceInfoChangeUnsubscribe( S_SiqInstance *siq, U16BIT serviceId )
697 {
698  S_SiqCachePmt *pCachePmt;
699 
700  FUNCTION_START(SIQ_ServiceInfoChangeSubscribe)
701  pCachePmt = GetCachePmt( siq, serviceId );
702  if (pCachePmt != NULL && pCachePmt->subscribed)
703  {
704  pCachePmt->subscribed--;
705  ASSERT(pCachePmt->requestId != 0)
706  if (!pCachePmt->subscribed && !pCachePmt->querying)
707  {
708  /* Tell DVB stack to stop sending PMT data */
709  siq->setup.dvpCancelTable( siq->setup.pmtref, pCachePmt->requestId );
710  }
711  }
712  FUNCTION_FINISH(SIQ_ServiceInfoChangeSubscribe)
713 }
714 
void SIQ_ServiceInfoChangeUnsubscribe(S_SiqInstance *siq, U16BIT serviceId)
Unsubscribe component to previously subscribed service change or alteration updates.
Definition: siq_cache.c:696
H_SiqPmtTable SIQ_PmtCreateTable(S_SiqInstance *siq, U8BIT *data)
Create PMT structure for monitoring (life-cycle, NB_Info)
Definition: siq_pmt.c:444
void SIQ_CacheClearPmt(H_SiqInstance siq, U16BIT serviceId)
Clear cached PMT information.
Definition: siq_cache.c:595
void SIQ_PmtDestroyTable(S_SiqInstance *siq, H_SiqPmtTable table)
Destroy PMT structure created by PMT_CreateTable.
Definition: siq_pmt.c:635
void SIQ_UpdatePat(H_SiqInstance siq, U8BIT *dptr)
Provide SIQ with latest PAT data. Calling this function is optional. However, if not used...
Definition: siq_cache.c:301
E_SIQ_STATUS SIQ_RequirePmt(H_SiqInstance siq, U8BIT *pmt, U16BIT *pSid, U8BIT *pVer)
Ask SIQ whether PMT section data is required. It assumes CRC has been checked and is passing valid PM...
Definition: siq_cache.c:433
void SIQ_TransportChanged(H_SiqInstance siq, U16BIT origNetworkId, U16BIT transportId)
Inform SIQ when a demux is tuning to another transport stream. Not required if PAT is supplied to SIQ...
Definition: siq_cache.c:391
Main API to DSM-CC core layer (provided functions and required callbacks).
H_SiqPmtTable SIQ_ParsePmt(H_SiqInstance siq, U8BIT *pmt)
Provide PMT section data to SIQ. It assumes CRC has been checked and is passing valid PMT sections So...
Definition: siq_cache.c:494
void SIQ_QueryPmtReceive(S_SiqInstance *siq, U16BIT serviceId, H_SiqPmtTable hpmt)
Definition: siq_main.c:293
void SIQ_ProcessPmt(H_SiqInstance siq, H_SiqPmtTable hNewTable, U16BIT serviceId, U8BIT version)
Provide PMT section data to SIQ. It assumes CRC has been checked and is passing valid PMT sections So...
Definition: siq_cache.c:509
Service Information Query: debug definitions.
void SIQ_PmtCheckTableChange(S_SiqInstance *siq, H_SiqPmtTable pOldTable, H_SiqPmtTable pNewTable, U16BIT serviceId)
For each carousel Id in old table, search through new table to see if it still exists. If not, tell DSM-CC. Then tell DSM-CC that PMT has been updated.
Definition: siq_pmt.c:987
Service Information Query: cache functionality.
E_DscError SIQ_ServiceInfoChangeSubscribe(S_SiqInstance *siq, U16BIT serviceId)
Subscribe a component to receive notification of any changes or alterations to the service informatio...
Definition: siq_cache.c:649
void SIQ_ServiceRemoved(H_SiqInstance siq, U16BIT serviceId)
Inform SIQ when a service has been removed from PAT. Not required if PAT is supplied to SIQ...
Definition: siq_cache.c:409
Service Information Query: main definitions.
E_DscError CDSM_SysProcessSIChangeEvent(H_DsmCoreInst instance, E_SIChangeEvent evnt, U16BIT service_id, U32BIT carousel_id)
Notify that the SI for the indicated service has changed Changes should be notified in the following ...
Definition: clDsmMain.c:1113