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

📄 playsound.c

📁 通过车载终端采集GPS数据
💻 C
📖 第 1 页 / 共 2 页
字号:
        }
        if (0 == nLeft)
            break;
    }

    return (128-nLeft);
}

/*******************************************
*nFlag:0表示读取内容填到playbuf的前64字节
*      1表示读取内容填到playbuf的后64字节
*返回值:实际读取到内容中的字节数
*******************************************/
Byte littlespeaker_read64(bit nFlag)
{
    Uint8 nLeft, nTmp, nPos;

    if (0 == nFlag)
    {
        nPos = 0;
    }
    else
    {
        nPos = 64;
    }
    nLeft = 64;
    while (0 != toneArrayPointer[gLitterSpeaker.pointVal])
    {
        Uint16 nValue;
        nValue = toneArrayPointer[gLitterSpeaker.pointVal]&0x3fff;;
        nTmp = nLeft;
        if (OK == read_filetobuf(nValue, gLitterSpeaker.nPosition, playBuf+nPos, &nTmp, PLAYSOUNT_NEXTREAD))
        {
            //本段语音读完,此时缓存有可能没有填完
            gLitterSpeaker.pointVal++;
            gLitterSpeaker.nPosition = 0;
            nPos += nTmp;
            nLeft -= nTmp;
            if (0 == toneArrayPointer[gLitterSpeaker.pointVal])
            {
                //所有语音都播放完毕
                gLitterSpeaker.status = SPEAKER_NOMOREDATA;
                break;
            }
        }
        else
        {
            //本段语音没有读完,但是缓存已经填完
            gLitterSpeaker.nPosition += nTmp;
            nLeft = 0;
            break;
        }
    }
    return (64-nLeft);
}

/*******************************************
*nFlag:0表示读取内容填到playbuf的前64字节
*      1表示读取内容填到playbuf的后64字节
*返回值:实际读取到内容中的字节数
*******************************************/
Byte read64_toplaybuf(bit nFlag)
{
    Uint8 nLeft, nTmp, nPos;

    if (0 == nFlag)
    {
        nPos = 0;
    }
    else
    {
        nPos = 64;
    }
    nLeft = 64;    
    while (0 != toneArrayPointer[playDir.pointVal])
    {
        nTmp = nLeft;
        if (1 == playDir.valid)
        {
            Uint16 nValue16;
            nValue16 = toneArrayPointer[playDir.pointVal]&0x3fff;
            if (0x3fff == nValue16)
            {
                //本站
                set_board_mode();
                //本站
                if (0 == stationTone[playDir.stationVal-1].stopTone)
                {
                    playDir.pointVal++;
                }
                else
                {
                    playDir.valid = 2;
                    playDir.pointVal2 = toneArrayAddr[stationTone[playDir.stationVal-1].stopTone-1];
                    //直接跳到下一个循环,来读取子串中的语音
                }
            }   
            else if (0x2fff == nValue16)
            {
                //终点站
                set_board_mode();
                if (0 == stationTone[busInfo.lastStation[busInfo.direction]-1].stopTone)
                {
                    playDir.pointVal++;
                }
                else
                {
                    //终点站
                    playDir.valid = 2;
                    playDir.pointVal2 = toneArrayAddr[stationTone[busInfo.lastStation[busInfo.direction]-1].stopTone-1];
                    //直接跳到下一个循环,来读取子串中的语音
                }
            }
            else if (0x1fff == nValue16)
            {
                //终点站播报
                set_board_mode();
                if ((busInfo.displayCurStation == busInfo.lastStation[0]) || (busInfo.displayCurStation == busInfo.lastStation[1]))
                {
                    //当前为终点站
                    if (0 != fixedTone[36])
                    {
                        playDir.valid = 2;
                        playDir.pointVal2 = toneArrayAddr[fixedTone[36]-1];
                    }
                    else
                    {
                        playDir.pointVal++;
                    }
                }
                else
                {
                    //当前不为终点站
                    playDir.pointVal++;
                }
                //直接跳到下一个循环,来读取子串中的语音
            }
            else
            {
                //一般的语音段
                if (OK == read_filetobuf(nValue16, playDir.nPosition, playBuf+nPos, &nTmp, PLAYSOUNT_NEXTREAD))
                {
                    //本段语音读完,此时缓存有可能没有填完
                    playDir.pointVal++;
                    playDir.nPosition = 0;
                    nPos += nTmp;
                    nLeft -= nTmp;
                    set_board_mode();
                    if (0 == toneArrayPointer[playDir.pointVal])
                    {
                        //所有语音都播放完毕
                        playDir.readFlag = SOUND_OFF;
                        break;
                    }
                }
                else
                {
                    //本段语音没有读完,但是缓存已经填完
                    playDir.nPosition += nTmp;
                    nLeft = 0;
                    break;
                }
            }
        }
        else
        {
            if (OK == read_filetobuf(toneArrayPointer[playDir.pointVal2], playDir.nPosition, playBuf+nPos, &nTmp, PLAYSOUNT_NEXTREAD))
            {
                //本段语音读完
                nPos += nTmp;
                nLeft -= nTmp;
                playDir.pointVal2++;
                playDir.nPosition = 0;
                if (0 == toneArrayPointer[playDir.pointVal2])
                {
                    //该子串读完  
                    playDir.valid = 1;                  
                    playDir.pointVal++;
                    if (0 == toneArrayPointer[playDir.pointVal])
                    {
                        playDir.readFlag = SOUND_OFF;
                        break;
                    }
                }
            }
            else
            {
                //子串还没有读完,但缓冲区已经填完
                playDir.nPosition += nTmp;
                nLeft = 0;
                break;
            }
        }
        if (0 == nLeft)
            break;
    }

    return (64-nLeft);
}

/**********播放语音串***************/
/*nValue:值从1开始
/***********************************/
void play_toneArray(Uint8 nValue, PLAY_TYPE type)
{
    if (SPEAKER_IDLE == gLitterSpeaker.status)
    {    
        msm_stop_playback();
    //    reset_msm9841();
        playDir.setAddr = nValue;
        playDir.valid = 1;
        playDir.pointVal = toneArrayAddr[nValue-1];
        playDir.nPosition = 0;
        
        //将buf中的内容发送给9841
        //默认情况打开内喇叭
        speak_boardcontrol(CONTROL_BOARDINNER);
        boardMode = 0;
        gPlaySendSize = read128_toplaybuf();
        
        playDir.type = type;    
        msm_start_playback();
        msm_senddata(playBuf, gPlaySendSize);
        bPlayFlag = 0;
        //同时还需要将剩余的内容读进来填充buf
        if (NO_PLAYSOUND != playDir.type)
        {
            playDir.readFlag = SOUND_ON;
            gPlaySendSize = read64_toplaybuf(bPlayFlag);
        }
    }
    else
    {
        //记录下当前
        playDir.setAddr = nValue;
        playDir.valid = 1;
        playDir.pointVal = toneArrayAddr[nValue-1];
        playDir.nPosition = 0;
        playDir.type = type; 
    }
}

/****播放小喇叭提示音****/
void play_littlespeaker(Byte type)
{
    Uint8 nValue;
    if (type <= LITTLESPEAKER_SPEEDALARM)
    {
        if (0 != fixedTone[48+type])
        {
            if (NO_PLAYSOUND != playDir.type)
            {
                //当前正在播放报站等信息,需要送64个字节到缓存中
                gLitterSpeaker.status = SPEAKER_BUSY;
                nValue = fixedTone[48+type]-1;
                gLitterSpeaker.pointVal = toneArrayAddr[nValue];
                gLitterSpeaker.nPosition = 0;
                gPlaySendSize = littlespeaker_read64(bPlayFlag);
                set_littlespeaker();
            }
            else
            {
                //直接送128个字节
                msm_stop_playback();
                gLitterSpeaker.status = SPEAKER_BUSY;
                nValue = fixedTone[48+type]-1;
                gLitterSpeaker.pointVal = toneArrayAddr[nValue];
                gLitterSpeaker.nPosition = 0;
                gPlaySendSize = littlespeaker_read128();
                msm_start_playback();
                msm_senddata(playBuf, gPlaySendSize);
                bPlayFlag = 0;
                if (SPEAKER_NOMOREDATA != gLitterSpeaker.status)
                {
                    gPlaySendSize = littlespeaker_read64(bPlayFlag);
                }
            }
        }
    }    
}
/************************************
*停止报站
**************************************/
void stop_board()
{
    gLitterSpeaker.status = SPEAKER_IDLE;
    playDir.type = NO_PLAYSOUND;
    gPlaySendSize = 0;
    msm_stop_playback();
}

/*****************************************
*是否可以播放拐弯
*返回值:OK表示允许拐弯,KO表示不允许拐弯
*****************************************/
Byte is_playconner()
{
    if (STATION_PLAY == playDir.type)
        return KO;
    else 
        return OK;
}

/************************************
*当前是否语音播放模块是否还需要读flash
*返回值:OK表示不需要读;KO表示还需要读flash
************************************/
Byte is_playReadFlash()
{
    if ((NO_PLAYSOUND == playDir.type) && (gLitterSpeaker.status == SPEAKER_IDLE))
        return OK;
    else
        return KO;
}

//中断函数,需要注意的在停止播放后是不是也会有一个中断,需要将IT0设置为edge triggered
void ISRmsm9841(void) interrupt 0
{
    if ((SPEAKER_IDLE != gLitterSpeaker.status) || (NO_PLAYSOUND != playDir.type))
    {
        if (0 == bPlayFlag)
        {
            msm_senddata(playBuf, gPlaySendSize);
            bPlayFlag = 1;
        }
        else
        {
            msm_senddata(playBuf+64, gPlaySendSize);
            bPlayFlag = 0;
        }
        if (SPEAKER_IDLE == gLitterSpeaker.status)
        {
            if (SOUND_OFF == playDir.readFlag)
            {
    			playDir.type = 	NO_PLAYSOUND;
                check_playqueue();
            }
            else
                gPlaySendSize = read64_toplaybuf(bPlayFlag);
        }
        else if (SPEAKER_NOMOREDATA == gLitterSpeaker.status)
        {
            gLitterSpeaker.status = SPEAKER_IDLE;
            if (SOUND_OFF == playDir.readFlag)
            {
                playDir.type = 	NO_PLAYSOUND;
                check_playqueue();
            }
            else
            {
                back_board_mode();
                gPlaySendSize = read64_toplaybuf(bPlayFlag);
            }
        }
        else
            gPlaySendSize = littlespeaker_read64(bPlayFlag);
            
    }
    else
        speak_boardcontrol(CONTROL_NOSPEAKER);
}

/************播放文明用语************/
/*nNum:值从1开始,值为0xff表示按下取消键,
/*				停止播放所有语音
/*nNum:值为9表示播放拐弯
/*nNum:值为10表示要播放下坡
/********************************/
void play_notitionsound(Uint8 nNum/*播放第几个文明用语*/)
{
	//stop play previous sound
    Uint8 nValue;
    stop_board();
	if (0xff != nNum)
    {
        if (9 == nNum)
        {
            nValue = 5;            
        }
        else if (10 == nNum)
        {
            nValue = 47;
        }
        else
        {
    		nValue = 38+nNum;
        }
        if (0 == fixedTone[nValue])
			playDir.type = NO_PLAYSOUND;
		else
		{
			playDir.type = NOTION_PLAY;
		    //播放对应的串
			play_toneArray(fixedTone[nValue], NOTION_PLAY);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -