--- af_hrtf.c.yue 2005-04-09 19:20:39.000000000 +0200 +++ af_hrtf.c 2005-04-09 19:24:18.895766224 +0200 @@ -16,6 +16,10 @@ /* HRTF filter coefficients and adjustable parameters */ #include "af_hrtf.h" +#define HRTF_MIX_51 0 +#define HRTF_MIX_STEREO 1 +#define HRTF_MIX_MATRIX2CH 2 + typedef struct af_hrtf_s { /* Lengths */ int dlbuflen, hrflen, basslen; @@ -48,6 +52,7 @@ float lr_fwr, rr_fwr; /* Cyclic position on the ring buffer */ int cyc_pos; + int print_flag; } af_hrtf_t; /* Convolution on a ring buffer @@ -190,15 +195,16 @@ s->lr_fwr += abs(in[2]) - fabs(s->fwrbuf_lr[fwr_pos]); s->rr_fwr += abs(in[3]) - fabs(s->fwrbuf_rr[fwr_pos]); - if(s->decode_mode == 0) { + switch (s->decode_mode) { + case HRTF_MIX_51: /* 5/5+1 channel sources */ s->lf[k] = in[0]; s->cf[k] = in[4]; s->rf[k] = in[1]; s->fwrbuf_lr[k] = s->lr[k] = in[2]; s->fwrbuf_rr[k] = s->rr[k] = in[3]; - } - else if(s->decode_mode == 2) { + break; + case HRTF_MIX_MATRIX2CH: /* Matrix encoded 2 channel sources */ s->fwrbuf_l[k] = in[0]; s->fwrbuf_r[k] = in[1]; @@ -208,12 +214,13 @@ &(s->adapt_l_gain), &(s->adapt_r_gain), &(s->adapt_lpr_gain), &(s->adapt_lmr_gain), s->lf, s->rf, s->lr, s->rr, s->cf); - } - else { /* s->decode_mode == 1 */ + break; + case HRTF_MIX_STEREO: /* Stereo sources */ s->lf[k] = in[0]; s->rf[k] = in[1]; s->cf[k] = s->lr[k] = s->rr[k] = 0; + break; } /* We need to update the bass compensation delay line, too. */ @@ -240,11 +247,11 @@ } af->data->nch = ((af_data_t*)arg)->nch; if(af->data->nch < 5) { - if(af->data->nch == 2) { - /* 2 channel input */ - if(s->decode_mode != 2) { + if(af->data->nch == 2) { + /* 2 channel input */ + if(s->decode_mode != HRTF_MIX_MATRIX2CH) { /* Default behavior is stereo mixing. */ - s->decode_mode = 1; + s->decode_mode = HRTF_MIX_STEREO; } } af->data->nch = 5; @@ -263,7 +270,7 @@ break; case 's': /* Input needs matrix decoding. */ - s->decode_mode = 2; + s->decode_mode = HRTF_MIX_MATRIX2CH; break; case '0': s->matrix_mode = 0; @@ -277,6 +284,8 @@ return AF_OK; } + s->print_flag = 1; + return AF_UNKNOWN; } @@ -331,7 +340,6 @@ */ static af_data_t* play(struct af_instance_s *af, af_data_t *data) { - static int counter = 0; af_hrtf_t *s = af->setup; short *in = data->audio; // Input audio data short *out = NULL; // Output audio data @@ -342,19 +350,30 @@ if(AF_OK != RESIZE_LOCAL_BUFFER(af, data)) return NULL; - if(counter++ == 0) { - if(s->decode_mode == 2) - af_msg(AF_MSG_INFO, - "[hrtf] Using active matrix to decode 2 channel " - "input\n"); - if(s->decode_mode == 1) + if(s->print_flag) { + s->print_flag = 0; + switch (s->decode_mode) { + case HRTF_MIX_51: af_msg(AF_MSG_INFO, "[hrtf] Using HRTF to mix %s discrete surround into " "L, R channels\n", s->matrix_mode ? "5" : "5+1"); - else + break; + case HRTF_MIX_STEREO: af_msg(AF_MSG_INFO, "[hrtf] Using HRTF to mix stereo into " "L, R channels\n"); + break; + case HRTF_MIX_MATRIX2CH: + af_msg(AF_MSG_INFO, + "[hrtf] Using active matrix to decode 2 channel " + "input\n"); + break; + default: + af_msg(AF_MSG_WARN, + "[hrtf] bogus decode_mode: %d\n", s->decode_mode); + break; + } + if(s->matrix_mode) af_msg(AF_MSG_INFO, "[hrtf] Using active matrix to decode rear center " @@ -393,7 +412,9 @@ s->lf[k] += CFECHOAMPL * s->cf[(k + CFECHODELAY) % s->dlbuflen]; s->rf[k] += CFECHOAMPL * s->cf[(k + CFECHODELAY) % s->dlbuflen]; - if(s->decode_mode != 1) { + switch (s->decode_mode) { + case HRTF_MIX_51: + case HRTF_MIX_MATRIX2CH: /* Mixer filter matrix */ common = conv(dblen, hlen, s->cf, s->cf_ir, k + s->cf_o); if(s->matrix_mode) { @@ -420,8 +441,7 @@ (conv(dblen, hlen, s->rr, s->ar_ir, k + s->ar_o) + conv(dblen, hlen, s->lr, s->or_ir, k + s->or_o)) * M1_76DB + common); - } - else { + } else { left = ( conv(dblen, hlen, s->lf, s->af_ir, k + s->af_o) + conv(dblen, hlen, s->rf, s->of_ir, k + s->of_o) + @@ -435,14 +455,20 @@ conv(dblen, hlen, s->lr, s->or_ir, k + s->or_o) + common); } - } - else { /* s->decode_mode == 1 */ + break; + case HRTF_MIX_STEREO: left = ( conv(dblen, hlen, s->lf, s->af_ir, k + s->af_o) + conv(dblen, hlen, s->rf, s->of_ir, k + s->of_o)); right = ( conv(dblen, hlen, s->rf, s->af_ir, k + s->af_o) + conv(dblen, hlen, s->lf, s->of_ir, k + s->of_o)); + break; + default: + /* make gcc happy */ + left = 0.0; + right = 0.0; + break; } /* Bass compensation for the lower frequency cut of the HRTF. A @@ -464,21 +490,24 @@ left *= AMPLNORM; right *= AMPLNORM; - if(s->decode_mode != 2) { + switch (s->decode_mode) { + case HRTF_MIX_51: + case HRTF_MIX_STEREO: /* "Cheating": linear stereo expansion to amplify the 3D perception. Note: Too much will destroy the acoustic space and may even result in headaches. */ diff = STEXPAND2 * (left - right); out[0] = (int16_t)(left + diff); out[1] = (int16_t)(right - diff); - } - else { + break; + case HRTF_MIX_MATRIX2CH: /* Do attempt any stereo expansion with matrix encoded sources. The L = Lt, R = Rt channels are phase correlated, any stereo expansion will sound very unnatural. */ out[0] = (int16_t)left; out[1] = (int16_t)right; + break; } /* The remaining channels are not needed any more */ @@ -551,7 +580,9 @@ should not be enabled lightly (it will also steer the Ls, Rs channels). */ s->matrix_mode = 0; - s->decode_mode = 0; + s->decode_mode = HRTF_MIX_51; + + s->print_flag = 1; if (allocate(s) != 0) { af_msg(AF_MSG_ERROR, "[hrtf] Memory allocation error.\n");