• 基于DSP_CPLD_aP8942A_LM1791的语音控制


    语音驱动程序  drv_voice.c

    语音服务程序  srv_voice.c

    1、先运行初始化函数,主要是设置初始音量,并建立一个软件定时器来,以10ms的周期来调用语音播放函数。

     1 void srvVoiceInit()
     2 {
     3     T_SOFT_TIMER_HANDLE hSoftTimer;
     4     UINT16 usVoiceVolumeTunerAdjust;
     5 
     6     g_hVoiceDevHandle = osalDevOpen(GEN20_PROTO_VOICE_DEV_NAME);
     7     if (g_hVoiceDevHandle == INVALID_HANDLE)
     8     {
     9         LOG_ERROR_LOG(("srvVoiceInit failed at voice driver open.\r\n"));
    10     }
    11     else
    12     {
    13         /* Initialize voice play info structure, must before soft timer started. */
    14         /* TODO: read default voice from EEPROM */
    15         srvVoiSetDefaultVoiceType(VDVT_TYPE_A);
    16         //g_tVoicePlayInfo.eSwitchStatus = VPSS_VOICE_IDLE;
    17         gVoiPlayState = VPSS_VOICE_IDLE;
    18         gVoiInnerEvent = E_NULL;
    19         usVoiceVolumeTunerAdjust = 160;
    20         //gVoiceToSet = 54;
    21         srvSetVoiceVolume(63);
    22         osalDevIoctl(g_hVoiceDevHandle, VOICE_CTRL_RST_PLAYBACK_CLR , NULL);
    23         osalDevIoctl(g_hVoiceDevHandle, VOICE_CTRL_SET_VOICE_VOLUME, &usVoiceVolumeTunerAdjust);
    24 
    25         /* Create the soft timer for push button service, the handle is not needed. */
    26         if (OSAL_IS_RESULT_OK(osalTimCreateSoftTimer(&hSoftTimer, 10, STT_REPEAT, &srvVoicePlayTimerRoutine, NULL)))
    27         {
    28             if (OSAL_IS_RESULT_OK(osalTimStartSoftTimer(hSoftTimer)))
    29             {
    30                 g_hVoiceMode = 0;
    31             }
    32             else
    33             {
    34                 LOG_ERROR_LOG(("srvVoiceInit failed at SoftTimer start.\r\n"));
    35             }
    36         }
    37         else
    38         {
    39             LOG_ERROR_LOG(("srvVoiceInit failed at SoftTimer create.\r\n"));
    40         }
    41     }
    42 }

    2 语音播放函数,先根据状态来设置语音模式,再根据模式来播放语音

     1 static void srvVoicePlayTimerRoutine(void *pvParam)
     2 {
     3     /* Wait event and return immediately. */
     4     if(0 != g_hVoiceMode)
     5     {
     6         /* Some thing happened, adjust current voice play accordingly. */
     7         srvVoiUpdateVoicePlayInfo(g_hVoiceMode);
     8 
     9         /* Control voice play according to the information. */
    10         srvVoiPlayVoice();
    11         g_hVoiceMode = 0;
    12     }
    13     else
    14     {
    15         srvVoiPlayVoice();
    16     }
    17 
    18 }

    3 更新语音播放信息,根据语音模式来更新

    根据接收的语音事件来播放对应的语音片段,

    语音包括以下

    SRV_VOICE_PLAY_SYSTEM_START;系统启动声音

    SRV_VOICE_PLAY_OPERATION_DENIED;操作禁止声音

    SRV_VOICE_PLAY_TEST;测试声音

    SRV_VOICE_PLAY_MIN_OUTPUT;小档位声音

    SRV_VOICE_PLAY_MAX_OUTPUT;大档位声音

    SRV_VOICE_PLAY_OVER_CURRENT;过流警报声

    SRV_VOICE_PLAY_RECOVERABLE_FAULT;可恢复性错误声音

    SRV_VOICE_PLAY_NON_RECOVERABLE_FAULT;不可恢复性错误

    SRV_VOICE_PLAY_FAULT_REPLAY;错误重放

    SRV_VOICE_PLAY_SHOW_DEFAULT_VOICE;默认语音

      1 static void srvVoiUpdateVoicePlayInfo(UINT uVoiceEvent)
      2 {
      3     if ((uVoiceEvent & SRV_VOICE_PLAY_SYSTEM_START) == SRV_VOICE_PLAY_SYSTEM_START)
      4     {
      5         /* Play welcome voice 1 time in fixed volume 60. */
      6         gVoiInnerEvent  = E_PLAY_VOICE;
      7         g_tVoicePlayInfo.voiMode = VOI_MODE_REPEAT;
      8         g_tVoicePlayInfo.wCurrVoiceSection = VOICE_SECTION_FLASH_START;
      9         g_tVoicePlayInfo.usVoicePlayTimeIn10mS = VOICE_PLAY_DURATION_TIME_INFINITE;
     10         g_tVoicePlayInfo.usVoicePlayRepeat = 1;
     11         g_tVoicePlayInfo.usVoiceVolume = srvGetVoiceVolume();
     12         //g_tVoicePlayInfo.usVoiceStopTimeoutIn10mS = 3;
     13         g_tVoicePlayInfo.usVoiceStopIntervalTimeIn10mS = 10;
     14         //g_tVoicePlayInfo.eSwitchStatus = VPSS_VOICE_START_PLAY;
     15     }
     16 
     17     if ((uVoiceEvent & SRV_VOICE_PLAY_OPERATION_DENIED) == SRV_VOICE_PLAY_OPERATION_DENIED)
     18     {
     19         /* Play welcome voice 1 time in fixed volume 60. */
     20         gVoiInnerEvent  = E_PLAY_VOICE;
     21         g_tVoicePlayInfo.voiMode = VOI_MODE_REPEAT;
     22         g_tVoicePlayInfo.wCurrVoiceSection = VOICE_SECTION_OPERATION_DENIED;
     23         g_tVoicePlayInfo.usVoicePlayTimeIn10mS = VOICE_PLAY_DURATION_TIME_INFINITE;
     24         g_tVoicePlayInfo.usVoicePlayRepeat = 1;
     25         g_tVoicePlayInfo.usVoiceVolume = 60;
     26         //g_tVoicePlayInfo.usVoiceStopTimeoutIn10mS = 3;
     27         g_tVoicePlayInfo.usVoiceStopIntervalTimeIn10mS = 10;
     28         //g_tVoicePlayInfo.eSwitchStatus = VPSS_VOICE_START_PLAY;
     29     }
     30     if ((uVoiceEvent & SRV_VOICE_PLAY_TEST) == SRV_VOICE_PLAY_TEST)
     31     {
     32         /* TODO: */
     33         gVoiInnerEvent  = E_PLAY_VOICE;
     34         g_tVoicePlayInfo.voiMode = VOI_MODE_TIME_LIMITED;
     35         g_tVoicePlayInfo.wCurrVoiceSection = VOICE_SECTION_TEST_IN_PROGRESS;
     36         g_tVoicePlayInfo.usVoicePlayTimeIn10mS = VOICE_PLAY_DURATION_TIME_INFINITE;
     37         g_tVoicePlayInfo.usVoicePlayRepeat = VOICE_PLAY_REPEAT_INFINITE;
     38         g_tVoicePlayInfo.usVoiceVolume = srvGetVoiceVolume();
     39         //g_tVoicePlayInfo.usVoiceStopTimeoutIn10mS = 3;
     40         g_tVoicePlayInfo.usVoiceStopIntervalTimeIn10mS = 10;
     41         //g_tVoicePlayInfo.eSwitchStatus = VPSS_VOICE_START_PLAY;
     42     }
     43     if ((uVoiceEvent & SRV_VOICE_PLAY_MIN_OUTPUT) == SRV_VOICE_PLAY_MIN_OUTPUT)
     44     {
     45         gVoiInnerEvent  = E_PLAY_VOICE;
     46         g_tVoicePlayInfo.voiMode = VOI_MODE_REPEAT;
     47         g_tVoicePlayInfo.wCurrVoiceSection = g_tVoicePlayInfo.wVoiceDefaultMinOutput;
     48         g_tVoicePlayInfo.usVoicePlayTimeIn10mS = VOICE_PLAY_DURATION_TIME_INFINITE;
     49         g_tVoicePlayInfo.usVoicePlayRepeat = VOICE_PLAY_REPEAT_INFINITE;
     50         g_tVoicePlayInfo.usVoiceVolume = srvGetVoiceVolume();// VOICE_PLAY_CURRENT_VOICE_VOLUME;
     51         //g_tVoicePlayInfo.usVoiceStopTimeoutIn10mS = 3;
     52         g_tVoicePlayInfo.usVoiceStopIntervalTimeIn10mS = 30; // last 26
     53         //g_tVoicePlayInfo.eSwitchStatus = VPSS_VOICE_START_PLAY;
     54     }
     55     if ((uVoiceEvent & SRV_VOICE_PLAY_MAX_OUTPUT) == SRV_VOICE_PLAY_MAX_OUTPUT)
     56     {
     57         gVoiInnerEvent  = E_PLAY_VOICE;
     58         g_tVoicePlayInfo.voiMode = VOI_MODE_REPEAT;
     59         g_tVoicePlayInfo.wCurrVoiceSection = g_tVoicePlayInfo.wVoiceDefaultMaxOutput;
     60         g_tVoicePlayInfo.usVoicePlayTimeIn10mS = VOICE_PLAY_DURATION_TIME_INFINITE;
     61         g_tVoicePlayInfo.usVoicePlayRepeat = VOICE_PLAY_REPEAT_INFINITE;
     62         g_tVoicePlayInfo.usVoiceVolume = srvGetVoiceVolume(); //VOICE_PLAY_CURRENT_VOICE_VOLUME;
     63         //g_tVoicePlayInfo.usVoiceStopTimeoutIn10mS = 3;
     64         g_tVoicePlayInfo.usVoiceStopIntervalTimeIn10mS = 15; //last 10
     65         //g_tVoicePlayInfo.eSwitchStatus = VPSS_VOICE_START_PLAY;
     66     }
     67     if ((uVoiceEvent & SRV_VOICE_PLAY_OVER_CURRENT) == SRV_VOICE_PLAY_OVER_CURRENT)
     68     {
     69         /* TODO: */
     70         /* Play fatal error voice 1 time in fixed volume 60. */
     71         gVoiInnerEvent  = E_PLAY_VOICE;
     72         g_tVoicePlayInfo.voiMode = VOI_MODE_REPEAT;
     73         g_tVoicePlayInfo.wCurrVoiceSection = VOICE_SECTION_FATAL_ERROR;
     74         g_tVoicePlayInfo.usVoicePlayTimeIn10mS = VOICE_PLAY_DURATION_TIME_INFINITE;
     75         g_tVoicePlayInfo.usVoicePlayRepeat = 1;
     76         g_tVoicePlayInfo.usVoiceVolume = 60;
     77         //g_tVoicePlayInfo.usVoiceStopTimeoutIn10mS = 3;
     78         g_tVoicePlayInfo.usVoiceStopIntervalTimeIn10mS = 10;
     79         //g_tVoicePlayInfo.eSwitchStatus = VPSS_VOICE_START_PLAY;
     80     }
     81     if ((uVoiceEvent & SRV_VOICE_PLAY_RECOVERABLE_FAULT) == SRV_VOICE_PLAY_RECOVERABLE_FAULT)
     82     {
     83         /* Play fatal error voice 1 time in fixed volume 60. */
     84         gVoiInnerEvent  = E_PLAY_VOICE;
     85         g_tVoicePlayInfo.voiMode = VOI_MODE_REPEAT;
     86         g_tVoicePlayInfo.wCurrVoiceSection = VOICE_SECTION_FATAL_ERROR;
     87         g_tVoicePlayInfo.usVoicePlayTimeIn10mS = VOICE_PLAY_DURATION_TIME_INFINITE;
     88         g_tVoicePlayInfo.usVoicePlayRepeat = 1;//VOICE_PLAY_REPEAT_INFINITE;
     89         g_tVoicePlayInfo.usVoiceVolume = 60;
     90         //g_tVoicePlayInfo.usVoiceStopTimeoutIn10mS = 3;
     91         g_tVoicePlayInfo.usVoiceStopIntervalTimeIn10mS = 10;
     92         //g_tVoicePlayInfo.eSwitchStatus = VPSS_VOICE_START_PLAY;
     93     }
     94     if ((uVoiceEvent & SRV_VOICE_PLAY_NON_RECOVERABLE_FAULT) == SRV_VOICE_PLAY_NON_RECOVERABLE_FAULT)
     95     {
     96         /* Play fatal error voice 3 timeS in fixed volume 60. */
     97         gVoiInnerEvent  = E_PLAY_VOICE;
     98         g_tVoicePlayInfo.voiMode = VOI_MODE_REPEAT;
     99         g_tVoicePlayInfo.wCurrVoiceSection = VOICE_SECTION_FATAL_ERROR;
    100         g_tVoicePlayInfo.usVoicePlayTimeIn10mS = VOICE_PLAY_DURATION_TIME_INFINITE;
    101         g_tVoicePlayInfo.usVoicePlayRepeat = 1;//VOICE_PLAY_REPEAT_INFINITE;
    102         g_tVoicePlayInfo.usVoiceVolume = 60;
    103         //g_tVoicePlayInfo.usVoiceStopTimeoutIn10mS = 3;
    104         g_tVoicePlayInfo.usVoiceStopIntervalTimeIn10mS = 10;
    105         //g_tVoicePlayInfo.eSwitchStatus = VPSS_VOICE_START_PLAY;
    106     }
    107     if ((uVoiceEvent & SRV_VOICE_PLAY_FAULT_REPLAY) == SRV_VOICE_PLAY_FAULT_REPLAY)
    108     {
    109         /* Play fatal error voice 1 time in fixed volume 60. */
    110         gVoiInnerEvent  = E_PLAY_VOICE;
    111         g_tVoicePlayInfo.voiMode = VOI_MODE_REPEAT;
    112         g_tVoicePlayInfo.wCurrVoiceSection = VOICE_SECTION_FATAL_ERROR;
    113         g_tVoicePlayInfo.usVoicePlayTimeIn10mS = VOICE_PLAY_DURATION_TIME_INFINITE;
    114         g_tVoicePlayInfo.usVoicePlayRepeat = 1;
    115         g_tVoicePlayInfo.usVoiceVolume = 60;
    116         //g_tVoicePlayInfo.usVoiceStopTimeoutIn10mS = 3;
    117         g_tVoicePlayInfo.usVoiceStopIntervalTimeIn10mS = 10;
    118         //g_tVoicePlayInfo.eSwitchStatus = VPSS_VOICE_START_PLAY;
    119     }
    120     if ((uVoiceEvent & SRV_VOICE_PLAY_SHOW_DEFAULT_VOICE) == SRV_VOICE_PLAY_SHOW_DEFAULT_VOICE)
    121     {
    122         gVoiInnerEvent  = E_PLAY_VOICE;
    123         g_tVoicePlayInfo.voiMode = VOI_MODE_REPEAT;
    124         g_tVoicePlayInfo.wCurrVoiceSection = VOICE_PLAY_DEFAULT_VOICE_SECTION;
    125         g_tVoicePlayInfo.usVoicePlayTimeIn10mS = 100;
    126         g_tVoicePlayInfo.usVoicePlayRepeat = VOICE_PLAY_REPEAT_INFINITE;
    127         g_tVoicePlayInfo.usVoiceVolume = srvGetVoiceVolume();
    128         g_tVoicePlayInfo.usVoiceStopIntervalTimeIn10mS = 10;
    129         //g_tVoicePlayInfo.usVoiceStopTimeoutIn10mS = 3;
    130         //g_tVoicePlayInfo.eSwitchStatus = VPSS_VOICE_START_PLAY;
    131     }
    132     if ((uVoiceEvent & SRV_VOICE_PLAY_STOP) == SRV_VOICE_PLAY_STOP)
    133     {
    134         /* Stop current play, don't change wCurrVoiceSection, left it done in srvVoiPlayVoice(). */
    135         gVoiInnerEvent  = E_STOP_VOICE ;
    136         //g_tVoicePlayInfo.usVoiceStopTimeoutIn10mS = 3;
    137         g_tVoicePlayInfo.usVoicePlayRepeat = 1;
    138         g_tVoicePlayInfo.usVoiceVolume = 60;  // 
    139         //g_tVoicePlayInfo.eSwitchStatus = VPSS_VOICE_EXPLICIT_STOP_PLAY;
    140     }
    141 }

    4 语音信息结构体

     1 typedef struct{
     2     VOI_MODE_TYPE voiMode;
     3     UINT16 wCurrVoiceSection;             /* 当前语音段. */
     4     UINT16 usVoicePlayTimeIn10mS;         /* 语音总时长. */
     5     UINT16 usVoiceStopIntervalTimeIn10mS; /* 重复播放的间隔时间 */
     6     UINT16 usVoiceStopIntervalRemainTimeIn10mS; /* 间隔时间的剩余量. */
     7     //UINT16 usVoiceStopTimeoutIn10mS;    /* Timeout when checking whether voice stopped. */
     8     UINT16 usVoicePlayRepeat; /* 语音重复次数 */
     9     UINT16 usVoiceVolume;     /* 音量 */
    10     UINT16 wVoiceDefaultMaxOutput; 
    11     UINT16 wVoiceDefaultMinOutput;
    12 } T_VOICE_PLAY_INFO;

    5 播放语音

    static void srvVoiPlayVoice(void)
    {
        UINT16 wVoiceSection; //语音段
        //UINT16 usVoiceVolumeTunerAdjust;
        UINT16 usVoiceVolumeToSet; //设置的音量
        UINT16 wVoiceStatus; //语音状态
        T_OSAL_RESULT eRslt = OSAL_OK;
        static UINT16 wLastVoiceStatus = 0; //上一次语音的状态
        static UINT32 ticForwait;//等待的时钟数
        static E_VOICE_PLAY_SWITCH_STATUS afterResetState = VPSS_VOICE_IDLE;
    
        if(gVoiPlayState != VPSS_VOICE_IDLE)
        {   //语音状态非IDLE状态
            if(gVoiInnerEvent == E_PLAY_VOICE)
            {
                gVoiPlayState = VPSS_VOICE_RESET;
                afterResetState = VPSS_VOICE_LOAD_VOICE;
            }else if(gVoiInnerEvent == E_STOP_VOICE){
                gVoiPlayState = VPSS_VOICE_RESET;
                afterResetState = VPSS_VOICE_IDLE;
            }
        }
    
        switch (gVoiPlayState)
        {
            case VPSS_VOICE_IDLE:
                if(gVoiInnerEvent == E_PLAY_VOICE)
                {
                    gVoiPlayState = VPSS_VOICE_LOAD_VOICE;
                }
            break;
    
            case VPSS_VOICE_LOAD_VOICE:
                usVoiceVolumeToSet = g_tVoicePlayInfo.usVoiceVolume;
                eRslt = osalDevIoctl(g_hVoiceDevHandle, VOICE_CTRL_SET_VOICE_VOLUME, &usVoiceVolumeToSet);//设置音量
    
                if (OSAL_IS_RESULT_OK(eRslt))
                { //等音量设置完
                    wVoiceSection = g_tVoicePlayInfo.wCurrVoiceSection;
                    eRslt = osalDevWrite(g_hVoiceDevHandle, &wVoiceSection, 1); //加载待播放的语音
    
                    if (OSAL_IS_RESULT_OK(eRslt))
                    { //等待语音加载完成
                        if(g_tVoicePlayInfo.voiMode == VOI_MODE_REPEAT)
                        { //播放模式为重复播放模式
                            ticForwait = osalTimGetOSTime();
                            gVoiPlayState = VPSS_VOICE_TRIGGER_WAIT;
                        }
                        else if(g_tVoicePlayInfo.voiMode == VOI_MODE_TIME_LIMITED)
                        {  //限时播放模式
                            gVoiPlayState = VPSS_VOICE_PLAY_TIME_LIMITED;
                        }
                    }else{
                        LOG_ERROR_LOG(("Voice driver write failed. Error: %08x.\r\n", eRslt));
                    }
                }else{
                    LOG_ERROR_LOG(("Voice driver ioctl failed. Error: %08x.\r\n", eRslt));
                }
            break;
    
            case VPSS_VOICE_TRIGGER_WAIT:
                //wait 100ms
                if((osalTimGetOSTime() -ticForwait) > 1000)
                {
                    wVoiceSection = VOICE_SECTION_NULL;
                    eRslt = osalDevWrite(g_hVoiceDevHandle, &wVoiceSection, 1);
                    gVoiPlayState = VPSS_VOICE_PLAY_REPEAT;
                }
            break;
    
            case VPSS_VOICE_PLAY_REPEAT:
                eRslt = osalDevIoctl(g_hVoiceDevHandle, VOICE_CTRL_READ_STATUS, &wVoiceStatus);
                if (OSAL_IS_RESULT_OK(eRslt))
                {
                    /* Check if current playing is finished */
                    if((wVoiceStatus == 0x0000) )//&(wLastVoiceStatus == 0x0001)
                    {
                        wLastVoiceStatus = 0;
                        g_tVoicePlayInfo.usVoiceStopIntervalRemainTimeIn10mS = g_tVoicePlayInfo.usVoiceStopIntervalTimeIn10mS;
                        gVoiPlayState = VPSS_VOICE_RELOAD_VOICE;
                    }else{
                        wLastVoiceStatus = wVoiceStatus;
                    }
                }else{
                    LOG_ERROR_LOG(("Voice driver ioctl failed. Error: %08x.\r\n", eRslt));
                }
            break;
    
            case VPSS_VOICE_RELOAD_VOICE:
    
                if(g_tVoicePlayInfo.usVoiceStopIntervalRemainTimeIn10mS != 0)
                {
                    g_tVoicePlayInfo.usVoiceStopIntervalRemainTimeIn10mS --;
                }else{
                    if(g_tVoicePlayInfo.usVoicePlayRepeat != 0){
                           if(g_tVoicePlayInfo.usVoicePlayRepeat != VOICE_PLAY_REPEAT_INFINITE)
                           {
                               g_tVoicePlayInfo.usVoicePlayRepeat--;
                           }
                           if(g_tVoicePlayInfo.usVoicePlayRepeat != 0)
                           {
                               wVoiceSection = g_tVoicePlayInfo.wCurrVoiceSection;
                               eRslt = osalDevWrite(g_hVoiceDevHandle, &wVoiceSection, 1);
                               ticForwait = osalTimGetOSTime();
                               gVoiPlayState = VPSS_VOICE_TRIGGER_WAIT;
                           }
                           else{
                               gVoiPlayState = VPSS_VOICE_IDLE;
                           }
                    }else{
                        gVoiPlayState = VPSS_VOICE_IDLE;
                    }
                }
            break;
    
            case VPSS_VOICE_RESET:
                wVoiceSection = VOICE_SECTION_NULL;
                eRslt = osalDevWrite(g_hVoiceDevHandle, &wVoiceSection, 1);
                eRslt = osalDevIoctl(g_hVoiceDevHandle, VOICE_CTRL_RST_PLAYBACK_SET, NULL);
                ticForwait = osalTimGetOSTime();
                gVoiPlayState = VPSS_VOICE_RESET_WAIT;
            break;
    
            case VPSS_VOICE_RESET_WAIT:
                if((osalTimGetOSTime() - ticForwait) > 500)
                {
                    eRslt = osalDevIoctl(g_hVoiceDevHandle, VOICE_CTRL_RST_PLAYBACK_CLR , NULL);
                    gVoiPlayState = afterResetState;
                }
            break;
    
            case VPSS_VOICE_PLAY_TIME_LIMITED:
                if(g_tVoicePlayInfo.usVoicePlayTimeIn10mS != VOICE_PLAY_DURATION_TIME_INFINITE )
                {
                    if(g_tVoicePlayInfo.usVoicePlayTimeIn10mS != 0)
                    {
                        g_tVoicePlayInfo.usVoicePlayTimeIn10mS--;
                    }
                    else
                    {
                        gVoiPlayState = VPSS_VOICE_RESET;
                        afterResetState = VPSS_VOICE_IDLE;
                    }
                }
            break;
        }
        gVoiInnerEvent = E_NULL;
    
    }
  • 相关阅读:
    深度通道编程模型
    缓冲区溢出实验实验楼
    团队作业(一)
    信安导论学习阶段性总结
    Python总结
    mysql下载及安装
    初识python
    MobileMenuScene来点动画效果
    移动菜单页面PlayerInput
    渲染和填充MobileMenuListItem
  • 原文地址:https://www.cnblogs.com/FZLGYZ/p/16092402.html
Copyright © 2020-2023  润新知