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

📄 voice.cpp

📁 windows mobile RIL软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1999  Microsoft Corporation

Module Name:

voice.cpp

Abstract:


Notes:


--*/


#include "precomp.h"

#if defined(WAVECOM_DRIVER) || defined(OEM1_DRIVER) || defined(OEM2_DRIVER) || defined(EMP_DRIVER) || defined(PHILIP_DRIVER)
#include <gsmradio.h>
#else
#define IOCTL_SPKR_ENABLE   0
#define IOCTL_SPKR_DISABLE  0
#endif


#if defined(OEM1_DRIVER) || defined(OEM2_DRIVER) || defined(EMP_DRIVER) || defined(PHILIP_DRIVER)
// This driver doesn't have a way to query current
// uplink and downlink volume, so we have to cache them.
DWORD   g_dwCacheUplinkVolume;
DWORD   g_dwCacheDownlinkVolume;
#endif

#if defined (RIL_CACHE_AUDIO_MUTING)
// Cache the mute setting to avoid querying the radio
BOOL   g_fAudioMutingOn;
#endif

#ifdef PHILIP_DRIVER

static HRESULT ParseGetAudioGain(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetAudioGain);
    UINT nRValue;

    RILGAININFO* prgi = NULL;
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

    prgi = (RILGAININFO*)AllocBlob(sizeof(RILGAININFO));
    if (!prgi) {
        hr = E_OUTOFMEMORY;
        goto Error;
    }
    memset(prgi, 0x00, sizeof(RILGAININFO));
    prgi->cbSize = sizeof(RILGAININFO);

	// Type	Command	Response
	// Set	+CLVL=<level>	Successful:	OK
	//		Fail: 	ERROR

	// Read	+CLVL?	+CLVL: <level>
	// Test	+CLVL=?	+CLVL:(1-10)


    if (!ParseRspPrefix(szRsp, szRsp)                 ||
        !MatchStringBeginning(szRsp, "+CLVL:", szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    //Get receive and transmit value
   if ( !ParseUInt(szRsp, TRUE, nRValue, szRsp)  ||
        !FindRspPostfix(szRsp, szRsp)) 
    {
        hr = E_FAIL;
        goto Error;
    }


	NKDbgPrintfW(TEXT("ParseGetAudioGain nRValue = %0d\r\n"), nRValue);

	prgi->dwRxGain = CLVL2AudioRxGain(nRValue);
	
	NKDbgPrintfW(TEXT("ParseGetAudioGain dwRxGain = %0x\r\n"), prgi->dwRxGain);

    prgi->dwParams |= RIL_PARAM_GI_RXGAIN;

    pBlob = (void*)prgi;
    cbBlob = sizeof(RILGAININFO);

Error:
    if (FAILED(hr)) {
        FreeBlob(prgi);
    }
    return hr;
}

HRESULT RILDrv_GetAudioGain(DWORD dwParam)
{
	
    FUNCTION_TRACE(RILDrv_GetAudioGain);
    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle) {
        hr = E_FAIL;
        goto Error;
    }

    // Alan Luo : replace VGT VGR by CLVL
    if (!QueueCmd(pHandle, "AT+CLVL?\r", CMDOPT_NONE, APIID_GETAUDIOGAIN, ParseGetAudioGain, NULL, hr)) {

        hr = E_FAIL;
        goto Error;
    }

Error:
    return hr;
}

// Alan Luo : replace VGT VGR by CLVL
// Only for CMS92 Modem
//
//
HRESULT RILDrv_SetAudioGain(DWORD dwParam, const RILGAININFO* lpGainInfo)
{
    FUNCTION_TRACE(RILDrv_SetAudioGain);
    char szCmd[MAX_PATH];
    LPSTR szWalk = szCmd;
    HRESULT hr = S_OK;
	UINT uCLVL = 0;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle || !lpGainInfo) {
        hr = E_FAIL;
        goto Error;
    }

    if (!(lpGainInfo->dwParams & RIL_PARAM_GI_RXGAIN)) {
        hr = E_INVALIDARG;
        goto Error;
    }

    (void)strncpyz(szWalk, "AT", MAX_PATH - (szWalk - szCmd));
    szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
    DEBUGCHK(NULL != szWalk);

	NKDbgPrintfW(TEXT("RILDrv_SetAudioGain lpGainInfo->dwRxGain = %0x\r\n"), lpGainInfo->dwRxGain);
	
	uCLVL = AudioRxGain2CLVL(lpGainInfo->dwRxGain);
	
	NKDbgPrintfW(TEXT("RILDrv_SetAudioGain uCLVL = %0d\r\n"), uCLVL);

    if (lpGainInfo->dwParams & RIL_PARAM_GI_RXGAIN) 
    {

        (void)_snprintfz(szWalk, MAX_PATH - (szWalk - szCmd), "+CLVL=%u", uCLVL);

        szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
        DEBUGCHK(NULL != szWalk);
    }
    
	(void)strncpyz(szWalk, "\r", MAX_PATH - (szWalk - szCmd));  // NO_TYPO: 30

    if (!QueueCmd(pHandle, szCmd, CMDOPT_NONE, APIID_SETAUDIOGAIN, NULL, NULL, hr)) {
        hr = E_FAIL;
        goto Error;
    }

Error:
    return hr;
}


UINT AudioRxGain2CLVL(DWORD dwRxGain)
{
	UINT uCLVL = 0;

	if(dwRxGain == 0)
	{
		uCLVL = 1;
	}
	else if(dwRxGain <= 0x33330000)
	{
		uCLVL = 2;
	}
	else if(dwRxGain <= 0x66660000)
	{
		uCLVL = 4;
	}
	else if(dwRxGain <= 0x99990000)
	{
		uCLVL = 6;
	}
	else if(dwRxGain <= 0xcccc0000)
	{
		uCLVL = 8;	
	}
	else if(dwRxGain <= 0xffff0000)
	{
		uCLVL = 10;	
	}
	
	return uCLVL;
}

DWORD CLVL2AudioRxGain(UINT uCLVL)
{
	DWORD dwRxGain = 0;

	if(uCLVL == 1)
	{
		dwRxGain = 0;
	}
	else if(uCLVL <= 2)
	{
		dwRxGain = 0x33330000;
	}
	else if(uCLVL <= 4)
	{
		dwRxGain = 0x66660000;
	}
	else if(uCLVL <= 6)
	{
		dwRxGain = 0x99990000;
	}
	else if(uCLVL <= 8)
	{
		dwRxGain = 0xcccc0000;
	}
	else if(uCLVL <= 10)
	{
		dwRxGain = 0xffff0000;
	}	

	return dwRxGain;
}
#else
//
//
//
static HRESULT ParseGetAudioGain(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetAudioGain);
    UINT nValue;
    RILGAININFO* prgi = NULL;
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

    prgi = (RILGAININFO*)AllocBlob(sizeof(RILGAININFO));
    if (!prgi) {
        hr = E_OUTOFMEMORY;
        goto Error;
    }
    memset(prgi, 0x00, sizeof(RILGAININFO));
    prgi->cbSize = sizeof(RILGAININFO);

#if defined(OEM1_DRIVER)
    nValue = g_dwCacheDownlinkVolume;
#elif defined(OEM2_DRIVER)
    nValue = (g_dwCacheDownlinkVolume * 255) / 100;
#elif defined(EMP_DRIVER)
    nValue = (g_dwCacheDownlinkVolume * 255) / 8;
#else
    // Parse "<prefix>+VGR: <gain><postfix>"
    if (!ParseRspPrefix(szRsp, szRsp)                 ||
        !MatchStringBeginning(szRsp, "+VGR: ", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp)        ||
        !ParseRspPostfix(szRsp, szRsp)) {
        hr = E_FAIL;
        goto Error;
    }
#endif
#if defined(WAVECOM_DRIVER)
    prgi->dwRxGain = ((255 - nValue) << 24) | ((255 - nValue) << 16) | ((255 - nValue) << 8) | (255 - nValue);
#else
    prgi->dwRxGain = (nValue << 24) | (nValue << 16) | (nValue << 8) | (nValue);
#endif
    prgi->dwParams |= RIL_PARAM_GI_RXGAIN;

#if defined(OEM1_DRIVER) || defined(OEM2_DRIVER) || defined(EMP_DRIVER)
    nValue = g_dwCacheUplinkVolume; // For OEM1 and OEM2 and EMP, only cache TxGain value in gsm driver, no AT command is sent out.
#else
    // Parse "<prefix>+VGT: <gain><postfix>"
    if (!ParseRspPrefix(szRsp, szRsp)                 ||
        !MatchStringBeginning(szRsp, "+VGT: ", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp)        ||
        !ParseRspPostfix(szRsp, szRsp)) {
        hr = E_FAIL;
        goto Error;
    }
#endif

#ifndef OEM2_DRIVER // OEM2 does not offer a transmit gain AT command by default
    prgi->dwTxGain = (nValue << 24) | (nValue << 16) | (nValue << 8) | (nValue);

⌨️ 快捷键说明

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