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

📄 ms_create.c

📁 DSP 播放语音文件例子
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -