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

📄 audiomodem.cpp

📁 Windows CE 6.0 BSP for the Beagle Board.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        OUTREG16(&m_pEACRegisters->AM3VCTR,pInfo->M[2]);
#endif
    DEBUGMSG( ZONE_MODEM, (TEXT("AC: SetEACAudioInfo:...OK\r\n")));
#endif
    return TRUE;
}


//------------------------------------------------------------------------------
//
//  Function: GetCMSIAudioInfo
//
//

BOOL 
ACAudioHWContext::GetEACAudioInfo(PEAC_AUDIO_SETTING pInfo)
{
    DEBUGMSG( ZONE_MODEM, (TEXT("AC: GetEACAudioInfo\r\n")));
#ifdef OMAP730
#ifndef SHIP_BUILD
    USHORT usVal;
    int i;

    pInfo->S = INREG16(&m_pEACRegisters->ASTCTR);

    // switches K1-K12
    usVal = INREG16(&m_pEACRegisters->AMSCFR);
    for (i=0;i<12;i++)
        pInfo->K[i] = (usVal & (1 << i))!=0;

    // DMA gain
    pInfo->DMAVOL = INREG16(&m_pEACRegisters->AMVCTR);

    pInfo->M[0] = INREG16(&m_pEACRegisters->AM1VCTR);
    pInfo->M[1] = INREG16(&m_pEACRegisters->AM2VCTR);
    pInfo->M[2] = INREG16(&m_pEACRegisters->AM3VCTR);
#endif
#endif

    DEBUGMSG( ZONE_MODEM, (TEXT("AC: GetEACAudioInfo:...OK\r\n")));

    return TRUE;
}



//------------------------------------------------------------------------------
//
//  Function: ModemNetworkEnabled
//
//

BOOL
ACAudioHWContext::ModemNetworkEnabled (BOOL fEnable)
{
    DEBUGMSG( ZONE_MODEM, (TEXT("AC: ModemNetworkEnabled:...%d\r\n"), fEnable));

    SetModemDevice(fEnable);

    return TRUE;
}

//------------------------------------------------------------------------------
//
//  Function: InputStreamOpened
//
//

BOOL
ACAudioHWContext::InputStreamOpened()
{
    CAutoLock cs(&m_csModemDevice);

    DEBUGMSG( ZONE_MODEM, (TEXT("AC: InputStreamOpened\r\n")));
    // Open the modem device in case it is not opened yet.
    if (!OpenModemDevice ())
    {
        return FALSE;
    }

#ifdef OMAP730
    CSMI_INFO_GC_AUDIO_VOICE_REQ     audioReq;
    audioReq.Uplink = TRUE;                 // Uplink
    audioReq.Mute   = FALSE;                // no mute
    audioReq.Volume = GSM_UPLINK_VOLUME;    // Use default?
    DWORD dwRet;

    if (!DeviceIoCtrl(  m_hGsmDev,
                        GC_AUDIO_VOICE_REQ,
                        (LPVOID)&audioReq,
                        sizeof(CSMI_INFO_GC_AUDIO_VOICE_REQ),
                        NULL,
                        0,
                        &dwRet,
                        NULL)) {
        ERRORMSG(1, (TEXT("AC: GC_AUDIO_VOICE_REQ..failed\r\n")));
        return FALSE;
    }

    DEBUGMSG( ZONE_MODEM, (TEXT("AC: Input GC_AUDIO_VOICE_REQ:...0x%x\r\n"),
               audioReq.Volume));
#endif
    return TRUE;
}

//------------------------------------------------------------------------------
//
//  Function: InputStreamClosed
//
//  called on stop of wave capture.
//

BOOL
ACAudioHWContext::InputStreamClosed()
{
    CAutoLock cs(&m_csModemDevice);

    DEBUGMSG( ZONE_MODEM, (TEXT("AC: InputStreamClosed\r\n")));
#ifdef OMAP730
    // Open the modem device in case it is not opened yet.
    if (!OpenModemDevice())
    {
        return FALSE;
    }

    CSMI_INFO_GC_AUDIO_VOICE_REQ     audioReq;
    audioReq.Uplink = TRUE;                     // Uplink
    audioReq.Mute   = TRUE;                     // Mute
    audioReq.Volume = GSM_UPLINK_VOLUME;        // Use default?
    DWORD dwRet;

    if (!DeviceIoCtrl(  m_hGsmDev,
                        GC_AUDIO_VOICE_REQ,
                        (LPVOID)&audioReq,
                        sizeof(CSMI_INFO_GC_AUDIO_VOICE_REQ),
                        NULL,
                        0,
                        &dwRet,
                        NULL)) {
        ERRORMSG(1, (TEXT("AC: GC_AUDIO_VOICE_REQ..failed\r\n")));
        return FALSE;
    }

    DEBUGMSG( ZONE_MODEM, (TEXT("AC: InputStreamClosed:...\r\n")));
#endif
    return TRUE;
}

//------------------------------------------------------------------------------
//
//  Function: OutputStreamOpened
//
//

BOOL
ACAudioHWContext::OutputStreamOpened()
{
    return TRUE;
}

//------------------------------------------------------------------------------
//
//  Function: OutputStreamClosed
//
//

BOOL
ACAudioHWContext::OutputStreamClosed()
{
    return TRUE;
}


//------------------------------------------------------------------------------
//
//  Function: SetSideTone
//
//  control side tone
//
//
// Set the side tone and echo cancellation of the mic.
//
/* -------------------------------------------------------------------------- */
/*  aecControl register bits                                                  */
/*                                                                            */
/*      bit 0 : ACK bit : set to 1 in order to warn DSP that a new command  */
/*              is present.                                                   */
/*      bit 1 : enable AEC                                                    */
/*      bit 2 : enable SPENH (= Speech Enhancement = noise reduction)         */
/*      bit 3 : additionnal AEC gain attenuation (lsb)                        */
/*      bit 4 : additionnal AEC gain attenuation (msb)                        */
/*      bit 5 : additionnal SPENH gain attenuation (lsb)                      */
/*      bit 6 : additionnal SPENH gain attenuation (msb)                      */
/*      bit 7 : reset trigger for AEC                                         */
/*      bit 8 : reset trigger for SPENH                                       */
/*      bit 9 : AEC selector 0 : short AEC, 1 : long AEC                      */
/*                                                                            */
/* -------------------------------------------------------------------------- */

/* -------------------------------------------------------------------------- */
/*  VALID VALUES                                                              */
/*                                                                            */
/*  for Short AEC        0083                                                 */
/*  for long AEC         0283                                                 */
/*  for long AEC  -6 dB  028B                                                 */
/*  for long AEC  -12 dB 0293                                                 */
/*  for long AEC  -18 dB 029B                                                 */
/*  for SPENH            0105                                                 */
/*  for SPENH -6 dB      0125                                                 */
/*  for SPENH -12 dB     0145                                                 */
/*  for SPENH -18 dB     0165                                                 */
/*  for BOTH             0187                                                 */
/*  for STOP ALL         0001 (all bits reset + ACK to 1 to warn the DSP)     */
/*                                                                            */
/* -------------------------------------------------------------------------- */
//

BOOL
ACAudioHWContext::SetSideTone(BOOL fEnable)
{
    CAutoLock cs(&m_csModemDevice);

    DEBUGMSG( ZONE_MODEM, (TEXT("AC: SetSideTone\r\n")));
    // Open the modem device in case it is not opened yet.
    if (!OpenModemDevice())
    {
        return FALSE;
    }

#ifdef OMAP730
    DWORD dwRet;
    CSMI_INFO_GC_AUDIO_SIDETONE_REQ  sidetoneReq;
    if (fEnable)
    {
        sidetoneReq.Volume = 
        m_bHeadsetActive ? (UINT8)m_nSidetoneHeadset : (UINT8)m_nSidetoneSpeaker;
    }
    else 
    {
        sidetoneReq.Volume = 0;    
    }

    // Control sidetone
    if (!DeviceIoCtrl(  m_hGsmDev,
                        GC_AUDIO_SIDETONE_REQ,
                        (LPVOID)&sidetoneReq,
                        sizeof(CSMI_INFO_GC_AUDIO_SIDETONE_REQ),
                        NULL,
                        0,
                        &dwRet,
                        NULL)) {
        ERRORMSG(1, (TEXT("GC_AUDIO_SIDETONE_REQ..failed\r\n")));
        return FALSE;
    }

    DEBUGMSG( ZONE_MODEM, (TEXT("AC: GC_AUDIO_SIDETONE_REQ:...\r\n")));

    CSMI_INFO_GC_AUDIO_ECHOCANC_REQ  echocancReq;
    if (fEnable)
        echocancReq.Algorithm = 0x0001;   // All bits reset
    else
        echocancReq.Algorithm = 0x029B;   // -18 dB

    // Control echo cancellation
    if (!DeviceIoCtrl(  m_hGsmDev,
                        GC_AUDIO_ECHOCANC_REQ,
                        (LPVOID)&echocancReq,
                        sizeof(CSMI_INFO_GC_AUDIO_ECHOCANC_REQ),
                        NULL,
                        0,
                        &dwRet,
                        NULL)) {
        ERRORMSG(1, (TEXT("GC_AUDIO_ECHOCANC_REQ..failed\r\n")));
        return FALSE;
    }

    DEBUGMSG( ZONE_MODEM, (TEXT("AC: GC_AUDIO_ECHOCANC_REQ:...\r\n")));

#endif

    return TRUE;
}

//------------------------------------------------------------------------------
//
//  Function: HandleExtMessage
//
//  handle custom wave driver IOCtl for modem
//

BOOL
ACAudioHWContext::HandleExtMessage (
                        DWORD  dwCode,
                        PBYTE  pBufIn,
                        DWORD  dwLenIn,
                        PBYTE  pBufOut,
                        DWORD  dwLenOut,
                        PDWORD pdwActualOut)
{
    DWORD data;

    switch (dwCode)
    {
        // Receiving volume
        case IOCTL_VOICE_RX_VOLUME_SET:
            if (pdwActualOut) *pdwActualOut = 0;
            if (CeSafeCopyMemory(&data, pBufIn, sizeof(DWORD)) == 0) break;
            return SetVoiceRxGain(data);

        case IOCTL_VOICE_RX_VOLUME_GET:
            if (pdwActualOut) *pdwActualOut = sizeof (DWORD);
            if (CeSafeCopyMemory(&data, pBufIn, sizeof(DWORD)) == 0) break;
            return GetVoiceRxGain(&data);

        // Tramsmitting volume
        case IOCTL_VOICE_TX_VOLUME_SET:
            if (pdwActualOut) *pdwActualOut = sizeof (DWORD);
            if (CeSafeCopyMemory(&data, pBufIn, sizeof(DWORD)) == 0) break;
            return SetVoiceTxGain(data);

        case IOCTL_VOICE_TX_VOLUME_GET:
            if (pdwActualOut) *pdwActualOut = sizeof (DWORD);
            if (CeSafeCopyMemory(&data, pBufIn, sizeof(DWORD)) == 0) break;
            return GetVoiceTxGain(&data);

        case IOCTL_CMSI_AUDIO_INFO_SET:
            {
                CMSI_AUDIO_SETTING audio;
                if (pBufIn == NULL || dwLenIn<sizeof(CMSI_AUDIO_SETTING)) return FALSE;
                if (pdwActualOut) *pdwActualOut = 0;
                if (CeSafeCopyMemory(&audio, pBufIn, sizeof(audio)) == 0) break;
                return SetCMSIAudioInfo(&audio);
            }
        case IOCTL_CMSI_AUDIO_INFO_GET:
            {
                CMSI_AUDIO_SETTING audio;
                if (pBufOut == NULL || dwLenOut<sizeof(CMSI_AUDIO_SETTING)) return FALSE;
                if (pdwActualOut) *pdwActualOut = sizeof(CMSI_AUDIO_SETTING);
                if (GetCMSIAudioInfo(&audio)) 
                {
                    if (CeSafeCopyMemory(pBufOut, &audio, sizeof(audio)) == 0) break;
                    return TRUE;
                }
                break;
            }
        case IOCTL_START_AMR_CAPTURE:
            if (pdwActualOut) *pdwActualOut = 0;
            return SetAMRcapture(TRUE);

        case IOCTL_STOP_AMR_CAPTURE:
            if (pdwActualOut) *pdwActualOut = 0;
            return SetAMRcapture(FALSE);

        case IOCTL_EAC_INFO_SET:
            {
                EAC_AUDIO_SETTING audio;
                if (pBufIn == NULL || dwLenIn<sizeof(EAC_AUDIO_SETTING)) return FALSE;
                if (pdwActualOut) *pdwActualOut = 0;
                if (CeSafeCopyMemory(&audio, pBufIn, sizeof(audio)) == 0) break;
                return SetEACAudioInfo(&audio);
            }

        case IOCTL_EAC_INFO_GET:
            {
                EAC_AUDIO_SETTING audio;
                if (pBufOut == NULL || dwLenOut<sizeof(EAC_AUDIO_SETTING)) return FALSE;
                if (pdwActualOut) *pdwActualOut = sizeof(EAC_AUDIO_SETTING);
                if (GetEACAudioInfo(&audio)) {
                    if (CeSafeCopyMemory(pBufOut, &audio, sizeof(audio)) == 0) break;
                    return TRUE;
                }
            }
            break;

        default:
            ERRORMSG(1, (TEXT("WAVE: Unknown IOCTL_xxx(0x%08X), device = 0x%04X, function = 0x%03X \r\n"),
						dwCode, dwCode >> 16, (dwCode >> 2) & 0xFFF));
            break;
    }
    return FALSE;
}

⌨️ 快捷键说明

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