语音驱动程序  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;

}

 

posted on 2022-04-02 15:41  信义勤爱  阅读(157)  评论(0)    收藏  举报