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

📄 vmodem.cpp

📁 Voice Over IP - Server, Client Model
💻 CPP
字号:
#include  <Tapi.h> 
#include <malloc.h>
#include <jni.h>
#include<mmsystem.h>
#include "vmodem.h"

#define tapiVersionCur  (MAKELONG(4,1))

HLINEAPP hlineapp;
HLINE  hline;
HCALL hcall;
HANDLE handle;
MSG  msg;
int sts=0;
BOOL msgstatus=false;

HWAVEOUT hwout;
WAVEHDR wh;	
HWAVEIN hin;
WAVEHDR wh1;


UINT	WOutId=0,WInId;


WAVEFORMATEX  getFormat()
	{
		WAVEFORMATEX hwf;		
		hwf.nChannels=1;
		hwf.nSamplesPerSec=8000;
		hwf.cbSize=0;
		hwf.wBitsPerSample=8;
		hwf.nBlockAlign=(hwf.wBitsPerSample>>3 )* hwf.nChannels;
		hwf.wFormatTag=WAVE_FORMAT_PCM;
		hwf.nAvgBytesPerSec=hwf.nBlockAlign*hwf.nSamplesPerSec;
		return hwf;
	}


void getMediaIn()
		{
		LPVARSTRING lpVarString;       
		DWORD size=sizeof(VARSTRING)+1024;
        lpVarString=(LPVARSTRING)malloc(size);                	
		lpVarString->dwTotalSize=size;	
		if ( !(lineGetID(0,0,hcall,LINECALLSELECT_CALL,lpVarString,"wave/in")))             
	  	{			
		lpVarString=(LPVARSTRING)realloc(lpVarString,lpVarString->dwNeededSize);   	
		lpVarString->dwTotalSize=lpVarString->dwNeededSize;
		lineGetID(0,0,hcall,LINECALLSELECT_CALL,lpVarString,"wave/in");				     								
	  	}                      
	 	WInId = *((LPUINT)((LPBYTE) lpVarString +
  			(lpVarString -> dwStringOffset)));
		free(lpVarString);		
		
	 	}		

void getMediaOut()
		{
		LPVARSTRING lpVarString;       
		DWORD size=sizeof(LPVARSTRING)+1024;
		lpVarString=(LPVARSTRING)malloc(size);                	
		lpVarString->dwTotalSize=size;	
		if ( !(lineGetID(0,0,hcall,LINECALLSELECT_CALL,lpVarString,"wave/out")))             
	  	{			
		lpVarString=(LPVARSTRING)realloc(lpVarString,lpVarString->dwNeededSize);   	
		lpVarString->dwTotalSize=lpVarString->dwNeededSize;
		lineGetID(0,0,hcall,LINECALLSELECT_CALL,lpVarString,"wave/out");				     										
	  	}                      
		WOutId = *((LPUINT)((LPBYTE) lpVarString +
  			(lpVarString -> dwStringOffset)));
		free(lpVarString);	
		sts=WOutId;

		
		}

void CALLBACK lineCallback(DWORD hdevice,DWORD dwmsg,DWORD dwCallbackInstance,DWORD dwparam1,DWORD dwparam2,DWORD dwparam3)
 {
   if(dwmsg == LINE_CALLSTATE && dwparam1 == LINECALLSTATE_CONNECTED)
    {
      sts=2;
	  msgstatus=true;
	  getMediaIn();
	  getMediaOut();
	  
    }
   else if(dwmsg==LINE_CALLSTATE && dwparam1 == LINECALLSTATE_IDLE)
    {
      sts=3;
    }
   else if (dwmsg==LINE_CALLSTATE && dwparam1 == LINECALLSTATE_DIALING)
   {	  
      sts=1;
   }
 
}


LINEDEVCAPS * Getdevcaps(HLINEAPP  hlineapp, DWORD  dwdeviceID, LPDWORD lpdwapiversion)
   {
     LINEDEVCAPS *plinedevcaps;
     LINEEXTENSIONID  extensionID;
     lineNegotiateAPIVersion(hlineapp,dwdeviceID,0x10004,0x10004,lpdwapiversion,&extensionID);
     plinedevcaps=(LINEDEVCAPS*)malloc(sizeof(LINEDEVCAPS));

     lineGetDevCaps(hlineapp,dwdeviceID, *lpdwapiversion, 0 , plinedevcaps);

     if(plinedevcaps->dwNeededSize > plinedevcaps->dwTotalSize )
      {
        plinedevcaps=(LINEDEVCAPS*)realloc(plinedevcaps,plinedevcaps->dwNeededSize);
        plinedevcaps->dwTotalSize=plinedevcaps->dwNeededSize;
        lineGetDevCaps(hlineapp,dwdeviceID,*lpdwapiversion,0,plinedevcaps);
      }
   return  plinedevcaps;
  }


JNIEXPORT void JNICALL Java_vmodem_init(JNIEnv *env, jobject obj)
{
			
	DWORD   dwnumdevs;
	lineInitialize(&hlineapp,GetModuleHandle(NULL),lineCallback,"VOIP",&dwnumdevs);
	LINEDEVCAPS  *pLinedevcaps;    
    DWORD  dwapiversion;   
	pLinedevcaps=Getdevcaps(hlineapp,0,&dwapiversion);
	free(pLinedevcaps);	
	lineOpen(hlineapp,0,&hline,dwapiversion,0,0,LINECALLPRIVILEGE_OWNER,LINEMEDIAMODE_INTERACTIVEVOICE,NULL);
	lineSetStatusMessages(hline,LINEDEVSTATE_RINGING | LINEDEVSTATE_CONNECTED | LINEDEVSTATE_DISCONNECTED | LINEDEVSTATE_OTHER,0);	
}



void message()
{
while(!msgstatus)
     {
      if(GetMessage(&msg,NULL,0,0))
		DispatchMessage(&msg);
     }		
}


void lineCall(const char * dialno)
{
	unsigned long Exitcode;

	ZeroMemory(&wh,sizeof(WAVEHDR));
	ZeroMemory(&wh1,sizeof(WAVEHDR));
	LINECALLPARAMS linecallparams;	
	memset(&linecallparams,0,sizeof(LINECALLPARAMS));
	linecallparams.dwTotalSize=sizeof(LINECALLPARAMS);
	linecallparams.dwMinRate=2400;
	linecallparams.dwMaxRate=57600;
	linecallparams.dwMediaMode=LINEMEDIAMODE_INTERACTIVEVOICE;
	lineMakeCall(hline,&hcall,dialno,0,&linecallparams);
	handle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)message,0,0,&Exitcode);

}

JNIEXPORT void JNICALL Java_vmodem_uninit(JNIEnv *env, jobject obj)
{
		lineClose(hline); 
        lineShutdown(hlineapp);
}

JNIEXPORT void JNICALL Java_vmodem_dial(JNIEnv *env, jobject obj, jstring str)
{
	const char * dialno;
	unsigned char b[5]="true";
	dialno=env->GetStringUTFChars(str,&b[0]);	
	env->ReleaseStringUTFChars(str,dialno);	
	lineCall(dialno);
}

JNIEXPORT jint  JNICALL Java_vmodem_getstatus(JNIEnv *env, jobject obj)
{
			return sts;
}

JNIEXPORT jbyteArray JNICALL Java_vmodem_getvoice(JNIEnv *e, jobject obj)
{
	
		signed char *samples=(signed char*)malloc(8000);
		
		jbyteArray ja=e->NewByteArray(8000);
		jbyte *jb;jboolean bol=false; 		
		WAVEFORMATEX format = getFormat();
	    waveInOpen(&hin,2,&format,0,0,WAVE_MAPPED);        	
		waveInStart(hin);
		wh.dwBufferLength=8000;
		wh.lpData=(char*)samples;
		waveInPrepareHeader(hin,&wh,sizeof(wh));  
		waveInAddBuffer(hin,&wh,sizeof(wh));
		Sleep(1000);		
		waveInUnprepareHeader(hin,&wh,sizeof(wh));
		waveInStop(hin);	
		waveInClose(hin);  		 		 
	
		e->SetByteArrayRegion(ja,0,8000,samples);

		free(samples);
		return ja;
}

JNIEXPORT jint JNICALL Java_vmodem_setvoice(JNIEnv *e, jobject obj, jbyteArray s)
{
		int r=0;			
		signed char *jb=(signed char*)malloc(8000);
		jboolean bol=true; 
		sts=e->GetArrayLength(s);
		jb=e->GetByteArrayElements(s,&bol);
		WAVEFORMATEX format = getFormat();
		waveOutOpen(&hwout,2,&format,0,0,WAVE_MAPPED);
		wh1.dwBufferLength=8000;
		wh1.lpData=(char*)jb;
		waveOutPrepareHeader(hwout,&wh1,sizeof(wh1));
		waveOutWrite(hwout,&wh1,sizeof(wh1));		
		while(waveOutUnprepareHeader(hwout,&wh1,sizeof(wh1))==WAVERR_STILLPLAYING)
			Sleep(50);		 
		 waveOutClose(hwout);
		 return 0;			
}


JNIEXPORT jbyteArray JNICALL Java_vmodem_test(JNIEnv *e, jobject obj, jbyteArray s)
{


		jbyteArray ja=e->NewByteArray(5);
	/*	jbyte *jb;jboolean bol=false; 
		sts=e->GetArrayLength(s);
		jb=e->GetByteArrayElements(s,&bol);
		e->SetByteArrayRegion(ja,0,4,jb);*/

		
		return 	ja;	
}

⌨️ 快捷键说明

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