G711DecTest.c revision b44cdb1b44b144d09e8ec950d1e8e4c280064056
1
2/*
3 *  Copyright 2001-2008 Texas Instruments - http://www.ti.com/
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17/* =============================================================================
18 *             Texas Instruments OMAP (TM) Platform Software
19 *  (c) Copyright Texas Instruments, Incorporated.  All Rights Reserved.
20 *
21 *  Use of this software is controlled by the terms and conditions found
22 *  in the license agreement under which this software has been supplied.
23 * =========================================================================== */
24/**
25 * @file G711DecTest.c
26 *
27 * This file contains the test application code that invokes the component.
28 *
29 * @path  $(CSLPATH)\OMAPSW_MPU\linux\audio\src\openmax_il\g711\tests
30 *
31 * @rev  1.0
32 */
33/* ----------------------------------------------------------------------------
34 *!
35 *! Revision History
36 *! ===================================
37 *! 14-dec-2006 sc: creation
38 * =========================================================================== */
39
40
41/* standard header files */
42#include <unistd.h>
43#include <stdlib.h>
44#include <sys/ioctl.h>
45#include <sys/select.h>
46#include <string.h>
47#include <stdio.h>
48#include <fcntl.h>
49#include <errno.h>
50#include <linux/vt.h>
51#include <signal.h>
52#include <sys/stat.h>
53#include <pthread.h>
54#include <stdio.h>
55#include <linux/soundcard.h>
56
57/* OMX header files */
58#include <OMX_Index.h>
59#include <OMX_Types.h>
60#include <OMX_Component.h>
61#include <OMX_Core.h>
62#include <OMX_Audio.h>
63#include <TIDspOmx.h>
64
65
66#ifdef OMX_GETTIME
67#include <OMX_Common_Utils.h>
68#include <OMX_GetTime.h>     /*Headers for Performance & measuremet    */
69#endif
70
71/* ======================================================================= */
72/**
73 * @def APP_DEBUG Configure Debug traces
74 */
75/* ======================================================================= */
76#undef APP_DEBUG
77/*For timestamp and tickcount*/
78#undef APP_TIME_TIC_DEBUG
79/* ======================================================================= */
80/**
81 * @def APP_DEBUG Configure Debug traces
82 */
83/* ======================================================================= */
84#undef APP_MEMCHECK
85/* ======================================================================= */
86/**
87 * @def    APP_MEMDEBUG    This Macro turns On the logic to detec memory
88 *                         leaks on the App. To debug the component,
89 *                         WMADEC_MEMDEBUG must be defined.
90 */
91/* ======================================================================= */
92#undef APP_MEMDEBUG
93
94void *arr[500] = {NULL};
95int lines[500]= {0};
96int bytes[500]= {0};
97char file[500][50]= {""};
98
99#ifdef APP_MEMDEBUG
100int r;
101#define newmalloc(x) mymalloc(__LINE__,__FILE__,x)
102#define newfree(z) myfree(z,__LINE__,__FILE__)
103void * mymalloc(int line, char *s, int size);
104int myfree(void *dp, int line, char *s);
105#else
106#define newmalloc(x) malloc(x)
107#define newfree(z) free(z)
108#endif
109
110/* ======================================================================= */
111/**
112 * @def  DASF                           Define a Value for DASF mode
113 */
114/* ======================================================================= */
115#define DASF 1
116/* ======================================================================= */
117/**
118 * @def  USE_BUFFER                 Buffer allocation method (app vs OMX)
119 */
120/* ======================================================================= */
121#undef USE_BUFFER
122/* ======================================================================= */
123/**
124 * @def  FIFO1, FIFO2                 FIFO
125 */
126/* ======================================================================= */
127#define FIFO1 "/dev/fifo.1"
128#define FIFO2 "/dev/fifo.2"
129/* ======================================================================= */
130/**
131 * @def  GAIN                      Define a GAIN value for Configure Audio
132 */
133/* ======================================================================= */
134#define GAIN 95
135/* ======================================================================= */
136/**
137 * @def    INPUT_G711DEC_BUFFER_SIZE             Standart Input Buffer Size
138 *                                                (1 frame)
139 */
140/* ======================================================================= */
141#define INPUT_G711DEC_BUFFER_SIZE 80
142/* ======================================================================= */
143/**
144 * @def    OUTPUT_G711DEC_BUFFER_SIZE           Standart Output Buffer Size
145 */
146/* ======================================================================= */
147#define OUTPUT_G711DEC_BUFFER_SIZE 160
148/* ======================================================================= */
149/**
150 * @def    G711DEC_SAMPLING_FREQUENCY          Sampling Frequency
151 */
152/* ======================================================================= */
153#define G711DEC_SAMPLING_FREQUENCY 8000
154/* ======================================================================= */
155/**
156 * @def    G711_APP_ID          Application Id
157 */
158/* ======================================================================= */
159#define G711_APP_ID 100
160/* ======================================================================= */
161/**
162 * @def    G711_MAX_NUM_BUFS    Number of buffer
163 */
164/* ======================================================================= */
165#define G711_MAX_NUM_BUFS 10
166/* ======================================================================= */
167/**
168 *  MACROS used for debug
169 */
170/* ======================================================================= */
171#ifdef APP_DEBUG
172#define APP_DPRINT(...)    fprintf(stderr,__VA_ARGS__)
173#else
174#define APP_DPRINT(...)
175#endif
176
177#ifdef APP_MEMCHECK
178#define APP_MEMPRINT(...)    fprintf(stderr,__VA_ARGS__)
179#else
180#define APP_MEMPRINT(...)
181#endif
182
183#ifdef APP_TIME_TIC_DEBUG
184#define TIME_PRINT(...)     fprintf(stderr,__VA_ARGS__)
185#define TICK_PRINT(...)     fprintf(stderr,__VA_ARGS__)
186#else
187#define TIME_PRINT(...)
188#define TICK_PRINT(...)
189#endif
190
191#ifdef OMX_GETTIME
192OMX_ERRORTYPE eError = OMX_ErrorNone;
193int GT_FlagE = 0;  /* Fill Buffer 1 = First Buffer,  0 = Not First Buffer  */
194int GT_FlagF = 0;  /*Empty Buffer  1 = First Buffer,  0 = Not First Buffer  */
195static OMX_NODE* pListHead = NULL;
196#endif
197
198/* ======================================================================= */
199/**
200 *  PRIVATE functions
201 */
202/* ======================================================================= */
203OMX_S16 GetInfoFromBufferHeader(OMX_U8 **pBufPtr, OMX_S16 *pCurBitRate,OMX_S16 *pNextBitRateFlag);
204void ResetBufferPointers(OMX_U8 **pBuffer);
205OMX_S16 maxint(OMX_S16 a, OMX_S16 b);
206OMX_S16 fill_data (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn);
207OMX_ERRORTYPE send_input_buffer (OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn);
208void ConfigureAudio();
209
210/* ======================================================================= */
211/**
212 *  GLOBAL variables
213 */
214/* ======================================================================= */
215FILE *inputToSN = NULL;
216OMX_S16 inputPortDisabled = 0;
217OMX_S16 outputPortDisabled = 0;
218OMX_S16 alternate = 0;
219OMX_S16 numRead = 0;
220OMX_S16 testCaseNo = 0;
221OMX_STRING strG711Decoder = "OMX.TI.G711.decode";
222
223pthread_mutex_t WaitForState_mutex;
224pthread_cond_t  WaitForState_threshold;
225OMX_U8          WaitForState_flag = 0;
226OMX_U8          TargetedState = 0;
227
228/* pipe management */
229int IpBuf_Pipe[2] = {0};
230int OpBuf_Pipe[2] = {0};
231int Event_Pipe[2] = {0};
232fd_set rfds;
233static OMX_BOOL bInvalidState;
234OMX_S16 done = 0;
235OMX_S16 dasfmode = 0;
236OMX_S16 fsizemode = 0;
237/******************************************************************************/
238OMX_S16 numInputBuffers = 0;
239OMX_S16 numOutputBuffers = 0;
240#ifdef USE_BUFFER
241OMX_U8* pInputBuffer[10] = {NULL};
242OMX_U8* pOutputBuffer[10] = {NULL};
243#endif
244
245OMX_BUFFERHEADERTYPE* pInputBufferHeader[10]  = {NULL};
246OMX_BUFFERHEADERTYPE* pOutputBufferHeader[10] = {NULL};
247
248int timeToExit = 0;
249/* RM control */
250int preempted = 0;
251/******************************************************************************/
252
253
254/* ----------------------------------------------------------------------------
255 * maxint()
256 *
257 * safe routine to get the maximum of 2 integers
258 * ---------------------------------------------------------------------------- */
259OMX_S16 maxint(OMX_S16 a, OMX_S16 b)
260{
261    return (a>b) ? a : b;
262}
263
264/* ----------------------------------------------------------------------------
265 * WaitForState()
266 *
267 * This function is called by the application.
268 * It blocks until the OMX component is not in the DesiredState
269 * ---------------------------------------------------------------------------- */
270static OMX_ERRORTYPE WaitForState(OMX_HANDLETYPE* pHandle, OMX_STATETYPE DesiredState)
271{
272    OMX_STATETYPE CurState = OMX_StateInvalid;
273    OMX_ERRORTYPE eError = OMX_ErrorNone;
274    OMX_S16 nCnt = 0;
275    OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle;
276    eError = pComponent->GetState(pHandle, &CurState);
277
278    while( (eError == OMX_ErrorNone) && (CurState != DesiredState) && (eError == OMX_ErrorNone) ) {
279        // sleep(1);
280        if(nCnt++ == 10) {
281            APP_DPRINT( "Still Waiting, press CTL-C to continue\n");
282        }
283        eError = pComponent->GetState(pHandle, &CurState);
284    }
285
286    if( eError != OMX_ErrorNone ) return eError;
287    return OMX_ErrorNone;
288}
289
290/* ----------------------------------------------------------------------------
291 * EventHandler()
292 *
293 * This function is called by OMX component as
294 * a callback when one of the following OMX_EVENTS
295 * occurs:
296 *
297 * OMX_EventCmdComplete,         component has sucessfully completed a command
298 * OMX_EventError,               component has detected an error condition
299 * OMX_EventMark,                component has detected a buffer mark
300 * OMX_EventPortSettingsChanged, component is reported a port settings change
301 * OMX_EventBufferFlag,          component has detected an EOS
302 * OMX_EventResourcesAcquired,   component has been granted resources and is
303 *                               automatically starting the state change from
304 *                               OMX_StateWaitForResources to OMX_StateIdle.
305 * ---------------------------------------------------------------------------- */
306OMX_ERRORTYPE EventHandler(OMX_HANDLETYPE hComponent,OMX_PTR pAppData,OMX_EVENTTYPE eEvent,
307                           OMX_U32 nData1,OMX_U32 nData2,OMX_PTR pEventData)
308{
309    OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)hComponent;
310    OMX_STATETYPE state = OMX_StateInvalid;
311    OMX_ERRORTYPE eError = OMX_ErrorNone;
312    OMX_U8 writeValue = 0;
313
314    eError = pComponent->GetState (hComponent, &state);
315    APP_DPRINT("%d Error returned from GetState\n",__LINE__);
316    if(eError != OMX_ErrorNone) {
317        APP_DPRINT("%d :: App: Error returned from GetState\n",__LINE__);
318    }
319
320    switch (eEvent) {
321    case OMX_EventResourcesAcquired:
322        writeValue = 1;
323        preempted = 0;
324        write(Event_Pipe[1], &writeValue, sizeof(OMX_U8));
325        APP_DPRINT( "%d :: App: Component OMX_EventResourcesAquired = %d\n", __LINE__,eEvent);
326        break;
327    case OMX_EventBufferFlag:
328        writeValue = 2;
329        write(Event_Pipe[1], &writeValue, sizeof(OMX_U8));
330        printf( "%d :: App: Component OMX_EventBufferFlag = %d\n", __LINE__,eEvent);
331        break;
332    case OMX_EventCmdComplete:
333        APP_DPRINT ( "%d :: App: Component State Changed To %d\n", __LINE__,state);
334        if (nData1 == OMX_CommandPortDisable) {
335            if (nData2 == OMX_DirInput) {
336                inputPortDisabled = 1;
337            }
338            APP_DPRINT( "%d :: App: Component OMX_EventCmdComplete = %d\n", __LINE__,eEvent);
339            if (nData2 == OMX_DirOutput) {
340                outputPortDisabled = 1;
341            }
342            APP_DPRINT( "%d :: App: Component OMX_EventCmdComplete = %d\n", __LINE__,eEvent);
343        }
344        if ((nData1 == OMX_CommandStateSet) && (TargetedState == nData2) &&
345            (WaitForState_flag)){
346            WaitForState_flag = 0;
347            pthread_mutex_lock(&WaitForState_mutex);
348            pthread_cond_signal(&WaitForState_threshold);
349            pthread_mutex_unlock(&WaitForState_mutex);
350        }
351        APP_DPRINT( "%d :: App: Component OMX_EventCmdComplete = %d\n", __LINE__,(int)nData2);
352        break;
353
354    case OMX_EventError:
355        if (nData1 == OMX_ErrorInvalidState) {
356            bInvalidState = OMX_TRUE;
357        }
358        else if(nData1 == OMX_ErrorResourcesPreempted) {
359            writeValue = 0;
360            preempted = 1;
361            write(Event_Pipe[1], &writeValue, sizeof(OMX_U8));
362        }
363        else if (nData1 == OMX_ErrorResourcesLost) {
364            WaitForState_flag = 0;
365            pthread_mutex_lock(&WaitForState_mutex);
366            pthread_cond_signal(&WaitForState_threshold);
367            pthread_mutex_unlock(&WaitForState_mutex);
368        }
369        else if(nData1 == OMX_ErrorResourcesPreempted) {
370            writeValue = 0;
371            preempted = 1;
372            write(Event_Pipe[1], &writeValue, sizeof(OMX_U8));
373        }
374        APP_DPRINT( "%d :: App: Component OMX_EventError = %d\n", __LINE__,eEvent);
375        break;
376
377    case OMX_EventMax:
378    case OMX_EventMark:
379        break;
380
381    default:
382        break;
383    }
384
385    return eError;
386}
387
388/* ----------------------------------------------------------------------------
389 * FillBufferDone()
390 *
391 * This function is called by OMX component as
392 * a callback when a Buffer has been filled
393 * ---------------------------------------------------------------------------- */
394void FillBufferDone (OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBuffer)
395{
396    APP_DPRINT ("APP:::: OUTPUT BUFFER = %p && %p\n",pBuffer, pBuffer->pBuffer);
397    APP_DPRINT ("APP:::: pBuffer->nFilledLen = %d\n",(int)pBuffer->nFilledLen);
398    /*add on: TimeStamp & TickCount EmptyBufferDone*/
399    TIME_PRINT("TimeStamp Output: %lld\n",pBuffer->nTimeStamp);
400    TICK_PRINT("TickCount Output: %ld\n\n",pBuffer->nTickCount);
401    write(OpBuf_Pipe[1], &pBuffer, sizeof(pBuffer));
402#ifdef OMX_GETTIME
403    if (GT_FlagF == 1 ) /* First Buffer Reply*/  /* 1 = First Buffer,  0 = Not First Buffer  */
404    {
405        GT_END("Call to FillBufferDone  <First: FillBufferDone>");
406        GT_FlagF = 0 ;   /* 1 = First Buffer,  0 = Not First Buffer  */
407    }
408#endif
409}
410
411/* ----------------------------------------------------------------------------
412 * EmptyBufferDone()
413 *
414 * This function is called by OMX component as
415 * a callback when a Buffer has been emptied
416 * ---------------------------------------------------------------------------- */
417void EmptyBufferDone(OMX_HANDLETYPE hComponent, OMX_PTR ptr, OMX_BUFFERHEADERTYPE* pBuffer)
418{
419    APP_DPRINT ("APP:::: INPUT BUFFER = %p && %p\n",pBuffer, pBuffer->pBuffer);
420    if (!preempted) {
421        write(IpBuf_Pipe[1], &pBuffer, sizeof(pBuffer));
422    }
423#ifdef OMX_GETTIME
424    if (GT_FlagE == 1 ) /* First Buffer Reply*/  /* 1 = First Buffer,  0 = Not First Buffer  */
425    {
426        GT_END("Call to EmptyBufferDone <First: EmptyBufferDone>");
427        GT_FlagE = 0;   /* 1 = First Buffer,  0 = Not First Buffer  */
428    }
429#endif
430}
431typedef struct G711DEC_FTYPES{
432    unsigned short FrameSizeType;
433    unsigned short NmuNLvl;
434    unsigned short NoiseLp;
435    unsigned long  dBmNoise;
436    unsigned short plc;
437}G711DEC_FTYPES;
438/* ----------------------------------------------------------------------------
439 * main()
440 *
441 * This function is called at application startup
442 * and drives the G711 Decoder OMX component
443 * ---------------------------------------------------------------------------- */
444int main(int argc, char* argv[])
445{
446    OMX_CALLBACKTYPE G711CaBa = {(void *)EventHandler,
447                                 (void*)EmptyBufferDone,
448                                 (void*)FillBufferDone};
449
450    OMX_HANDLETYPE                pHandle;
451    OMX_PARAM_PORTDEFINITIONTYPE* pCompPrivateStruct    = NULL;
452    OMX_AUDIO_CONFIG_MUTETYPE*    pCompPrivateStructMute = NULL;
453    OMX_AUDIO_CONFIG_VOLUMETYPE*  pCompPrivateStructVolume = NULL;
454    OMX_AUDIO_PARAM_PCMMODETYPE*  pG711Param = NULL;
455    OMX_COMPONENTTYPE*            pComponent,*pComponent_dasf = NULL;
456    OMX_BUFFERHEADERTYPE*         pInputBufferHeader[G711_MAX_NUM_BUFS] = {NULL};
457    OMX_BUFFERHEADERTYPE*         pOutputBufferHeader[G711_MAX_NUM_BUFS] = {NULL};
458
459    OMX_ERRORTYPE error = OMX_ErrorNone;
460    OMX_U32 AppData = G711_APP_ID;
461    TI_OMX_DSP_DEFINITION* audioinfo = malloc(sizeof(TI_OMX_DSP_DEFINITION));
462    G711DEC_FTYPES* frameinfo = malloc(sizeof(G711DEC_FTYPES));
463    TI_OMX_DATAPATH dataPath;
464    struct timeval tv   ;
465    OMX_S16 retval = 0, i = 0, j = 0,k = 0;
466    OMX_S16 frmCount = 0;
467    OMX_S16 frmCnt = 1;
468    OMX_S16 testcnt = 1;
469    OMX_S16 testcnt1 = 1;
470
471    OMX_BUFFERHEADERTYPE* pBuf = NULL;
472
473    bInvalidState = OMX_FALSE;
474
475    OMX_STATETYPE         state = OMX_StateInvalid;
476    OMX_INDEXTYPE         index = 0;
477/*    int g711decfdwrite = 0;
478    int g711decfdread = 0;*/
479
480    APP_DPRINT("------------------------------------------------------\n");
481    APP_DPRINT("This is Main Thread In G711 DECODER Test Application:\n");
482    APP_DPRINT("Test Core 1.5 - " __DATE__ ":" __TIME__ "\n");
483    APP_DPRINT("------------------------------------------------------\n");
484#ifdef OMX_GETTIME
485    printf("Line %d\n",__LINE__);
486    GTeError = OMX_ListCreate(&pListHead);
487    printf("Line %d\n",__LINE__);
488    printf("eError = %d\n",GTeError);
489    GT_START();
490    printf("Line %d\n",__LINE__);
491#endif
492    /* check the input parameters */
493    if(argc != 17) {
494        printf( "Usage: G711DecTest_common [infile] [outfile] [1-ALaw 2-MuLaw]\
495                [sampling freq] [testcase] [dasf mode] [accoustic mode] [nbInputBuf]\
496                [Input Buf Size] [nbOutputBuf] [Output Buf size] [Frame Size Type]\
497                [NMU Lvl] [Noise LP] [Noise in dBm] [PLC index]\n");
498        goto EXIT;
499    }
500
501    OMX_S16 numInputBuffers = 0;
502    OMX_S16 inputBufferSize = 0;
503    OMX_S16 numOutputBuffers = 0;
504    OMX_S16 outputBufferSize = 0;
505    OMX_S8  fParam1 = 0;
506    numInputBuffers = atoi(argv[8]);
507    inputBufferSize = atoi(argv[9]);
508    numOutputBuffers = atoi(argv[10]);
509    outputBufferSize = atoi(argv[11]);
510    fParam1 = atoi(argv[12]);
511
512    if(numInputBuffers > 4 && numInputBuffers < 1)
513    {
514        APP_DPRINT( "Cannot support %u Input buffers\n", numInputBuffers);
515        goto EXIT;
516    }
517    if(numOutputBuffers > 4 && numOutputBuffers < 0)
518    {
519        APP_DPRINT( "Cannot support %u Output buffers\n", numOutputBuffers);
520        goto EXIT;
521    }
522    if(fParam1 > 3 && fParam1 < 0)
523    {
524        APP_DPRINT( "Cannot support %u such frame size type \n", fParam1);
525        printf( "Cannot support %u such frame size type \n", fParam1);
526
527        goto EXIT;
528    }
529
530    printf("%d :: App: number of Input buffers = %d \n",__LINE__,numInputBuffers);
531    printf("%d :: App: size of input buffers = %d \n",__LINE__,inputBufferSize);
532    printf("%d :: App: number of output buffers = %d \n",__LINE__,numOutputBuffers);
533    printf("%d :: App: size of Output buffers = %d \n",__LINE__,outputBufferSize);
534
535    /* check to see that the input file exists */
536    struct stat sb = {0};
537    OMX_S16 status = stat(argv[1], &sb);
538    if( status != 0 ) {
539        APP_DPRINT( "Cannot find file %s. (%u)\n", argv[1], errno);
540        goto EXIT;
541    }
542
543    /* Open the file of data to be rendered. */
544    FILE* fIn = fopen(argv[1], "r");
545    if( fIn == NULL ) {
546        APP_DPRINT( "Error:  failed to open the file %s for readonly\access\n", argv[1]);
547        goto EXIT;
548    }
549
550    FILE* fOut = NULL;
551    fOut = fopen(argv[2], "w");
552    if( fOut == NULL ) {
553        APP_DPRINT( "Error:  failed to create the output file %s\n", argv[2]);
554        goto EXIT;
555    }
556
557    /* Create a pipe used to queue data from the callback. */
558    retval = pipe(IpBuf_Pipe);
559    if( retval != 0) {
560        APP_DPRINT( "Error:Fill Data Pipe failed to open\n");
561        goto EXIT;
562    }
563
564    retval = pipe(OpBuf_Pipe);
565    if( retval != 0) {
566        APP_DPRINT( "Error:Empty Data Pipe failed to open\n");
567        goto EXIT;
568    }
569    retval = pipe(Event_Pipe);
570    if( retval != 0) {
571        APP_DPRINT( "%d %s Error: Empty Data Pipe failed to open\n",__LINE__, __FUNCTION__);
572        goto EXIT;
573    }
574
575    /* save off the "max" of the handles for the selct statement */
576    OMX_S16 fdmax = maxint(IpBuf_Pipe[0], OpBuf_Pipe[0]);
577    fdmax = maxint(fdmax,Event_Pipe[0]);
578    APP_DPRINT("%d :: G711Test\n",__LINE__);
579
580    error = TIOMX_Init();
581
582    if(error != OMX_ErrorNone) {
583        APP_DPRINT("%d :: Error returned by TIOMX_Init()\n",__LINE__);
584        goto EXIT;
585    }
586
587    APP_DPRINT("%d :: G711Test\n",__LINE__);
588
589    int command = atoi(argv[5]);
590    switch (command ) {
591    case 1:
592        printf ("-------------------------------------\n");
593        printf ("Testing Simple PLAY till EOF \n");
594        printf ("-------------------------------------\n");
595        break;
596    case 2:
597        printf ("-------------------------------------\n");
598        printf ("Testing Stop and Play \n");
599        printf ("-------------------------------------\n");
600        testcnt = 2;
601        break;
602    case 3:
603        printf ("-------------------------------------\n");
604        printf ("Testing PAUSE & RESUME Command\n");
605        printf ("-------------------------------------\n");
606        break;
607    case 4:
608        printf ("---------------------------------------------\n");
609        printf ("Testing STOP Command by Stopping In-Between\n");
610        printf ("---------------------------------------------\n");
611        break;
612    case 5:
613        printf ("-------------------------------------------------\n");
614        printf ("Testing Repeated PLAY without Deleting Component\n");
615        printf ("-------------------------------------------------\n");
616        testcnt = 20;
617        break;
618    case 6:
619        printf ("------------------------------------------------\n");
620        printf ("Testing Repeated PLAY with Deleting Component\n");
621        printf ("------------------------------------------------\n");
622        testcnt1 = 20;
623        break;
624    case 7:
625        printf ("----------------------------------------------------------\n");
626        printf ("Testing Multiframe with each buffer size = 2 x frameLength\n");
627        printf ("----------------------------------------------------------\n");
628        testCaseNo = 7;
629        break;
630    case 8:
631        printf ("------------------------------------------------------------\n");
632        printf ("Testing Multiframe with each buffer size = 1/2 x frameLength\n");
633        printf ("------------------------------------------------------------\n");
634        testCaseNo = 8;
635        break;
636    case 9:
637        printf ("------------------------------------------------------------\n");
638        printf ("Testing Multiframe with alternating buffer sizes\n");
639        printf ("------------------------------------------------------------\n");
640        testCaseNo = 9;
641        break;
642    case 10:
643        printf ("------------------------------------------------------------\n");
644        printf ("Testing Mute/Unmute for Playback Stream\n");
645        printf ("------------------------------------------------------------\n");
646        break;
647    case 11:
648        printf ("------------------------------------------------------------\n");
649        printf ("Testing Set Volume for Playback Stream\n");
650        printf ("------------------------------------------------------------\n");
651        break;
652
653    case 12:
654        printf ("------------------------------------------------------------\n");
655        printf ("Testing Simple PLAY  \n");
656        printf ("------------------------------------------------------------\n");
657        break;
658
659    }
660
661    APP_DPRINT("%d :: G711Test\n",__LINE__);
662    fsizemode = atoi(argv[12]);
663    dasfmode = atoi(argv[6]);
664    if(dasfmode == 1){
665        printf("DASF MODE\n");
666#if STATE_TRANSITION_STATE
667        ConfigureAudio();
668#endif
669    }
670    else if(dasfmode == 0){
671        printf("NON DASF MODE\n");
672    }
673    else {
674        printf("Enter proper DASF mode\n");
675        printf("DASF:1\n");
676        printf("NON DASF:0\n");
677        goto EXIT;
678    }
679
680    APP_DPRINT("%d :: G711Test\n",__LINE__);
681
682    for(j = 0; j < testcnt1; j++) {
683        if(j >= 1) {
684            printf ("\n****** Decoding the file %i Time ******* \n", j+1);
685
686            /* Create a pipe used to queue data from the callback. */
687            retval = pipe( IpBuf_Pipe);
688            if( retval != 0) {
689                APP_DPRINT( "Error:Fill Data Pipe failed to open\n");
690                goto EXIT;
691            }
692
693            retval = pipe( OpBuf_Pipe);
694            if( retval != 0) {
695                APP_DPRINT( "Error:Empty Data Pipe failed to open\n");
696                goto EXIT;
697            }
698            fIn = fopen(argv[1], "r");
699            if( fIn == NULL ) {
700                fprintf(stderr, "Error:  failed to open the file %s for readonly\
701                                                                   access\n", argv[1]);
702                goto EXIT;
703            }
704
705            fOut = fopen(argv[2], "w");
706            if( fOut == NULL ) {
707                fprintf(stderr, "Error:  failed to create the output file \n");
708                goto EXIT;
709            }
710            error = TIOMX_Init();
711            inputToSN = fopen("outputSecondTime.log","w");
712
713        }
714        else {
715            inputToSN = fopen("outputFirstTime.log","w");
716        }
717#ifdef DSP_RENDERING_ON
718        if((g711decfdwrite=open(FIFO1,O_WRONLY))<0)
719        {
720            printf("[G711TEST] - failure to open WRITE pipe\n");
721        }
722        else
723        {
724            printf("[G711TEST] - opened WRITE pipe\n");
725        }
726        if((g711decfdread=open(FIFO2,O_RDONLY))<0)
727        {
728            printf("[G711TEST] - failure to open READ pipe\n");
729            goto EXIT;
730        }
731        else
732        {
733            printf("[G711TEST] - opened READ pipe\n");
734        }
735#endif
736        /* Load the G711 Encoder Component */
737        APP_DPRINT("%d :: G711Test\n",__LINE__);
738#ifdef OMX_GETTIME
739        GT_START();
740        error = OMX_GetHandle(&pHandle, strG711Decoder, &AppData, &G711CaBa);
741        GT_END("Call to OMX_GetHandle");
742#else
743        error = TIOMX_GetHandle(&pHandle, strG711Decoder, &AppData, &G711CaBa);
744#endif
745        APP_DPRINT("%d :: G711Test\n",__LINE__);
746        if((error != OMX_ErrorNone) || (pHandle == NULL)) {
747            APP_DPRINT ("Error in Get Handle function\n");
748            goto EXIT;
749        }
750
751        APP_DPRINT("%d :: G711Test\n",__LINE__);
752
753        pCompPrivateStruct = malloc (sizeof (OMX_PARAM_PORTDEFINITIONTYPE));
754        if (pCompPrivateStruct == 0) {
755            printf("Malloc failed\n");
756            error = -1;
757            goto EXIT;
758        }
759
760        if (dasfmode)
761        {
762#ifdef RTM_PATH
763            dataPath = DATAPATH_APPLICATION_RTMIXER;
764#endif
765
766#ifdef ETEEDN_PATH
767            dataPath = DATAPATH_APPLICATION;
768#endif
769        }
770        /* set playback stream mute/unmute */
771        pCompPrivateStructMute = malloc (sizeof(OMX_AUDIO_CONFIG_MUTETYPE));
772        if(pCompPrivateStructMute == NULL) {
773            printf("%d :: App: Malloc Failed\n",__LINE__);
774            goto EXIT;
775        }
776        pCompPrivateStructVolume = malloc (sizeof(OMX_AUDIO_CONFIG_VOLUMETYPE));
777        if(pCompPrivateStructVolume == NULL) {
778            printf("%d :: App: Malloc Failed\n",__LINE__);
779            goto EXIT;
780        }
781
782        APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pCompPrivateStruct);
783        APP_DPRINT("%d :: G711Test\n",__LINE__);
784        pCompPrivateStruct->nSize = sizeof (OMX_PARAM_PORTDEFINITIONTYPE);
785        pCompPrivateStruct->nVersion.s.nVersionMajor = 0xF1;
786        pCompPrivateStruct->nVersion.s.nVersionMinor = 0xF2;
787        APP_DPRINT("%d :: G711Test\n",__LINE__);
788        /* Send input port config */
789        pCompPrivateStruct->nPortIndex = OMX_DirInput;
790        pCompPrivateStruct->format.audio.cMIMEType = malloc(20);
791        strcpy(pCompPrivateStruct->format.audio.cMIMEType,"NONMIME");
792        pCompPrivateStruct->eDir = OMX_DirInput;
793        pCompPrivateStruct->nPortIndex = OMX_DirInput;
794        pCompPrivateStruct->nBufferCountActual = numInputBuffers;
795        pCompPrivateStruct->nBufferSize = inputBufferSize;
796        pCompPrivateStruct->format.audio.eEncoding = OMX_AUDIO_CodingG711;
797        pCompPrivateStruct->bEnabled = 1;
798        pCompPrivateStruct->bPopulated = 0;
799
800#ifdef OMX_GETTIME
801        GT_START();
802        error = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, pCompPrivateStruct);
803        GT_END("Set Parameter Test-SetParameter");
804#else
805        error = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, pCompPrivateStruct);
806#endif
807        if (error != OMX_ErrorNone) {
808            error = OMX_ErrorBadParameter;
809            printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
810            goto EXIT;
811        }
812        /* Send output port config */
813        pCompPrivateStruct->nPortIndex = OMX_DirOutput;
814        pCompPrivateStruct->eDir = OMX_DirOutput;
815        pCompPrivateStruct->nPortIndex = OMX_DirOutput;
816        pCompPrivateStruct->nBufferCountActual = numOutputBuffers;
817        pCompPrivateStruct->nBufferSize = outputBufferSize;
818
819        if(dasfmode == 1) {
820            pCompPrivateStruct->nBufferCountActual = 0;
821        }
822#ifdef OMX_GETTIME
823        GT_START();
824        error = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, pCompPrivateStruct);
825        GT_END("Set Parameter Test-SetParameter");
826#else
827        error = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, pCompPrivateStruct);
828#endif
829        if (error != OMX_ErrorNone) {
830            error = OMX_ErrorBadParameter;
831            printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
832            goto EXIT;
833        }
834        /* default setting for Mute/Unmute */
835        pCompPrivateStructMute->nSize = sizeof (OMX_AUDIO_CONFIG_MUTETYPE);
836        pCompPrivateStructMute->nVersion.s.nVersionMajor    = 0xF1;
837        pCompPrivateStructMute->nVersion.s.nVersionMinor    = 0xF2;
838        pCompPrivateStructMute->nPortIndex                  = OMX_DirInput;
839        pCompPrivateStructMute->bMute                       = OMX_FALSE;
840
841        /* default setting for volume */
842        pCompPrivateStructVolume->nSize = sizeof(OMX_AUDIO_CONFIG_VOLUMETYPE);
843        pCompPrivateStructVolume->nVersion.s.nVersionMajor  = 0xF1;
844        pCompPrivateStructVolume->nVersion.s.nVersionMinor  = 0xF2;
845        pCompPrivateStructVolume->nPortIndex                = OMX_DirInput;
846        pCompPrivateStructVolume->bLinear                   = OMX_FALSE;
847        pCompPrivateStructVolume->sVolume.nValue            = 50;               /* actual volume */
848        pCompPrivateStructVolume->sVolume.nMin              = 0;                /* min volume */
849        pCompPrivateStructVolume->sVolume.nMax              = 100;              /* max volume */
850
851#ifndef USE_BUFFER
852        /* Allocate Input buffers with OMX_AllocateBuffer() API */
853        for (i=0; i < numInputBuffers; i++) {
854            /* allocate input buffer */
855            APP_DPRINT("%d :: About to call OMX_AllocateBuffer\n",__LINE__);
856            error = OMX_AllocateBuffer(pHandle,&pInputBufferHeader[i],0,NULL,inputBufferSize);
857            APP_DPRINT("%d :: called OMX_AllocateBuffer\n",__LINE__);
858            if(error != OMX_ErrorNone) {
859                APP_DPRINT("%d :: Error returned by OMX_AllocateBuffer()\n",__LINE__);
860                goto EXIT;
861            }
862
863        }
864        /* Allocate Output buffers with OMX_AllocateBuffer() API */
865        for (i=0; i < numOutputBuffers; i++) {
866            /* allocate output buffer */
867            APP_DPRINT("%d :: About to call OMX_AllocateBuffer\n",__LINE__);
868            error = OMX_AllocateBuffer(pHandle,&pOutputBufferHeader[i],1,NULL,outputBufferSize);
869            APP_DPRINT("%d :: called OMX_AllocateBuffer\n",__LINE__);
870            if(error != OMX_ErrorNone) {
871                APP_DPRINT("%d :: Error returned by OMX_AllocateBuffer()\n",__LINE__);
872                goto EXIT;
873            }
874        }
875#else
876        /* Allocate Input buffers with OMX_UseBuffer() API */
877        for (i=0; i < numInputBuffers; i++)
878        {
879            pInputBuffer[i] = (OMX_U8*)malloc(inputBufferSize + EXTRA_BUFFBYTES);
880            APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pInputBuffer[i]);
881            pInputBuffer[i] = pInputBuffer[i] + CACHE_ALIGNMENT;
882
883            /* allocate input buffer */
884            APP_DPRINT("%d :: About to call OMX_UseBuffer\n",__LINE__);
885            error = OMX_UseBuffer(pHandle,&pInputBufferHeader[i],0,NULL,inputBufferSize,pInputBuffer[i]);
886            APP_DPRINT("%d :: called OMX_UseBuffer\n",__LINE__);
887            if(error != OMX_ErrorNone)
888            {
889                APP_DPRINT("%d :: Error returned by OMX_UseBuffer()\n",__LINE__);
890                goto EXIT;
891            }
892
893        }
894        /* Allocate Output buffers with OMX_UseBuffer() API */
895        for ( i = 0 ; i < numOutputBuffers ; i++ )
896        {
897            pOutputBuffer[i] = (OMX_U8*)malloc (outputBufferSize + EXTRA_BUFFBYTES);
898            APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pOutputBuffer);
899            pOutputBuffer[i] = pOutputBuffer[i] + CACHE_ALIGNMENT;
900
901            /* allocate output buffer */
902            APP_DPRINT("%d :: About to call OMX_UseBuffer\n",__LINE__);
903            error = OMX_UseBuffer(pHandle,&pOutputBufferHeader[i],1,NULL,outputBufferSize,pOutputBuffer[i]);
904            APP_DPRINT("%d :: called OMX_UseBuffer\n",__LINE__);
905            if(error != OMX_ErrorNone)
906            {
907                APP_DPRINT("%d :: Error returned by OMX_UseBuffer()\n",__LINE__);
908                goto EXIT;
909            }
910
911        }
912#endif
913
914        /* Send  G711 config for input */
915        pG711Param = malloc (sizeof (OMX_AUDIO_PARAM_PCMMODETYPE));
916        APP_MEMPRINT("%d:::[TESTAPPALLOC] %p\n",__LINE__,pG711Param);
917        if(pG711Param == NULL) {
918            printf("%d :: App: Malloc Failed\n",__LINE__);
919            goto EXIT;
920        }
921
922        pG711Param->nPortIndex = OMX_DirInput;
923        OMX_GetParameter(pHandle, OMX_IndexParamAudioPcm, pG711Param);
924        pG711Param->nSize = sizeof (OMX_AUDIO_PARAM_PCMMODETYPE);
925        pG711Param->nVersion.s.nVersionMajor = 0xF1;
926        pG711Param->nVersion.s.nVersionMinor = 0xF2;
927
928        pG711Param->nChannels = 1; /* mono */
929        pG711Param->eNumData = OMX_NumericalDataUnsigned;
930        pG711Param->eEndian = OMX_EndianLittle;
931        pG711Param->bInterleaved = OMX_FALSE;
932        pG711Param->nBitPerSample = 8;
933        pG711Param->nSamplingRate = 0; /* means undefined in the OMX standard */
934
935        for ( i = 0 ; i < OMX_AUDIO_MAXCHANNELS ; i++ )
936            pG711Param->eChannelMapping[0] = OMX_AUDIO_ChannelNone;
937
938        /* extract compression format from command line */
939        if (atoi(argv[3]) == OMX_AUDIO_PCMModeALaw)
940            pG711Param->ePCMMode = OMX_AUDIO_PCMModeALaw;
941        else if (atoi(argv[3]) == OMX_AUDIO_PCMModeMULaw)
942            pG711Param->ePCMMode = OMX_AUDIO_PCMModeMULaw;
943
944        else {
945            printf("Enter proper G711 mode\n");
946            printf("A-Law:1\n");
947            printf("MU-Law:2\n");
948            goto EXIT;
949        }
950#ifdef OMX_GETTIME
951        GT_START();
952        error = OMX_SetParameter (pHandle, OMX_IndexParamAudioPcm, pG711Param);
953        GT_END("Set Parameter Test-SetParameter");
954#else
955        error = OMX_SetParameter (pHandle, OMX_IndexParamAudioPcm, pG711Param);
956#endif
957        if (error != OMX_ErrorNone) {
958            error = OMX_ErrorBadParameter;
959            printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
960            goto EXIT;
961        }
962        /* Send  G711 config for output */
963        pG711Param->nPortIndex = OMX_DirOutput;
964        pG711Param->nBitPerSample = 16;
965        pG711Param->ePCMMode = OMX_AUDIO_PCMModeLinear;
966
967        /* extract sampling rate from command line */
968        pG711Param->nSamplingRate = atoi(argv[4]);
969#ifdef OMX_GETTIME
970        GT_START();
971        error = OMX_SetParameter (pHandle,OMX_IndexParamAudioPcm, pG711Param);
972        GT_END("Set Parameter Test-SetParameter");
973#else
974        error = OMX_SetParameter (pHandle,OMX_IndexParamAudioPcm, pG711Param);
975#endif
976        if (error != OMX_ErrorNone) {
977            error = OMX_ErrorBadParameter;
978            printf ("%d:: OMX_ErrorBadParameter\n",__LINE__);
979            goto EXIT;
980        }
981
982        pComponent_dasf = (OMX_COMPONENTTYPE *)pHandle;
983
984        /** Getting the frame params */
985        frameinfo->FrameSizeType = atoi(argv[12]);
986        frameinfo->NmuNLvl = atoi(argv[13]);
987        frameinfo->NoiseLp = atoi(argv[14]);
988        frameinfo->dBmNoise = atoi(argv[15]);
989        frameinfo->plc = atoi(argv[16]);
990
991        error = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.g711dec.frameparams",&index);
992        if (error != OMX_ErrorNone) {
993            printf("Error getting extension index\n");
994            goto EXIT;
995        }
996
997        error = OMX_SetConfig (pHandle, index, frameinfo);
998        if(error != OMX_ErrorNone) {
999            error = OMX_ErrorBadParameter;
1000            APP_DPRINT("%d :: Error from OMX_SetConfig() function\n",__LINE__);
1001            goto EXIT;
1002        }
1003
1004        /* get TeeDN or ACDN mode */
1005        audioinfo->acousticMode = atoi(argv[7]);
1006
1007        /* Process DASF mode */
1008        if(dasfmode == 1){
1009            audioinfo->dasfMode = 1;
1010        }
1011        else if(dasfmode == 0){
1012            audioinfo->dasfMode = 0;
1013
1014        }
1015        else {
1016            printf("Enter proper DASF mode\n");
1017            printf("DASF:1\n");
1018            printf("NON DASF:0\n");
1019            goto EXIT;
1020        }
1021
1022        /* get extension index to define proprietary DASF settings */
1023        error = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.g711headerinfo",&index);
1024        if (error != OMX_ErrorNone) {
1025            printf("Error getting extension index\n");
1026            goto EXIT;
1027        }
1028
1029/*        cmd_data.hComponent = pHandle;
1030        cmd_data.AM_Cmd = AM_CommandIsOutputStreamAvailable;*/
1031
1032        /* for decoder, using AM_CommandIsInputStreamAvailable */
1033/*        cmd_data.param1 = 0;*/
1034#ifdef DSP_RENDERING_ON
1035        if((write(g711decfdwrite, &cmd_data, sizeof(cmd_data)))<0) {
1036            printf("%d [G711 Dec Component] - send command to audio manager\n", __LINE__);
1037            goto EXIT;
1038        }
1039        if((read(g711decfdread, &cmd_data, sizeof(cmd_data)))<0) {
1040            printf("%d [G711 Dec Component] - failure to get data from the audio manager\n", __LINE__);
1041            goto EXIT;
1042        }
1043#endif
1044
1045/*        audioinfo->streamId = cmd_data.streamID;*/
1046        if(audioinfo->dasfMode)
1047            printf("***************StreamId=%d******************\n", (int)audioinfo->streamId );
1048        APP_DPRINT("%d :: TestApp: Set Config, pHandle %p\n", __LINE__, pHandle);
1049        error = OMX_SetConfig(pHandle,index,audioinfo);
1050        if (error != OMX_ErrorNone) {
1051            printf("Error in SetConfig\n");
1052            goto EXIT;
1053        }
1054        APP_DPRINT("%d :: TestApp: Get Extension Index, pHandle %p\n", __LINE__, pHandle);
1055        error = OMX_GetExtensionIndex(pHandle, "OMX.TI.index.config.g711dec.datapath",&index);
1056        if (error != OMX_ErrorNone) {
1057            printf("Error getting extension index\n");
1058            goto EXIT;
1059        }
1060        APP_DPRINT("%d :: TestApp: Set Config, pHandle %p\n", __LINE__, pHandle);
1061        error = OMX_SetConfig (pHandle, index, &dataPath);
1062        if(error != OMX_ErrorNone) {
1063            error = OMX_ErrorBadParameter;
1064            APP_DPRINT("%d :: WmaDecTest.c :: Error from OMX_SetConfig() function\n",__LINE__);
1065            goto EXIT;
1066        }
1067
1068        /* start the OMX component */
1069        APP_DPRINT("%d :: TestApp: Change state to Idle, pHandle %p\n", __LINE__, pHandle);
1070#ifdef OMX_GETTIME
1071        GT_START();
1072#endif
1073        error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateIdle, NULL);
1074        if(error != OMX_ErrorNone) {
1075            APP_DPRINT ("Error from SendCommand-Idle(Init) State function\n");
1076            goto EXIT;
1077        }
1078
1079        /* Wait for startup to complete */
1080        error = WaitForState(pHandle, OMX_StateIdle);
1081#ifdef OMX_GETTIME
1082        GT_END("Call to SendCommand <OMX_StateIdle>");
1083#endif
1084        if(error != OMX_ErrorNone) {
1085            APP_DPRINT( "Error:  hG711Encoder->WaitForState reports an error %X\n", error);
1086            goto EXIT;
1087        }
1088        APP_DPRINT("%d :: TestApp: State Changed to Idle\n", __LINE__);
1089        for(i = 0; i < testcnt; i++)
1090        {
1091            if(i > 0)
1092            {
1093                printf ("\n***** Decoding the file for %i Time ***** \n",i+1);
1094
1095                close(IpBuf_Pipe[0]);
1096                close(IpBuf_Pipe[1]);
1097                close(OpBuf_Pipe[0]);
1098                close(OpBuf_Pipe[1]);
1099                close(Event_Pipe[0]);
1100                close(Event_Pipe[1]);
1101
1102                /* Create a pipe used to queue data from the callback. */
1103                retval = pipe(IpBuf_Pipe);
1104                if( retval != 0)
1105                {
1106                    APP_DPRINT( "Error:Fill Data Pipe failed to open\n");
1107                    goto EXIT;
1108                }
1109
1110                retval = pipe(OpBuf_Pipe);
1111                if( retval != 0)
1112                {
1113                    APP_DPRINT( "Error:Empty Data Pipe failed to open\n");
1114                    goto EXIT;
1115                }
1116
1117                retval = pipe(Event_Pipe);
1118                if( retval != 0) {
1119                    APP_DPRINT( "%d Error: Empty Event Pipe failed to open\n",__LINE__);
1120                    goto EXIT;
1121                }
1122
1123                fIn = fopen(argv[1], "r");
1124                if(fIn == NULL)
1125                {
1126                    fprintf(stderr, "Error:  failed to open the file %s for readonly access\n", argv[1]);
1127                    goto EXIT;
1128                }
1129
1130                fOut = fopen(argv[2], "w");
1131                if(fOut == NULL)
1132                {
1133                    fprintf(stderr, "Error:  failed to create the output file \n");
1134                    goto EXIT;
1135                }
1136            }
1137
1138            done = 0;
1139
1140            printf ("Basic Function:: Sending OMX_StateExecuting Command\n");
1141#ifdef OMX_GETTIME
1142            GT_START();
1143#endif
1144            error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateExecuting, NULL);
1145            if(error != OMX_ErrorNone)
1146            {
1147                APP_DPRINT ("Error from SendCommand-Executing State function\n");
1148                goto EXIT;
1149            }
1150            pComponent = (OMX_COMPONENTTYPE *)pHandle;
1151            error = WaitForState(pHandle, OMX_StateExecuting);
1152#ifdef OMX_GETTIME
1153            GT_END("Call to SendCommand <OMX_StateExecuting>");
1154#endif
1155            if(error != OMX_ErrorNone)
1156            {
1157                APP_DPRINT( "Error:  hG711Decoder->WaitForState reports an error %X\n", error);
1158                goto EXIT;
1159            }
1160
1161            for (k=0; k < numInputBuffers; k++)
1162            {
1163#ifdef OMX_GETTIME
1164                if (k==0)
1165                {
1166                    GT_FlagE=1;  /* 1 = First Buffer,  0 = Not First Buffer  */
1167                    GT_START(); /* Empty Bufffer */
1168                }
1169#endif
1170                error = send_input_buffer (pHandle, pInputBufferHeader[k], fIn);
1171            }
1172
1173            if (dasfmode == 0)
1174            {
1175                for (k=0; k < numOutputBuffers; k++)
1176                {
1177#ifdef OMX_GETTIME
1178                    if (k==0)
1179                    {
1180                        GT_FlagF=1;  /* 1 = First Buffer,  0 = Not First Buffer  */
1181                        GT_START(); /* Fill Buffer */
1182                    }
1183#endif
1184                    OMX_FillThisBuffer(pHandle,  pOutputBufferHeader[k]);
1185                }
1186            }
1187
1188            error = OMX_GetState(pHandle, &state);
1189
1190            while( (error == OMX_ErrorNone) && (state != OMX_StateIdle) &&
1191                   (state != OMX_StateInvalid)) {
1192
1193                FD_ZERO(&rfds);
1194                FD_SET(IpBuf_Pipe[0], &rfds);
1195                FD_SET(OpBuf_Pipe[0], &rfds);
1196                FD_SET(Event_Pipe[0], &rfds);
1197                tv.tv_sec = 1;
1198                tv.tv_usec = 0;
1199                frmCount++;
1200
1201                retval = select(fdmax+1, &rfds, NULL, NULL, &tv);
1202                if(retval == -1)
1203                {
1204                    perror("select()");
1205                    APP_DPRINT ( " : Error \n");
1206                    break;
1207                }
1208
1209                if(retval == 0) {
1210                    APP_DPRINT ("%d :: BasicFn App Timeout !!!!!!!!!!! \n",__LINE__);
1211                }
1212
1213                switch (command)
1214                {
1215                case 1: /* Testing Simple PLAY till EOF */
1216                case 5: /* Testing Repeated PLAY without Deleting Component */
1217                case 6: /* Testing Repeated PLAY with Deleting Component */
1218                case 7: /* Testing Multiframe with each buffer size = 2 x frameLength */
1219                case 8: /* Testing Multiframe with each buffer size = 1/2 x frameLength */
1220                case 9: /* Testing Multiframe with alternating buffer sizes */
1221                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1222                        OMX_BUFFERHEADERTYPE* pBuffer;
1223                        read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1224                        error = send_input_buffer (pHandle, pBuffer, fIn);
1225
1226                        if (error != OMX_ErrorNone) {
1227                            printf ("Error While reading input pipe\n");
1228                            goto EXIT;
1229                        }
1230                        frmCnt++;
1231                        pBuffer->nFlags = 0;
1232                    }
1233                    break;
1234
1235                case 2: /* Testing Stop and Play */
1236                case 4: /* Testing STOP Command by Stopping In-Between */
1237                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1238                        OMX_BUFFERHEADERTYPE* pBuffer;
1239                        read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1240                        frmCnt++;
1241                        pBuffer->nFlags = 0;
1242                        if(frmCnt == 50) { /*100 Frames processed */
1243                            fprintf(stderr, "Shutting down since 100 frames were sent---------- \n");
1244#ifdef OMX_GETTIME
1245                            GT_START();
1246#endif
1247                            error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
1248                            if(error != OMX_ErrorNone) {
1249                                fprintf (stderr,"Error from SendCommand-Idle(Stop) State function\n");
1250                                goto EXIT;
1251                            }
1252                            error = WaitForState(pHandle, OMX_StateIdle);
1253#ifdef OMX_GETTIME
1254                            GT_END("Call to SendCommand <OMX_StateIdle>");
1255#endif
1256                            if(error != OMX_ErrorNone) {
1257                                fprintf(stderr, "Error:  hPcmDecoder->WaitForState reports an error %X\n", error);
1258                                goto EXIT;
1259                            }
1260                            done = 1;
1261                        }
1262                        error = send_input_buffer (pHandle, pBuffer, fIn);
1263                        if (error != OMX_ErrorNone) {
1264                            printf ("Error While reading input pipe\n");
1265                            goto EXIT;
1266                        }
1267                    }
1268                    break;
1269
1270                case 3: /* Testing PAUSE & RESUME Command */
1271                    if (frmCount == 16) {  /*100 Frames processed */
1272                        printf (" Sending Resume command to Codec \n");
1273#ifdef OMX_GETTIME
1274                        GT_START();
1275#endif
1276                        error = OMX_SendCommand(pHandle, OMX_CommandStateSet,OMX_StateExecuting, NULL);
1277                        if(error != OMX_ErrorNone) {
1278                            fprintf (stderr,"Error from SendCommand-Executing State function\n");
1279                            goto EXIT;
1280                        }
1281                        /* Wait for startup to complete */
1282                        error = WaitForState(pHandle, OMX_StateExecuting);
1283#ifdef OMX_GETTIME
1284                        GT_END("Call to SendCommand <OMX_StateExecuting>");
1285#endif
1286                        if(error != OMX_ErrorNone) {
1287                            fprintf(stderr, "Error:  hPcmDecoder->WaitForState reports an error %X\n", error);
1288                            goto EXIT;
1289                        }
1290                    }
1291                    if(frmCount == 6) {   /*6 Frames processed */
1292                        printf (" Sending Pause command to Codec \n");
1293#ifdef OMX_GETTIME
1294                        GT_START();
1295#endif
1296                        error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StatePause, NULL);
1297                        if(error != OMX_ErrorNone) {
1298                            fprintf (stderr,"Error from SendCommand-Pasue State function\n");
1299                            goto EXIT;
1300                        }
1301                        /* Wait for startup to complete */
1302                        error = WaitForState(pHandle, OMX_StatePause);
1303#ifdef OMX_GETTIME
1304                        GT_END("Call to SendCommand <OMX_StatePause>");
1305#endif
1306                        if(error != OMX_ErrorNone) {
1307                            fprintf(stderr, "Error:  hPcmDecoder->WaitForState reports an error %X\n", error);
1308                            goto EXIT;
1309                        }
1310                    }
1311
1312                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1313                        OMX_BUFFERHEADERTYPE* pBuffer;
1314                        read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1315                        error = send_input_buffer (pHandle, pBuffer, fIn);
1316                        if (error != OMX_ErrorNone) {
1317                            printf ("Error While reading input pipe\n");
1318                            goto EXIT;
1319                        }
1320                        frmCnt++;
1321                    }
1322                    break;
1323
1324                case 10: /* Testing Mute/Unmute for Playback Stream */
1325                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1326                        OMX_BUFFERHEADERTYPE* pBuffer;
1327
1328                        read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1329                        pBuffer->nFlags = 0;
1330                        error = send_input_buffer (pHandle, pBuffer, fIn);
1331                        if (error != OMX_ErrorNone) {
1332                            goto EXIT;
1333                        }
1334                        frmCnt++;
1335                    }
1336                    if(frmCnt == 50) {
1337                        printf("************Mute the playback stream*****************\n");
1338                        pCompPrivateStructMute->bMute = OMX_TRUE;
1339                        error = OMX_SetConfig(pHandle, OMX_IndexConfigAudioMute, pCompPrivateStructMute);
1340                        if (error != OMX_ErrorNone) {
1341                            error = OMX_ErrorBadParameter;
1342                            goto EXIT;
1343                        }
1344                    }
1345                    if(frmCnt == 120) {
1346                        printf("************Unmute the playback stream*****************\n");
1347                        pCompPrivateStructMute->bMute = OMX_FALSE;
1348                        error = OMX_SetConfig(pHandle, OMX_IndexConfigAudioMute, pCompPrivateStructMute);
1349                        if (error != OMX_ErrorNone) {
1350                            error = OMX_ErrorBadParameter;
1351                            goto EXIT;
1352                        }
1353                    }
1354                    break;
1355
1356                case 11: /* test set volume for playback stream */
1357                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1358                        OMX_BUFFERHEADERTYPE* pBuffer;
1359
1360                        read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1361                        pBuffer->nFlags = 0;
1362                        error = send_input_buffer (pHandle, pBuffer, fIn);
1363                        if (error != OMX_ErrorNone) {
1364                            goto EXIT;
1365                        }
1366                        frmCnt++;
1367                    }
1368                    if(frmCnt == 10) {
1369                        printf("************Set stream volume to high*****************\n");
1370                        pCompPrivateStructVolume->sVolume.nValue = 0x8000;
1371                        error = OMX_SetConfig(pHandle, OMX_IndexConfigAudioVolume, pCompPrivateStructVolume);
1372                        if (error != OMX_ErrorNone) {
1373                            error = OMX_ErrorBadParameter;
1374                            goto EXIT;
1375                        }
1376                    }
1377                    if(frmCnt == 85) {
1378                        printf("************Set stream volume to low*****************\n");
1379                        pCompPrivateStructVolume->sVolume.nValue = 0x1000;
1380                        error = OMX_SetConfig(pHandle, OMX_IndexConfigAudioVolume, pCompPrivateStructVolume);
1381                        if (error != OMX_ErrorNone) {
1382                            error = OMX_ErrorBadParameter;
1383                            goto EXIT;
1384                        }
1385                    }
1386                    break;
1387
1388                case 12: /* test unsupported content*/
1389                    if(FD_ISSET(IpBuf_Pipe[0], &rfds)) {
1390                        int a, b;
1391                        a = (int)argv[4];
1392                        b = (int)argv[7];
1393                        OMX_BUFFERHEADERTYPE* pBuffer;
1394                        read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1395                        error = send_input_buffer (pHandle, pBuffer, fIn);
1396                        if(((a != 8000)) || ((b <= 0) || (b >= 3))){
1397                            printf("************ Unsupported content ****************\n ");
1398                            goto EXIT;
1399                        }
1400                        if (error != OMX_ErrorNone) {
1401                            printf ("Error While reading input pipe\n");
1402                            goto EXIT;
1403                        }
1404                        frmCnt++;
1405                    }
1406                default:
1407                    APP_DPRINT("%d :: ### Running Simple DEFAULT Case Here ###\n",__LINE__);
1408
1409                } /* Switch Command Ending Here */
1410
1411                if( FD_ISSET(OpBuf_Pipe[0], &rfds) ) {
1412                    read(OpBuf_Pipe[0], &pBuf, sizeof(pBuf));
1413                    if (OUTPUT_G711DEC_BUFFER_SIZE != pBuf->nFilledLen ) {
1414                        APP_DPRINT ("%d : WARNING: Different Size, %d\n",__LINE__,(int)pBuf->nFilledLen);
1415                    }
1416                    if ((state != OMX_StateExecuting) && (pBuf->nFilledLen > 0))
1417                        printf("Writing remaining output buffer\n");
1418                    fwrite(pBuf->pBuffer, 1, pBuf->nFilledLen, fOut);
1419                    fflush(fOut);
1420                    if (state == OMX_StateExecuting ) {
1421                        OMX_FillThisBuffer(pHandle, pBuf);
1422                    }
1423                }
1424
1425                error = pComponent->GetState(pHandle, &state);
1426                if(error != OMX_ErrorNone) {
1427                    APP_DPRINT("%d:: Warning:  hG711Encoder->GetState has returned status %X\n",__LINE__, error);
1428                    goto EXIT;
1429                }
1430                else if (preempted){
1431                    sched_yield();
1432                }
1433            } /* While Loop Ending Here */
1434
1435            printf ("The current state of the component = %d \n",state);
1436            fclose(fOut);
1437            fclose(fIn);
1438            if(( command == 5) || (command == 2)) { /*If test is Stop & Play or Repeated*/
1439                sleep (3);                                     /*play without deleting the component*/
1440            }
1441        } /* For loop on testcnt ends here */
1442
1443/*        cmd_data.hComponent = pHandle;
1444        cmd_data.AM_Cmd = AM_Exit;*/
1445#ifdef DSP_RENDERING_ON
1446        if((write(g711decfdwrite, &cmd_data, sizeof(cmd_data)))<0)
1447            printf("%d ::TestApp :: [G711 Dec Component] - send command to audio manager\n",__LINE__);
1448        close(g711decfdwrite);
1449        close(g711decfdread);
1450#endif
1451        printf ("Sending the StateLoaded Command\n");
1452#ifdef OMX_GETTIME
1453        GT_START();
1454#endif
1455        error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateLoaded, NULL);
1456        if(error != OMX_ErrorNone) {
1457            APP_DPRINT ("%d:: Error from SendCommand-Idle State function\n",__LINE__);
1458            goto EXIT;
1459        }
1460
1461        error = OMX_SendCommand(pHandle, OMX_CommandPortDisable, -1, NULL);
1462
1463
1464        if(error != OMX_ErrorNone) {
1465            APP_DPRINT( "Error:  hG711Encoder->WaitForState reports an error %X\n", error);
1466            goto EXIT;
1467        }
1468
1469        /* free buffers */
1470        for (i=0; i < numInputBuffers; i++) {
1471            error = OMX_FreeBuffer(pHandle,OMX_DirInput,pInputBufferHeader[i]);
1472            if( (error != OMX_ErrorNone)) {
1473                APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1474                goto EXIT;
1475            }
1476        }
1477
1478        for (i=0; i < numOutputBuffers; i++) {
1479            error = OMX_FreeBuffer(pHandle,OMX_DirOutput,pOutputBufferHeader[i]);
1480            if( (error != OMX_ErrorNone)) {
1481                APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1482                goto EXIT;
1483            }
1484        }
1485
1486#ifdef USE_BUFFER
1487        /* free the App Allocated Buffers */
1488        printf("%d :: App: Freeing the App Allocated Buffers in TestApp\n",__LINE__);
1489        for(i=0; i < numInputBuffers; i++) {
1490            pInputBuffer[i] = pInputBuffer[i] - 128;
1491            APP_MEMPRINT("%d :: App: [TESTAPPFREE] pInputBuffer[%d] = %p\n",__LINE__,i,pInputBuffer[i]);
1492            if(pInputBuffer[i] != NULL){
1493                free(pInputBuffer[i]);
1494                pInputBuffer[i] = NULL;
1495            }
1496        }
1497
1498        for(i=0; i < numOutputBuffers; i++) {
1499            pOutputBuffer[i] = pOutputBuffer[i] - 128;
1500            APP_MEMPRINT("%d :: App: [TESTAPPFREE] pOutputBuffer[%d] = %p\n",__LINE__,i, pOutputBuffer[i]);
1501            if(pOutputBuffer[i] != NULL){
1502                free(pOutputBuffer[i]);
1503                pOutputBuffer[i] = NULL;
1504            }
1505        }
1506#endif
1507
1508        error = WaitForState(pHandle, OMX_StateLoaded);
1509#ifdef OMX_GETTIME
1510        GT_END("Call to SendCommand <OMX_StateLoaded After freeing input/output BUFFERS & OMX_CommandPortDisable>");
1511#endif
1512
1513        /* Unload the G711 Encoder Component */
1514        printf ("Free the Component handle\n");
1515        error = TIOMX_FreeHandle(pHandle);
1516        APP_MEMPRINT("%d:::[TESTAPPFREE] %p\n",__LINE__,pG711Param);
1517        free(pG711Param);
1518        APP_MEMPRINT("%d:::[TESTAPPFREE] %p\n",__LINE__,pCompPrivateStruct->format.audio.cMIMEType);
1519        free(pCompPrivateStruct->format.audio.cMIMEType);
1520        APP_MEMPRINT("%d:::[TESTAPPFREE] %p\n",__LINE__,pCompPrivateStruct);
1521        free(pCompPrivateStruct);
1522        if( (error != OMX_ErrorNone)) {
1523            APP_DPRINT ("%d:: Error in Free Handle function\n",__LINE__);
1524            goto EXIT;
1525        }
1526
1527        close(IpBuf_Pipe[0]);
1528        close(IpBuf_Pipe[1]);
1529        close(OpBuf_Pipe[0]);
1530        close(OpBuf_Pipe[1]);
1531
1532        close(Event_Pipe[0]);
1533        close(Event_Pipe[1]);
1534        APP_DPRINT ("%d Free Handle returned Successfully\n",__LINE__);
1535
1536        fclose(inputToSN);
1537        APP_DPRINT ("%d:: Free Handle returned Successfully \n\n\n\n",__LINE__);
1538
1539    } /* For loop on testcnt1 ends here */
1540
1541 EXIT:
1542
1543#ifdef OMX_GETTIME
1544    GT_END("G711_DEC test <End>");
1545    OMX_ListDestroy(pListHead);
1546#endif
1547
1548    error = TIOMX_Deinit();
1549    if( (error != OMX_ErrorNone)) {
1550        APP_DPRINT("APP: Error in Deinit Core function\n");
1551        goto EXIT;
1552    }
1553    return error;
1554}
1555
1556/***************************************************
1557 *
1558 *   Send_input_Buffer send input buffer to OMX_COMPONENT
1559 *
1560 *****************************************************/
1561OMX_ERRORTYPE send_input_buffer(OMX_HANDLETYPE pHandle, OMX_BUFFERHEADERTYPE* pBuffer, FILE *fIn)
1562{
1563    OMX_ERRORTYPE error = OMX_ErrorNone;
1564    OMX_S16 nRead = fill_data (pBuffer, fIn);
1565    OMX_S16 i = 0;
1566    APP_DPRINT ("%%%%%%%%%%%%%%%%%%%%%%%%%\n");
1567    APP_DPRINT ("%d :: pBuffer = %p nRead = %d\n",__LINE__,pBuffer,nRead);
1568    APP_DPRINT ("%%%%%%%%%%%%%%%%%%%%%%%%%\n");
1569
1570    if((nRead < numRead) && (done == 0)) {
1571        fprintf(stderr, "Shutting down Since last buffer was sent---------- \n");
1572#ifdef OMX_GETTIME
1573        GT_START();
1574#endif
1575        error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
1576        if(error != OMX_ErrorNone) {
1577            fprintf (stderr,"Error from SendCommand-Idle(Stop) State function\n");
1578            goto EXIT;
1579        }
1580        WaitForState(pHandle, OMX_StateIdle);
1581#ifdef OMX_GETTIME
1582        GT_END("Call to SendCommand <OMX_StateIdle>");
1583#endif
1584        done = 1;
1585        pBuffer->nFlags = OMX_BUFFERFLAG_EOS;
1586        printf("%i %s - EOS Has been ocurred \n",__LINE__,__FUNCTION__);
1587    }
1588
1589    else {
1590        pBuffer->nFilledLen = nRead;
1591        for (i=0; i < nRead; i++) {
1592            fprintf(inputToSN,"pBuffer->pBuffer[%d] = %x\n",i,pBuffer->pBuffer[i]);
1593        }
1594        pBuffer->nTimeStamp = rand()%100;
1595        pBuffer->nTickCount = rand() % 70;
1596        TIME_PRINT("TimeStamp Input: %lld\n",pBuffer->nTimeStamp);
1597        TICK_PRINT("TickCount Input: %ld\n",pBuffer->nTickCount);
1598        error = OMX_EmptyThisBuffer(pHandle, pBuffer);
1599        if (error == OMX_ErrorIncorrectStateOperation) error = 0;
1600    }
1601
1602 EXIT:
1603    return error;
1604}
1605
1606
1607OMX_S16 fill_data (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn)
1608{
1609    OMX_S16 nRead = 0;
1610    static OMX_S16 totalRead = 0;
1611    static OMX_S16 fileHdrReadFlag = 0;
1612
1613    if (!fileHdrReadFlag) {
1614        fprintf (stderr, "Reading the file\n");
1615        fileHdrReadFlag = 1;
1616    }
1617
1618    if (testCaseNo == 7) { /* Multiframe with each buffer size = 2* framelenght */
1619        numRead = 2*pBuf->nAllocLen;
1620    }
1621    else if (testCaseNo == 8) { /* Multiframe with each buffer size = 2/framelenght */
1622        numRead = pBuf->nAllocLen/2;
1623    }
1624    else if (testCaseNo == 9) { /* Multiframe with alternating buffer size */
1625        if (alternate == 0) {
1626            numRead = 2*pBuf->nAllocLen;
1627            alternate = 1;
1628        }
1629        else {
1630            numRead = pBuf->nAllocLen/2;
1631            alternate = 0;
1632        }
1633    }
1634    else {
1635        numRead = pBuf->nAllocLen;
1636    }
1637    nRead = fread(pBuf->pBuffer, 1, numRead , fIn);
1638    totalRead += nRead;
1639
1640    pBuf->nFilledLen = nRead;
1641    return nRead;
1642}
1643
1644void ConfigureAudio()
1645{
1646    int Mixer = 0, arg = 0, status = 0;
1647
1648    Mixer = open("/dev/sound/mixer", O_WRONLY);
1649    if (Mixer < 0) {
1650        perror("open of /dev/sound/mixer failed");
1651        exit(1);
1652    }
1653
1654    arg = G711DEC_SAMPLING_FREQUENCY;      /* sampling rate */
1655    printf("Sampling freq set to:%d\n",arg);
1656    status = ioctl(Mixer, SOUND_PCM_WRITE_RATE, &arg);
1657    if (status == -1) {
1658        perror("SOUND_PCM_WRITE_RATE ioctl failed");
1659        printf("sample rate set to %u\n", arg);
1660    }
1661    arg = AFMT_S16_LE;          /* AFMT_S16_LE or AFMT_S32_LE */
1662    status = ioctl(Mixer, SOUND_PCM_SETFMT, &arg);
1663    if (status == -1) {
1664        perror("SOUND_PCM_SETFMT ioctl failed");
1665        printf("Bitsize set to %u\n", arg);
1666    }
1667    arg = 2;            /* Channels mono 1 stereo 2 */
1668    status = ioctl(Mixer, SOUND_PCM_WRITE_CHANNELS, &arg);
1669    if (status == -1) {
1670        perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
1671        printf("Channels set to %u\n", arg);
1672    }
1673    /* MIN 0 MAX 100 */
1674
1675    arg = GAIN<<8|GAIN;
1676    status = ioctl(Mixer, SOUND_MIXER_WRITE_VOLUME, &arg);
1677    if (status == -1) {
1678        perror("SOUND_MIXER_WRITE_VOLUME ioctl failed");
1679        printf("Volume set to %u\n", arg);
1680    }
1681}
1682
1683#ifdef APP_MEMDEBUG
1684void * mymalloc(int line, char *s, int size)
1685{
1686    void *p;
1687    int e=0;
1688    p = malloc(size);
1689    if(p==NULL){
1690        printf("Memory not available\n");
1691        exit(1);
1692    }
1693    else{
1694        while((lines[e]!=0)&& (e<500) ){
1695            e++;
1696        }
1697        arr[e]=p;
1698        lines[e]=line;
1699        bytes[e]=size;
1700        strcpy(file[e],s);
1701        printf("Allocating %d bytes on address %p, line %d file %s pos %d\n", size, p, line, s, e);
1702        return p;
1703    }
1704}
1705
1706int myfree(void *dp, int line, char *s)
1707{
1708    int q = 0;
1709    for(q=0;q<500;q++){
1710        if(arr[q]==dp){
1711            printf("Deleting %d bytes on address %p, line %d file %s\n", bytes[q],dp, line, s);
1712            free(dp);
1713            dp = NULL;
1714            lines[q]=0;
1715            strcpy(file[q],"");
1716            break;
1717        }
1718    }
1719    if(500==q)
1720        printf("\n\nPointer not found. Line:%d    File%s!!\n\n",line, s);
1721
1722    return 0;
1723}
1724#endif
1725