Hi,
I am using decode audio from audio file test case and add playback support in decode audio demo function but i can't hear any sound on hdmi or AIC.Here is my modified code. Yellow background is new added function for playback.
if (Audio_initRenderDevice(AUDIO_CHANNELS_SUPPORTED,96000,1) < 0) This function called before App_decodeTaskFxn
static Void *App_decodeTaskFxn(Void * prm)
{
FILE *in = NULL, *out = NULL;
UInt8 *inBuf = NULL;
UInt8 *outBuf = NULL;
ADEC_PROCESS_PARAMS_S decPrm;
Int32 rdIdx, to_read, readBytes;
ADEC_CREATE_PARAMS_S adecParams;
Void *decHandle = NULL;
Int32 frameCnt = 0, totalSamples = 0;
Int32 inBufSize, outBufSize;
Audio_DecInfo *info = prm;
Bool isSharedRegion = FALSE;
char threadName[128];
snprintf(threadName,sizeof(threadName),"%s_%x",__func__,0);
threadName[sizeof(threadName) - 1] = 0;
OSA_printTID(threadName);
if (!prm)
{
printf ("ADEC task failed <invalid param>...........\n");
return NULL;
}
memset(&decPrm, 0, sizeof(decPrm));
memset(&adecParams, 0, sizeof(adecParams));
adecParams.decoderType = (info->decodeType == 0) ? AUDIO_CODEC_TYPE_AAC_LC : AUDIO_CODEC_TYPE_G711;
adecParams.desiredChannelMode = info->numChannels;
/* For AAC-LC, 0 means mono & 2 means stereo */
if (adecParams.decoderType == AUDIO_CODEC_TYPE_AAC_LC)
adecParams.desiredChannelMode -= 1;
decHandle = Adec_create(&adecParams);
if (decHandle)
{
printf ("ADEC Create done...........\n");
}
else
{
printf ("ADEC Create failed...........\n");
printf ("\n********Decode APP Task Exitting....\n");
gAppDecodeThreadActive = FALSE;
gAppDecodeThreadExitFlag = TRUE;
return NULL;
}
gAppDecodeThreadExitFlag = FALSE;
if (adecParams.decoderType == AUDIO_CODEC_TYPE_AAC_LC)
isSharedRegion = TRUE;
inBufSize = MAX_INPUT_BUFFER / 2;
if (inBufSize < adecParams.minInBufSize)
inBufSize = adecParams.minInBufSize;
outBufSize = MAX_OUTPUT_BUFFER;
if (outBufSize < adecParams.minOutBufSize)
outBufSize = adecParams.minOutBufSize;
in = fopen(info->inFile, "rb");
if (!in)
{
printf ("File <%s> Open Error....\n", info->inFile);
}
out = fopen(info->outFile, "wb");
if (!out)
{
printf ("File <%s> Open Error....\n", info->outFile);
}
inBuf = App_allocBuf(inBufSize, isSharedRegion);
outBuf = App_allocBuf(outBufSize, isSharedRegion);
if (in && out && inBuf && outBuf)
{
printf ("\n\n=============== Starting Decode ===================\n");
sleep(1);
rdIdx = 0;
to_read = inBufSize;
decPrm.outBuf.dataBuf = outBuf;
while (gAppDecodeThreadActive == TRUE)
{
readBytes = fread (inBuf + rdIdx, 1, to_read, in);
readBytes += rdIdx;
if (readBytes)
{
decPrm.inBuf.dataBufSize = readBytes;
decPrm.inBuf.dataBuf = inBuf;
decPrm.outBuf.dataBufSize = outBufSize;
if (Adec_process(decHandle, &decPrm) < 0)
{
printf ("DEC: Decode process failed... Corrupted handled!!!! ....\n");
break;
}
if (decPrm.inBuf.dataBufSize <= 0)
{
if (totalSamples <= 0)
printf ("DEC: Decoder didnt consume bytes <%d>... exiting....\n", readBytes);
printf ("=============== Decode completed, %d samples generated ================\n", totalSamples);
break;
}
if ((totalSamples == 0) && (adecParams.decoderType == AUDIO_CODEC_TYPE_AAC_LC))
{
Demo_printDecodeStreamParams(&decPrm);
}
if (out)
{
writeToFile(out, &decPrm);
}
Audio_playBuffer(decPrm.inBuf.dataBuf,decPrm.inBuf.dataBufSize);
rdIdx = (readBytes-decPrm.inBuf.dataBufSize);
memmove(inBuf, inBuf+decPrm.inBuf.dataBufSize, rdIdx);
to_read = decPrm.inBuf.dataBufSize;
{
// printf ("DEC - %d, Samples Generated - %d <total %d>, bytesConsumed - %d\n",
// frameCnt, decPrm.numSamples, totalSamples, decPrm.inBuf.dataBufSize);
}
frameCnt++;
totalSamples += decPrm.numSamples;
}
else
{
printf ("=============== Decode completed, %d samples generated ================\n", totalSamples);
break;
}
}
}
else
{
printf ("\n\n=============== Decode not starting.... file / mem error ============\n");
}
prm = prm;
if (in)
fclose(in);
if (out)
fclose(out);
if (inBuf)
App_freeBuf(inBuf, inBufSize, isSharedRegion);
if (outBuf)
App_freeBuf(outBuf, outBufSize, isSharedRegion);
Adec_delete(decHandle);
printf ("\n********Decode APP Task Exitting....\n");
gAppDecodeThreadActive = FALSE;
gAppDecodeThreadExitFlag = TRUE;
return NULL;
}