|
@@ -3778,20 +3778,20 @@ cmDspInst_t* _cmDspEchoCancelAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, uns
|
3778
|
3778
|
*/
|
3779
|
3779
|
|
3780
|
3780
|
cmDspEchoCancel_t* p = cmDspInstAllocV(cmDspEchoCancel_t,ctx,classPtr,instSymId,id,storeSymId,va_cnt,vl,
|
3781
|
|
- 1, "mu", kMuEcId, 0,0, kInDsvFl | kDoubleDsvFl, "NLSM mu coefficient.",
|
3782
|
|
- 1, "irN", kImpRespN_EcId, 0,0, kInDsvFl | kUIntDsvFl, "Filter impulse response length in samples.",
|
3783
|
|
- 1, "delayN", kDelayN_EcId, 0,0, kInDsvFl | kUIntDsvFl, "Fixed feedback delay in samples.",
|
3784
|
|
- 1, "uf_in", kUnfiltInEcId, 0,1, kInDsvFl | kAudioBufDsvFl,"Unfiltered audio input",
|
3785
|
|
- 1, "f_in", kFiltInEcId, 0,1, kInDsvFl | kAudioBufDsvFl,"Filtered audio input",
|
3786
|
|
- 1, "out", kOutEcId, 0,1, kOutDsvFl | kAudioBufDsvFl,"Audio output",
|
|
3781
|
+ 1, "mu", kMuEcId, 0,0, kInDsvFl | kDoubleDsvFl, "NLSM mu coefficient.",
|
|
3782
|
+ 1, "irN", kImpRespN_EcId, 0,0, kInDsvFl | kUIntDsvFl, "Filter impulse response length in samples.",
|
|
3783
|
+ 1, "delayN", kDelayN_EcId, 0,0, kInDsvFl | kUIntDsvFl, "Fixed feedback delay in samples.",
|
|
3784
|
+ 1, "uf_in", kUnfiltInEcId, 0,1, kInDsvFl | kAudioBufDsvFl, "Unfiltered audio input",
|
|
3785
|
+ 1, "f_in", kFiltInEcId, 0,1, kInDsvFl | kAudioBufDsvFl, "Filtered audio input",
|
|
3786
|
+ 1, "out", kOutEcId, 0,1, kOutDsvFl | kAudioBufDsvFl, "Audio output",
|
3787
|
3787
|
0 );
|
3788
|
3788
|
|
3789
|
3789
|
|
3790
|
|
- p->r = cmNlmsEcAlloc(ctx->cmProcCtx, NULL, 0,0,0 );
|
|
3790
|
+ p->r = cmNlmsEcAlloc(ctx->cmProcCtx, NULL, 0, 0,0,0 );
|
3791
|
3791
|
|
3792
|
3792
|
cmDspSetDefaultDouble( ctx, &p->inst, kMuEcId, 0, 0.1);
|
3793
|
3793
|
cmDspSetDefaultUInt( ctx, &p->inst, kImpRespN_EcId, 0, 2048);
|
3794
|
|
- cmDspSetDefaultUInt( ctx, &p->inst, kDelayN_EcId, 0, 3963);
|
|
3794
|
+ cmDspSetDefaultUInt( ctx, &p->inst, kDelayN_EcId, 0, 1906);
|
3795
|
3795
|
|
3796
|
3796
|
return &p->inst;
|
3797
|
3797
|
}
|
|
@@ -3804,7 +3804,7 @@ cmDspRC_t _cmDspEchoCancelSetup( cmDspCtx_t* ctx, cmDspInst_t* inst )
|
3804
|
3804
|
unsigned hN = cmDspUInt(inst,kImpRespN_EcId);
|
3805
|
3805
|
unsigned delayN = cmDspUInt(inst,kDelayN_EcId);
|
3806
|
3806
|
|
3807
|
|
- if( cmNlmsEcInit(p->r,mu,hN,delayN) != cmOkRC )
|
|
3807
|
+ if( cmNlmsEcInit(p->r,cmDspSampleRate(ctx),mu,hN,delayN) != cmOkRC )
|
3808
|
3808
|
rc = cmErrMsg(&inst->classPtr->err, kSubSysFailDspRC, "Unable to initialize the internal echo canceller.");
|
3809
|
3809
|
|
3810
|
3810
|
return rc;
|
|
@@ -3833,8 +3833,9 @@ cmDspRC_t _cmDspEchoCancelReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspE
|
3833
|
3833
|
|
3834
|
3834
|
cmDspRC_t _cmDspEchoCancelExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
|
3835
|
3835
|
{
|
3836
|
|
- cmDspRC_t rc = kOkDspRC;
|
3837
|
|
- cmDspEchoCancel_t* p = (cmDspEchoCancel_t*)inst;
|
|
3836
|
+ cmDspRC_t rc = kOkDspRC;
|
|
3837
|
+ cmDspEchoCancel_t* p = (cmDspEchoCancel_t*)inst;
|
|
3838
|
+ bool bypassFl = false;
|
3838
|
3839
|
|
3839
|
3840
|
const cmSample_t* fV = cmDspAudioBuf(ctx,inst,kFiltInEcId,0);
|
3840
|
3841
|
unsigned fN = cmDspAudioBufSmpCount(ctx,inst,kFiltInEcId,0);
|
|
@@ -3845,10 +3846,19 @@ cmDspRC_t _cmDspEchoCancelExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEv
|
3845
|
3846
|
cmSample_t* yV = cmDspAudioBuf(ctx,inst,kOutEcId,0);
|
3846
|
3847
|
unsigned yN = cmDspAudioBufSmpCount(ctx,inst,kOutEcId,0);
|
3847
|
3848
|
|
3848
|
|
- if( fV !=NULL && uV != NULL && yV != NULL )
|
|
3849
|
+ assert( fN==uN && fN==yN );
|
|
3850
|
+
|
|
3851
|
+ if( bypassFl )
|
3849
|
3852
|
{
|
3850
|
|
- assert( uN == yN && fN == yN );
|
3851
|
|
- cmNlmsEcExec(p->r,uV,fV,yV,yN);
|
|
3853
|
+ cmVOS_Copy(yV,yN,fV);
|
|
3854
|
+ }
|
|
3855
|
+ else
|
|
3856
|
+ {
|
|
3857
|
+ if( fV !=NULL && uV != NULL && yV != NULL )
|
|
3858
|
+ {
|
|
3859
|
+ assert( uN == yN && fN == yN );
|
|
3860
|
+ cmNlmsEcExec(p->r,uV,fV,yV,yN);
|
|
3861
|
+ }
|
3852
|
3862
|
}
|
3853
|
3863
|
|
3854
|
3864
|
return rc;
|
|
@@ -3856,10 +3866,30 @@ cmDspRC_t _cmDspEchoCancelExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEv
|
3856
|
3866
|
|
3857
|
3867
|
cmDspRC_t _cmDspEchoCancelRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
|
3858
|
3868
|
{
|
3859
|
|
-//cmDspEchoCancel_t* p = (cmDspEchoCancel_t*)inst;
|
|
3869
|
+ cmDspEchoCancel_t* p = (cmDspEchoCancel_t*)inst;
|
3860
|
3870
|
|
3861
|
3871
|
cmDspSetEvent(ctx,inst,evt);
|
3862
|
3872
|
|
|
3873
|
+ if( p->r != NULL )
|
|
3874
|
+ {
|
|
3875
|
+ switch(evt->dstVarId)
|
|
3876
|
+ {
|
|
3877
|
+ case kMuEcId:
|
|
3878
|
+ cmNlmsEcSetMu( p->r, cmDspReal(inst,kMuEcId));
|
|
3879
|
+ break;
|
|
3880
|
+
|
|
3881
|
+ case kImpRespN_EcId:
|
|
3882
|
+ cmNlmsEcSetIrN( p->r, cmDspUInt(inst,kImpRespN_EcId));
|
|
3883
|
+ break;
|
|
3884
|
+
|
|
3885
|
+ case kDelayN_EcId:
|
|
3886
|
+ cmNlmsEcSetDelayN( p->r, cmDspUInt(inst,kDelayN_EcId));
|
|
3887
|
+ break;
|
|
3888
|
+ }
|
|
3889
|
+ }
|
|
3890
|
+
|
|
3891
|
+ printf("mu:%f dN:%i hN:%i\n",p->r->mu,p->r->delayN,p->r->hN);
|
|
3892
|
+
|
3863
|
3893
|
return kOkDspRC;
|
3864
|
3894
|
}
|
3865
|
3895
|
|