summaryrefslogtreecommitdiff
path: root/software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c
diff options
context:
space:
mode:
Diffstat (limited to 'software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c')
-rw-r--r--software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c108
1 files changed, 91 insertions, 17 deletions
diff --git a/software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c b/software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c
index 463f077..a229190 100644
--- a/software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c
+++ b/software/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.c
@@ -2,7 +2,7 @@
File: oct6100_channel.c
- Copyright (c) 2001-2008 Octasic Inc.
+ Copyright (c) 2001-2009 Octasic Inc.
Description:
@@ -23,9 +23,9 @@ You should have received a copy of the GNU General Public License
along with the OCT6100 GPL API; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-$Octasic_Release: OCT612xAPI-01.01.01 $
+$Octasic_Release: OCT612xAPI-01.02.01 $
-$Octasic_Revision: 494 $
+$Octasic_Revision: 506 $
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
@@ -144,6 +144,7 @@ UINT32 Oct6100ChannelOpenDef(
f_pChannelOpen->VqeConfig.fSoutNaturalListenerEnhancement = FALSE;
f_pChannelOpen->VqeConfig.fRoutNoiseReduction = FALSE;
f_pChannelOpen->VqeConfig.lRoutNoiseReductionLevelGainDb = -18;
+ f_pChannelOpen->VqeConfig.fEnablePlayout = TRUE;
f_pChannelOpen->VqeConfig.lAnrSnrEnhancementDb = -18;
f_pChannelOpen->VqeConfig.ulAnrVoiceNoiseSegregation = 6;
f_pChannelOpen->VqeConfig.ulToneDisablerVqeActivationDelay = 300;
@@ -368,6 +369,7 @@ UINT32 Oct6100ChannelModifyDef(
f_pChannelModify->VqeConfig.fSoutNaturalListenerEnhancement = cOCT6100_KEEP_PREVIOUS_SETTING;
f_pChannelModify->VqeConfig.fRoutNoiseReduction = cOCT6100_KEEP_PREVIOUS_SETTING;
f_pChannelModify->VqeConfig.lRoutNoiseReductionLevelGainDb = cOCT6100_KEEP_PREVIOUS_SETTING;
+ f_pChannelModify->VqeConfig.fEnablePlayout = cOCT6100_KEEP_PREVIOUS_SETTING;
f_pChannelModify->VqeConfig.lAnrSnrEnhancementDb = cOCT6100_KEEP_PREVIOUS_SETTING;
f_pChannelModify->VqeConfig.ulAnrVoiceNoiseSegregation = cOCT6100_KEEP_PREVIOUS_SETTING;
f_pChannelModify->VqeConfig.ulToneDisablerVqeActivationDelay = cOCT6100_KEEP_PREVIOUS_SETTING;
@@ -826,6 +828,7 @@ UINT32 Oct6100ChannelGetStatsDef(
f_pChannelStats->VqeConfig.fSoutNaturalListenerEnhancement = FALSE;
f_pChannelStats->VqeConfig.fRoutNoiseReduction = FALSE;
f_pChannelStats->VqeConfig.lRoutNoiseReductionLevelGainDb = cOCT6100_INVALID_SIGNED_STAT;
+ f_pChannelStats->VqeConfig.fEnablePlayout = TRUE;
f_pChannelStats->VqeConfig.lAnrSnrEnhancementDb = cOCT6100_INVALID_SIGNED_STAT;
f_pChannelStats->VqeConfig.ulAnrVoiceNoiseSegregation = cOCT6100_INVALID_STAT;
f_pChannelStats->VqeConfig.ulToneDisablerVqeActivationDelay = cOCT6100_INVALID_STAT;
@@ -2543,6 +2546,7 @@ UINT32 Oct6100ApiUpdateChannelEntry(
pChanEntry->VqeConfig.bySoutNaturalListenerEnhancementGainDb = (UINT8)( pVqeConfig->ulSoutNaturalListenerEnhancementGainDb & 0xFF );
pChanEntry->VqeConfig.fSoutNaturalListenerEnhancement = (UINT8)( pVqeConfig->fSoutNaturalListenerEnhancement & 0xFF );
pChanEntry->VqeConfig.fRoutNoiseReduction = (UINT8)( pVqeConfig->fRoutNoiseReduction & 0xFF );
+ pChanEntry->VqeConfig.fEnablePlayout = (UINT8)( pVqeConfig->fEnablePlayout & 0xFF );
pChanEntry->VqeConfig.chRoutNoiseReductionLevelGainDb = (OCT_INT8) (pVqeConfig->lRoutNoiseReductionLevelGainDb & 0xFF);
pChanEntry->VqeConfig.fEnableMusicProtection = (UINT8)( pVqeConfig->fEnableMusicProtection & 0xFF );
pChanEntry->VqeConfig.fIdleCodeDetection = (UINT8)( pVqeConfig->fIdleCodeDetection & 0xFF );
@@ -5915,6 +5919,9 @@ UINT32 Oct6100ApiModifyChannelEntry(
pApiVqeConf->fSoutNaturalListenerEnhancement = (UINT8)( f_pChannelOpen->VqeConfig.fSoutNaturalListenerEnhancement & 0xFF );
pApiVqeConf->fRoutNoiseReduction = (UINT8)( f_pChannelOpen->VqeConfig.fRoutNoiseReduction & 0xFF );
pApiVqeConf->chRoutNoiseReductionLevelGainDb = (OCT_INT8)( f_pChannelOpen->VqeConfig.lRoutNoiseReductionLevelGainDb & 0xFF );
+
+ pApiVqeConf->fEnablePlayout = (UINT8)( f_pChannelOpen->VqeConfig.fEnablePlayout & 0xFF );
+
pApiVqeConf->fEnableMusicProtection = (UINT8)( f_pChannelOpen->VqeConfig.fEnableMusicProtection & 0xFF );
pApiVqeConf->fIdleCodeDetection = (UINT8)( f_pChannelOpen->VqeConfig.fIdleCodeDetection & 0xFF );
}
@@ -6974,6 +6981,9 @@ UINT32 Oct6100ApiChannelGetStatsSer(
f_pChannelStats->VqeConfig.fSoutNaturalListenerEnhancement = pChanEntry->VqeConfig.fSoutNaturalListenerEnhancement;
f_pChannelStats->VqeConfig.fRoutNoiseReduction = pChanEntry->VqeConfig.fRoutNoiseReduction;
f_pChannelStats->VqeConfig.lRoutNoiseReductionLevelGainDb = pChanEntry->VqeConfig.chRoutNoiseReductionLevelGainDb;
+
+ f_pChannelStats->VqeConfig.fEnablePlayout = pChanEntry->VqeConfig.fEnablePlayout;
+
f_pChannelStats->VqeConfig.fEnableMusicProtection = pChanEntry->VqeConfig.fEnableMusicProtection;
f_pChannelStats->VqeConfig.fIdleCodeDetection = pChanEntry->VqeConfig.fIdleCodeDetection;
@@ -8034,6 +8044,15 @@ UINT32 Oct6100ApiCheckVqeConfig(
if ( f_pVqeConfig->fRoutNoiseReduction == TRUE && pImageInfo->fRoutNoiseReduction == FALSE )
return cOCT6100_ERR_NOT_SUPPORTED_CHANNEL_ROUT_NR;
+ /* Check if parameters are valid. */
+ if ( f_pVqeConfig->fEnablePlayout != TRUE && f_pVqeConfig->fEnablePlayout != FALSE )
+ return cOCT6100_ERR_CHANNEL_ENABLE_PLAYOUT;
+ if ( f_pVqeConfig->fEnablePlayout == FALSE && pImageInfo->fPerChannelPlayoutControl == FALSE )
+ return cOCT6100_ERR_NOT_SUPPORTED_DISABLE_PLAYOUT;
+
+ if ( f_pVqeConfig->fEnablePlayout == TRUE && f_pVqeConfig->fRoutNoiseReduction == TRUE )
+ return cOCT6100_ERR_NOT_SUPPORTED_ENABLE_PLAYOUT_AND_ROUT_NOISE_REDUCTION;
+
/*Check if noise reduction level gain is supported*/
if ( ( pImageInfo->fRoutNoiseReductionLevel == FALSE ) && ( f_pVqeConfig->lRoutNoiseReductionLevelGainDb != -18 ) )
return cOCT6100_ERR_NOT_SUPPORTED_CHANNEL_ROUT_NOISE_REDUCTION_GAIN;
@@ -8937,6 +8956,43 @@ UINT32 Oct6100ApiWriteVqeNlpMemory(
}
+ /* Per channel playout configuration control. */
+ if ( pSharedInfo->ImageInfo.fPerChannelPlayoutControl == TRUE )
+ {
+ /* Check if the configuration has been changed. */
+ if ( ( f_fModifyOnly == FALSE )
+ || ( ( f_fModifyOnly == TRUE )
+ && ( f_pVqeConfig->fEnablePlayout != pChanEntry->VqeConfig.fEnablePlayout ) ) )
+ {
+ ulFeatureBytesOffset = pSharedInfo->MemoryMap.PerChannelPlayoutControlFieldOfst.usDwordOffset * 4;
+ ulFeatureBitOffset = pSharedInfo->MemoryMap.PerChannelPlayoutControlFieldOfst.byBitOffset;
+ ulFeatureFieldLength = pSharedInfo->MemoryMap.PerChannelPlayoutControlFieldOfst.byFieldSize;
+
+ mOCT6100_RETRIEVE_NLP_CONF_DWORD( f_pApiInstance,
+ pChanEntry,
+ ulNlpConfigBaseAddress + ulFeatureBytesOffset,
+ &ulTempData,
+ ulResult );
+ if ( ulResult != cOCT6100_ERR_OK )
+ return ulResult;
+
+ /* Clear previous value set in the feature field.*/
+ mOCT6100_CREATE_FEATURE_MASK( ulFeatureFieldLength, ulFeatureBitOffset, &ulMask );
+
+ ulTempData &= (~ulMask);
+ ulTempData |= (UINT32)f_pVqeConfig->fEnablePlayout << ulFeatureBitOffset;
+
+ /* Write the new DWORD where the field is located. */
+ mOCT6100_SAVE_NLP_CONF_DWORD( f_pApiInstance,
+ pChanEntry,
+ ulNlpConfigBaseAddress + ulFeatureBytesOffset,
+ ulTempData,
+ ulResult );
+ if ( ulResult != cOCT6100_ERR_OK )
+ return ulResult;
+ }
+ }
+
/* Configure Sout ANR SNR enhancement. */
if ( pSharedInfo->ImageInfo.fAnrSnrEnhancement == TRUE )
{
@@ -9500,7 +9556,7 @@ UINT32 Oct6100ApiWriteVqeNlpMemory(
&& ( ( f_pVqeConfig->ulNonLinearityBehaviorA != pChanEntry->VqeConfig.byNonLinearityBehaviorA )
|| ( f_pChannelOpen->ulEchoOperationMode != pChanEntry->byEchoOperationMode ) ) ) )
{
- UINT16 ausLookupTable[ 14 ] = { 0x3663, 0x3906, 0x399C, 0x3A47, 0x3B06, 0x3B99, 0x3C47, 0x3D02, 0x3D99, 0x3E47, 0x3F00, 0x3F99, 0x4042, 0x4100 };
+ UINT16 ausLookupTable[ 14 ] = { 0x3663, 0x3908, 0x399C, 0x3A47, 0x3B06, 0x3B99, 0x3C47, 0x3D02, 0x3D99, 0x3E47, 0x3F00, 0x3F99, 0x4042, 0x4100 };
ulFeatureBytesOffset = pSharedInfo->MemoryMap.PcmLeakFieldOfst.usDwordOffset * 4;
ulFeatureBitOffset = pSharedInfo->MemoryMap.PcmLeakFieldOfst.byBitOffset;
@@ -9519,18 +9575,16 @@ UINT32 Oct6100ApiWriteVqeNlpMemory(
ulTempData &= (~ulMask);
- /*If we support ANR level the TLV is shared over 2 bits*/
- if (ulFeatureBitOffset == 18)
- {
- ulFeatureBitOffset -= 2;
- ausLookupTable[ f_pVqeConfig->ulNonLinearityBehaviorA ] &= 0xFFFC;
- }
+ /* Check if some bits of the filed are shared with another field (RNR) */
+ usTempData = ausLookupTable[ f_pVqeConfig->ulNonLinearityBehaviorA ];
+ if ( ulFeatureFieldLength != 16 )
+ usTempData = (UINT16)( usTempData >> ( 16 - ulFeatureFieldLength ) );
if ( ( f_pChannelOpen->ulEchoOperationMode == cOCT6100_ECHO_OP_MODE_NO_ECHO )
|| ( f_pChannelOpen->ulEchoOperationMode == cOCT6100_ECHO_OP_MODE_SPEECH_RECOGNITION ) )
ulTempData |= ( 0x0 << ulFeatureBitOffset );
else
- ulTempData |= ( ausLookupTable[ f_pVqeConfig->ulNonLinearityBehaviorA ] << ulFeatureBitOffset );
+ ulTempData |= ( usTempData << ulFeatureBitOffset );
/* Then save the DWORD where the field is located.*/
mOCT6100_SAVE_NLP_CONF_DWORD( f_pApiInstance,
@@ -10242,16 +10296,31 @@ UINT32 Oct6100ApiWriteEchoMemory(
WriteParams.usWriteData = 0x0000;
/* Set the echo control field.*/
- if ( ( f_pChannelOpen->ulEchoOperationMode == cOCT6100_ECHO_OP_MODE_NO_ECHO )
- || ( f_pChannelOpen->ulEchoOperationMode == cOCT6100_ECHO_OP_MODE_SPEECH_RECOGNITION ) )
+ if ( ( ( pSharedInfo->IntrptManage.fAfBistFailedOnBoot == TRUE )
+
+ )
+
+ )
{
- WriteParams.usWriteData |= cOCT6100_ECHO_OP_MODE_NORMAL << cOCT6100_ECHO_CONTROL_MEM_AF_CONTROL;
+ /* Keep the AF in reset, or in power-down. */
+ if ( f_pChannelOpen->ulEchoOperationMode != cOCT6100_ECHO_OP_MODE_POWER_DOWN )
+ WriteParams.usWriteData |= cOCT6100_ECHO_OP_MODE_HT_RESET << cOCT6100_ECHO_CONTROL_MEM_AF_CONTROL;
+ else
+ WriteParams.usWriteData |= cOCT6100_ECHO_OP_MODE_POWER_DOWN << cOCT6100_ECHO_CONTROL_MEM_AF_CONTROL;
}
- else if ( f_pChannelOpen->ulEchoOperationMode != cOCT6100_ECHO_OP_MODE_EXTERNAL )
+ else
{
- WriteParams.usWriteData |= f_pChannelOpen->ulEchoOperationMode << cOCT6100_ECHO_CONTROL_MEM_AF_CONTROL;
+ if ( ( f_pChannelOpen->ulEchoOperationMode == cOCT6100_ECHO_OP_MODE_NO_ECHO )
+ || ( f_pChannelOpen->ulEchoOperationMode == cOCT6100_ECHO_OP_MODE_SPEECH_RECOGNITION ) )
+ {
+ WriteParams.usWriteData |= cOCT6100_ECHO_OP_MODE_NORMAL << cOCT6100_ECHO_CONTROL_MEM_AF_CONTROL;
+ }
+ else if ( f_pChannelOpen->ulEchoOperationMode != cOCT6100_ECHO_OP_MODE_EXTERNAL )
+ {
+ WriteParams.usWriteData |= f_pChannelOpen->ulEchoOperationMode << cOCT6100_ECHO_CONTROL_MEM_AF_CONTROL;
+ }
}
-
+
/* Set the SIN/SOUT law.*/
WriteParams.usWriteData |= ulSinPcmLaw << cOCT6100_ECHO_CONTROL_MEM_INPUT_LAW_OFFSET;
WriteParams.usWriteData |= ulSoutPcmLaw << cOCT6100_ECHO_CONTROL_MEM_OUTPUT_LAW_OFFSET;
@@ -10666,6 +10735,11 @@ UINT32 Oct6100ApiUpdateOpenStruct(
else
f_pChanOpen->VqeConfig.fIdleCodeDetection = f_pChanModify->VqeConfig.fIdleCodeDetection;
+ if ( f_pChanModify->VqeConfig.fEnablePlayout == cOCT6100_KEEP_PREVIOUS_SETTING )
+ f_pChanOpen->VqeConfig.fEnablePlayout = f_pChanEntry->VqeConfig.fEnablePlayout;
+ else
+ f_pChanOpen->VqeConfig.fEnablePlayout = f_pChanModify->VqeConfig.fEnablePlayout;
+
/*======================================================================*/