📄 vmodem.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 + -