--- xa_acodec.c.orig Sun Mar 21 23:36:25 1999 +++ xa_acodec.c Mon Mar 22 18:03:48 1999 @@ -198,7 +198,17 @@ { if (inc_cnt < (1<<24)) { /*** Decode Sample ***/ - dataL = (spec & 4)?(ibuf[1]):(*ibuf); + if (snd_hdr->volume_boost) + { + unsigned c = snd_hdr->volume_boost; + unsigned d = 8 - c; + if (spec & 4) + dataL = (ibuf[1]<>d); + else + dataL = (ibuf[0]<>d); + } + else + dataL = (spec & 4)?(ibuf[1]):(*ibuf); ibuf += bps; byte_cnt += bps; samp_cnt--; inc_cnt += inc; } @@ -1884,6 +1894,19 @@ new_snd->inc = inc = (xaULONG)( finc * (double)(1<<24) ); new_snd->inc_cnt = 0; + if (vaudiof->amp_scale < 2.0) + new_snd->volume_boost = 0; + else if (vaudiof->amp_scale < 4.0) + new_snd->volume_boost = 1; + else if (vaudiof->amp_scale < 8.0) + new_snd->volume_boost = 2; + else if (vaudiof->amp_scale < 16.0) + new_snd->volume_boost = 3; + else if (vaudiof->amp_scale < 32.0) + new_snd->volume_boost = 4; + else + new_snd->volume_boost = 5; + /* Determine Chunk Time */ ftime = ((double)(xa_vaudio_hard_buff) * 1000.0) / (double)(hfreq); new_snd->ch_time = (xaLONG)ftime; @@ -2167,6 +2190,7 @@ break; case XA_AUDIO_LINEAR_1M: + case XA_AUDIO_SIGNED_1M: { switch(itype) { @@ -2183,7 +2207,8 @@ case XA_AUDIO_LINEAR_2SL: case XA_AUDIO_LINEAR_2SB: new_snd->spec = - ((itype & XA_AUDIO_TYPE_MASK)==XA_AUDIO_LINEAR)?(0):(1); + ((itype & XA_AUDIO_TYPE_MASK)== + (xa_audio_hard_type & XA_AUDIO_TYPE_MASK))?(0):(1); if (itype & XA_AUDIO_BPS_2_MSK) new_snd->spec |= (itype & XA_AUDIO_BIGEND_MSK)?(2):(4); if (itype & XA_AUDIO_STEREO_MSK) @@ -2195,12 +2220,16 @@ if (xa_audio_hard_type & XA_AUDIO_BIGEND_MSK) new_snd->spec = 0 | 4 | 8; else new_snd->spec = 1 | 4 | 8; + if (xa_audio_hard_type == XA_AUDIO_LINEAR_1M) + new_snd->spec |= 2; new_snd->delta = XA_ADecode_ULAWx_PCMxM; break; case XA_AUDIO_ULAW: if (xa_audio_hard_type & XA_AUDIO_BIGEND_MSK) new_snd->spec = 0 | 4; else new_snd->spec = 1 | 4; + if (xa_audio_hard_type == XA_AUDIO_LINEAR_1M) + new_snd->spec |= 2; new_snd->delta = XA_ADecode_ULAWx_PCMxM; break; case XA_AUDIO_ALAWS: @@ -2218,6 +2247,8 @@ case XA_AUDIO_ARMLAWS: if (xa_audio_hard_type & XA_AUDIO_BIGEND_MSK) new_snd->spec = 0 | 4 | 8; + if (xa_audio_hard_type == XA_AUDIO_LINEAR_1M) + new_snd->spec |= 2; else new_snd->spec = 1 | 4 | 8; new_snd->delta = XA_ADecode_ARMLAWx_PCMxM; break; @@ -2226,41 +2257,59 @@ new_snd->spec = 0 | 4; else new_snd->spec = 1 | 4; new_snd->delta = XA_ADecode_ARMLAWx_PCMxM; + if (xa_audio_hard_type == XA_AUDIO_LINEAR_1M) + new_snd->spec |= 2; break; case XA_AUDIO_ADPCM_M: - new_snd->spec = 2 | 4; /* 1 byte output */ + new_snd->spec = 4; /* 1 byte output */ + if (xa_audio_hard_type == XA_AUDIO_LINEAR_1M) + new_snd->spec |= 2; new_snd->delta = XA_ADecode_ADPCMM_PCM2M; break; case XA_AUDIO_ADPCM_S: - new_snd->spec = 2 | 4; /* 1 byte output */ + new_snd->spec = 4; /* 1 byte output */ + if (xa_audio_hard_type == XA_AUDIO_LINEAR_1M) + new_snd->spec |= 2; new_snd->delta = XA_ADecode_ADPCMS_PCM2M; break; case XA_AUDIO_DVI_M: - new_snd->spec = 2 | 4; /* 1 byte output */ + new_snd->spec = 4; /* 1 byte output */ + if (xa_audio_hard_type == XA_AUDIO_LINEAR_1M) + new_snd->spec |= 2; new_snd->delta = XA_ADecode_DVIM_PCMxM; break; case XA_AUDIO_DVI_S: - new_snd->spec = 2 | 4; /* 1 byte output */ + new_snd->spec = 4; /* 1 byte output */ + if (xa_audio_hard_type == XA_AUDIO_LINEAR_1M) + new_snd->spec |= 2; new_snd->delta = XA_ADecode_DVIS_PCMxM; break; case XA_AUDIO_IMA4_M: - new_snd->spec = 2 | 4; /* 1 byte output */ + new_snd->spec = 4; /* 1 byte output */ + if (xa_audio_hard_type == XA_AUDIO_LINEAR_1M) + new_snd->spec |= 2; new_snd->delta = XA_ADecode_IMA4M_PCMxM; break; case XA_AUDIO_IMA4_S: - new_snd->spec = 2 | 4; /* 1 byte output */ + new_snd->spec = 4; /* 1 byte output */ + if (xa_audio_hard_type == XA_AUDIO_LINEAR_1M) + new_snd->spec |= 2; new_snd->delta = XA_ADecode_IMA4S_PCMxM; break; #ifdef XA_GSM case XA_AUDIO_GSM: case XA_AUDIO_MSGSM: - new_snd->spec = 2 | 4; /* 1 byte output */ + new_snd->spec = 4; /* 1 byte output */ + if (xa_audio_hard_type == XA_AUDIO_LINEAR_1M) + new_snd->spec |= 2; if (itype == XA_AUDIO_MSGSM_M) new_snd->spec |= 0x80; new_snd->delta = XA_ADecode_GSMM_PCMxM; break; #endif case XA_AUDIO_NOP: - new_snd->spec = 2 | 4; /* 1 byte output */ + new_snd->spec = 4; /* 1 byte output */ + if (xa_audio_hard_type == XA_AUDIO_LINEAR_1M) + new_snd->spec |= 2; new_snd->delta = XA_ADecode_NOP_PCMXM; break; default: