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

📄 interf_enc.cpp

📁 实现了录音,放音功能!在evc4.0下编译功过,wince5.0下能正常录音,放音,暂停录放音!
💻 CPP
字号:
/*************************************************************************/
/*                                                                       */
/* Copyright (c) 2000-2004 Linuos Design                                 */
/*                                     领驰设计中心  版权所有 2000-2004  */
/*                                                                       */
/* PROPRIETARY RIGHTS of Linuos Design  are involved in the subject      */
/* matter of this material.  All manufacturing, reproduction, use, and   */
/* sales rights pertaining to this subject matter are governed by the    */
/* license agreement.  The recipient of this software implicitly accepts */ 
/* the terms of the license.                                             */
/* 本软件文档资料是领驰设计中心的资产,任何人士阅读和使用本资料必须获得   */
/* 相应的书面授权,承担保密责任和接受相应的法律约束.                      */
/*                                                                       */
/*************************************************************************/

/*
* ===================================================================
*  TS 26.104
*  REL-5 V5.4.0 2004-03
*  REL-6 V6.1.0 2004-03
*  3GPP AMR Floating-point Speech Codec
* ===================================================================
*
*/

/*
* interf_enc.c
*
*
* Project:
*    AMR Floating-Point Codec
*
* Contains:
*    This module contains all the functions needed encoding 160
*    16-bit speech samples to AMR encoder parameters.
*
*/

/*
* include files
*/
//#include <stdlib.h>
//#include <stdio.h>
//#include <memory.h>
#include "stdafx.h"
//#include "interf_enc.h"
//#include "sp_enc.h"
//#include "interf_rom.h"
//
/*
* EncoderMMS
*
*
* Parameters:
*    mode                 I: AMR mode
*    param                I: Encoder output parameters
*    stream               O: packed speech frame
*    frame_type           I: frame type (DTX)
*    speech_mode          I: speech mode (DTX)
*
* Function:
*    Pack encoder output parameters to octet structure according
*    importance table and AMR file storage format according to
*    RFC 3267.
* Returns:
*    number of octets
*/
static INT32 EncoderMMS( enum Mode mode, INT16 *param, UINT8 *stream, 
					   enum TXFrameType frame_type, enum Mode speech_mode )
{
	INT32 j = 0, k;
	INT16 *mask;
	
	memset(stream, 0, block_size[mode]);
	
	*stream = toc_byte[mode];
	stream++;
	
	if ( mode == 15 ) 
	{
		return 1;
	}
	else if ( mode == MRDTX )
	{
		mask = order_MRDTX;
		
		for ( j = 1; j < 36; j++ )
		{
			if ( param[ * mask] & *( mask + 1 ) )
				*stream += 0x01;
			mask += 2;
			
			if ( j % 8 )
				*stream <<= 1;
			else
				stream++;
		}
		
		/* add SID type information */
		if ( frame_type == TX_SID_UPDATE )
			*stream += 0x01;
		*stream <<= 3;
		
		/* speech mode indication */
		*stream += ( UINT8 )(speech_mode & 0x0007);
		
		*stream <<= 1;
		
		/* don't shift at the end of the function */
		return 6;
	}
	else if ( mode == MR475 ) 
	{
		mask = order_MR475;
		
		for ( j = 1; j < 96; j++ ) 
		{
			if ( param[ * mask] & *( mask + 1 ) )
				*stream += 0x01;
			mask += 2;
			
			if ( j % 8 )
				*stream <<= 1;
			else
				stream++;
		}
	}
	else if ( mode == MR515 ) 
	{
		mask = order_MR515;
		
		for ( j = 1; j < 104; j++ ) 
		{
			if ( param[ * mask] & *( mask + 1 ) )
				*stream += 0x01;
			mask += 2;
			
			if ( j % 8 )
				*stream <<= 1;
			else
				stream++;
		}
	}
	else if ( mode == MR59 ) 
	{
		mask = order_MR59;
		
		for ( j = 1; j < 119; j++ ) 
		{
			if ( param[ * mask] & *( mask + 1 ) )
				*stream += 0x01;
			mask += 2;
			
			if ( j % 8 )
				*stream <<= 1;
			else
				stream++;
		}
	}
	else if ( mode == MR67 ) 
	{
		mask = order_MR67;
		
		for ( j = 1; j < 135; j++ )
		{
			if ( param[ * mask] & *( mask + 1 ) )
				*stream += 0x01;
			mask += 2;
			
			if ( j % 8 )
				*stream <<= 1;
			else
				stream++;
		}
	}
	else if ( mode == MR74 ) 
	{
		mask = order_MR74;
		
		for ( j = 1; j < 149; j++ )
		{
			if ( param[ * mask] & *( mask + 1 ) )
				*stream += 0x01;
			mask += 2;
			
			if ( j % 8 )
				*stream <<= 1;
			else
				stream++;
		}
	}
	else if ( mode == MR795 )
	{
		mask = order_MR795;
		
		for ( j = 1; j < 160; j++ ) 
		{
			if ( param[ * mask] & *( mask + 1 ) )
				*stream += 0x01;
			mask += 2;
			
			if ( j % 8 )
				*stream <<= 1;
			else
				stream++;
		}
	}
	else if ( mode == MR102 ) 
	{
		mask = order_MR102;
		
		for ( j = 1; j < 205; j++ )
		{
			if ( param[ * mask] & *( mask + 1 ) )
				*stream += 0x01;
			mask += 2;
			
			if ( j % 8 )
				*stream <<= 1;
			else
				stream++;
		}
	}
	else if ( mode == MR122 )
	{
		mask = order_MR122;
		
		for ( j = 1; j < 245; j++ ) 
		{
			if ( param[ * mask] & *( mask + 1 ) )
				*stream += 0x01;
			mask += 2;
			
			if ( j % 8 )
				*stream <<= 1;
			else
				stream++;
		}
	}
	
	/* shift remaining bits */
	k = j % 8;
	if ( k )
	{
		*stream <<= ( 8 - k );
	}
	return( (INT32)block_size[mode] );
}


/*
* Sid_Sync_reset
*
*
* Parameters:
*    st                O: state structure
*
* Function:
*    Initializes state memory
*
* Returns:
*    void
*/
static void Sid_Sync_reset( AMR_Encode_State *st )
{
	st->sid_update_counter = 3;
	st->sid_handover_debt = 0;
	st->prev_ft = TX_SPEECH_GOOD;
}


/*
* Encoder_Interface_Encode
*
*
* Parameters:
*    st                I: pointer to state structure
*    mode              I: Speech Mode
*    speech            I: Input speech
*    serial            O: Output octet structure 3GPP or
*                         ETSI serial stream
*    force_speech      I: Force speech in DTX
*
* Function:
*    Encoding and packing one frame of speech
*
* Returns:
*    number of octets
*/
INT32 Encoder_Interface_Encode( void *st, enum Mode mode, INT16 *speech, UINT8 *serial, INT32 force_speech)
/*
#ifndef ETSI
UINT8 *serial,

  #else
  INT16 *serial,
  #endif
  
	INT32 force_speech )
*/
{
	INT16 prm[PRMNO_MR122];   /* speech parameters, max size */
	const INT16 *homing;   /* pointer to homing frame */
	INT16 homing_size;   /* frame size for homing frame */
	
	
	AMR_Encode_State * s;
	enum TXFrameType txFrameType;   /* frame type */
	
	INT32 i, noHoming = 0;
	
	
	/*
    * used encoder mode,
    * if used_mode == -1, force VAD on
    */
	enum Mode used_mode = (Mode)-force_speech;
	
	
	s = ( AMR_Encode_State * )st;
	
    /*
	* Checks if all samples of the input frame matches the encoder
	* homing frame pattern, which is 0x0008 for all samples.
	*/
	for ( i = 0; i < 160; i++ ) 
	{
		noHoming = speech[i] ^ 0x0008;
		
		if ( noHoming )
			break;
	}
	
	if (noHoming)
	{
		Speech_Encode_Frame( s->encoderState, mode, speech, prm, &used_mode );
	}
	else
	{
		switch ( mode )
		{
		case MR122:
            homing = dhf_MR122;
            homing_size = 18;
            break;
			
		case MR102:
            homing = dhf_MR102;
            homing_size = 12;
            break;
			
		case MR795:
            homing = dhf_MR795;
            homing_size = 8;
            break;
			
		case MR74:
            homing = dhf_MR74;
            homing_size = 7;
            break;
			
		case MR67:
            homing = dhf_MR67;
            homing_size = 7;
            break;
			
		case MR59:
            homing = dhf_MR59;
            homing_size = 7;
            break;
			
		case MR515:
            homing = dhf_MR515;
            homing_size = 7;
            break;
			
		case MR475:
            homing = dhf_MR475;
            homing_size = 7;
            break;
			
		default:
            homing = NULL;
            homing_size = 0;
            break;
		}
		for( i = 0; i < homing_size; i++)
		{
			prm[i] = homing[i];
		}
		/* rest of the parameters are zero */
		memset(&prm[homing_size], 0, (PRMNO_MR122 - homing_size) << 1);
		used_mode = mode;
	}
	if ( used_mode == MRDTX ) 
	{
		s->sid_update_counter--;
		
		if ( s->prev_ft == TX_SPEECH_GOOD ) 
		{
			txFrameType = TX_SID_FIRST;
			s->sid_update_counter = 3;
		}
		else 
		{
			/* TX_SID_UPDATE or TX_NO_DATA */
			if ( ( s->sid_handover_debt > 0 ) && ( s->sid_update_counter > 2 ) ) 
			{
			/*
			* ensure extra updates are properly delayed after
			* a possible SID_FIRST
				*/
				txFrameType = TX_SID_UPDATE;
				s->sid_handover_debt--;
			}
			else 
			{
				if ( s->sid_update_counter == 0 ) 
				{
					txFrameType = TX_SID_UPDATE;
					s->sid_update_counter = 8;
				}
				else
				{
					txFrameType = TX_NO_DATA;
					used_mode = (Mode)15;
				}
			}
		}
	}
	else 
	{
		s->sid_update_counter = 8;
		txFrameType = TX_SPEECH_GOOD;
	}
	s->prev_ft = txFrameType;
	
	if ( noHoming == 0 )
	{
		Speech_Encode_Frame_reset( s->encoderState, s->dtx );
		Sid_Sync_reset( s );
	}
	
	/*
	#ifndef ETSI
	#ifdef IF2
	return Encoder3GPP( used_mode, prm, serial, txFrameType, mode );
	
	  #else
	*/
	return EncoderMMS( used_mode, prm, serial, txFrameType, mode );
	
	/*
	#endif
	#else
	
	  Prm2Bits( used_mode, prm, &serial[1] );
	  serial[0] = ( INT16 )txFrameType;
	  serial[245] = ( INT16 )mode;
	  return 500;
	  #endif
	*/
	
}


/*
* Encoder_Interface_init
*
*
* Parameters:
*    dtx               I: DTX flag
*
* Function:
*    Allocates state memory and initializes state memory
*
* Returns:
*    pointer to encoder interface structure
*/
void * Encoder_Interface_init( INT32 dtx )
{
	AMR_Encode_State * s = NULL;
	
	/* allocate memory */
	s = ( AMR_Encode_State * ) new AMR_Encode_State;
	if ( s == NULL )
	{
		return NULL;
	}
	s->encoderState = Speech_Encode_Frame_init( dtx );
	Sid_Sync_reset( s );
	s->dtx = dtx;
	return s;
}


/*
* DecoderInterfaceExit
*
*
* Parameters:
*    state             I: state structure
*
* Function:
*    The memory used for state memory is freed
*
* Returns:
*    Void
*/
void Encoder_Interface_exit( void *state )
{
	AMR_Encode_State * s;
	s = ( AMR_Encode_State * )state;
	
	/* mcFree memory */
//	Speech_Encode_Frame_exit( &s->encoderState );
	delete s->encoderState;
	delete s;
	state = NULL;
}

⌨️ 快捷键说明

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