📄 sportstervoice.c
字号:
write(fd, buf, 1); fclose(fp); fclose(gsmfp); /* untoast the gsm file */ String toast = String(TOAST_PATH) + " -dlc " + gsmFile + " > " + rawFile; system(toast.cstr()); /* convert to wav */ FILE* wavfp = fopen(wavFile.cstr(), "w"); FILE* rawfp = fopen(rawFile.cstr(), "r"); struct stat mystat; stat(rawFile.cstr(), &mystat); numRead = mystat.st_size; int recBitsPerSample = 16; int recSamplesPerSec = 8000; int recNumChannels = 1; //double recSecFraction = 0.25; char groupID[8], riffType[5], chunkID[5]; long chunkSize; short wFormatTag; unsigned short wChannels; unsigned long dwSamplesPerSec; unsigned long dwAvgBytesPerSec; unsigned short wBlockAlign; unsigned short wBitsPerSample; int bufSize = numRead; unsigned char* recBuf = new unsigned char[bufSize]; strcpy(groupID, "RIFF"); strcpy(riffType, "WAVE"); strcpy(chunkID, "fmt "); chunkSize = 16; wFormatTag = 1; wChannels = recNumChannels; dwSamplesPerSec = recSamplesPerSec; wBlockAlign = recNumChannels*recBitsPerSample/8; dwAvgBytesPerSec = recSamplesPerSec*wBlockAlign; wBitsPerSample = recBitsPerSample; fwrite(groupID,sizeof(char),8,wavfp); fwrite(riffType,sizeof(char),4,wavfp); fwrite(chunkID,sizeof(char),4,wavfp); fwrite(&chunkSize,sizeof(long),1,wavfp); fwrite(&wFormatTag,sizeof(short),1,wavfp); fwrite(&wChannels,sizeof(unsigned short),1,wavfp); fwrite(&dwSamplesPerSec,sizeof(unsigned long),1,wavfp); fwrite(&dwAvgBytesPerSec,sizeof(unsigned long),1,wavfp); fwrite(&wBlockAlign,sizeof(unsigned short),1,wavfp); fwrite(&wBitsPerSample,sizeof(unsigned short),1,wavfp); strcpy(chunkID, "data"); chunkSize = numRead; fwrite(chunkID,sizeof(char),4,wavfp); fwrite(&chunkSize,sizeof(long),1,wavfp); for(int i=0; i< numRead; i+= bufSize) { fread(recBuf, sizeof(char), bufSize, rawfp); fwrite(recBuf, sizeof(char), bufSize, wavfp); } fclose(rawfp); fclose(wavfp); /* done with conversion */ String newBuf; newBuf = readLine(); while(okMessages.find(newBuf) == okMessages.end() && errorMessages.find(newBuf) == errorMessages.end()) { newBuf = readLine(); } writeLine("at#vls=0"); writeLine("at#cls=0"); writeLine(MODEM_RESET); writeLine(MODEM_INIT);}#endif#ifdef VOICEvoid SportsterVoice::playFile(String& file, target where){ unsigned char buf[1024]; String newBuf; FILE* fp; struct pollfd pollRead[1]; struct pollfd pollWrite[1]; pollRead[0].fd = fd; pollRead[0].events = POLLIN; pollWrite[0].fd = fd; pollWrite[0].events = POLLOUT; if( (fp = fopen(file.cstr(), "r")) == NULL) { return; } writeLine("AT&F1"); /* select voice mode */ writeLine("at#cls=8"); writeLine("AT #VSM=128,8000"); /* select speaker output device */ switch(where) { case line: writeLine("AT #VLS=0"); break; case handset: writeLine("AT #VLS=1"); break; case speaker: writeLine("AT #VLS=2"); break; case microphone: writeLine("AT #VLS=3"); break; case line_speaker: writeLine("AT #VLS=4"); break; case speakerphone: writeLine("AT #VLS=6"); break; } writeLine("at#vtx"); while(!feof(fp)) { int n = fread(buf, sizeof(unsigned char), 1, fp); if(n == 1) { if(buf[0] == DLE) { write(fd, buf, n); } write(fd, buf, n); } } char temp[4]; temp[0] = DLE; temp[1] = ETX; write(fd, temp, 2); fclose(fp); newBuf = readLine(); while(okMessages.find(newBuf) == okMessages.end() && errorMessages.find(newBuf) == errorMessages.end()) { newBuf = readLine(); } writeLine("at#vls=0"); writeLine("at#cls=0"); writeLine(MODEM_RESET); writeLine(MODEM_INIT);}#endif#ifdef VOICEvoid SportsterVoice::answerCall(String& greetingFile, String& messageFile){ String gsmFile = messageFile + ".gsm"; String wavFile = messageFile + ".wav"; String rawFile = messageFile + ".raw"; writeLine("AT&F1"); /* select voice mode */ writeLine("AT #CLS=8"); writeLine("AT #VSM=128,8000"); //writeLine("AT S41=4"); /* select telephone line device */ writeLine("AT #VLS=0"); unsigned char buf[1024]; String newBuf; FILE* fp; if( (fp = fopen(greetingFile.cstr(), "r")) == NULL) { return; } writeLine("AT A"); writeLine("AT #VTX"); while(!feof(fp)) { int n = fread(buf, sizeof(unsigned char), 1, fp); if(n == 1) { if(buf[0] == DLE) { write(fd, buf, n); } write(fd, buf, n); } } char temp[4]; temp[0] = DLE; temp[1] = ETX; write(fd, temp, 2); newBuf = readLine(); while(okMessages.find(newBuf) == okMessages.end() && errorMessages.find(newBuf) == errorMessages.end()) { newBuf = readLine(); } fclose(fp); writeLine("AT #VTS=\"{3,10}\""); /* greeting done, record message */ fp = fopen(messageFile.cstr(), "w"); FILE* gsmfp = fopen(gsmFile.cstr(), "w");#ifdef SILENCE writeLine("AT #VSP=20"); writeLine("AT #VSD=1"); writeLine("AT #VSS=1");#endif writeLine("AT #VRX"); bool bunny = true; int numRead = 0; int numFrame = 3000; int bytesPerFrame = 38; bool thisFrameQuiet = false; bool lastFrameQuiet = false; bool firstByteQuiet = false; bool secndByteQuiet = false; int numQuietFrame = 0; int maxQuietFrame = 100; for(int i=0; (i<numFrame) && bunny; i++) {#ifdef DEBUG printf("Frame %d: ", i);#endif lastFrameQuiet = thisFrameQuiet; thisFrameQuiet = false; for(int j=0; (j<bytesPerFrame); j++) { numRead = read(fd, buf, 1); if(numRead == 1) { if(buf[0] != DLE) { if(j == 0) { if(buf[0] == 0xb6) { firstByteQuiet = true; } else { firstByteQuiet = false; } } else if(j == 1) { if(buf[0] == 0xb6) { secndByteQuiet = true; } else { secndByteQuiet = false; } if( firstByteQuiet && secndByteQuiet ) { thisFrameQuiet = true; } else { thisFrameQuiet = false; } if(thisFrameQuiet && lastFrameQuiet) { numQuietFrame++; } else { numQuietFrame = 0; } if(numQuietFrame > maxQuietFrame) { bunny = false; } }#ifdef DEBUG printf("%02x", buf[0]);#endif fwrite(buf, sizeof(char), numRead, fp); if(j > 1 && j < (bytesPerFrame-3)) { fwrite(buf, sizeof(char), 1, gsmfp); } } else { numRead = read(fd, buf, 1); while(numRead != 1) { numRead = read(fd, buf, 1); } buf[1]=0; if(buf[0] == DLE) { printf("%02x", buf[0]); fwrite(buf, sizeof(unsigned char), 1, fp); fwrite(buf, sizeof(char), 1, gsmfp); } else { j--; } } } else { j--; } }#ifdef DEBUG printf("\n");#endif } buf[0]=0x10; write(fd, buf, 1); fclose(fp); fclose(gsmfp); /* untoast the gsm file */ String toast = String(TOAST_PATH) + " -dlc " + gsmFile + " > " + rawFile; system(toast.cstr()); /* convert to wav */ FILE* wavfp = fopen(wavFile.cstr(), "w"); FILE* rawfp = fopen(rawFile.cstr(), "r"); struct stat mystat; stat(rawFile.cstr(), &mystat); numRead = mystat.st_size; int recBitsPerSample = 16; int recSamplesPerSec = 8000; int recNumChannels = 1; //double recSecFraction = 0.25; char groupID[8], riffType[5], chunkID[5]; long chunkSize; short wFormatTag; unsigned short wChannels; unsigned long dwSamplesPerSec; unsigned long dwAvgBytesPerSec; unsigned short wBlockAlign; unsigned short wBitsPerSample; int bufSize = numRead; unsigned char* recBuf = new unsigned char[bufSize]; strcpy(groupID, "RIFF"); strcpy(riffType, "WAVE"); strcpy(chunkID, "fmt "); chunkSize = 16; wFormatTag = 1; wChannels = recNumChannels; dwSamplesPerSec = recSamplesPerSec; wBlockAlign = recNumChannels*recBitsPerSample/8; dwAvgBytesPerSec = recSamplesPerSec*wBlockAlign; wBitsPerSample = recBitsPerSample; fwrite(groupID,sizeof(char),8,wavfp); fwrite(riffType,sizeof(char),4,wavfp); fwrite(chunkID,sizeof(char),4,wavfp); fwrite(&chunkSize,sizeof(long),1,wavfp); fwrite(&wFormatTag,sizeof(short),1,wavfp); fwrite(&wChannels,sizeof(unsigned short),1,wavfp); fwrite(&dwSamplesPerSec,sizeof(unsigned long),1,wavfp); fwrite(&dwAvgBytesPerSec,sizeof(unsigned long),1,wavfp); fwrite(&wBlockAlign,sizeof(unsigned short),1,wavfp); fwrite(&wBitsPerSample,sizeof(unsigned short),1,wavfp); strcpy(chunkID, "data"); chunkSize = numRead; fwrite(chunkID,sizeof(char),4,wavfp); fwrite(&chunkSize,sizeof(long),1,wavfp); for(int i=0; i< numRead; i+= bufSize) { fread(recBuf, sizeof(char), bufSize, rawfp); fwrite(recBuf, sizeof(char), bufSize, wavfp); } fclose(rawfp); fclose(wavfp); /* done with conversion */ newBuf = readLine(); while(okMessages.find(newBuf) == okMessages.end() && errorMessages.find(newBuf) == errorMessages.end()) { newBuf = readLine(); } writeLine("AT H0"); //writeLine("at#vls=0"); writeLine("at#cls=0"); writeLine(MODEM_RESET); writeLine(MODEM_INIT); }#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -