Skip to content

Commit 58f1a3c

Browse files
committed
added hotfix to avoid crash on macos-ARM for the spreader example
1 parent 8f3a426 commit 58f1a3c

File tree

2 files changed

+56
-36
lines changed

2 files changed

+56
-36
lines changed

examples/src/spreader/spreader.c

Lines changed: 51 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,15 @@ void spreader_create
8888
pData->interpolatorFadeIn[t] = ((float)t+1.0f)/(float)TIME_SLOTS;
8989
pData->interpolatorFadeOut[t] = 1.0f - ((float)t+1.0f)/(float)TIME_SLOTS;
9090
}
91+
92+
// Hotfix:
93+
pData->_tmpFrame = malloc1d(MAX_NUM_CHANNELS*TIME_SLOTS *sizeof(float_complex));
94+
pData->_H_tmp = malloc1d(MAX_NUM_CHANNELS *sizeof(float_complex));
95+
pData->_Cy = malloc1d(MAX_NUM_CHANNELS*MAX_NUM_CHANNELS *sizeof(float_complex));
96+
pData->_E_dir = malloc1d(MAX_NUM_CHANNELS*MAX_NUM_CHANNELS *sizeof(float_complex));
97+
pData->_V = malloc1d(MAX_NUM_OUTPUTS*MAX_NUM_OUTPUTS *sizeof(float_complex));
98+
pData->_D = malloc1d(MAX_NUM_OUTPUTS*MAX_NUM_OUTPUTS *sizeof(float_complex));
99+
pData->_Cproto = malloc1d(MAX_NUM_OUTPUTS*MAX_NUM_OUTPUTS *sizeof(float_complex));
91100

92101
/* Optimal mixing */
93102
pData->hCdf = NULL;
@@ -157,6 +166,15 @@ void spreader_destroy
157166
free(pData->interp_Mr);
158167
free(pData->interp_Mr_cmplx);
159168

169+
// Hotfix:
170+
free(pData->_tmpFrame);
171+
free(pData->_H_tmp);
172+
free(pData->_Cy);
173+
free(pData->_E_dir);
174+
free(pData->_V);
175+
free(pData->_D);
176+
free(pData->_Cproto);
177+
160178
/* Optimal mixing */
161179
cdf4sap_cmplx_destroy(&(pData->hCdf));
162180
cdf4sap_destroy(&(pData->hCdf_res));
@@ -354,9 +372,6 @@ void spreader_process
354372
float trace, Ey, Eproto, Gcomp;
355373
float src_dirs_deg[SPREADER_MAX_NUM_SOURCES][2], src_dir_xyz[3], CprotoDiag[MAX_NUM_OUTPUTS*MAX_NUM_OUTPUTS], src_spread[MAX_NUM_OUTPUTS];
356374
float_complex scaleC, tmp;
357-
float_complex tmpFrame[MAX_NUM_CHANNELS][TIME_SLOTS], H_tmp[MAX_NUM_CHANNELS], Cy[MAX_NUM_CHANNELS*MAX_NUM_CHANNELS];
358-
float_complex E_dir[MAX_NUM_CHANNELS*MAX_NUM_CHANNELS], V[MAX_NUM_OUTPUTS*MAX_NUM_OUTPUTS], D[MAX_NUM_OUTPUTS*MAX_NUM_OUTPUTS];
359-
float_complex Cproto[MAX_NUM_OUTPUTS*MAX_NUM_OUTPUTS];
360375
#if 0
361376
float_complex Cx[MAX_NUM_OUTPUTS*MAX_NUM_OUTPUTS];
362377
float CxDiag[MAX_NUM_OUTPUTS*MAX_NUM_OUTPUTS];
@@ -407,11 +422,11 @@ void spreader_process
407422
for(band=0; band<HYBRID_BANDS; band++){
408423
if(pData->freqVector[band]<MAX_SPREAD_FREQ){
409424
/* Loop over all angles, and sum the H_grid's within the spreading area */
410-
memset(H_tmp, 0, Q*sizeof(float_complex));
425+
memset(pData->_H_tmp, 0, Q*sizeof(float_complex));
411426
for(ng=0,nSpread=0; ng<pData->nGrid; ng++){
412427
if(pData->angles[ng] <= (src_spread[src]/2.0f)){
413428
for(q=0; q<Q; q++)
414-
H_tmp[q] = ccaddf(H_tmp[q], pData->H_grid[band*Q*pData->nGrid + q*pData->nGrid + ng]);
429+
pData->_H_tmp[q] = ccaddf(pData->_H_tmp[q], pData->H_grid[band*Q*pData->nGrid + q*pData->nGrid + ng]);
415430
nSpread++;
416431
pData->dirActive[src][ng] = 1;
417432
}
@@ -425,13 +440,13 @@ void spreader_process
425440
/* If no directions found in the spread area, then just include the nearest one */
426441
if(nSpread==0){
427442
for(q=0; q<Q; q++)
428-
H_tmp[q] = pData->H_grid[band*Q*pData->nGrid + q*pData->nGrid + centre_ind];
443+
pData->_H_tmp[q] = pData->H_grid[band*Q*pData->nGrid + q*pData->nGrid + centre_ind];
429444
nSpread=1;
430445
}
431446

432447
/* Apply */
433448
cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Q, TIME_SLOTS, 1, &calpha,
434-
H_tmp, 1,
449+
pData->_H_tmp, 1,
435450
pData->inputframeTF[band][src], TIME_SLOTS, &cbeta,
436451
FLATTEN2D(pData->protoframeTF[band]), TIME_SLOTS);
437452

@@ -476,22 +491,22 @@ void spreader_process
476491
cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasConjTrans, Q, Q, TIME_SLOTS, &calpha,
477492
FLATTEN2D(pData->protoframeTF[band]), TIME_SLOTS,
478493
FLATTEN2D(pData->protoframeTF[band]), TIME_SLOTS, &cbeta,
479-
Cproto, Q);
494+
pData->_Cproto, Q);
480495
cblas_sscal(/*re+im*/2*Q*Q, pData->covAvgCoeff, (float*)pData->Cproto[src][band], 1);
481-
cblas_saxpy(/*re+im*/2*Q*Q, 1.0f-pData->covAvgCoeff, (float*)Cproto, 1, (float*)pData->Cproto[src][band], 1);
496+
cblas_saxpy(/*re+im*/2*Q*Q, 1.0f-pData->covAvgCoeff, (float*)pData->_Cproto, 1, (float*)pData->Cproto[src][band], 1);
482497
}
483498

484499
/* Define target covariance matrices */
485500
for(band=0; band<HYBRID_BANDS; band++){
486501
/* Sum the H_array outer product matrices for the whole spreading area */
487502
if(pData->freqVector[band]<MAX_SPREAD_FREQ){
488-
memset(Cy, 0, Q*Q*sizeof(float_complex));
489-
memset(H_tmp, 0, Q*sizeof(float_complex));
503+
memset(pData->_Cy, 0, Q*Q*sizeof(float_complex));
504+
memset(pData->_H_tmp, 0, Q*sizeof(float_complex));
490505
for(ng=0, nSpread=0; ng<pData->nGrid; ng++){
491506
if(pData->angles[ng] <= (src_spread[src]/2.0f)){
492-
cblas_caxpy(Q*Q, &calpha, pData->HHH[band][ng], 1, Cy, 1);
507+
cblas_caxpy(Q*Q, &calpha, pData->HHH[band][ng], 1, pData->_Cy, 1);
493508
for(q=0; q<Q; q++)
494-
H_tmp[q] = ccaddf(H_tmp[q], pData->H_grid[band*Q*pData->nGrid + q*pData->nGrid + ng]);
509+
pData->_H_tmp[q] = ccaddf(pData->_H_tmp[q], pData->H_grid[band*Q*pData->nGrid + q*pData->nGrid + ng]);
495510
nSpread++;
496511
pData->dirActive[src][ng] = 1;
497512
}
@@ -504,9 +519,9 @@ void spreader_process
504519

505520
/* If no directions found in the spread area, then just include the nearest one */
506521
if(nSpread==0) {
507-
cblas_caxpy(Q*Q, &calpha, pData->HHH[band][centre_ind], 1, Cy, 1);
522+
cblas_caxpy(Q*Q, &calpha, pData->HHH[band][centre_ind], 1, pData->_Cy, 1);
508523
for(q=0; q<Q; q++)
509-
H_tmp[q] = pData->H_grid[band*Q*pData->nGrid + q*pData->nGrid + centre_ind];
524+
pData->_H_tmp[q] = pData->H_grid[band*Q*pData->nGrid + q*pData->nGrid + centre_ind];
510525
nSpread++;
511526
}
512527
#if 1
@@ -515,31 +530,31 @@ void spreader_process
515530
/* Normalise Cy */
516531
trace = 0.0f;
517532
for(q=0; q<Q; q++)
518-
trace += crealf(Cy[q*Q+q]);
519-
cblas_sscal(/*re+im*/2*Q*Q, 1.0f/(trace+2.23e-9f), (float*)Cy, 1);
533+
trace += crealf(pData->_Cy[q*Q+q]);
534+
cblas_sscal(/*re+im*/2*Q*Q, 1.0f/(trace+2.23e-9f), (float*)pData->_Cy, 1);
520535

521536
/* Compute signals for the centre of the spread */
522537
for(q=0; q<Q; q++)
523-
H_tmp[q] = pData->H_grid[band*Q*pData->nGrid + q*pData->nGrid + centre_ind];
538+
pData->_H_tmp[q] = pData->H_grid[band*Q*pData->nGrid + q*pData->nGrid + centre_ind];
524539
cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Q, TIME_SLOTS, 1, &calpha,
525-
H_tmp, 1,
540+
pData->_H_tmp, 1,
526541
pData->inputframeTF[band][src], TIME_SLOTS, &cbeta,
527-
tmpFrame, TIME_SLOTS);
542+
pData->_tmpFrame, TIME_SLOTS);
528543

529544
/* Introduce their channel energies into the target */
530545
cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasConjTrans, Q, Q, TIME_SLOTS, &calpha,
531-
tmpFrame, TIME_SLOTS,
532-
tmpFrame, TIME_SLOTS, &cbeta,
533-
E_dir, Q);
546+
pData->_tmpFrame, TIME_SLOTS,
547+
pData->_tmpFrame, TIME_SLOTS, &cbeta,
548+
pData->_E_dir, Q);
534549
trace = 0.0f;
535550
for(q=0; q<Q; q++)
536-
trace += crealf(E_dir[q*Q+q]);
537-
cblas_sscal(/*re+im*/2*Q*Q, trace, (float*)Cy, 1);
551+
trace += crealf(pData->_E_dir[q*Q+q]);
552+
cblas_sscal(/*re+im*/2*Q*Q, trace, (float*)pData->_Cy, 1);
538553
}
539554
#endif
540555
/* Average over time */
541556
cblas_sscal(/*re+im*/2*Q*Q, pData->covAvgCoeff, (float*)pData->Cy[src][band], 1);
542-
cblas_saxpy(/*re+im*/2*Q*Q, 1.0f-pData->covAvgCoeff, (float*)Cy, 1, (float*)pData->Cy[src][band], 1);
557+
cblas_saxpy(/*re+im*/2*Q*Q, 1.0f-pData->covAvgCoeff, (float*)pData->_Cy, 1, (float*)pData->Cy[src][band], 1);
543558
}
544559

545560
/* Formulate mixing matrices */
@@ -558,15 +573,15 @@ void spreader_process
558573

559574
/* Compute mixing matrix per band */
560575
for(band=0; band<HYBRID_BANDS; band++){
561-
memcpy(Cy, pData->Cy[src][band], Q*Q*sizeof(float_complex));
562-
cblas_sscal(/*re+im*/2*Q*Q, Gcomp, (float*)Cy, 1);
563-
utility_cseig(NULL, Cy, Q, 1, V, D, NULL);
576+
memcpy(pData->_Cy, pData->Cy[src][band], Q*Q*sizeof(float_complex));
577+
cblas_sscal(/*re+im*/2*Q*Q, Gcomp, (float*)pData->_Cy, 1);
578+
utility_cseig(NULL, pData->_Cy, Q, 1, pData->_V, pData->_D, NULL);
564579
for(i=0; i<Q; i++)
565580
for(j=0; j<Q; j++)
566-
D[i*Q+j] = i==j ? csqrtf(D[i*Q+j]) : cmplxf(0.0f, 0.0f);
581+
pData->_D[i*Q+j] = i==j ? csqrtf(pData->_D[i*Q+j]) : cmplxf(0.0f, 0.0f);
567582
cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Q, Q, Q, &calpha,
568-
V, Q,
569-
D, Q, &cbeta,
583+
pData->_V, Q,
584+
pData->_D, Q, &cbeta,
570585
pData->new_M[band], Q);
571586
}
572587
break;
@@ -576,17 +591,17 @@ void spreader_process
576591
if(pData->freqVector[band]<MAX_SPREAD_FREQ){
577592
#if 1
578593
/* Diagonalise and diagonally load the Cproto matrices */
579-
cblas_ccopy(Q*Q, pData->Cproto[src][band], 1, Cproto, 1);
594+
cblas_ccopy(Q*Q, pData->Cproto[src][band], 1, pData->_Cproto, 1);
580595
for(i=0; i<Q; i++){
581596
for(j=0; j<Q; j++){
582597
if(i==j)
583-
Cproto[i*Q+i] = craddf(Cproto[i*Q+i], 0.00001f);
584-
CprotoDiag[i*Q+j] = i==j ? crealf(Cproto[i*Q+i]) : 0.0f;
598+
pData->_Cproto[i*Q+i] = craddf(pData->_Cproto[i*Q+i], 0.00001f);
599+
CprotoDiag[i*Q+j] = i==j ? crealf(pData->_Cproto[i*Q+i]) : 0.0f;
585600
}
586601
}
587602

588603
/* Compute mixing matrices */
589-
formulate_M_and_Cr_cmplx(pData->hCdf, Cproto, pData->Cy[src][band], pData->Qmix_cmplx, 0, 0.2f, pData->new_M[band], pData->Cr_cmplx);
604+
formulate_M_and_Cr_cmplx(pData->hCdf, pData->_Cproto, pData->Cy[src][band], pData->Qmix_cmplx, 0, 0.2f, pData->new_M[band], pData->Cr_cmplx);
590605
for(i=0; i<Q*Q; i++)
591606
pData->Cr[i] = crealf(pData->Cr_cmplx[i]);
592607
formulate_M_and_Cr(pData->hCdf_res, CprotoDiag, pData->Cr, pData->Qmix, 0, 0.2f, pData->new_Mr[band], NULL);

examples/src/spreader/spreader_internal.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@ typedef struct _spreader
118118
float_complex* Qmix_cmplx; /**< Identity; FLAT: Q x Q */
119119
float* Cr; /**< Residual covariance; FLAT: Q x Q */
120120
float_complex* Cr_cmplx; /**< Residual covariance; FLAT: Q x Q */
121+
122+
// Hotfix:
123+
float_complex* _tmpFrame, *_H_tmp, *_Cy;
124+
float_complex* _E_dir, *_V, *_D;
125+
float_complex* _Cproto;
121126

122127
/* flags/status */
123128
CODEC_STATUS codecStatus; /**< see #CODEC_STATUS */

0 commit comments

Comments
 (0)