cmAudioPortAlsa.c : Added, but disabled, use of IMPULSE_FN.

This commit is contained in:
Kevin Larke 2014-06-14 13:56:05 -07:00
parent 4df91dd08f
commit ae14a04442

View File

@ -18,6 +18,8 @@
#define DESC_CHAR_CNT (255) #define DESC_CHAR_CNT (255)
#define INIT_DEV_CNT (5) #define INIT_DEV_CNT (5)
//#define IMPULSE_FN "/home/kevin/temp/recd0.txt"
enum { kDfltPeriodsPerBuf = 2, kPollfdsArrayCnt=2 }; enum { kDfltPeriodsPerBuf = 2, kPollfdsArrayCnt=2 };
enum { kInFl=0x01, kOutFl=0x02 }; enum { kInFl=0x01, kOutFl=0x02 };
@ -51,6 +53,14 @@ typedef struct devRecd_str
cmApSample_t* iBuf; // iBuf[ iFpc * iChCnt ] cmApSample_t* iBuf; // iBuf[ iFpc * iChCnt ]
cmApSample_t* oBuf; // oBuf[ oFpc * oChCnt ] cmApSample_t* oBuf; // oBuf[ oFpc * oChCnt ]
unsigned oBufCnt; // count of buffers written
#ifdef IMPULSE_FN
int* recdBuf;
unsigned recdN;
unsigned recdIdx;
#endif
unsigned iFpC; // buffer frames per cycle (in ALSA this is call period_size) unsigned iFpC; // buffer frames per cycle (in ALSA this is call period_size)
unsigned oFpC; unsigned oFpC;
@ -447,6 +457,12 @@ void _cmApDevAppend( cmApRoot_t* p, cmApDevRecd_t* drp )
drp->devIdx = p->devCnt; // set the device index drp->devIdx = p->devCnt; // set the device index
drp->rootPtr = p; // set the pointer back to the root drp->rootPtr = p; // set the pointer back to the root
#ifdef IMPULSE_FN
drp->recdN = 44100*2*2;
drp->recdBuf = cmMemAllocZ(int,drp->recdN);
drp->recdIdx = 0;
#endif
memcpy(p->devArray + p->devCnt, drp, sizeof(cmApDevRecd_t)); memcpy(p->devArray + p->devCnt, drp, sizeof(cmApDevRecd_t));
++p->devCnt; ++p->devCnt;
@ -597,7 +613,7 @@ void _cmApStateRecover( snd_pcm_t* pcmH, cmApDevRecd_t* drp, bool inputFl )
// Returns count of frames written on success or < 0 on error; // Returns count of frames written on success or < 0 on error;
// set smpPtr to NULL to write a buffer of silence // set smpPtr to NULL to write a buffer of silence
int _cmApWriteBuf( const cmApDevRecd_t* drp, snd_pcm_t* pcmH, const cmApSample_t* sp, unsigned chCnt, unsigned frmCnt, unsigned bits, unsigned sigBits ) int _cmApWriteBuf( cmApDevRecd_t* drp, snd_pcm_t* pcmH, const cmApSample_t* sp, unsigned chCnt, unsigned frmCnt, unsigned bits, unsigned sigBits )
{ {
int err = 0; int err = 0;
unsigned bytesPerSmp = (bits==24 ? 32 : bits)/8; unsigned bytesPerSmp = (bits==24 ? 32 : bits)/8;
@ -641,15 +657,28 @@ int _cmApWriteBuf( const cmApDevRecd_t* drp, snd_pcm_t* pcmH, const cmApSample_t
case 32: case 32:
{ {
int* dp = (int*)obuf; int* dp = (int*)obuf;
while( sp < ep ) while( sp < ep )
*dp++ = (int)(*sp++ * 0x7fffffff); *dp++ = (int)(*sp++ * 0x7fffffff);
#ifdef IMPLUSE_FN
int* tmp = (int*)obuf;
unsigned ii = 0;
if( drp->oBufCnt < 3 )
for(; ii<32; ++ii)
tmp[ii] = 0x7fffffff;
#endif
} }
break; break;
} }
} }
// send the bytes to the device // send the bytes to the device
err = snd_pcm_writei( pcmH, obuf, frmCnt ); err = snd_pcm_writei( pcmH, obuf, frmCnt );
++drp->oBufCnt;
if( err < 0 ) if( err < 0 )
{ {
@ -670,7 +699,7 @@ int _cmApWriteBuf( const cmApDevRecd_t* drp, snd_pcm_t* pcmH, const cmApSample_t
// Returns frames read on success or < 0 on error. // Returns frames read on success or < 0 on error.
// Set smpPtr to NULL to read the incoming buffer and discard it // Set smpPtr to NULL to read the incoming buffer and discard it
int _cmApReadBuf( const cmApDevRecd_t* drp, snd_pcm_t* pcmH, cmApSample_t* smpPtr, unsigned chCnt, unsigned frmCnt, unsigned bits, unsigned sigBits ) int _cmApReadBuf( cmApDevRecd_t* drp, snd_pcm_t* pcmH, cmApSample_t* smpPtr, unsigned chCnt, unsigned frmCnt, unsigned bits, unsigned sigBits )
{ {
int err = 0; int err = 0;
unsigned bytesPerSmp = (bits==24 ? 32 : bits)/8; unsigned bytesPerSmp = (bits==24 ? 32 : bits)/8;
@ -742,6 +771,14 @@ int _cmApReadBuf( const cmApDevRecd_t* drp, snd_pcm_t* pcmH, cmApSample_t* smpPt
int mv = sigBits==24 ? 0x7fffff00 : 0x7fffffff; int mv = sigBits==24 ? 0x7fffff00 : 0x7fffffff;
while(dp < ep) while(dp < ep)
*dp++ = ((cmApSample_t)*sp++) / mv; *dp++ = ((cmApSample_t)*sp++) / mv;
#ifdef IMPULSE_FN
sp = (int*)buf;
int* esp = sp + smpCnt;
for(; sp<esp && drp->recdIdx < drp->recdN; ++drp->recdIdx)
drp->recdBuf[drp->recdIdx] = *sp++;
#endif
} }
break; break;
default: default:
@ -1435,6 +1472,7 @@ cmApRC_t cmApAlsaInitialize( cmRpt_t* rpt, unsigned baseApDevIdx )
} // card loop } // card loop
if( rc == kOkApRC && p->asyncFl==false ) if( rc == kOkApRC && p->asyncFl==false )
{ {
p->pollfdsCnt = 0; p->pollfdsCnt = 0;
@ -1469,8 +1507,26 @@ cmApRC_t cmApAlsaFinalize()
{ {
_cmApDevShutdown(p,p->devArray+i,true); _cmApDevShutdown(p,p->devArray+i,true);
_cmApDevShutdown(p,p->devArray+i,false); _cmApDevShutdown(p,p->devArray+i,false);
#ifdef IMPULSE_FN
if( p->devArray[i].recdIdx > 0 )
{
const char* fn = "/home/kevin/temp/recd0.txt";
FILE* fp = fopen(fn,"wt");
if( fp != NULL )
{
unsigned j;
for(j=0; j<p->devArray[i].recdIdx; ++j)
fprintf(fp,"%i\n",p->devArray[i].recdBuf[j]);
fclose(fp);
}
}
cmMemFree(p->devArray[i].recdBuf);
#endif
cmMemPtrFree(&p->devArray[i].iBuf); cmMemPtrFree(&p->devArray[i].iBuf);
cmMemPtrFree(&p->devArray[i].oBuf); cmMemPtrFree(&p->devArray[i].oBuf);
} }
cmMemPtrFree(&p->pollfds); cmMemPtrFree(&p->pollfds);
@ -1483,6 +1539,7 @@ cmApRC_t cmApAlsaFinalize()
recdFree(); recdFree();
//write_rec(2); //write_rec(2);
return rc; return rc;
} }