Skip to content

Commit b8e4839

Browse files
authored
Merge pull request #33 from leomccormack/soloFeature
Solo feature
2 parents 9e32b74 + 0aae6b6 commit b8e4839

File tree

6 files changed

+103
-10
lines changed

6 files changed

+103
-10
lines changed

examples/include/ambi_enc.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,22 @@ void ambi_enc_setNormType(void* const hAmbi, int newType);
146146
*/
147147
void ambi_enc_setEnablePostScaling(void* const hAmbi, int newStatus);
148148

149+
150+
/**
151+
* Sets gain factor for an input source.
152+
*/
153+
void ambi_enc_setSourceGain(void* const hAmbi, int srcIdx, float newGain);
154+
155+
/**
156+
* Set a source to solo.
157+
*/
158+
void ambi_enc_setSourceSolo(void* const hAmbi, int srcIdx);
159+
160+
/**
161+
* Unsolo / unmute all sources.
162+
*/
163+
void ambi_enc_setUnSolo(void* const hAmbi);
164+
149165

150166
/* ========================================================================== */
151167
/* Get Functions */

examples/include/binauraliser.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,20 @@ void binauraliser_setRPYflag(void* const hBin, int newState);
216216
/** NOT IMPLEMENTED YET */
217217
void binauraliser_setInterpMode(void* const hBin, int newMode);
218218

219+
/**
220+
* Sets gain factor for an input source.
221+
*/
222+
void binauraliser_setSourceGain(void* const hBin, int srcIdx, float newGain);
223+
224+
/**
225+
* Set a source to solo.
226+
*/
227+
void binauraliser_setSourceSolo(void* const hBin, int srcIdx);
228+
229+
/**
230+
* Unsolo / unmute all sources.
231+
*/
232+
void binauraliser_setUnSolo(void* const hBin);
219233

220234

221235
/* ========================================================================== */

examples/src/ambi_enc/ambi_enc.c

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ void ambi_enc_create
4040
/* default user parameters */
4141
loadSourceConfigPreset(SOURCE_CONFIG_PRESET_DEFAULT, pData->src_dirs_deg, &(pData->new_nSources));
4242
pData->nSources = pData->new_nSources;
43-
for(i=0; i<MAX_NUM_INPUTS; i++)
43+
for(i=0; i<MAX_NUM_INPUTS; i++){
4444
pData->recalc_SH_FLAG[i] = 1;
45+
pData->src_gains[i] = 1.f;
46+
}
4547
pData->chOrdering = CH_ACN;
4648
pData->norm = NORM_SN3D;
4749
pData->order = SH_ORDER_FIRST;
@@ -117,18 +119,21 @@ void ambi_enc_process
117119

118120
/* recalulate SHs (only if encoding direction has changed) */
119121
mixWithPreviousFLAG = 0;
120-
for(i=0; i<nSources; i++){
121-
if(pData->recalc_SH_FLAG[i]){
122-
getRSH_recur(order, pData->src_dirs_deg[i], 1, (float*)Y_src);
122+
for(ch=0; ch<nSources; ch++){
123+
if(pData->recalc_SH_FLAG[ch]){
124+
getRSH_recur(order, pData->src_dirs_deg[ch], 1, (float*)Y_src);
123125
for(j=0; j<nSH; j++)
124-
pData->Y[j][i] = Y_src[j];
126+
pData->Y[j][ch] = Y_src[j];
125127
for(; j<MAX_NUM_SH_SIGNALS; j++)
126-
pData->Y[j][i] = 0.0f;
127-
pData->recalc_SH_FLAG[i] = 0;
128+
pData->Y[j][ch] = 0.0f;
129+
pData->recalc_SH_FLAG[ch] = 0;
128130

129131
/* If encoding gains have changed, then we should also mix with and interpolate the previous gains */
130132
mixWithPreviousFLAG = 1;
131133
}
134+
/* Apply source gains */
135+
if(fabsf(pData->src_gains[ch] - 1.f) > 1e-6f)
136+
utility_svsmul(pData->inputFrameTD[ch], &(pData->src_gains[ch]), AMBI_ENC_FRAME_SIZE, NULL);
132137
}
133138

134139
/* spatially encode the input signals into spherical harmonic signals */
@@ -281,6 +286,30 @@ void ambi_enc_setEnablePostScaling(void* const hAmbi, int newStatus)
281286
pData->enablePostScaling = newStatus;
282287
}
283288

289+
void ambi_enc_setSourceGain(void* const hAmbi, int srcIdx, float newGain)
290+
{
291+
ambi_enc_data *pData = (ambi_enc_data*)(hAmbi);
292+
pData->src_gains[srcIdx] = newGain;
293+
}
294+
295+
void ambi_enc_setSourceSolo(void* const hAmbi, int srcIdx)
296+
{
297+
ambi_enc_data *pData = (ambi_enc_data*)(hAmbi);
298+
int i;
299+
for(i=0; i<pData->nSources; i++){
300+
if(i==srcIdx)
301+
pData->src_gains[i] = 1.f;
302+
else
303+
pData->src_gains[i] = 0.f;
304+
}
305+
}
306+
307+
void ambi_enc_setUnSolo(void* const hAmbi)
308+
{
309+
ambi_enc_data *pData = (ambi_enc_data*)(hAmbi);
310+
for(int i=0; i<pData->nSources; i++)
311+
pData->src_gains[i] = 1.f;
312+
}
284313

285314
/* Get Functions */
286315

examples/src/ambi_enc/ambi_enc_internal.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ typedef struct _ambi_enc
8080
NORM_TYPES norm; /**< Ambisonic normalisation convention (see #NORM_TYPES) */
8181
SH_ORDERS order; /**< Current SH encoding order */
8282
int enablePostScaling; /**< Flag 1: output signals scaled by 1/sqrt(nSources), 0: disabled */
83-
83+
float src_gains[MAX_NUM_INPUTS]; /**< Gains applied per source */
84+
8485
} ambi_enc_data;
8586

8687

examples/src/binauraliser/binauraliser.c

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,10 @@ void binauraliser_create
8888
pData->codecStatus = CODEC_STATUS_NOT_INITIALISED;
8989
pData->procStatus = PROC_STATUS_NOT_ONGOING;
9090
pData->reInitHRTFsAndGainTables = 1;
91-
for(ch=0; ch<MAX_NUM_INPUTS; ch++)
91+
for(ch=0; ch<MAX_NUM_INPUTS; ch++) {
9292
pData->recalc_hrtf_interpFLAG[ch] = 1;
93+
pData->src_gains[ch] = 1.f;
94+
}
9395
pData->recalc_M_rotFLAG = 1;
9496
}
9597

@@ -215,6 +217,12 @@ void binauraliser_process
215217
for(; i<nSources; i++)
216218
memset(pData->inputFrameTD[i], 0, BINAURALISER_FRAME_SIZE * sizeof(float));
217219

220+
/* Apply source gains */
221+
for (ch = 0; ch < nSources; ch++) {
222+
if(fabsf(pData->src_gains[ch] - 1.f) > 1e-6f)
223+
utility_svsmul(pData->inputFrameTD[ch], &(pData->src_gains[ch]), BINAURALISER_FRAME_SIZE, NULL);
224+
}
225+
218226
/* Apply time-frequency transform (TFT) */
219227
afSTFT_forward_knownDimensions(pData->hSTFT, pData->inputFrameTD, BINAURALISER_FRAME_SIZE, MAX_NUM_INPUTS, TIME_SLOTS, pData->inputframeTF);
220228

@@ -436,6 +444,30 @@ void binauraliser_setInterpMode(void* const hBin, int newMode)
436444
pData->recalc_hrtf_interpFLAG[ch] = 1;
437445
}
438446

447+
void binauraliser_setSourceGain(void* const hAmbi, int srcIdx, float newGain)
448+
{
449+
binauraliser_data *pData = (binauraliser_data*)(hAmbi);
450+
pData->src_gains[srcIdx] = newGain;
451+
}
452+
453+
void binauraliser_setSourceSolo(void* const hAmbi, int srcIdx)
454+
{
455+
binauraliser_data *pData = (binauraliser_data*)(hAmbi);
456+
int i;
457+
for(i=0; i<pData->nSources; i++){
458+
if(i==srcIdx)
459+
pData->src_gains[i] = 1.f;
460+
else
461+
pData->src_gains[i] = 0.f;
462+
}
463+
}
464+
465+
void binauraliser_setUnSolo(void* const hAmbi)
466+
{
467+
binauraliser_data *pData = (binauraliser_data*)(hAmbi);
468+
for(int i=0; i<pData->nSources; i++)
469+
pData->src_gains[i] = 1.f;
470+
}
439471

440472

441473
/* Get Functions */

examples/src/binauraliser/binauraliser_internal.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ typedef struct _binauraliser
133133
int bFlipPitch; /**< flag to flip the sign of the pitch rotation angle */
134134
int bFlipRoll; /**< flag to flip the sign of the roll rotation angle */
135135
int useRollPitchYawFlag; /**< rotation order flag, 1: r-p-y, 0: y-p-r */
136-
136+
float src_gains[MAX_NUM_INPUTS]; /**< Gains applied per source */
137+
137138
} binauraliser_data;
138139

139140

0 commit comments

Comments
 (0)