From 3d61697e688c99ff9265238b2eab474f7f1bcfc8 Mon Sep 17 00:00:00 2001 From: Octasic Inc Date: Wed, 23 Nov 2005 15:07:18 +0200 Subject: importing OCT612x-01.00-PR38 --- .../oct6100api/oct6100_api/oct6100_adpcm_chan.c | 1204 ++++++++++++++++++++ 1 file changed, 1204 insertions(+) create mode 100644 software/octdeviceapi/oct6100api/oct6100_api/oct6100_adpcm_chan.c (limited to 'software/octdeviceapi/oct6100api/oct6100_api/oct6100_adpcm_chan.c') diff --git a/software/octdeviceapi/oct6100api/oct6100_api/oct6100_adpcm_chan.c b/software/octdeviceapi/oct6100api/oct6100_api/oct6100_adpcm_chan.c new file mode 100644 index 0000000..ab39a52 --- /dev/null +++ b/software/octdeviceapi/oct6100api/oct6100_api/oct6100_adpcm_chan.c @@ -0,0 +1,1204 @@ +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +File: oct6100_adpcm_chan.c + + Copyright (c) 2001-2005 Octasic Inc. + +Description: + + This file contains functions used to open and close ADPCM channels. + +This file is part of the Octasic OCT6100 GPL API . The OCT6100 GPL API is +free software; you can redistribute it and/or modify it under the terms of +the GNU General Public License as published by the Free Software Foundation; +either version 2 of the License, or (at your option) any later version. + +The OCT6100 GPL API is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +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.00-PR38 $ + +$Octasic_Revision: 15 $ + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + +/***************************** INCLUDE FILES *******************************/ + +#include "octdef.h" + +#include "oct6100api/oct6100_defines.h" +#include "oct6100api/oct6100_errors.h" +#include "oct6100api/oct6100_apiud.h" + +#include "apilib/octapi_llman.h" + +#include "oct6100api/oct6100_tlv_inst.h" +#include "oct6100api/oct6100_chip_open_inst.h" +#include "oct6100api/oct6100_chip_stats_inst.h" +#include "oct6100api/oct6100_interrupts_inst.h" +#include "oct6100api/oct6100_channel_inst.h" +#include "oct6100api/oct6100_remote_debug_inst.h" +#include "oct6100api/oct6100_debug_inst.h" +#include "oct6100api/oct6100_api_inst.h" +#include "oct6100api/oct6100_adpcm_chan_inst.h" + +#include "oct6100api/oct6100_interrupts_pub.h" +#include "oct6100api/oct6100_chip_open_pub.h" +#include "oct6100api/oct6100_channel_pub.h" +#include "oct6100api/oct6100_adpcm_chan_pub.h" + +#include "oct6100_chip_open_priv.h" +#include "oct6100_miscellaneous_priv.h" +#include "oct6100_memory_priv.h" +#include "oct6100_tsst_priv.h" +#include "oct6100_channel_priv.h" +#include "oct6100_adpcm_chan_priv.h" + +/**************************** PUBLIC FUNCTIONS ****************************/ + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100AdpcmChanOpen + +Description: This function opens an ADPCM channel between two TDM timeslots. + This channel will perform ADPCM compression or decompression + depending on the channel mode. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep the + present state of the chip and all its resources. + +f_pAdpcmChanOpen Pointer to ADPCM channel open structure. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100AdpcmChanOpenDef( + tPOCT6100_ADPCM_CHAN_OPEN f_pAdpcmChanOpen ) +{ + f_pAdpcmChanOpen->pulChanHndl = NULL; + + f_pAdpcmChanOpen->ulInputTimeslot = cOCT6100_INVALID_TIMESLOT; + f_pAdpcmChanOpen->ulInputStream = cOCT6100_INVALID_STREAM; + f_pAdpcmChanOpen->ulInputNumTssts = 1; + f_pAdpcmChanOpen->ulInputPcmLaw = cOCT6100_PCM_U_LAW; + + f_pAdpcmChanOpen->ulOutputTimeslot = cOCT6100_INVALID_TIMESLOT; + f_pAdpcmChanOpen->ulOutputStream = cOCT6100_INVALID_STREAM; + f_pAdpcmChanOpen->ulOutputPcmLaw = cOCT6100_PCM_U_LAW; + f_pAdpcmChanOpen->ulOutputNumTssts = 1; + + f_pAdpcmChanOpen->ulChanMode = cOCT6100_ADPCM_ENCODING; + f_pAdpcmChanOpen->ulEncodingRate = cOCT6100_G726_32KBPS; + f_pAdpcmChanOpen->ulDecodingRate = cOCT6100_G726_32KBPS; + + f_pAdpcmChanOpen->ulAdpcmNibblePosition = cOCT6100_ADPCM_IN_LOW_BITS; + + return cOCT6100_ERR_OK; +} + +UINT32 Oct6100AdpcmChanOpen( + tPOCT6100_INSTANCE_API f_pApiInstance, + tPOCT6100_ADPCM_CHAN_OPEN f_pAdpcmChanOpen ) +{ + tOCT6100_SEIZE_SERIALIZE_OBJECT SeizeSerObj; + tOCT6100_RELEASE_SERIALIZE_OBJECT ReleaseSerObj; + UINT32 ulSerRes = cOCT6100_ERR_OK; + UINT32 ulFncRes = cOCT6100_ERR_OK; + + /* Set the process context of the serialize structure.*/ + SeizeSerObj.pProcessContext = f_pApiInstance->pProcessContext; + ReleaseSerObj.pProcessContext = f_pApiInstance->pProcessContext; + + /* Seize all list semaphores needed by this function. */ + SeizeSerObj.ulSerialObjHndl = f_pApiInstance->ulApiSerObj; + SeizeSerObj.ulTryTimeMs = cOCT6100_WAIT_INFINITELY; + ulSerRes = Oct6100UserSeizeSerializeObject( &SeizeSerObj ); + if ( ulSerRes == cOCT6100_ERR_OK ) + { + /* Call the serialized function. */ + ulFncRes = Oct6100AdpcmChanOpenSer( f_pApiInstance, f_pAdpcmChanOpen ); + } + else + { + return ulSerRes; + } + + /* Release the seized semaphores. */ + ReleaseSerObj.ulSerialObjHndl = f_pApiInstance->ulApiSerObj; + ulSerRes = Oct6100UserReleaseSerializeObject( &ReleaseSerObj ); + + /* If an error occured then return the error code. */ + if ( ulSerRes != cOCT6100_ERR_OK ) + return ulSerRes; + if ( ulFncRes != cOCT6100_ERR_OK ) + return ulFncRes; + + return cOCT6100_ERR_OK; +} + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100AdpcmChanClose + +Description: This function closes an opened ADPCM channel. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep the + present state of the chip and all its resources. + +f_pAdpcmChanClose Pointer to ADPCM channel close structure. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100AdpcmChanCloseDef( + tPOCT6100_ADPCM_CHAN_CLOSE f_pAdpcmChanClose ) +{ + f_pAdpcmChanClose->ulChanHndl = cOCT6100_INVALID_HANDLE; + + return cOCT6100_ERR_OK; +} + +UINT32 Oct6100AdpcmChanClose( + tPOCT6100_INSTANCE_API f_pApiInstance, + tPOCT6100_ADPCM_CHAN_CLOSE f_pAdpcmChanClose ) +{ + tOCT6100_SEIZE_SERIALIZE_OBJECT SeizeSerObj; + tOCT6100_RELEASE_SERIALIZE_OBJECT ReleaseSerObj; + UINT32 ulSerRes = cOCT6100_ERR_OK; + UINT32 ulFncRes = cOCT6100_ERR_OK; + + /* Set the process context of the serialize structure.*/ + SeizeSerObj.pProcessContext = f_pApiInstance->pProcessContext; + ReleaseSerObj.pProcessContext = f_pApiInstance->pProcessContext; + + /* Seize all list semaphores needed by this function. */ + SeizeSerObj.ulSerialObjHndl = f_pApiInstance->ulApiSerObj; + SeizeSerObj.ulTryTimeMs = cOCT6100_WAIT_INFINITELY; + ulSerRes = Oct6100UserSeizeSerializeObject( &SeizeSerObj ); + if ( ulSerRes == cOCT6100_ERR_OK ) + { + /* Call the serialized function. */ + ulFncRes = Oct6100AdpcmChanCloseSer( f_pApiInstance, f_pAdpcmChanClose ); + } + else + { + return ulSerRes; + } + + /* Release the seized semaphores. */ + ReleaseSerObj.ulSerialObjHndl = f_pApiInstance->ulApiSerObj; + ulSerRes = Oct6100UserReleaseSerializeObject( &ReleaseSerObj ); + + /* If an error occured then return the error code. */ + if ( ulSerRes != cOCT6100_ERR_OK ) + return ulSerRes; + if ( ulFncRes != cOCT6100_ERR_OK ) + return ulFncRes; + + return cOCT6100_ERR_OK; +} + + +/**************************** PRIVATE FUNCTIONS ****************************/ + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiGetAdpcmChanSwSizes + +Description: Gets the sizes of all portions of the API instance pertinent + to the management of the ADPCM memory. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pOpenChip Pointer to chip configuration struct. +f_pInstSizes Pointer to struct containing instance sizes. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiGetAdpcmChanSwSizes( + IN tPOCT6100_CHIP_OPEN f_pOpenChip, + OUT tPOCT6100_API_INSTANCE_SIZES f_pInstSizes ) +{ + UINT32 ulTempVar; + UINT32 ulResult; + + /* Determine the amount of memory required for the API ADPCM channel list.*/ + f_pInstSizes->ulAdpcmChannelList = f_pOpenChip->ulMaxAdpcmChannels * sizeof( tOCT6100_API_ADPCM_CHAN ); + + if ( f_pOpenChip->ulMaxAdpcmChannels > 0 ) + { + /* Calculate memory needed for ADPCM memory allocation */ + ulResult = OctapiLlmAllocGetSize( f_pOpenChip->ulMaxAdpcmChannels, &f_pInstSizes->ulAdpcmChannelAlloc ); + if ( ulResult != cOCT6100_ERR_OK ) + return cOCT6100_ERR_FATAL_48; + } + else + { + f_pInstSizes->ulAdpcmChannelAlloc = 0; + } + + mOCT6100_ROUND_MEMORY_SIZE( f_pInstSizes->ulAdpcmChannelList, ulTempVar ) + mOCT6100_ROUND_MEMORY_SIZE( f_pInstSizes->ulAdpcmChannelAlloc, ulTempVar ) + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiAdpcmChanSwInit + +Description: Initializes all elements of the instance structure associated + to the ADPCM memory. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep + the present state of the chip and all its resources. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiAdpcmChanSwInit( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance ) +{ + tPOCT6100_API_ADPCM_CHAN pChannelsTsiList; + tPOCT6100_SHARED_INFO pSharedInfo; + UINT32 ulMaxAdpcmChannels; + PVOID pAdpcmChannelsAlloc; + UINT32 ulResult; + + /* Get local pointer to shared portion of instance. */ + pSharedInfo = f_pApiInstance->pSharedInfo; + + /* Initialize the ADPCM channel API list.*/ + ulMaxAdpcmChannels = pSharedInfo->ChipConfig.usMaxAdpcmChannels; + + /* Set all entries in the ADPCM channel list to unused. */ + mOCT6100_GET_ADPCM_CHAN_LIST_PNT( pSharedInfo, pChannelsTsiList ) + + /* Clear the memory */ + Oct6100UserMemSet( pChannelsTsiList, 0x00, sizeof(tOCT6100_API_ADPCM_CHAN) * ulMaxAdpcmChannels ); + + /* Initialize the ADPCM channel allocation structures to "all free". */ + if ( ulMaxAdpcmChannels > 0 ) + { + mOCT6100_GET_ADPCM_CHAN_ALLOC_PNT( pSharedInfo, pAdpcmChannelsAlloc ) + + ulResult = OctapiLlmAllocInit( &pAdpcmChannelsAlloc, ulMaxAdpcmChannels ); + if ( ulResult != cOCT6100_ERR_OK ) + return cOCT6100_ERR_FATAL_BD; + } + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100AdpcmChanOpenSer + +Description: Opens an ADPCM channel. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep the + present state of the chip and all its resources. + +f_pAdpcmChanOpen Pointer to an ADPCM channel open structure + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100AdpcmChanOpenSer( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + IN OUT tPOCT6100_ADPCM_CHAN_OPEN f_pAdpcmChanOpen ) +{ + UINT16 usAdpcmChanIndex; + UINT16 usTsiMemIndex; + UINT16 usAdpcmMemIndex; + UINT16 usInputTsstIndex; + UINT16 usOutputTsstIndex; + UINT32 ulResult; + + /* Check the user's configuration of the ADPCM channel open structure for errors. */ + ulResult = Oct6100ApiCheckAdpcmChanParams( f_pApiInstance, f_pAdpcmChanOpen ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Reserve all resources needed by the ADPCM channel. */ + ulResult = Oct6100ApiReserveAdpcmChanResources( f_pApiInstance, f_pAdpcmChanOpen, &usAdpcmChanIndex, &usAdpcmMemIndex, &usTsiMemIndex, &usInputTsstIndex, &usOutputTsstIndex ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Write all necessary structures to activate the ADPCM channel. */ + ulResult = Oct6100ApiWriteAdpcmChanStructs( f_pApiInstance, f_pAdpcmChanOpen, usAdpcmMemIndex, usTsiMemIndex, usInputTsstIndex, usOutputTsstIndex ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Update the ADPCM channel entry in the API list. */ + ulResult = Oct6100ApiUpdateAdpcmChanEntry( f_pApiInstance, f_pAdpcmChanOpen, usAdpcmChanIndex, usAdpcmMemIndex, usTsiMemIndex, usInputTsstIndex, usOutputTsstIndex ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiCheckAdpcmChanParams + +Description: Checks the user's ADPCM channel open configuration for errors. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep the + present state of the chip and all its resources. + +f_pAdpcmChanOpen Pointer to ADPCM channel open configuration structure. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiCheckAdpcmChanParams( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + IN tPOCT6100_ADPCM_CHAN_OPEN f_pAdpcmChanOpen ) +{ + UINT32 ulResult; + + /* Check for errors. */ + if ( f_pApiInstance->pSharedInfo->ChipConfig.usMaxAdpcmChannels == 0 ) + return cOCT6100_ERR_ADPCM_CHAN_DISABLED; + + if ( f_pAdpcmChanOpen->pulChanHndl == NULL ) + return cOCT6100_ERR_ADPCM_CHAN_INVALID_HANDLE; + + /* Check the input TDM streams, timeslots component for errors. */ + if ( f_pAdpcmChanOpen->ulInputNumTssts != 1 && + f_pAdpcmChanOpen->ulInputNumTssts != 2 ) + return cOCT6100_ERR_ADPCM_CHAN_INPUT_NUM_TSSTS; + + ulResult = Oct6100ApiValidateTsst( f_pApiInstance, + f_pAdpcmChanOpen->ulInputNumTssts, + f_pAdpcmChanOpen->ulInputTimeslot, + f_pAdpcmChanOpen->ulInputStream, + cOCT6100_INPUT_TSST ); + if ( ulResult != cOCT6100_ERR_OK ) + { + if ( ulResult == cOCT6100_ERR_TSST_TIMESLOT ) + { + return cOCT6100_ERR_ADPCM_CHAN_INPUT_TIMESLOT; + } + else if ( ulResult == cOCT6100_ERR_TSST_STREAM ) + { + return cOCT6100_ERR_ADPCM_CHAN_INPUT_STREAM; + } + else + { + return ulResult; + } + } + + if( f_pAdpcmChanOpen->ulInputPcmLaw != cOCT6100_PCM_U_LAW && + f_pAdpcmChanOpen->ulInputPcmLaw != cOCT6100_PCM_A_LAW ) + return cOCT6100_ERR_ADPCM_CHAN_INPUT_PCM_LAW; + + /* Check the output TDM streams, timeslots component for errors. */ + if ( f_pAdpcmChanOpen->ulOutputNumTssts != 1 && + f_pAdpcmChanOpen->ulOutputNumTssts != 2 ) + return cOCT6100_ERR_ADPCM_CHAN_OUTPUT_NUM_TSSTS; + + ulResult = Oct6100ApiValidateTsst( f_pApiInstance, + f_pAdpcmChanOpen->ulOutputNumTssts, + f_pAdpcmChanOpen->ulOutputTimeslot, + f_pAdpcmChanOpen->ulOutputStream, + cOCT6100_OUTPUT_TSST ); + if ( ulResult != cOCT6100_ERR_OK ) + { + if ( ulResult == cOCT6100_ERR_TSST_TIMESLOT ) + { + return cOCT6100_ERR_ADPCM_CHAN_OUTPUT_TIMESLOT; + } + else if ( ulResult == cOCT6100_ERR_TSST_STREAM ) + { + return cOCT6100_ERR_ADPCM_CHAN_OUTPUT_STREAM; + } + else + { + return ulResult; + } + } + if( f_pAdpcmChanOpen->ulOutputPcmLaw != cOCT6100_PCM_U_LAW && + f_pAdpcmChanOpen->ulOutputPcmLaw != cOCT6100_PCM_A_LAW ) + return cOCT6100_ERR_ADPCM_CHAN_OUTPUT_PCM_LAW; + + /* Now, check the channel mode. */ + if ( f_pAdpcmChanOpen->ulChanMode != cOCT6100_ADPCM_ENCODING && + f_pAdpcmChanOpen->ulChanMode != cOCT6100_ADPCM_DECODING ) + return cOCT6100_ERR_ADPCM_CHAN_MODE; + + if ( f_pAdpcmChanOpen->ulChanMode == cOCT6100_ADPCM_ENCODING ) + { + /* Check the encoding rate. */ + if ( ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G711_64KBPS ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G726_40KBPS ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G726_32KBPS ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G726_24KBPS ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G726_16KBPS ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G727_40KBPS_4_1 ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G727_40KBPS_3_2 ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G727_40KBPS_2_3 ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G727_32KBPS_4_0 ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G727_32KBPS_3_1 ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G727_32KBPS_2_2 ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G727_24KBPS_3_0 ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G727_24KBPS_2_1 ) && + ( f_pAdpcmChanOpen->ulEncodingRate != cOCT6100_G727_16KBPS_2_0 ) ) + return cOCT6100_ERR_ADPCM_CHAN_ENCODING_RATE; + } + else /* if ( f_pAdpcmChanOpen->ulChanMode != cOCT6100_ADPCM_DECODING ) */ + { + /* Check the decoding rate. */ + if ( f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G711_64KBPS && + f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G726_40KBPS && + f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G726_32KBPS && + f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G726_24KBPS && + f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G726_16KBPS && + f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G726_ENCODED && + f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G711_G726_ENCODED && + f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G727_2C_ENCODED && + f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G727_3C_ENCODED && + f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G727_4C_ENCODED && + f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G711_G727_2C_ENCODED && + f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G711_G727_3C_ENCODED && + f_pAdpcmChanOpen->ulDecodingRate != cOCT6100_G711_G727_4C_ENCODED ) + return cOCT6100_ERR_ADPCM_CHAN_DECODING_RATE; + + /* Make sure that two timeslots are allocated if PCM-ECHO encoded is selected. */ + if ( (f_pAdpcmChanOpen->ulDecodingRate == cOCT6100_G711_G726_ENCODED || + f_pAdpcmChanOpen->ulDecodingRate == cOCT6100_G711_G727_2C_ENCODED || + f_pAdpcmChanOpen->ulDecodingRate == cOCT6100_G711_G727_3C_ENCODED || + f_pAdpcmChanOpen->ulDecodingRate == cOCT6100_G711_G727_4C_ENCODED ) && + f_pAdpcmChanOpen->ulInputNumTssts != 2 ) + return cOCT6100_ERR_ADPCM_CHAN_INCOMPATIBLE_NUM_TSSTS; + } + + /* Check the nibble position. */ + if ( f_pAdpcmChanOpen->ulAdpcmNibblePosition != cOCT6100_ADPCM_IN_LOW_BITS && + f_pAdpcmChanOpen->ulAdpcmNibblePosition != cOCT6100_ADPCM_IN_HIGH_BITS ) + return cOCT6100_ERR_ADPCM_CHAN_ADPCM_NIBBLE_POSITION; + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiReserveAdpcmChanResources + +Description: Reserves all resources needed for the new ADPCM channel. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep the + present state of the chip and all its resources. + +f_pAdpcmChanOpen Pointer to ADPCM channel configuration structure. +f_pusAdpcmChanIndex Allocated entry in ADPCM channel list. +f_pusAdpcmMemIndex Allocated entry in the ADPCM control memory. +f_pusTsiMemIndex Allocated entry in the TSI chariot memory. +f_pusInputTsstIndex TSST memory index of the input samples. +f_pusOutputTsstIndex TSST memory index of the output samples. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiReserveAdpcmChanResources( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + IN tPOCT6100_ADPCM_CHAN_OPEN f_pAdpcmChanOpen, + OUT PUINT16 f_pusAdpcmChanIndex, + OUT PUINT16 f_pusAdpcmMemIndex, + OUT PUINT16 f_pusTsiMemIndex, + OUT PUINT16 f_pusInputTsstIndex, + OUT PUINT16 f_pusOutputTsstIndex ) +{ + tPOCT6100_SHARED_INFO pSharedInfo; + UINT32 ulResult; + UINT32 ulTempVar; + BOOL fAdpcmChanEntry = FALSE; + BOOL fAdpcmMemEntry = FALSE; + BOOL fTsiMemEntry = FALSE; + BOOL fInputTsst = FALSE; + + /* Obtain local pointer to shared portion of instance. */ + pSharedInfo = f_pApiInstance->pSharedInfo; + + /* Reserve an entry in the ADPCM channel list. */ + ulResult = Oct6100ApiReserveAdpcmChanEntry( f_pApiInstance, f_pusAdpcmChanIndex ); + if ( ulResult == cOCT6100_ERR_OK ) + { + fAdpcmChanEntry = TRUE; + + /* Find a TSI memory entry.*/ + ulResult = Oct6100ApiReserveTsiMemEntry( f_pApiInstance, f_pusTsiMemIndex ); + if ( ulResult == cOCT6100_ERR_OK ) + { + fTsiMemEntry = TRUE; + + /* Find a conversion memory entry. */ + ulResult = Oct6100ApiReserveConversionMemEntry( f_pApiInstance, f_pusAdpcmMemIndex ); + if ( ulResult == cOCT6100_ERR_OK ) + { + fAdpcmMemEntry = TRUE; + + /* Reserve the input TSST entry. */ + ulResult = Oct6100ApiReserveTsst( f_pApiInstance, + f_pAdpcmChanOpen->ulInputTimeslot, + f_pAdpcmChanOpen->ulInputStream, + f_pAdpcmChanOpen->ulInputNumTssts, + cOCT6100_INPUT_TSST, + f_pusInputTsstIndex, + NULL ); + if ( ulResult == cOCT6100_ERR_OK ) + { + fInputTsst = TRUE; + + /* Reserve the output TSST entry. */ + ulResult = Oct6100ApiReserveTsst( f_pApiInstance, + f_pAdpcmChanOpen->ulOutputTimeslot, + f_pAdpcmChanOpen->ulOutputStream, + f_pAdpcmChanOpen->ulOutputNumTssts, + cOCT6100_OUTPUT_TSST, + f_pusOutputTsstIndex, + NULL ); + } + } + } + else + { + /* Return an error other than a fatal error. */ + ulResult = cOCT6100_ERR_ADPCM_CHAN_NO_MORE_TSI_AVAILABLE; + } + } + + if ( ulResult != cOCT6100_ERR_OK ) + { + if( fAdpcmChanEntry == TRUE ) + { + ulTempVar = Oct6100ApiReleaseAdpcmChanEntry( f_pApiInstance, *f_pusAdpcmChanIndex ); + if ( ulTempVar != cOCT6100_ERR_OK ) + return ulTempVar; + } + + if( fTsiMemEntry == TRUE ) + { + ulTempVar = Oct6100ApiReleaseTsiMemEntry( f_pApiInstance, *f_pusTsiMemIndex ); + if ( ulTempVar != cOCT6100_ERR_OK ) + return ulTempVar; + } + + if( fAdpcmMemEntry == TRUE ) + { + ulTempVar = Oct6100ApiReleaseConversionMemEntry( f_pApiInstance, *f_pusAdpcmMemIndex ); + if ( ulTempVar != cOCT6100_ERR_OK ) + return ulTempVar; + } + + if( fInputTsst == TRUE ) + { + ulTempVar = Oct6100ApiReleaseTsst( f_pApiInstance, + f_pAdpcmChanOpen->ulInputTimeslot, + f_pAdpcmChanOpen->ulInputStream, + f_pAdpcmChanOpen->ulInputNumTssts, + cOCT6100_INPUT_TSST, + cOCT6100_INVALID_INDEX ); + if ( ulTempVar != cOCT6100_ERR_OK ) + return ulTempVar; + } + + return ulResult; + } + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiWriteAdpcmChanStructs + +Description: Performs all the required structure writes to configure the + new ADPCM channel. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep the + present state of the chip and all its resources. + +f_pAdpcmChanOpen Pointer to ADPCM channel configuration structure. +f_pusAdpcmChanIndex Allocated entry in ADPCM channel list. +f_pusAdpcmMemIndex Allocated entry in the ADPCM control memory. +f_pusTsiMemIndex Allocated entry in the TSI chariot memory. +f_pusInputTsstIndex TSST memory index of the input samples. +f_pusOutputTsstIndex TSST memory index of the output samples. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiWriteAdpcmChanStructs( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + IN tPOCT6100_ADPCM_CHAN_OPEN f_pAdpcmChanOpen, + IN UINT16 f_usAdpcmMemIndex, + IN UINT16 f_usTsiMemIndex, + IN UINT16 f_usInputTsstIndex, + IN UINT16 f_usOutputTsstIndex ) +{ + tPOCT6100_SHARED_INFO pSharedInfo; + tOCT6100_WRITE_PARAMS WriteParams; + UINT32 ulResult; + UINT32 ulCompType = 0; + + /* Obtain local pointer to shared portion of instance. */ + pSharedInfo = f_pApiInstance->pSharedInfo; + + WriteParams.pProcessContext = f_pApiInstance->pProcessContext; + + WriteParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId; + + /*------------------------------------------------------------------------------*/ + /* Configure the TSST control memory. */ + + /* Set the input TSST control entry. */ + ulResult = Oct6100ApiWriteInputTsstControlMemory( f_pApiInstance, + f_usInputTsstIndex, + f_usTsiMemIndex, + f_pAdpcmChanOpen->ulInputPcmLaw ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Set the output TSST control entry. */ + ulResult = Oct6100ApiWriteOutputTsstControlMemory( f_pApiInstance, + f_usOutputTsstIndex, + f_pAdpcmChanOpen->ulAdpcmNibblePosition, + f_pAdpcmChanOpen->ulOutputNumTssts, + f_usTsiMemIndex ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /*------------------------------------------------------------------------------*/ + + + /*------------------------------------------------------------------------------*/ + /* Configure the ADPCM memory. */ + + if ( f_pAdpcmChanOpen->ulChanMode == cOCT6100_ADPCM_ENCODING ) + { + switch( f_pAdpcmChanOpen->ulEncodingRate ) + { + case cOCT6100_G711_64KBPS: + + if ( f_pAdpcmChanOpen->ulOutputPcmLaw == cOCT6100_PCM_U_LAW ) + ulCompType = 0x4; + else /* if ( f_pAdpcmChanOpen->ulOutputPcmLaw != cOCT6100_PCM_U_LAW ) */ + ulCompType = 0x5; + break; + case cOCT6100_G726_40KBPS: ulCompType = 0x3; break; + case cOCT6100_G726_32KBPS: ulCompType = 0x2; break; + case cOCT6100_G726_24KBPS: ulCompType = 0x1; break; + case cOCT6100_G726_16KBPS: ulCompType = 0x0; break; + case cOCT6100_G727_40KBPS_4_1: ulCompType = 0xD; break; + case cOCT6100_G727_40KBPS_3_2: ulCompType = 0xA; break; + case cOCT6100_G727_40KBPS_2_3: ulCompType = 0x6; break; + case cOCT6100_G727_32KBPS_4_0: ulCompType = 0xE; break; + case cOCT6100_G727_32KBPS_3_1: ulCompType = 0xB; break; + case cOCT6100_G727_32KBPS_2_2: ulCompType = 0x7; break; + case cOCT6100_G727_24KBPS_3_0: ulCompType = 0xC; break; + case cOCT6100_G727_24KBPS_2_1: ulCompType = 0x8; break; + case cOCT6100_G727_16KBPS_2_0: ulCompType = 0x9; break; + } + + ulResult = Oct6100ApiWriteEncoderMemory( f_pApiInstance, + f_usAdpcmMemIndex, + ulCompType, + f_usTsiMemIndex, + FALSE, + f_pAdpcmChanOpen->ulAdpcmNibblePosition, + cOCT6100_INVALID_INDEX, + cOCT6100_INVALID_VALUE, + cOCT6100_INVALID_VALUE ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + else /* if ( f_pAdpcmChanOpen->ulChanMode != cOCT6100_ADPCM_DECODING ) */ + { + switch( f_pAdpcmChanOpen->ulDecodingRate ) + { + case cOCT6100_G711_64KBPS: ulCompType = 0x8; break; + case cOCT6100_G726_40KBPS: ulCompType = 0x3; break; + case cOCT6100_G726_32KBPS: ulCompType = 0x2; break; + case cOCT6100_G726_24KBPS: ulCompType = 0x1; break; + case cOCT6100_G726_16KBPS: ulCompType = 0x0; break; + case cOCT6100_G727_2C_ENCODED: ulCompType = 0x4; break; + case cOCT6100_G727_3C_ENCODED: ulCompType = 0x5; break; + case cOCT6100_G727_4C_ENCODED: ulCompType = 0x6; break; + case cOCT6100_G726_ENCODED: ulCompType = 0x9; break; + case cOCT6100_G711_G726_ENCODED: ulCompType = 0xA; break; + case cOCT6100_G711_G727_2C_ENCODED: ulCompType = 0xC; break; + case cOCT6100_G711_G727_3C_ENCODED: ulCompType = 0xD; break; + case cOCT6100_G711_G727_4C_ENCODED: ulCompType = 0xE; break; + } + + ulResult = Oct6100ApiWriteDecoderMemory( f_pApiInstance, + f_usAdpcmMemIndex, + ulCompType, + f_usTsiMemIndex, + f_pAdpcmChanOpen->ulOutputPcmLaw, + f_pAdpcmChanOpen->ulAdpcmNibblePosition ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + } + + /*------------------------------------------------------------------------------*/ + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiUpdateAdpcmChanEntry + +Description: Updates the new ADPCM channel in the ADPCM channel list. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep + the present state of the chip and all its resources. + +f_pAdpcmChanOpen Pointer to ADPCM channel open configuration structure. +f_usAdpcmChanIndex Allocated entry in the ADPCM channel list. +f_usAdpcmMemIndex Allocated entry in ADPCM memory. +f_usTsiMemIndex Allocated entry in TSI chariot memory. +f_usInputTsstIndex TSST control memory index of the input TSST. +f_usOutputTsstIndex TSST control memory index of the output TSST. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiUpdateAdpcmChanEntry( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + IN OUT tPOCT6100_ADPCM_CHAN_OPEN f_pAdpcmChanOpen, + IN UINT16 f_usAdpcmChanIndex, + IN UINT16 f_usAdpcmMemIndex, + IN UINT16 f_usTsiMemIndex, + IN UINT16 f_usInputTsstIndex, + IN UINT16 f_usOutputTsstIndex ) +{ + tPOCT6100_API_ADPCM_CHAN pAdpcmChanEntry; + + /*------------------------------------------------------------------------------*/ + /* Obtain a pointer to the new ADPCM channel's list entry. */ + + mOCT6100_GET_ADPCM_CHAN_ENTRY_PNT( f_pApiInstance->pSharedInfo, pAdpcmChanEntry, f_usAdpcmChanIndex ) + + /* Copy the buffer's configuration and allocated resources. */ + pAdpcmChanEntry->usInputTimeslot = (UINT16)( f_pAdpcmChanOpen->ulInputTimeslot & 0xFFFF ); + pAdpcmChanEntry->usInputStream = (UINT16)( f_pAdpcmChanOpen->ulInputStream & 0xFFFF ); + pAdpcmChanEntry->byInputNumTssts = (UINT8)( f_pAdpcmChanOpen->ulInputNumTssts & 0xFF ); + pAdpcmChanEntry->byInputPcmLaw = (UINT8)( f_pAdpcmChanOpen->ulInputPcmLaw & 0xFF ); + + pAdpcmChanEntry->usOutputTimeslot = (UINT16)( f_pAdpcmChanOpen->ulOutputTimeslot & 0xFFFF ); + pAdpcmChanEntry->usOutputStream = (UINT16)( f_pAdpcmChanOpen->ulOutputStream & 0xFFFF ); + pAdpcmChanEntry->byOutputNumTssts = (UINT8)( f_pAdpcmChanOpen->ulOutputNumTssts & 0xFF ); + pAdpcmChanEntry->byOutputPcmLaw = (UINT8)( f_pAdpcmChanOpen->ulOutputPcmLaw & 0xFF ); + + /* Store hardware related information. */ + pAdpcmChanEntry->usTsiMemIndex = f_usTsiMemIndex; + pAdpcmChanEntry->usAdpcmMemIndex = f_usAdpcmMemIndex; + pAdpcmChanEntry->usInputTsstIndex = f_usInputTsstIndex; + pAdpcmChanEntry->usOutputTsstIndex = f_usOutputTsstIndex; + + /* Form handle returned to user. */ + *f_pAdpcmChanOpen->pulChanHndl = cOCT6100_HNDL_TAG_ADPCM_CHANNEL | (pAdpcmChanEntry->byEntryOpenCnt << cOCT6100_ENTRY_OPEN_CNT_SHIFT) | f_usAdpcmChanIndex; + + /* Finally, mark the ADPCM channel as opened. */ + pAdpcmChanEntry->fReserved = TRUE; + + /* Increment the number of ADPCM channel opened. */ + f_pApiInstance->pSharedInfo->ChipStats.usNumberAdpcmChans++; + + /*------------------------------------------------------------------------------*/ + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100AdpcmChanCloseSer + +Description: Closes an ADPCM channel. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep the + present state of the chip and all its resources. + +f_pAdpcmChanClose Pointer to ADPCM channel close structure. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100AdpcmChanCloseSer( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + IN OUT tPOCT6100_ADPCM_CHAN_CLOSE f_pAdpcmChanClose ) +{ + UINT16 usAdpcmChanIndex; + UINT16 usTsiMemIndex; + UINT16 usAdpcmMemIndex; + UINT16 usInputTsstIndex; + UINT16 usOutputTsstIndex; + UINT32 ulResult; + + /* Verify that all the parameters given match the state of the API. */ + ulResult = Oct6100ApiAssertAdpcmChanParams( f_pApiInstance, f_pAdpcmChanClose, &usAdpcmChanIndex, &usAdpcmMemIndex, &usTsiMemIndex, &usInputTsstIndex, &usOutputTsstIndex ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Release all resources associated to the ADPCM channel. */ + ulResult = Oct6100ApiInvalidateAdpcmChanStructs( f_pApiInstance, usAdpcmMemIndex, usInputTsstIndex, usOutputTsstIndex ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Release all resources associated to the ADPCM channel. */ + ulResult = Oct6100ApiReleaseAdpcmChanResources( f_pApiInstance, usAdpcmChanIndex, usAdpcmMemIndex, usTsiMemIndex ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Invalidate the handle. */ + f_pAdpcmChanClose->ulChanHndl = cOCT6100_INVALID_HANDLE; + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiAssertAdpcmChanParams + +Description: Validate the handle given by the user and verify the state of + the ADPCM channel about to be closed. + Also return all required information to deactivate the channel. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep the + present state of the chip and all its resources. +f_pAdpcmChanClose Pointer to ADPCM channel close structure. +f_pusAdpcmChanIndex Index of the ADPCM channel structure in the API list. +f_pusAdpcmMemIndex Index of the ADPCM memory structure in the API list. +f_pusTsiMemIndex Index of the TSI chariot memory used for this channel. +f_pusInputTsstIndex Index of the input entry in the TSST control memory. +f_pusOutputTsstIndex Index of the output entry in the TSST control memory. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiAssertAdpcmChanParams( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + IN tPOCT6100_ADPCM_CHAN_CLOSE f_pAdpcmChanClose, + OUT PUINT16 f_pusAdpcmChanIndex, + OUT PUINT16 f_pusAdpcmMemIndex, + OUT PUINT16 f_pusTsiMemIndex, + OUT PUINT16 f_pusInputTsstIndex, + OUT PUINT16 f_pusOutputTsstIndex ) +{ + tPOCT6100_SHARED_INFO pSharedInfo; + tPOCT6100_API_ADPCM_CHAN pAdpcmChanEntry; + UINT32 ulEntryOpenCnt; + + /* Get local pointer(s). */ + pSharedInfo = f_pApiInstance->pSharedInfo; + + /* Check the provided handle. */ + if ( (f_pAdpcmChanClose->ulChanHndl & cOCT6100_HNDL_TAG_MASK) != cOCT6100_HNDL_TAG_ADPCM_CHANNEL ) + return cOCT6100_ERR_ADPCM_CHAN_INVALID_HANDLE; + + *f_pusAdpcmChanIndex = (UINT16)( f_pAdpcmChanClose->ulChanHndl & cOCT6100_HNDL_INDEX_MASK ); + + if ( *f_pusAdpcmChanIndex >= pSharedInfo->ChipConfig.usMaxAdpcmChannels ) + return cOCT6100_ERR_ADPCM_CHAN_INVALID_HANDLE; + + /*------------------------------------------------------------------------------*/ + /* Get a pointer to the channel's list entry. */ + + mOCT6100_GET_ADPCM_CHAN_ENTRY_PNT( pSharedInfo, pAdpcmChanEntry, *f_pusAdpcmChanIndex ) + + /* Extract the entry open count from the provided handle. */ + ulEntryOpenCnt = (f_pAdpcmChanClose->ulChanHndl >> cOCT6100_ENTRY_OPEN_CNT_SHIFT) & cOCT6100_ENTRY_OPEN_CNT_MASK; + + /* Check for errors. */ + if ( pAdpcmChanEntry->fReserved != TRUE ) + return cOCT6100_ERR_ADPCM_CHAN_NOT_OPEN; + if ( ulEntryOpenCnt != pAdpcmChanEntry->byEntryOpenCnt ) + return cOCT6100_ERR_ADPCM_CHAN_INVALID_HANDLE; + + /* Return info needed to close the channel and release all resources. */ + *f_pusInputTsstIndex = pAdpcmChanEntry->usInputTsstIndex; + *f_pusOutputTsstIndex = pAdpcmChanEntry->usOutputTsstIndex; + *f_pusTsiMemIndex = pAdpcmChanEntry->usTsiMemIndex; + *f_pusAdpcmMemIndex = pAdpcmChanEntry->usAdpcmMemIndex; + + /*------------------------------------------------------------------------------*/ + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiInvalidateAdpcmChanStructs + +Description: Closes an ADPCM channel. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep the + present state of the chip and all its resources. + +f_usAdpcmMemIndex Index of the ADPCM memory. +f_usInputTsstIndex Index of the input entry in the TSST control memory. +f_usOutputTsstIndex Index of the output entry in the TSST control memory. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiInvalidateAdpcmChanStructs( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + IN UINT16 f_usAdpcmMemIndex, + IN UINT16 f_usInputTsstIndex, + IN UINT16 f_usOutputTsstIndex ) +{ + tPOCT6100_SHARED_INFO pSharedInfo; + tOCT6100_WRITE_PARAMS WriteParams; + UINT32 ulResult; + + /* Obtain local pointer to shared portion of instance. */ + pSharedInfo = f_pApiInstance->pSharedInfo; + + WriteParams.pProcessContext = f_pApiInstance->pProcessContext; + + WriteParams.ulUserChipId = pSharedInfo->ChipConfig.ulUserChipId; + + /*------------------------------------------------------------------------------*/ + /* Deactivate the TSST control memory. */ + + /* Set the input TSST control entry to unused. */ + WriteParams.ulWriteAddress = cOCT6100_TSST_CONTROL_MEM_BASE + ( f_usInputTsstIndex * cOCT6100_TSST_CONTROL_MEM_ENTRY_SIZE ); + + WriteParams.usWriteData = 0x0000; + mOCT6100_DRIVER_WRITE_API( WriteParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /* Set the output TSST control entry to unused. */ + WriteParams.ulWriteAddress = cOCT6100_TSST_CONTROL_MEM_BASE + ( f_usOutputTsstIndex * cOCT6100_TSST_CONTROL_MEM_ENTRY_SIZE ); + + WriteParams.usWriteData = 0x0000; + mOCT6100_DRIVER_WRITE_API( WriteParams, ulResult ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /*------------------------------------------------------------------------------*/ + + + /*------------------------------------------------------------------------------*/ + /* Clear the ADPCM memory. */ + + ulResult = Oct6100ApiClearConversionMemory( f_pApiInstance, f_usAdpcmMemIndex ); + if ( ulResult != cOCT6100_ERR_OK ) + return ulResult; + + /*------------------------------------------------------------------------------*/ + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiReleaseAdpcmChanResources + +Description: Release and clear the API entry associated to the ADPCM channel. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep the + present state of the chip and all its resources. +f_ulAdpcmChanIndex Index of the ADPCM channel in the API list. +f_usAdpcmMemIndex Index of the ADPCM memory used. +f_usTsiMemIndex Index of the TSI memory used. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiReleaseAdpcmChanResources( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + IN UINT16 f_usAdpcmChanIndex, + IN UINT16 f_usAdpcmMemIndex, + IN UINT16 f_usTsiMemIndex ) +{ + tPOCT6100_SHARED_INFO pSharedInfo; + tPOCT6100_API_ADPCM_CHAN pAdpcmChanEntry; + UINT32 ulResult; + + /* Obtain local pointer to shared portion of instance. */ + pSharedInfo = f_pApiInstance->pSharedInfo; + + mOCT6100_GET_ADPCM_CHAN_ENTRY_PNT( pSharedInfo, pAdpcmChanEntry, f_usAdpcmChanIndex ); + + /*------------------------------------------------------------------------------*/ + /* Release all resources associated with ADPCM channel. */ + + /* Release the entry in the ADPCM channel list. */ + ulResult = Oct6100ApiReleaseAdpcmChanEntry( f_pApiInstance, f_usAdpcmChanIndex ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReleaseConversionMemEntry( f_pApiInstance, f_usAdpcmMemIndex ); + if ( ulResult == cOCT6100_ERR_OK ) + { + ulResult = Oct6100ApiReleaseTsiMemEntry( f_pApiInstance, f_usTsiMemIndex ); + if ( ulResult == cOCT6100_ERR_OK ) + { + /* Release the input TSST entry. */ + ulResult = Oct6100ApiReleaseTsst( + f_pApiInstance, + pAdpcmChanEntry->usInputTimeslot, + pAdpcmChanEntry->usInputStream, + pAdpcmChanEntry->byInputNumTssts, + cOCT6100_INPUT_TSST, + cOCT6100_INVALID_INDEX ); + if ( ulResult == cOCT6100_ERR_OK ) + { + /* Release the output TSST entry. */ + ulResult = Oct6100ApiReleaseTsst( + f_pApiInstance, + pAdpcmChanEntry->usOutputTimeslot, + pAdpcmChanEntry->usOutputStream, + pAdpcmChanEntry->byOutputNumTssts, + cOCT6100_OUTPUT_TSST, + cOCT6100_INVALID_INDEX ); + } + } + } + } + + /* Check if an error occured while releasing the reserved resources. */ + if ( ulResult != cOCT6100_ERR_OK ) + { + if ( ulResult >= cOCT6100_ERR_FATAL ) + return ulResult; + else + return cOCT6100_ERR_FATAL_4A; + } + + /*------------------------------------------------------------------------------*/ + + + /*------------------------------------------------------------------------------*/ + /* Update the ADPCM channel's list entry. */ + + /* Mark the channel as closed. */ + pAdpcmChanEntry->fReserved = FALSE; + pAdpcmChanEntry->byEntryOpenCnt++; + + /* Decrement the number of ADPCM channels opened. */ + f_pApiInstance->pSharedInfo->ChipStats.usNumberAdpcmChans--; + + /*------------------------------------------------------------------------------*/ + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiReserveAdpcmChanEntry + +Description: Reserves one of the ADPCM channel API entry. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep + the present state of the chip and all its resources. + +f_pusAdpcmChanIndex Resulting index reserved in the ADPCM channel list. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiReserveAdpcmChanEntry( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + OUT PUINT16 f_pusAdpcmChanIndex ) +{ + tPOCT6100_SHARED_INFO pSharedInfo; + PVOID pAdpcmChanAlloc; + UINT32 ulResult; + UINT32 ulAdpcmChanIndex; + + /* Get local pointer to shared portion of instance. */ + pSharedInfo = f_pApiInstance->pSharedInfo; + + mOCT6100_GET_ADPCM_CHAN_ALLOC_PNT( pSharedInfo, pAdpcmChanAlloc ) + + ulResult = OctapiLlmAllocAlloc( pAdpcmChanAlloc, &ulAdpcmChanIndex ); + if ( ulResult != cOCT6100_ERR_OK ) + { + if ( ulResult == OCTAPI_LLM_NO_STRUCTURES_LEFT ) + return cOCT6100_ERR_ADPCM_CHAN_ALL_ADPCM_CHAN_ARE_OPENED; + else + return cOCT6100_ERR_FATAL_BE; + } + + *f_pusAdpcmChanIndex = (UINT16)( ulAdpcmChanIndex & 0xFFFF ); + + return cOCT6100_ERR_OK; +} + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\ + +Function: Oct6100ApiReleaseAdpcmChanEntry + +Description: Releases the specified ADPCM channel API entry. + +------------------------------------------------------------------------------- +| Argument | Description +------------------------------------------------------------------------------- +f_pApiInstance Pointer to API instance. This memory is used to keep + the present state of the chip and all its resources. + +f_usAdpcmChanIndex Index reserved in the ADPCM channel list. + +\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +UINT32 Oct6100ApiReleaseAdpcmChanEntry( + IN OUT tPOCT6100_INSTANCE_API f_pApiInstance, + IN UINT16 f_usAdpcmChanIndex ) +{ + tPOCT6100_SHARED_INFO pSharedInfo; + PVOID pAdpcmChanAlloc; + UINT32 ulResult; + + /* Get local pointer to shared portion of instance. */ + pSharedInfo = f_pApiInstance->pSharedInfo; + + mOCT6100_GET_ADPCM_CHAN_ALLOC_PNT( pSharedInfo, pAdpcmChanAlloc ) + + ulResult = OctapiLlmAllocDealloc( pAdpcmChanAlloc, f_usAdpcmChanIndex ); + if ( ulResult != cOCT6100_ERR_OK ) + { + return cOCT6100_ERR_FATAL_BF; + } + + return cOCT6100_ERR_OK; +} + -- cgit v1.2.3