📄 ms_create.c
字号:
#include "common.h"#ifndef NO_VOXPROMPT#define VOXPROMPTS_MAX 12#define VOXPROMPT_INIT_POS -1int _nPlayIPAddr = FALSE;LONG PlayIPAddress(char *szInStr, DWORD dwInit) { int adwNumIndex[VOXPROMPTS_MAX] = { 0 /*1*/, 2979 /*2*/, 5846 /*3*/, 8720 /*4*/, 11916 /*5*/, 14518 /*6*/, 18091 /*7*/, 21504 /*8*/, 23937 /*9*/, 27727 /*0*/, 30979 /*.*/, 32977 /*end*/ }; // 32978 byte buffer conversion: seconds * 8029.705 static FILE *fpIn; static int bFileOpened=FALSE; static SHORT *asVoiceBuffer; static int bBufferAllocated=FALSE; static int bPCMStreamCreated=FALSE; static int nCurrBuf=VOXPROMPT_INIT_POS; static int nStart=0, nEnd=0, nSize=0; static char szLocalString[16]; static int nCurrChar=0; static int nDelayTimer=0; static int nMaxBuffer=0; static H_SYS_BUFFER hAudioStream = 0; // struct timespec tsTime; OCTET oData; int i=0; uAudioStreamParam uParam; LONG lCreateErrCode; AUDIO_OOB_SIGNAL xOOB; extern void HandsetGenerateTone(OCTET , DWORD , BOOL ); if (dwInit && _nPlayIPAddr) { // don't re-init while playing return AUDIO_CHANNEL_MESSAGE_ERROR_DEV_MULTIPLE; } if (dwInit) { if (szInStr != NULL) { strncpy (szLocalString, szInStr, 16); szLocalString[15]='\0'; // make sure it's null terminated } else { printf ("ERR: invalid string\n"); return AUDIO_CHANNEL_MESSAGE_ERROR_GENERAL; } HandsetGenerateTone(1, AUDIO_DIALTONE, OFF); nCurrBuf = 0; // -1 is off state, 0 is on state nCurrChar = 0; _nPlayIPAddr = TRUE; } if (nCurrBuf == VOXPROMPT_INIT_POS) return AUDIO_CHANNEL_MESSAGE_NOERR; if (!bFileOpened) { fpIn = fopen ("voxprmts.pcm", "rb"); if (!fpIn) { printf ("ERR: Error opening voxprmpt.pcm\n"); return AUDIO_CHANNEL_MESSAGE_ERROR_GENERAL; } bFileOpened=TRUE; } if (!bBufferAllocated) { for (i=0; i<VOXPROMPTS_MAX-1; i++) { if (adwNumIndex[i+1]-adwNumIndex[i] > nMaxBuffer) nMaxBuffer = adwNumIndex[i+1]-adwNumIndex[i]; } printf ("DBG: max voxprompt buffer: %d\n", nMaxBuffer); asVoiceBuffer = (SHORT *) calloc (nMaxBuffer+1, sizeof(SHORT)); if (!asVoiceBuffer) { printf ("ERR: Error getting buffer\n"); return AUDIO_CHANNEL_MESSAGE_ERROR_GENERAL; } else { bBufferAllocated = TRUE; } } // check vcx_lPrintProcessChannel for 0 channel if (!bPCMStreamCreated) { /* Create Audio Decoder Instance */ uParam.xDecoder.eCodecType = AUDIO_CODEC_PCM; uParam.xDecoder.dwPacketDuration = 10; uParam.xDecoder.dwJitterBufferDuration = DEFAULT_AUDIO_RX_JITTER; lCreateErrCode = AudioStreamCreate(&hAudioStream, AUDIO_STREAM_DECODE, &uParam); if (lCreateErrCode != AUDIO_CHANNEL_MESSAGE_NOERR) { printf ("ERR: Unable to create PCM stream, err code: %ld\n", lCreateErrCode); return AUDIO_CHANNEL_MESSAGE_ERROR_GENERAL; } /* Associate Audio Decoder Instance */ lCreateErrCode = AudioStreamAssocChannel(hAudioStream, 1); if (lCreateErrCode != AUDIO_CHANNEL_MESSAGE_NOERR) { printf ("ERR: Unable to associate PCM stream, err code: %ld\n", lCreateErrCode); return AUDIO_CHANNEL_MESSAGE_ERROR_GENERAL; } /* Activate Audio Decoder Instance */ lCreateErrCode = AudioStreamUpdStatus(hAudioStream, TRUE); if (lCreateErrCode != AUDIO_CHANNEL_MESSAGE_NOERR) { printf ("ERR: Unable to activate PCM stream, err code: %ld\n", lCreateErrCode); return AUDIO_CHANNEL_MESSAGE_ERROR_GENERAL; } bPCMStreamCreated=TRUE; } if ((nCurrBuf > nSize) || (nCurrBuf == 0)) { // character done or new string if (szLocalString[nCurrChar] != '\0') { // next char case int nIdx; if ((nDelayTimer-=10) > 0) { // play first 80 samples (of bg noise) return AUDIO_CHANNEL_MESSAGE_ERROR_GENERAL; } nDelayTimer = 150; // in milliseconds nCurrBuf = 0; // next char case nIdx = szLocalString[nCurrChar] - '1'; if (nIdx == -1) nIdx = 9; /* 0 case */ else if (nIdx < 0) nIdx = 10; /* dot */ printf ("DBG: voxprompt digit %c\n", szLocalString[nCurrChar]); nStart = adwNumIndex[nIdx]; nEnd = adwNumIndex[nIdx+1]; nSize = nEnd - nStart; // printf ("DBG: nStart is %d, nEnd is %d, nSize is %d\n", nStart, nEnd, nSize); if (fseek(fpIn, nStart, SEEK_SET)==-1) { printf ("ERR: fseek err: nStart is %d\n", nStart); return AUDIO_CHANNEL_MESSAGE_ERROR_GENERAL; } bzero(asVoiceBuffer, (nMaxBuffer+1)<<1); // clear trailing for (i=0; i<nSize; i++) { if (!fread(&oData, 1, 1, fpIn)) { return AUDIO_CHANNEL_MESSAGE_ERROR_GENERAL; } asVoiceBuffer[i]= ((SHORT)oData)<<6; // volume here } // fill buffer nCurrChar++; } else { // free resources, last char done case nCurrBuf = VOXPROMPT_INIT_POS; _nPlayIPAddr = FALSE; /* Deactivate Audio Decoder Instance */ lCreateErrCode = AudioStreamUpdStatus(hAudioStream, FALSE); if (lCreateErrCode != AUDIO_CHANNEL_MESSAGE_NOERR) { printf ("ERR: Unable to deactivate PCM stream, err code: %ld\n", lCreateErrCode); return AUDIO_CHANNEL_MESSAGE_ERROR_GENERAL; } /* Destroy Audio Decoder Instance */ lCreateErrCode = AudioStreamDestroy(hAudioStream); if (lCreateErrCode != AUDIO_CHANNEL_MESSAGE_NOERR) { printf ("ERR: Unable to destroy PCM stream, err code: %ld\n", lCreateErrCode); return AUDIO_CHANNEL_MESSAGE_ERROR_GENERAL; } bPCMStreamCreated = FALSE; free(asVoiceBuffer); bBufferAllocated = FALSE; fclose (fpIn); bFileOpened=FALSE; return AUDIO_CHANNEL_MESSAGE_NOERR; } } xOOB.dwTimeStamp = 0; // dont care xOOB.wSeqNum = 0; // dont care xOOB.wTSI = 0; // dont care AudioPutDecodeData(hAudioStream, &(asVoiceBuffer[nCurrBuf]), 160, &xOOB); nCurrBuf+=80; return AUDIO_CHANNEL_MESSAGE_NOERR;}#endif // NO_VOXPROMPTH_MEDIA_STREAM MediaStreamCreate(E_PROTOCOL_MEDIA eType, DWORD dwReferenceId){ MEDIA_STREAM *pStream; ASSERT(dwReferenceId != 0); pStream = MediaStreamFind(dwReferenceId); if (pStream != NULL) { MS_LOG("MediaStreamCreate(): Stream %lx exists\n", dwReferenceId); pStream = NULL; } else { pStream = calloc(1, sizeof(MEDIA_STREAM)); pStream->dwId = dwReferenceId; pStream->eType = eType; if (pStream) { ASSERT(g_pdllStream); MS_LOG("MediaStreamCreate(): %lx, ID %lx\n", (DWORD)pStream, dwReferenceId); MS_LOCK(); DLLIST_append(g_pdllStream, pStream); MS_UNLOCK(); } } return (H_MEDIA_STREAM)pStream;}void _MS_Destroy(void *pMS){ MEDIA_STREAM *pStream = (MEDIA_STREAM*)pMS; switch (pStream->eType) { case PROTOCOL_MEDIA_AUDIO: MediaStreamDestroyAudInstance(pStream->pTx); MediaStreamDestroyAudInstance(pStream->pRx); pStream->pTx = NULL; pStream->pRx = NULL; break;#ifdef MEDIASTREAM_T38_SUPPORT case PROTOCOL_MEDIA_DATA: ASSERT(pStream->pT38); close(pStream->pT38->nSocket); AudioStreamDestroy(pStream->pT38->hTxStream); AudioStreamDestroy(pStream->pT38->hRxStream); break;#endif default: break; } free(pStream);}voidMediaStreamDestroy(H_MEDIA_STREAM pStream){ H_MEDIA_STREAM hStream; MS_LOCK(); MS_LOG("MediaStreamDestroy() %lx, total number %ld\n", pStream->dwId, DLLIST_count(g_pdllStream)); ProtocolReleaseResource(pStream->dwId, PROTOCOL_TXRX_TXRX); DLLIST_head(g_pdllStream);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -