diff --git a/pasdk/test_dsp/framework/audioStreamOutProc.c b/pasdk/test_dsp/framework/audioStreamOutProc.c
index 9b63f8ad271e70534a21aa102f1cb82963bc9453..be08b59c5ee0844c717bb5a9b4eb0a3a1ee214dd 100644 (file)
// FL: debug
#include "evmc66x_gpio_dbg.h"
+#include "dbgCapAf.h"
+// -----------------------------------------------------------------------------
+// Debugging Trace Control, local to this file.
+//
+#include "logp.h"
+
#define TRACE_TIME(a)
+// Allow a developer to selectively enable tracing.
+#define CURRENT_TRACE_MASK 0x07
+
+#define TRACE_MASK_TERSE 0x01 // only flag errors and show init
+#define TRACE_MASK_GENERAL 0x02 // half dozen lines per frame
+#define TRACE_MASK_VERBOSE 0x04 // trace full operation
+
+#if !(CURRENT_TRACE_MASK & TRACE_MASK_TERSE)
+ #undef TRACE_TERSE0
+ #undef TRACE_TERSE1
+ #undef TRACE_TERSE2
+ #undef TRACE_TERSE3
+ #undef TRACE_TERSE4
+ #define TRACE_TERSE0(a)
+ #define TRACE_TERSE1(a,b)
+ #define TRACE_TERSE2(a,b,c)
+ #define TRACE_TERSE3(a,b,c,d)
+ #define TRACE_TERSE4(a,b,c,d,e)
+#endif
+
+#if !(CURRENT_TRACE_MASK & TRACE_MASK_GENERAL)
+ #undef TRACE_GEN0
+ #undef TRACE_GEN1
+ #undef TRACE_GEN2
+ #undef TRACE_GEN3
+ #undef TRACE_GEN4
+ #define TRACE_GEN0(a)
+ #define TRACE_GEN1(a,b)
+ #define TRACE_GEN2(a,b,c)
+ #define TRACE_GEN3(a,b,c,d)
+ #define TRACE_GEN4(a,b,c,d,e)
+#endif
+
+#if !(CURRENT_TRACE_MASK & TRACE_MASK_VERBOSE)
+ #undef TRACE_VERBOSE0
+ #undef TRACE_VERBOSE1
+ #undef TRACE_VERBOSE2
+ #undef TRACE_VERBOSE3
+ #undef TRACE_VERBOSE4
+ #define TRACE_VERBOSE0(a)
+ #define TRACE_VERBOSE1(a,b)
+ #define TRACE_VERBOSE2(a,b,c)
+ #define TRACE_VERBOSE3(a,b,c,d)
+ #define TRACE_VERBOSE4(a,b,c,d,e)
+#endif
+
+// .............................................................................
+
//
// Audio Stream Definitions
//
PAF_AudioFrame *pDecResetAf
);
-// Purpose: ASOT Function for resetting output processing.
+// Purpose: ASOT Function for Output reset
static Int PAF_ASOT_outputReset(
const PAF_ASOT_Params *pP,
const PAF_ASOT_Patchs *pQ,
PAF_AudioFrame *pDecInfo1Af
);
+// Purpose: ASOT function for ASP chain reset and ENC info
+static Int PAF_ASOT_outputInfo1(
+ const PAF_ASOT_Params *pP,
+ const PAF_ASOT_Patchs *pQ,
+ PAF_ASOT_Config *pAsotCfg
+);
+
+// Purpose: Init-Sync Dec Decode1 state function.
+// Performes Dec Decode1 Init-Sync.
+static Int PAF_ASOT_initSyncDecDecode1(
+ const PAF_ASOT_Params *pP,
+ const PAF_ASOT_Patchs *pQ,
+ PAF_ASOT_Config *pAsotCfg
+);
+
// Purpose: Init-Sync Re-Sync state function.
// Peformed Init-Sync using stored Dec Reset/Info1 AFs.
static Int PAF_ASOT_initSyncResync(
PAF_AudioFrame *pDecInfo1Af
);
+#if 0
// Init-Sync update audio frame
static Int initSyncUpdateAf(
PAF_AudioFrame *dstAf,
PAF_AudioFrame *srcAf
);
+#endif
// Reset audio frames
static Void resetAfs(
UInt32 gMaxDecOpCbRdAfUnd =0; // max (consecutive) decoder output circular buffer underflow count
UInt32 gMasterCbResetCnt =0; // master circular buffer reset count
-// Global debug counters */
-UInt32 gTaskAsopCnt=0; // debug
-UInt32 gAsopInitCnt =0;
-UInt32 gAsopStreamCnt =0;
-UInt32 gAsopEncodeCnt =0;
-UInt32 gAsopFinalCnt =0;
-UInt32 gAsopQuitCnt =0;
-UInt32 gAsopOutSioUpdateCnt =0;
+// For writeDECCommandRestart
+extern volatile UInt32 gCommandOutputTask_SYNC;
+extern volatile UInt32 gCommandOutputTask_ACK;
+// Global debug counters */
+UInt32 gAsopTxSioReclaimCnt =0;
+UInt32 gAsopInitOutProcCnt =0;
+UInt32 gAsopInitSyncDecResetCnt =0;
+UInt32 gAsopInitSyncDecInfo1Cnt =0;
+UInt32 gAsopInitSyncDecDecode1Cnt =0;
+UInt32 gAsopInitSyncResyncCnt =0;
+UInt32 gAsopOutProcCnt =0;
+UInt32 gAsopInitCnt =0;
+UInt32 gAsopStreamCnt =0;
+UInt32 gAsopEncodeCnt =0;
+UInt32 gAsopFinalCnt =0;
+UInt32 gAsopOutSioUpdateCnt =0;
+UInt32 gAsopQuitCnt =0;
/*
* ======== taskAsopFxn ========
Int as; /* Audio Stream Number (1, 2, etc.) */
Int z; /* input/encode/stream/decode/output counter */
Int i; /* phase */
- Int errno; /* error number */
Int zMS;
- Int loopCount = 0; // used to stop trace to see startup behavior.
- Int outSel;
- enum { INIT_OUT_PROC_STATE, INITSYNC_DEC_RESET_STATE, INITSYNC_DEC_INFO1_STATE, INITSYNC_RESYNC_STATE, OUT_PROC_STATE } state;
+ Int errno; // error number
+ Int8 procSleep; // whether to sleep: 0: No, 1: Yes
+ Int8 procOutDevSel; // whether to perform output device selection: 0: No, 1:Yes
+ Int outSel; // whether output device selected
+ enum { INIT_OUT_PROC_STATE,
+ INITSYNC_DEC_RESET_STATE, INITSYNC_DEC_INFO1_STATE, INITSYNC_DEC_DECODE1_STATE,
+ INITSYNC_RESYNC_STATE,
+ OUT_PROC_STATE } state;
PAF_AudioFrame decResetAf;
PAF_AudioFrame decInfo1Af;
+ Int loopCount = 0; // used to stop trace to see startup behavior.
Log_info0("Enter taskAsopFxn()");
if (!pQ)
{
- TRACE_TERSE0("TaskAsip: No Patchs defined. Exiting.");
+ TRACE_TERSE0("TaskAsop: No Patchs defined. Exiting.");
LINNO_RPRT(TaskAsop, -1);
return;
}
//
for (z=STREAM1; z < STREAMN; z++)
{
- TRACE_VERBOSE1("TaskAsip: AS%d: running", as+z);
+ TRACE_VERBOSE1("TaskAsop: AS%d: running", as+z);
}
- state = INIT_OUT_PROC_STATE; // initialize state
- errno = 0; // reset error indicator
+ errno = 0; // init error indicator -- no error
+ procSleep = 1; // init sleep flag -- sleep
+ procOutDevSel = 1; // init device output selection flag -- perform output device selection
+ state = INIT_OUT_PROC_STATE; // init state
for (;;)
{
loopCount++;
// Check forward (ASIT) error here, TBD
//
+ // Even if we are not in error state, we check if writeDECCommandRestar issued or not
+ if (gCommandOutputTask_SYNC) {
+ TRACE_TERSE0("TaskAsop: ack for writeDECCommandRestart ... Wait for the command deasserted");
+ gCommandOutputTask_ACK = 1;
+ while (gCommandOutputTask_SYNC) {
+ Task_sleep(1);
+ }
+ TRACE_TERSE0("TaskAsop: ack for writeDECCommandRestart ... Sync-ed! Startover the process");
+ procSleep = 1; // init sleep flag -- sleep
+ procOutDevSel = 1; // init device output selection flag -- perform output device selection
+ state = INIT_OUT_PROC_STATE; // init state -- starover
+ errno = ASOP_DP_FORWARD_ERR; // Override the error -- for flushing SIO output device
+ }
+
// any error forces idling of output
if (errno)
{
TRACE_TERSE1("TaskAsop: Trace stopped at loop %d.", loopCount);
ERRNO_RPRT(TaskAsop, errno);
- }
+ }
- TRACE_VERBOSE1("TaskAsop: AS%d: ... sleeping ...", as+zMS);
- Task_sleep(1);
-
- // select output devices
- TRACE_GEN1("TaskAsop: AS%d: Output device selection ...", as+zMS);
- errno = pP->fxns->selectDevices(pP, pQ, pAsotCfg);
- if (errno)
+ if (procSleep == 1)
{
- TRACE_TERSE2("TaskAsop: AS%d: selectDevices returned errno = 0x%04x", as+zMS, errno);
- continue;
+ TRACE_VERBOSE1("TaskAsop: AS%d: ... sleeping ...", as+zMS);
+ Task_sleep(1);
}
- // if no output selected skip remaining processing
- errno = checkOutSel(pP, pAsotCfg, &outSel);
- if (errno < 0)
+ if (procOutDevSel == 1)
{
- TRACE_TERSE2("TaskAsop: AS%d: checkOutSel returned errno = 0x%04x", as+zMS, errno);
- continue;
- }
- else if (!outSel)
- {
- TRACE_VERBOSE1("TaskAsop: AS%d: No output selected...", as+zMS);
- continue;
+ // select output devices
+ TRACE_GEN1("TaskAsop: AS%d: Output device selection ...", as+zMS);
+ errno = pP->fxns->selectDevices(pP, pQ, pAsotCfg);
+ if (errno)
+ {
+ TRACE_TERSE2("TaskAsop: AS%d: selectDevices returned errno = 0x%04x", as+zMS, errno);
+
+ procSleep = 1;
+ procOutDevSel = 1;
+
+ continue;
+ }
+
+ // if no output selected skip remaining processing
+ errno = checkOutSel(pP, pAsotCfg, &outSel);
+ if (errno < 0)
+ {
+ TRACE_TERSE2("TaskAsop: AS%d: checkOutSel returned errno = 0x%04x", as+zMS, errno);
+
+ procSleep = 1;
+ procOutDevSel = 1;
+
+ continue;
+ }
+ else if (!outSel)
+ {
+ TRACE_VERBOSE1("TaskAsop: AS%d: No output selected...", as+zMS);
+
+ procSleep = 1;
+ procOutDevSel = 1;
+
+ continue;
+ }
}
switch (state)
{
case INIT_OUT_PROC_STATE:
+ gAsopInitOutProcCnt++;
Log_info0("TaskAsop: state=INIT_OUT_PROC_STATE");
//
if (errno < 0)
{
state = INIT_OUT_PROC_STATE;
+ procSleep = 1;
+ procOutDevSel = 1;
}
else
{
state = INITSYNC_DEC_RESET_STATE;
+ procSleep = 0;
+ procOutDevSel = 0;
}
break;
case INITSYNC_DEC_RESET_STATE:
+ gAsopInitSyncDecResetCnt++;
Log_info0("TaskAsop: state=INITSYNC_DEC_RESET_STATE");
//
if (errno < 0)
{
Log_info1("TaskAsop: state=INITSYNC_DEC_RESET_STATE errno=%d", errno);
+
// sync error -- start over
state = INIT_OUT_PROC_STATE;
+ procSleep = 1;
+ procOutDevSel = 1;
}
else if (errno == ASOP_INITSYNC_NOTREADY)
{
Log_info1("TaskAsop: state=INITSYNC_DEC_RESET_STATE not sync'd errno=%d", errno);
+
// sync not ready -- try again
state = INITSYNC_DEC_RESET_STATE;
+ errno=0; // FL: temp hack
+ procSleep = 1;
+ procOutDevSel = 1;
}
else // errno==0
{
Log_info1("TaskAsop: state=INITSYNC_DEC_RESET_STATE sync'd, errno=%d", errno);
+
// sync'd -- move on
state = INITSYNC_DEC_INFO1_STATE;
+ procSleep = 0;
+ procOutDevSel = 0;
}
break;
case INITSYNC_DEC_INFO1_STATE:
+ gAsopInitSyncDecInfo1Cnt++;
Log_info0("TaskAsop: state=INITSYNC_DEC_INFO1_STATE");
//
if (errno < 0)
{
Log_info1("TaskAsop: state=INITSYNC_DEC_INFO1_STATE errno=%d", errno);
+
// sync error -- start over
state = INIT_OUT_PROC_STATE;
+ procSleep = 1;
+ procOutDevSel = 1;
}
else if (errno == ASOP_INITSYNC_NOTREADY)
{
Log_info1("TaskAsop: state=INITSYNC_DEC_INFO1_STATE not sync'd errno=%d", errno);
+
// sync not ready -- try again
state = INITSYNC_DEC_INFO1_STATE;
+ errno=0; // FL: temp hack
+ procSleep = 1;
+ procOutDevSel = 0;
}
else // errno = 0
{
Log_info1("TaskAsop: state=INITSYNC_DEC_INFO1_STATE sync'd errno=%d", errno);
+
+ // sync'd -- move on
+ state = INITSYNC_DEC_DECODE1_STATE;
+ procSleep = 0;
+ procOutDevSel = 0;
+ }
+
+ break;
+
+ case INITSYNC_DEC_DECODE1_STATE:
+ gAsopInitSyncDecDecode1Cnt++;
+ Log_info0("TaskAsop: state=INITSYNC_DEC_DECODE1_STATE");
+
+ //
+ // Dec Info1 Init-Sync.
+ //
+
+ // Perform Dec Info1 init-sync.
+ // Latch Dec Info1 AF.
+ errno = PAF_ASOT_initSyncDecDecode1(pP, pQ, pAsotCfg);
+ if (errno < 0)
+ {
+ Log_info1("TaskAsop: state=INITSYNC_DEC_DECODE1_STATE errno=%d", errno);
+
+ // sync error -- start over
+ state = INIT_OUT_PROC_STATE;
+ procSleep = 1;
+ procOutDevSel = 1;
+ }
+ else if (errno == ASOP_INITSYNC_NOTREADY)
+ {
+ Log_info1("TaskAsop: state=INITSYNC_DEC_DECODE1_STATE not sync'd errno=%d", errno);
+
+ // sync not ready -- try again
+ state = INITSYNC_DEC_DECODE1_STATE;
+ errno=0; // FL: temp hack
+ procSleep = 1;
+ procOutDevSel = 0;
+ }
+ else // errno = 0
+ {
+ Log_info1("TaskAsop: state=INITSYNC_DEC_DECODE1_STATE sync'd errno=%d", errno);
+
// sync'd -- move on
state = OUT_PROC_STATE;
+ procSleep = 0;
+ procOutDevSel = 0;
}
break;
case INITSYNC_RESYNC_STATE:
+ gAsopInitSyncResyncCnt++;
Log_info0("TaskAsop: state=INITSYNC_RESYNC_STATE");
//
if (errno < 0)
{
Log_info1("TaskAsop: state=INITSYNC_RESYNC_STATE errno=%d", errno);
+
// sync error -- start over
state = INIT_OUT_PROC_STATE;
+ procSleep = 1;
+ procOutDevSel = 1;
}
else
{
Log_info1("TaskAsop: state=INITSYNC_RESYNC_STATE sync'd errno=%d", errno);
+
// re-sync'd -- move on
state = OUT_PROC_STATE;
+ procSleep = 0;
+ procOutDevSel = 0;
}
break;
case OUT_PROC_STATE:
+ gAsopOutProcCnt++;
Log_info0("TaskAsop: state=OUT_PROC_STATE");
//
{
// forward (ASIT) error -- start over
state = INIT_OUT_PROC_STATE;
+ procSleep = 1;
+ procOutDevSel = 1;
}
else
{
// local (ASOT) error
state = INITSYNC_RESYNC_STATE;
+ procSleep = 1;
+ procOutDevSel = 0; // disallow device re-select if local error during output processing
}
}
else if (errno > 0)
// skip re-sync
// resume output processing after new output selected
state = OUT_PROC_STATE;
+ procSleep = 1;
+ procOutDevSel = 1;
}
}
else
// no error returned if CB drained
// (i.e. CB drained is normal behavior)
- state = OUT_PROC_STATE;
+ state = INIT_OUT_PROC_STATE;
+ procSleep = 1;
+ procOutDevSel = 1;
}
break;
}
}
+/* No need to start-clocks here, since only selecting the device. */
+#if 0
// if device selected and valid then enable stat tracking if
// required and start clocking
if ((pAstCfg->xOut[z].outBufStatus.sioSelect < 0) && (pAstCfg->xOut[z].hTxSio))
}
}
}
+#endif
}
return errno;
// Check forward (ASIT) error here, TBD
//
-
+ // If writeDECCommandRestart issued, force exit the statemachine
+ if (gCommandOutputTask_SYNC) {
+ TRACE_VERBOSE1("PAF_ASOT_decodeProcessing: writeDECCommandRestart issued in state=0x%x ... exiting core loop", state);
+ errno = ASOP_DP_FORWARD_ERR;
+ break;
+ }
+
// Check if any change in output SIO, e.g. from Output shortcut.
// Changes will break FSM and allow Output reconfiguration.
errno = checkOutSio(pP, pAsotCfg, &outSioUpdate);
break;
}
-#if 0 // FL: moved to PAF_ASOT_initSyncDecInfo1()
//
- // Setup output: ASP chain reset, ENC reset, setCheckRateX, start output
+ // Setup output: setCheckRateX, start output
//
// Establish secondary timing
errno = pP->fxns->decodeInfo1(pP, pQ, pAsotCfg, frame, block);
TRACE_VERBOSE1("PAF_ASOT_decodeProcessing: INIT, errno 0x%x. break after decodeInfo1", errno);
break;
}
-#endif
TRACE_VERBOSE0("PAF_ASOT_decodeProcessing: state: INIT->STREAM");
state = STREAM;
return 0;
} //PAF_ASOT_encodeCommand
+//debug -- allow dynamic config
+//Int16 gStrFrameLen=DEF_STR_FRAME_LEN; // stream frame length (PCM samples)
+
// Purpose: Decoding Function for reinitializing the decoding process.
Int
PAF_ASOT_decodeInit(
for (z=DECODE1; z < DECODEN; z++)
{
+ // Initialize decoder output circular buffer for stream reads
+ //errno = cbInitStreamRead(pCbCtl, z, gStrFrameLen);
+ errno = cbInitStreamRead(pCbCtl, z);
+ if (errno)
+ {
+ TRACE_TERSE1("PAF_ASOT_decodeInit:cbInitStreamRead() error=%d", errno);
+ SW_BREAKPOINT; // debug
+ return errno;
+ }
+
// Start decoder output circular buffer reads
errno = cbReadStart(pCbCtl, z);
if (errno)
SW_BREAKPOINT; // debug
return errno;
}
+
gCbReadAfErr=0; // reset read circular buffer error count
gDecOpCbRdAfUnd=0; // reset decoder output circular buffer underflow count
gMaxDecOpCbRdAfUnd=0; // reset max decoder output circular buffer underflow count
Int block
)
{
- PAF_AST_Config *pAstCfg;
- Int z; /* decode/encode counter */
+ //PAF_AST_Config *pAstCfg;
+ //Int z; /* decode/encode counter */
Int errno; /* error number */
+#if 0 // moved to PAF_ASOT_outputInfo1()
pAstCfg = pAsotCfg->pAstCfg; // get pointer to AST common (shared) configuration
// run the chain of ASP's on the stream.
}
}
}
+#endif
errno = pP->fxns->setCheckRateX(pP, pQ, pAsotCfg, 0);
if (errno)
TRACE_TERSE1("PAF_ASOT_decodeInfo1: startOutput returns errno 0x%x", errno);
}
return errno;
- }
+ }
return 0;
}
Int z; /* decode/stream counter */
PAF_AudioFrame *pAfRd;
Int cbErrno;
- PAF_AST_DecOpCircBufStats cbStats; /* circular buffer statistics */
+ //PAF_AST_DecOpCircBufStats cbStats; /* circular buffer statistics */
Int errno;
// Read decoder output circular buffer
//
pAfRd = pAstCfg->xStr[zS].pAudioFrame;
- //GPIOSetOutput(GPIO_PORT_0, GPIO_PIN_106);
+ //GPIOSetOutput(GPIO_PORT_0, GPIO_PIN_106); // debug
cbErrno = cbReadAf(pCbCtl, z, pAfRd);
- if ((cbErrno < 0) && (cbErrno != ASP_DECOP_CB_READ_UNDERFLOW))
+ //GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_106); // debug
+ if ((cbErrno < 0) &&
+ (cbErrno != ASP_DECOP_CB_AF_READ_UNDERFLOW) &&
+ (cbErrno != ASP_DECOP_CB_PCM_READ_UNDERFLOW))
{
gCbReadAfErr++;
TRACE_TERSE1("PAF_ASOT_decodeStream:cbReadAf() error=%d", cbErrno);
- //SW_BREAKPOINT; // FL: debug
+ //SW_BREAKPOINT; // debug
return cbErrno;
}
// Handle underflows
- if (cbErrno == ASP_DECOP_CB_READ_UNDERFLOW)
+ if ((cbErrno == ASP_DECOP_CB_AF_READ_UNDERFLOW) ||
+ (cbErrno == ASP_DECOP_CB_PCM_READ_UNDERFLOW))
{
- // FL: some number of underflows alway occur on start of stream when ASOT only depends on configured Output.
- // DDP: ~2 underflows
- // MAT-THD: ~16 underflows
- // Need to check behavior of cbReset().
+ // (***) FL: Need to check behavior of cbReset().
// Need to check behavior on exit/re-entry into Output processing.
-
gDecOpCbRdAfUnd++; // increment circular buffer underflow count
if (gDecOpCbRdAfUnd >= DEC_OP_CB_RDAF_UND_THR)
{
gDecOpCbRdAfUnd = 0; // reset circular buffer underflow count
}
//Log_info0("PAF_ASOT_decodeStream:cbReadAf() complete.");
- //GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_106);
+ //GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_106); // debug
Log_info0("PAF_ASOT_decodeStream:cbReadAf() complete.");
#if 0 // (***) FL: shows timing of CB read
}
#endif
- // FL: debug
- // Get circular buffer statistics (debug)
+ // debug, get circular buffer statistics
//cbGetStats(pCbCtl, z, &cbStats);
cbGetStats(pCbCtl, z, &gCbStats);
- // FL: debug
+ // debug
cbLog(pCbCtl, z, 1, "PAF_ASOT_decodeStream:cbReadAf");
- //if (capAfWrite(pAfRd, 0) != CAP_AF_SOK)
- //{
- // Log_info0("capAfWrite() error");
- //}
+
+#if 0 // debug, capture audio frame
+ if (capAfWrite(pAfRd, PAF_LEFT) != CAP_AF_SOK)
+ {
+ Log_info0("capAfWrite() error");
+ }
+#endif
}
TRACE_VERBOSE0("PAF_ASOT_outputStream: calling streamChainFunction.");
Int z; /* encode/output counter */
Int errno; /* error number */
Int zX, zE, zS;
- UInt32 curTime;
+ // debug
+ //UInt32 curTime;
pAstCfg = pAsotCfg->pAstCfg; // get pointer to AST common (shared) configuration
as = pAstCfg->as;
pAstCfg->xOut[z].outBufConfig.lengthofFrame =
pAstCfg->xEnc[zE].encodeInStruct.pAudioFrame->sampleCount;
TRACE_GEN2("PAF_ASOT_decodeEncode: AS%d: processing block %d -- idle", as+zS, block);
+ //GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_106); // debug
errno = SIO_reclaim(pAstCfg->xOut[z].hTxSio,(Ptr *) &pAstCfg->xOut[z].pOutBuf, NULL);
+ //GPIOSetOutput(GPIO_PORT_0, GPIO_PIN_106); // debug
if (errno < 0)
{
SIO_idle(pAstCfg->xOut[z].hTxSio);
}
// TODO: use pC->xOut[z].pOutBuf in following ->encode call
-#if 0 // (***) FL: shows timing of Output Rx SIO reclaim
+#if 1 // (***) FL: shows timing of Output Tx SIO reclaim
// (***) debug // B8
{
static Uint8 toggleState = 0;
//
// Simulate Tx SIO_reclaim() pend
//
- //Semaphore_pend(semaphoreTxAudio, BIOS_WAIT_FOREVER);
- gTaskAsopCnt++;
- curTime = Clock_getTicks();
- //System_printf("System time in TaskAsipFxn Tx audio = %lu\n", (ULong)curTime);
+ //Semaphore_pend(semaphoreTxAudio, BIOS_WAIT_FOREVER);
+ //curTime = Clock_getTicks();
+ //System_printf("System time in TaskAsopFxn Tx audio = %lu\n", (ULong)curTime);
//Log_info1("outputEncode():Tx SIO reclaim(), system time = %u", curTime);
+
+ gAsopTxSioReclaimCnt++;
}
else
{
if (pAstCfg->xOut[z].hTxSio)
{
TRACE_GEN2("PAF_ASOT_decodeEncode: AS%d: processing block %d -- output", as+zS, block);
+ //GPIOSetOutput(GPIO_PORT_0, GPIO_PIN_106); // debug
errno = SIO_issue(pAstCfg->xOut[z].hTxSio,
&pAstCfg->xOut[z].outBufConfig, sizeof (pAstCfg->xOut[z].outBufConfig), 0);
+ //GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_106); // debug
if (errno)
{
SIO_idle(pAstCfg->xOut[z].hTxSio);
PAF_AST_Config *pAstCfg;
Int as; /* Audio Stream Number (1, 2, etc.) */
Int z; /* output counter */
- Int errno,nbufs; /* error number */
+ Int errno,nbufs, errme; /* error number */
Int zE, zS, zX;
Int zMD;
PAF_SIO_IALG_Obj *pObj;
}
}
+// Need to Revisit: Starting Clocks here seems logical & also manages the McASP without spurious underruns .
+
+#if 1
+ // if device selected and valid then enable stat tracking if
+ // required and start clocking
+ if ((pAstCfg->xOut[z].outBufStatus.sioSelect < 0) && (pAstCfg->xOut[z].hTxSio))
+ {
+ TRACE_VERBOSE0("PAF_ASOT_startOutput: start SIO clocks");
+ errme = SIO_ctrl(pAstCfg->xOut[z].hTxSio, PAF_SIO_CONTROL_OUTPUT_START_CLOCKS, 0);
+ if (errno)
+ {
+ TRACE_VERBOSE2("PAF_ASOT_startOutput: errme 0x%x, errno 0x%x", errme, errno);
+ SIO_idle(pAstCfg->xOut[z].hTxSio);
+ if (!errno)
+ {
+ errno = ASPERR_DEVOUT + errme;
+ }
+ }
+ }
+#endif
// Set sample count so that DOB knows how much data to send
pAstCfg->xOut[z].outBufConfig.lengthofFrame =
pAstCfg->xEnc[zE].encodeInStruct.pAudioFrame->sampleCount;
return errno;
} //PAF_ASOT_stopOutput
+
// -----------------------------------------------------------------------------
// ASOT Decoding Function Helper - SIO Driver Change
//
rateI = pAstCfg->xStr[zMS].pAudioFrame->fxns->sampleRateHz
(pAstCfg->xStr[zMS].pAudioFrame, inputRate, PAF_SAMPLERATEHZ_INV);
- for (z=OUTPUT1; z < OUTPUTN; z++) {
- if (pAstCfg->xOut[z].hTxSio && (pAstCfg->xOut[z].outBufStatus.clock & 0x01)) {
-
+ for (z=OUTPUT1; z < OUTPUTN; z++)
+ {
+ if (pAstCfg->xOut[z].hTxSio && (pAstCfg->xOut[z].outBufStatus.clock & 0x01))
+ {
// determine associated encoder
zE = z;
- for (zX = ENCODE1; zX < ENCODEN; zX++) {
- if (pP->outputsFromEncodes[zX] == z) {
+ for (zX = ENCODE1; zX < ENCODEN; zX++)
+ {
+ if (pP->outputsFromEncodes[zX] == z)
+ {
zE = zX;
break;
}
outputCount = pAstCfg->xEnc[zE].encodeStatus.frameLength;
rateO = pAstCfg->xStr[zMS].pAudioFrame->fxns->sampleRateHz
(pAstCfg->xStr[zMS].pAudioFrame, outputRate, PAF_SAMPLERATEHZ_STD);
- if (rateI > 0 && rateO > 0)
+ if ((rateI > 0) && (rateO > 0))
+ {
rateX = rateO /* std */ * rateI /* inv */;
+ }
else if (inputCount != 0)
+ {
rateX = (float )outputCount / inputCount;
+ }
else
- return ( ASPERR_INFO_RATERATIO );
+ {
+ return ASPERR_INFO_RATERATIO;
+ }
- getVal = SIO_ctrl (pAstCfg->xOut[z].hTxSio, PAF_SIO_CONTROL_SET_RATEX, (Arg) &rateX);
- if (getVal == DOBERR_RATECHANGE) {
+ getVal = SIO_ctrl(pAstCfg->xOut[z].hTxSio, PAF_SIO_CONTROL_SET_RATEX, (Arg)&rateX);
+ if (getVal == DOBERR_RATECHANGE)
+ {
for (zx=OUTPUT1; zx < OUTPUTN; zx++)
+ {
if (pAstCfg->xOut[zx].hTxSio)
+ {
SIO_idle (pAstCfg->xOut[zx].hTxSio);
+ }
+ }
// this forces an exit from the calling state machine which will
// eventually call startOutput which calls setCheckRateX for all outputs
// exit this loop /function early.
return ASPERR_INFO_RATECHANGE;
}
- else if( getVal != SYS_OK )
+ else if (getVal != SYS_OK)
+ {
return ((getVal & 0xff) | ASPERR_RATE_CHECK);
+ }
}
}
return ASOP_SOK;
}
+#if 0
// Init-Sync update audio frame
static Int initSyncUpdateAf(
PAF_AudioFrame *dstAf,
return ASOP_SOK;
}
+#endif
// Purpose: Init-Sync Dec Reset state function.
// Performes Dec Reset Init-Sync.
}
}
-// Purpose: ASOT Function for resetting output processing.
+// Purpose: ASOT Function for Output reset
static Int PAF_ASOT_outputReset(
const PAF_ASOT_Params *pP,
const PAF_ASOT_Patchs *pQ,
return ASOP_SOK;
}
+// FL: debug, allow modification of output frame length via JTAG
+Int16 gOutFrameLen=PAF_ASOT_FRAMELENGTH; // output frame length (PCM samples)
+
// Purpose: Init-Sync Dec Info1 state function.
// Performes Dec Info1 Init-Sync.
static Int PAF_ASOT_initSyncDecInfo1(
//{
// return errno;
//}
- outIsCpyAf(pDecInfo1Af, pStrAf);
- // decodeInfo1():
+ // Hack to set ASOT output frame length.
+ // THD sets this to 256 (hard-coded in Dec Info)
+ // DDP sets this to 0 (audio frame passthrough, 0 from ASDT AF frame length)
+ // PCM sets this to 256 (decodeControl.frameLength)
+ //pDecInfo1Af->sampleCount = 256; // !!!! GJ: Revisit !!!!
+ pDecInfo1Af->sampleCount = gOutFrameLen;
+
+ outIsCpyAf(pDecInfo1Af, pStrAf);
+
+ // Hack to set ASOT output frame length
+ // THD sets this to 256 (hard-coded in Dec Info)
+ // DDP sets this to 0 (audio frame passthrough, 0 from ASDT AF frame length)
+ // PCM sets this to 256 (decodeControl.frameLength)
+ //pStrAf->sampleCount = 256; // !!!! GJ: Revisit !!!!
+
+ // outputInfo1():
// - ASP chain reset,
- // - Enc Info,
- // - setCheckRateX,
- // - startOutput
- // frame and block parameters set to 0
- errno = pP->fxns->decodeInfo1(pP, pQ, pAsotCfg, 0, 0);
+ // - Enc Info
+ PAF_ASOT_outputInfo1(pP, pQ, pAsotCfg);
if (errno)
{
return ASOP_DECINFO1_ERR;
}
}
+// Purpose: ASOT function for ASP chain reset and ENC info
+static Int PAF_ASOT_outputInfo1(
+ const PAF_ASOT_Params *pP,
+ const PAF_ASOT_Patchs *pQ,
+ PAF_ASOT_Config *pAsotCfg
+)
+{
+ PAF_AST_Config *pAstCfg;
+ Int z; /* decode/encode counter */
+ Int errno; /* error number */
+
+
+ pAstCfg = pAsotCfg->pAstCfg; // get pointer to AST common (shared) configuration
+
+ // FL: frame parameter hard-coded to 0
+ // run the chain of ASP's on the stream.
+ TRACE_VERBOSE0("PAF_ASOT_decodeInfo1: calling streamChainFunction.");
+ errno = pP->fxns->streamChainFunction(pP, pQ, pAsotCfg,
+ PAF_ASP_CHAINFRAMEFXNS_RESET, 1, 0);
+ if (errno)
+ {
+ TRACE_TERSE1("PAF_ASOT_outputInfo1: streamChainFunction returns errno 0x%x ", errno);
+ return errno;
+ }
+
+ TRACE_VERBOSE0("PAF_ASOT_outputInfo1: calling enc->info.");
+ for (z=ENCODE1; z < ENCODEN; z++)
+ {
+ Int zO = pP->outputsFromEncodes[z];
+ if (pAstCfg->xOut[zO].hTxSio && pAstCfg->xEnc[z].encodeStatus.mode)
+ {
+ Int select = pAstCfg->xEnc[z].encodeStatus.select;
+ ALG_Handle encAlg = pAstCfg->xEnc[z].encAlg[select];
+ ENC_Handle enc = (ENC_Handle )encAlg;
+
+ if (enc->fxns->info)
+ {
+ errno = enc->fxns->info(enc, NULL,
+ &pAstCfg->xEnc[z].encodeControl,
+ &pAstCfg->xEnc[z].encodeStatus);
+ if (errno)
+ {
+ TRACE_TERSE1("PAF_ASOT_outputInfo1: info returns errno 0x%x ", errno);
+ return errno;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+// Purpose: Init-Sync Dec Decode1 state function.
+// Performes Dec Decode1 Init-Sync.
+static Int PAF_ASOT_initSyncDecDecode1(
+ const PAF_ASOT_Params *pP,
+ const PAF_ASOT_Patchs *pQ,
+ PAF_ASOT_Config *pAsotCfg
+)
+{
+ PAF_AST_Config *pAstCfg; // ASIT/ASOT/ASDT shared configuration
+ Int zMD; // Dec Master index
+ PAF_AST_OutInitSyncCtl *pOutIsCtl; // Output Init-Sync control
+ Int8 decFlag; // dec stage flag
+ Int errno; // error number
+
+
+ pAstCfg = pAsotCfg->pAstCfg;
+ zMD = pAstCfg->masterDec;
+ pOutIsCtl = &pAsotCfg->pAspmCfg->outIsCtl;
+
+ // Check for Dec Reset,
+ // Store dec reset AF
+ errno = outIsReadDecStageFlag(pOutIsCtl, zMD,
+ ASP_OUTIS_DEC_STAGE_DECODE1_IDX, &decFlag);
+ if (errno < 0)
+ {
+ return errno;
+ }
+
+ if (decFlag == 0)
+ {
+ return ASOP_INITSYNC_NOTREADY;
+ }
+ else
+ {
+ return ASOP_SOK;
+ }
+}
+
// Purpose: Init-Sync Re-Sync state function.
// Peformed Init-Sync using stored Dec Reset/Info1 AFs.
static Int PAF_ASOT_initSyncResync(
}
//
- // Dec Info1 re-sync using sotred Dec Info1 AF
+ // Dec Info1 re-sync using stored Dec Info1 AF
//
// Update Stream Audio Frame.
// decodeInfo1():
// - ASP chain reset,
- // - Enc Info,
- // - setCheckRateX,
- // - startOutput
- // frame and block parameters set to 0
- errno = pP->fxns->decodeInfo1(pP, pQ, pAsotCfg, 0, 0);
+ // - Enc Info
+ errno = PAF_ASOT_outputInfo1(pP, pQ, pAsotCfg);
if (errno)
{
return errno;
zMD = pAsotCfg->pAstCfg->masterDec; // get master Dec index
// Check circular buffer drain state
+ //GPIOSetOutput(GPIO_PORT_0, GPIO_PIN_107); // debug
errno = cbCheckDrainState(pCbCtl, zMD, &drainedFlag);
+ //GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_107); // debug
if (errno < 0)
{
return errno;
}
- if (drainedFlag == 0)
+ if (drainedFlag == 1)
{
return ASOP_DP_CB_DRAINED;
}