1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
|
#include <string.h>
#include <strings.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include "DSM_ExtAPI.h"
#include "DSM_Log.h"
#include "DSM_Port.h"
#define appdsm_DSMStatus_ToString( _status_ ) (\
( _status_ == DSM_Status_New ) ? "NEW":\
( _status_ == DSM_Status_Reachable ) ? "REACHABLE":\
( _status_ == DSM_Status_Unreachable ) ? "UNREACHABLE":\
( _status_ == DSM_Status_Removed ) ? "REMOVED":\
"unknown")
/* appli context */
struct appdsmCtx_t {
DSM_UCHAR dvbt_buffer[100000];
DSM_UCHAR sipsi_buffer[4096];
unsigned char dvbtNetworkFound;
unsigned char dvbtServiceOk;
unsigned char sipsiServiceOk;
DSM_ServiceHandle dvbtServHdl;
DSM_ServiceHandle sipsiServHdl;
};
/* services status callback */
void appdsm_ServiceStatusCB( void * userContext, const DSM_ServiceStatusCbData * pStatus ) {
struct appdsmCtx_t * pCtx = (struct appdsmCtx_t *)userContext;
if (pStatus->status == DSM_Service_OK) {
printf("<Service Status> handle %d : status %s\n",
pStatus->handle, "OK" );
if ( pStatus->handle == pCtx->dvbtServHdl ) {
pCtx->dvbtServiceOk = 1;
} else if ( pStatus->handle == pCtx->sipsiServHdl ) {
pCtx->sipsiServiceOk = 1;
}
}
}
/* events callbacks */
void appdsm_EventsCB( void * userContext, const DSM_EventCbData * pStatus ) {
struct appdsmCtx_t * pCtx = (struct appdsmCtx_t *)userContext;
if (( pStatus->event == DSM_Event_ServGroup )
&& ( pStatus->info.servGroup.sg.type == DSM_ServiceProtocol_DVBT ))
{
printf("<Event Svc Group> NwId: %d %s \n",
pStatus->info.servGroup.sg.subref.dvbt.nid,
appdsm_DSMStatus_ToString( pStatus->info.servGroup.status) );
/* DSM_MiliSecSleep(500);*/
pCtx->dvbtNetworkFound = 1;
}
}
void myCallback (void *context, DSM_ServiceHandle serviceHdl, DSM_ComponentHandle componentHdl, DSM_BufContext *dsmBufCtx, eDSM_DataStatus Status ) {
FILE *TsOut;
TsOut = fopen("out.ts", "ab");
fwrite( dsmBufCtx->BufAdd, sizeof(DSM_CHAR), dsmBufCtx->BufSize, TsOut);
fclose(TsOut);
dsmBufCtx->BufSize = 100000;
if (Status != DSM_DataStatus_Removed)
DSM_RegisterDataBuffer ( dsmBufCtx, serviceHdl, componentHdl );
}
void myCallbackSIPSI (void *context, DSM_ServiceHandle serviceHdl, DSM_ComponentHandle componentHdl, DSM_BufContext *dsmBufCtx, eDSM_DataStatus Status ) {
FILE *TsOut;
TsOut = fopen("outSIPSI.ts", "ab");
fwrite( dsmBufCtx->BufAdd, sizeof(DSM_CHAR), dsmBufCtx->BufSize, TsOut);
fclose(TsOut);
dsmBufCtx->BufSize = 4096;
if (Status != DSM_DataStatus_Removed)
DSM_RegisterDataBuffer ( dsmBufCtx, serviceHdl, componentHdl );
}
DSM_ServiceHandle appdsm_addDVBT( unsigned int nid, unsigned int tsid, unsigned int onid, unsigned int servid,
DSM_Bool enablePatPmtInRawTS, eDSM_ServicePriority priority, eDSM_ServiceMode mode ) {
DSM_Service serv;
DSM_ServiceHandle servHdl;
DSM_ServiceDVBT_Init( &serv ); /* default initialization */
serv.priority = priority;
serv.mode = mode;
serv.protocol = DSM_ServiceProtocol_DVBT;
serv.cbCtx.CallbackFunc = myCallback;
serv.cbCtx.timeout = DIB_TIMEOUT_INFINITE;
serv.data.dvbt.nid = nid;
serv.data.dvbt.tsid = tsid;
serv.data.dvbt.onid = onid;
serv.data.dvbt.servid = servid;
serv.data.dvbt.enablePatPmtInRawTS = DSM_True;
servHdl = DSM_AddService( &serv );
return servHdl;
}
DSM_ServiceHandle appdsm_addSIPSI ( void ) {
DSM_Service serv;
DSM_ServiceHandle servHdl;
DSM_ServiceSIPSI_Init( &serv );
serv.cbCtx.CallbackFunc = myCallbackSIPSI;
serv.cbCtx.timeout = DIB_TIMEOUT_INFINITE;
servHdl = DSM_AddService( &serv );
return servHdl;
}
/*********************************************************
* main function
*********************************************************/
int main() {
DSM_Result ret;
DSM_Config DSM_Config;
DSM_DatabaseConfig LoadedDatabase;
struct appdsmCtx_t appCtx;
/* appli context init */
appCtx.dvbtNetworkFound = 0;
appCtx.dvbtServiceOk = 0;
appCtx.sipsiServiceOk = 0;
appCtx.dvbtServHdl = DSM_ServiceHandle_NULL;
appCtx.sipsiServHdl = DSM_ServiceHandle_NULL;
/* initialize config */
DSM_API_Config_Init(&DSM_Config);
DSM_Config.nbFrequencies = 0;
printf("nombre de frequence a scanner = ");
scanf("%u", &DSM_Config.nbFrequencies);
DSM_Config.frequenciesArray = (DSM_RFChan*) malloc( DSM_Config.nbFrequencies*sizeof( DSM_RFChan ) );
DSM_Config.frequenciesArray[0].id.freq = (DSM_FreqKhz)0;
printf("quel freq(Khz) a scanner ->");
scanf("%u", &DSM_Config.frequenciesArray[0].id.freq);
DSM_Config.frequenciesArray[0].type = DSM_PhysicalLayer_DVB;
DSM_Config.frequenciesArray[0].subref.dvb.bandwidth = DSM_Bandwidth_8Mhz;
DSM_Config.frequenciesArray[0].subref.dvb.hierarchical = DSM_Hierarchical_HP;
/* open dsm */
ret = DSM_Open(&DSM_Config );
assert( ret == DSM_Success );
DSM_DEFAULT_LOG_LEVEL();
/* free config */
free( (void*)DSM_Config.frequenciesArray );
DSM_Config.frequenciesArray = NULL;
/* register callback */
DSM_RegisterServiceStatusCallback( appdsm_ServiceStatusCB, &appCtx );
DSM_RegisterEventCallback( appdsm_EventsCB, &appCtx, 0 );
/* Start dsm */
DSM_DatabaseConfig_Init( &LoadedDatabase );
ret = DSM_Start( &LoadedDatabase );
assert( ret == DSM_Success );
/* Wait for a network to be found */
while (appCtx.dvbtNetworkFound != 1)
DSM_MiliSecSleep(1000);
/* waiting for user interaction */
getchar();
/* quit */
DSM_Stop( NULL );
DSM_Close( );
return 0;
} |
Partager