📄 playsound.c
字号:
}
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 + -