⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aud_ctrl.c

📁 是MTK公司新出来的DVD方案
💻 C
📖 第 1 页 / 共 5 页
字号:
static code WORD wChDelayShare[DELAY_CH_MAX] = {
  W_CHDELAY_C,
  W_CHDELAY_L,
  W_CHDELAY_R,
  W_CHDELAY_LS,
  W_CHDELAY_RS,
  W_CHDELAY_CB,
  W_CHDELAY_CH7,
  W_CHDELAY_SUB
};

// bDelay is XX0cm, here
#if (defined(INPUT_STATE_KEY_TBL_KEEP) && defined(CHNL_DELAY_USE_TIME))
void vAdspChDelay(BYTE bChannel, BYTE bDelay) large
{
  if (bChannel >= DELAY_CH_MAX)
  {
    return;
  }

  if (bDelay > MAX_CH_DELAY_LEN * 2)
  {
    bDelay = MAX_CH_DELAY_LEN * 2;
  }

  vWriteDspSharedWInfo(wChDelayShare[bChannel], (WORD)(bDelay));
  vNotifyDspSharedInfo(dwChDelayUop[bChannel]);
}
#endif

// bTime is XX msec, here
#ifdef CHNL_DELAY_USE_TIME
void vAdspChDelayTime(BYTE bChannel, BYTE bTime) large
{
#if 0
  if (bChannel >= DELAY_CH_MAX)
  {
    return;
  }

  /* 340m/sec => 34cm/ms ~= 7*5cm */
  if (bTime > ((BYTE)(MAX_CH_DELAY_LEN / 7)))
  {
    bTime = MAX_CH_DELAY_LEN;
  }
  else
  {
    bTime  = bTime * 7;
  }

  vWriteDspSharedWInfo(wChDelayShare[bChannel], (WORD)(bTime));
  vNotifyDspSharedInfo(dwChDelayUop[bChannel]);
#endif

  BYTE bDelay;
  /* 1sec => 340m => 34000cm */
  bDelay = (BYTE) (((WORD)(34*bTime))/5);

  vAdspChDelay(bChannel, bDelay);

}
#endif /* CHNL_DELAY_USE_TIME */

#ifdef PLAYER_TRIM
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return    :
// *********************************************************************
static code DWRD dwChTrimUop[TRIM_CH_MAX] = {
  UOP_DSP_TRIM_C,
  UOP_DSP_TRIM_L,
  UOP_DSP_TRIM_R,
  UOP_DSP_TRIM_LS,
  UOP_DSP_TRIM_RS,
  UOP_DSP_TRIM_CB,
  UOP_DSP_TRIM_CH7,
  UOP_DSP_TRIM_SUBWOOFER,
  UOP_DSP_LFE_LEVEL
};

static code WORD wChTrimShare[TRIM_CH_MAX] = {
  D_TRIM_C,
  D_TRIM_L,
  D_TRIM_R,
  D_TRIM_LS,
  D_TRIM_RS,
  D_TRIM_CB,
  D_TRIM_CH7,
  D_TRIM_SUB,
  D_TRIM_LFE
};

void vAdspChTrim(BYTE bChannel, BYTE bLevel) large
{
  if (bChannel >= TRIM_CH_MAX)
  {
    return;
  }

  if (bLevel >= TRIM_LEVEL_MAX)
  {
    bLevel = TRIM_LEVEL_MAX - 1;
  }

  vWriteDspSharedDInfo(wChTrimShare[bChannel], TRIM[bLevel]);
  vNotifyDspSharedInfo(dwChTrimUop[bChannel]);
}

#endif /* PLAYER_TRIM */

// *********************************************************************
// Function :
// Description :
// Parameter :
// Return    :
// *********************************************************************
#if 0 //uncall
void vAdspDialogGain(BYTE bLevel) large
{
  if (bLevel >= TRIM_LEVEL_MAX)
  {
    bLevel = TRIM_LEVEL_MAX - 1;
  }

  vWriteDspSharedDInfo(D_DIALOGUE, TRIM[bLevel]);
  vNotifyDspSharedInfo(UOP_DSP_DIALOGUE_GAIN);
}
#endif /* uncall */

#endif /* not TWO_CHANNEL_ONLY */

// *********************************************************************
// Function :
// Description :
// Parameter :
// Return    :
// *********************************************************************
void vAdspVocalAssist(BYTE bMode) large
{
  strucDspKaraFlag rTmp1;
  WORD wTmp2;

  rTmp1.Union.Byte = bReadDspSharedBInfo(B_KARAFLAG);
  rTmp1.Union.Bit.Reserve = 0;

  if (_rAudioCtrl.sEcho.fgMic == TRUE)
  {
    wTmp2 = DSP_AC3_KARA_AWARE;
  }
  else
  {
    wTmp2 = DSP_AC3_KARA_DISABLE;
  }

  /* reset to default value first */
  _rAudioCtrl.sVocal.fgVoiceCancel = FALSE;
  rTmp1.Union.Bit.VoiceCancel = FALSE;
  rTmp1.Union.Bit.LRMix = FALSE;

  switch (bMode)
  {
    case VOCAL_VOICE_CANCEL:
      _rAudioCtrl.sVocal.fgVoiceCancel = TRUE;
#ifdef VOCAL_ASSIST_MIC_CNT
      rTmp1.Union.Bit.VoiceCancel = FALSE;
      rTmp1.Union.Bit.VocalAssist = FALSE;
#else
      rTmp1.Union.Bit.VoiceCancel = TRUE;
      rTmp1.Union.Bit.VocalAssist = TRUE;
#endif
      break;

    case VOCAL_LEFT:
      rTmp1.Union.Bit.LRMix = TRUE;
      rTmp1.Union.Bit.VoiceCancel = FALSE;
#ifdef VOCAL_ASSIST_MIC_CNT
      rTmp1.Union.Bit.VocalAssist = FALSE;
#else
      rTmp1.Union.Bit.VocalAssist = TRUE;
#endif
      break;

    case VOCAL_RIGHT:
      rTmp1.Union.Bit.LRMix = TRUE;
      rTmp1.Union.Bit.VoiceCancel = FALSE;
#ifdef VOCAL_ASSIST_MIC_CNT
      rTmp1.Union.Bit.VocalAssist = FALSE;
#else
      rTmp1.Union.Bit.VocalAssist = TRUE;
#endif
      break;

    case VOCAL_AUDIO1:
      rTmp1.Union.Bit.VoiceCancel = FALSE;
      rTmp1.Union.Bit.VocalAssist = FALSE;
      break;

    case VOCAL_AUDIO2:
      rTmp1.Union.Bit.VoiceCancel = FALSE;
      rTmp1.Union.Bit.VocalAssist = FALSE;
      break;

    case VOCAL_NONE:
      rTmp1.Union.Bit.VoiceCancel = FALSE;
      rTmp1.Union.Bit.VocalAssist = FALSE;
      wTmp2 = DSP_AC3_KARA_NONE;
      break;

    case VOCAL_V1:
      rTmp1.Union.Bit.VoiceCancel = FALSE;
      rTmp1.Union.Bit.VocalAssist = FALSE;
      wTmp2 = DSP_AC3_KARA_V1;
      break;

    case VOCAL_V2:
      rTmp1.Union.Bit.VoiceCancel = FALSE;
      rTmp1.Union.Bit.VocalAssist = FALSE;
      wTmp2 = DSP_AC3_KARA_V2;
      break;

    case VOCAL_BOTH:
      rTmp1.Union.Bit.VoiceCancel = FALSE;
      rTmp1.Union.Bit.VocalAssist = FALSE;
      wTmp2 = DSP_AC3_KARA_BOTH;
      break;

    case VOCAL_NO_ASSIST:
    default:
      _rAudioCtrl.sVocal.fgVoiceCancel = FALSE;
      rTmp1.Union.Bit.VocalAssist = FALSE;
      rTmp1.Union.Bit.VoiceCancel = FALSE;
#ifdef AC3_KARA_MODE
      wTmp2 = DSP_AC3_KARA_BOTH;
#else
      wTmp2 = DSP_AC3_KARA_AWARE;
#endif      
      bMode = VOCAL_NO_ASSIST;
      break;
  }

  /* set the internal flag */
  if (bMode == VOCAL_NO_ASSIST)
  {
    _rAudioCtrl.sFlag.fgVocalAssist = FALSE;
  }
  else
  {
    _rAudioCtrl.sFlag.fgVocalAssist = TRUE;
  }

  _rAudioCtrl.sVocal.bVocalMode = bMode;

#ifdef VOCAL_ASSIST_MIC_CNT
  _rAudioCtrl.sVocal.fgMicActive = FALSE;
  _rAudioCtrl.sVocal.bMicCnt = 0;
#endif

  /* notify the ADSP */
  if (bReadDspSharedBInfo(B_KARAFLAG) != rTmp1.Union.Byte)
  {
    vWriteDspSharedBInfo(B_KARAFLAG, rTmp1.Union.Byte);
    vNotifyDspSharedInfo(UOP_DSP_KARAOKE_FLAG);
  }

  if (_rAudioCtrl.sVocal.fgMelody == FALSE)
  {
    wTmp2 |= DSP_AC3_NO_MELODY;
  }

  if (wReadDspSharedWInfo(W_AC3KARAMOD) != wTmp2)
  {
#ifdef RS232_LOG
   DBGLogS(" write DSP shared  ");
   DBGLogB(bHiByte(wTmp2),bLoByte(wTmp2),0xff,0xff);
   DBGLogS("\n");
#endif    
    vWriteDspSharedWInfo(W_AC3KARAMOD, wTmp2);
    vNotifyDspSharedInfo(UOP_DSP_AC3_KARAOKE_MODE);
  }
}
// *********************************************************************
// Function : void vAdspKaraLR(BYTE bMode)
// Description :
// Parameter :
// Return    :
// *********************************************************************
void vAdspKaraLR(BYTE bMode) large
{
  BYTE bLevel;
#ifdef VOCAL_ASSIST_MIC_CNT
  strucDspKaraFlag rTmp;
#endif

  if (bMode == KARA_LEFT)
  {
    bLevel = LRMIX_LEFT_ONLY;
  }
  else if (bMode == KARA_RIGHT)
  {
    bLevel = LRMIX_RIGHT_ONLY;
  }
#ifdef VOCAL_ASSIST_MIC_CNT
  else if (bMode == KARA_STEREO)
  {
    rTmp.Union.Byte = bReadDspSharedBInfo(B_KARAFLAG);
    rTmp.Union.Bit.LRMix = FALSE;
    vWriteDspSharedBInfo(B_KARAFLAG, rTmp.Union.Byte);
    vNotifyDspSharedInfo(UOP_DSP_KARAOKE_FLAG);    
    return;
  }
#endif /* VOCAL_ASSIST_MIC_CNT */
  else
  {
    return;
  }

  _rAudioCtrl.bKaraMixRatioLR = bLevel;

  if (fgIsVocalAssistOn())
  {
    vWriteDspSharedDInfo(D_LRMIXRATIO, LRMIX[bLevel]);
    vNotifyDspSharedInfo(UOP_DSP_LR_MIX_RATIO);

  #ifdef VOCAL_ASSIST_MIC_CNT /* if the state is not sync */
    rTmp.Union.Byte = bReadDspSharedBInfo(B_KARAFLAG);
    rTmp.Union.Bit.LRMix = TRUE;
    rTmp.Union.Bit.VoiceCancel = FALSE;
    rTmp.Union.Bit.VocalAssist = FALSE;
    rTmp.Union.Bit.Reserve = 0;

    if (bReadDspSharedBInfo(B_KARAFLAG) != rTmp.Union.Byte)
    {
      vWriteDspSharedBInfo(B_KARAFLAG, rTmp.Union.Byte);
      vNotifyDspSharedInfo(UOP_DSP_KARAOKE_FLAG);
    }
  #endif /* VOCAL_ASSIST_MIC_CNT */
  }
}

#ifdef PLAYER_KARAOKE
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return    :
// *********************************************************************
void vAdspKaraMode(BYTE bMode) large
{
  /* note: the ADSP will clear its buffer automatically, so no need to mute first */

  /* TODO: restore vocal asssit and LR mix setting */
  /* TODO: if set to karaoke mode and SPDIF is on, should we force to PCM output? */
  strucDspMicFlag rTmp;
  BYTE bChange;

  bChange = FALSE;

  rTmp.Union.Byte = bReadDspSharedBInfo(B_MPFLAG);
  rTmp.Union.Bit.Reserve = 0;

  if (bMode == KARA_MODE_ENABLE)
  {
    _rAudioCtrl.sFlag.fgKaraMode = TRUE;
    _rAudioCtrl.sEcho.fgMic = TRUE;

    if (rTmp.Union.Bit.On != TRUE)
    {
      rTmp.Union.Bit.On = TRUE;
      bChange = TRUE;
    }

    /* set to two channel downmix mode */
  }
  else
  {
    _rAudioCtrl.sFlag.fgKaraMode = FALSE;
    _rAudioCtrl.sEcho.fgMic = FALSE;

    if (rTmp.Union.Bit.On != FALSE)
    {
      rTmp.Union.Bit.On = FALSE;
      bChange = TRUE;
    }

    /* restore the channel config is needed */
  }

#ifdef VOCAL_ASSIST_MIC_CNT
  _rAudioCtrl.sVocal.fgMicActive = FALSE;
  _rAudioCtrl.sVocal.bMicCnt = 0;
#endif

  #ifdef KARA_FORCE_SPDIF_PCM
  if ((_rAudioCtrl.sIEC.bFormat == SPDIF_FLAG_RAW) && (_rAudioCtrl.sFlag.fgSpdifOn == TRUE))
  {
    if (bMode == KARA_MODE_ENABLE)
    {
      /* set to PCM mode */
      vWriteDspSharedBInfo(B_IECFLAG, SPDIF_FLAG_PCM);
      vNotifyDspSharedInfo(UOP_DSP_IEC_FLAG);
    }
    else
    {
      /* restore to RAW mode */
      vWriteDspSharedBInfo(B_IECFLAG, SPDIF_FLAG_RAW);
      vNotifyDspSharedInfo(UOP_DSP_IEC_FLAG);
    }
  }
  #endif

  if (bChange)
  {
    vWriteDspSharedBInfo(B_MPFLAG, rTmp.Union.Byte);

  #ifdef MIC_AUTOMUTE
    /* after microphone switch, always set microphone mix off */
    vWriteDspSharedWInfo(B_MP_CHMIX, 0);

    _rAudioCtrl.bMicAutomuteCnt = MIC_AUTOMUTE_ON_CNT;
  #endif
  
    vNotifyDspSharedInfo(UOP_DSP_MICROPHONE_FLAG);
  }
}

// *********************************************************************
// Function :
// Description :
// Parameter :
// Return    :
// *********************************************************************
void vAdspSetMicEq(BYTE bMode) large
{
  strucDspMicFlag rTmp;

  rTmp.Union.Byte = bReadDspSharedBInfo(B_MPFLAG);
  rTmp.Union.Bit.Reserve = 0;

  if (bMode == ADSP_ON)
  {
    rTmp.Union.Bit.Eq = TRUE;
    /* set to two channel downmix mode */
  }
  else
  {
    rTmp.Union.Bit.Eq = FALSE;
    /* restore the channel config is needed */
  }

  vWriteDspSharedBInfo(B_MPFLAG, rTmp.Union.Byte);
  vNotifyDspSharedInfo(UOP_DSP_MICROPHONE_FLAG);
}



#ifdef VOCAL_ASSIST_MIC_CNT
// *********************************************************************
// Function : void vAdspKaraVC(BOOL fgOn)
// Description :
// Parameter :
// Return    :
// *********************************************************************
void vAdspKaraVC(BOOL fgOn) large
{
  strucDspKaraFlag rTmp1;

  rTmp1.Union.Byte = bReadDspSharedBInfo(B_KARAFLAG);

  if (rTmp1.Union.Bit.VoiceCancel != fgOn)
  {
    rTmp1.Union.Bit.VoiceCancel = fgOn;

    /* notify the ADSP */
    vWriteDspSharedBInfo(B_KARAFLAG, rTmp1.Union.Byte);
    vNotifyDspSharedInfo(UOP_DSP_KARAOKE_FLAG);
  }
}
#endif /* VOCAL_ASSIST_MIC_CNT */



#ifdef AC3_KARA_MODE
  #ifdef AC3_KARA_MELODY
// *********************************************************************
// Function : void vAdspKaraMelody(BOOL fgOn)
// Description :
// Parameter :
// Return    :
// *********************************************************************
void vAdspKaraMelody(BOOL fgOn) large
{
  WORD wTmp1 = wReadDspSharedWInfo(W_AC3KARAMOD);

  _rAudioCtrl.sVocal.fgMelody = fgOn;

  if ((fgOn == TRUE) && ((wTmp1 & DSP_AC3_NO_MELODY) != 0))
  {
    wTmp1 &= (~DSP_AC3_NO_MELODY);
  }
  else if ((fgOn == FALSE) && ((wTmp1 & DSP_AC3_NO_MELODY) == 0))
  {
    wTmp1 |= DSP_AC3_NO_MELODY;
  }
  else
  {
    return;
  }

  vWriteDspSharedWInfo(W_AC3KARAMOD, wTmp1);
  vNotifyDspSharedInfo(UOP_DSP_AC3_KARAOKE_MODE);
}
  #endif /* AC3_KARA_MELODY */

// *********************************************************************
// Function : void vAdspKaraAC3(BYTE bMode)
// Description :

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -