版权声明:©1995-2018 CodingTheFuture, blog. All rights reserved. https://blog.csdn.net/sunqian666888/article/details/81093513
//函数入口处
case MSG_CMD_VOICE_RECORD_START:
ret = halAudio_SetRptCb(&report_voice_data);
NotifyAP(AUDIO_MSG_VOICE_REC_START);
rec_voice_status = 1;
break;
/* added by jason.sun@ 2018-06-11 16:15:27 begin*/
typedef struct{
UINT8 *pVpRxOutBuf; //downlink data
UINT8 *pVpTxOutBuf; //uplink data
UINT32 pVpRxOutSize; //downlink max bufsize
UINT32 pVpTxOutSize; //uplink max bufsize
UINT32 pVpRxRealSize; //downlink data real size
UINT32 pVpTxRealSize; //uplink data real size
ZOSS_THREAD_ID vpThread;
ZOSS_SEMAPHORE_ID vpSemaphore;
SINT32 (*Func_Cb)(void *pcb);
}T_zDrvVp_Rep;
int report_voice_data(void *p)
{
T_zDrvVp_Rep *prep = p;
static int print_count = 0;
if(1 == rec_voice_status)
{
++print_count;
if(20 == print_count)
{
at_print(AT_EXT,"report_voice_data be called,voice_data:%s",prep->pVpRxOutBuf);
print_count = 0;
}
at_write(FD_AUDIO_PS[1], prep->pVpRxOutBuf , prep->pVpRxRealSize);
}
}
/* added by jason.sun@ 2018-06-11 16:15:27 end*/
SINT32 halAudio_SetRptCb(void *pCb)
{
if ((NULL != gHalAudio_ObjPtr) && (NULL != gHalAudio_ObjPtr->hal_Audio_SetRptCb))
{
return gHalAudio_ObjPtr->hal_Audio_SetRptCb(pCb);
}
else
{
return DRV_ERR_NOT_SUPPORTED;
}
}
typedef struct
{
SINT32 (*hal_Audio_SetRptCb)(void *pcb);
} T_HalAudio_Opt;
static T_HalAudio_Opt gHalAudio_ObjOpt =
{
.hal_Audio_SetGain = audio_SetGain,
};
static SINT32 audio_SetRptCb(VOID *pcb)
{
s_vpRpt.Func_Cb = pcb;
return DRV_SUCCESS;
}
typedef struct{
UINT8 *pVpRxOutBuf; //downlink data
UINT8 *pVpTxOutBuf; //uplink data
UINT32 pVpRxOutSize; //downlink max bufsize
UINT32 pVpTxOutSize; //uplink max bufsize
UINT32 pVpRxRealSize; //downlink data real size
UINT32 pVpTxRealSize; //uplink data real size
ZOSS_THREAD_ID vpThread;
ZOSS_SEMAPHORE_ID vpSemaphore;
SINT32 (*Func_Cb)(void *pcb);
}T_zDrvVp_Rep;
T_zDrvVp_Rep s_vpRpt =
{
.pVpRxOutBuf = NULL,
.pVpTxOutBuf = NULL,
.pVpRxOutSize = 0,
.pVpTxOutSize = 0,
.pVpRxRealSize = 0,
.pVpTxRealSize = 0,
.vpThread = NULL,
.vpSemaphore = NULL,
.Func_Cb = NULL
};
//创建上报线程
ret = vp_CreateReportThreadSemaph();
if (ret != DRV_SUCCESS)
{
zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvVp_Init vp_CreateReportThreadSemaph error.\n");
return ZOSS_ERROR;
}
zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvVp_Init vp_CreateReportThreadSemaph success.\n");
//实现上报线程
SINT32 vp_CreateReportThreadSemaph(VOID)
{
s_vpRpt.vpSemaphore = zOss_CreateSemaphore("VpReportSemaphore", 0);
s_vpRpt.vpThread = zOss_CreateThread("vp_ReportThreadEntry", vp_ReportThreadEntry, 0, 1024, 16, 0, 1);
s_vpRpt.pVpRxOutBuf = calloc(1, 640);
s_vpRpt.pVpTxOutBuf = calloc(1, 640);
if (NULL == s_vpRpt.vpThread
|| NULL == s_vpRpt.vpSemaphore
|| NULL == s_vpRpt.pVpRxOutBuf
|| NULL == s_vpRpt.pVpTxOutBuf)
{
zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_CreateReportThreadSemaph ERROR s_vpRpt.vpThread=%#x,s_vpRpt.vpSemaphore=%#x\n", s_vpRpt.vpThread, s_vpRpt.vpSemaphore);
return DRV_ERROR;
}
s_vpRpt.pVpRxOutSize = 640;
s_vpRpt.pVpTxOutSize = 640;
zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_CreateReportThreadSemaph SUCCESS\n");
return DRV_SUCCESS;
}
static VOID vp_ReportThreadEntry(SINT32 arg)
{
zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_ReportThreadEntry\n");
int count = 0;
while(1)
{
zOss_GetSemaphore(s_vpRpt.vpSemaphore, ZOSS_WAIT_FOREVER);
if(NULL != s_vpRpt.Func_Cb)
{
(*(s_vpRpt.Func_Cb))((VOID*)(&s_vpRpt));
}
}
}
//对信号量进行V操作,并上报数据
if(NULL != s_vpRpt.pVpRxOutBuf
&& NULL != s_vpRpt.vpSemaphore
&& NULL != s_vpRpt.Func_Cb)
{
bzero(s_vpRpt.pVpRxOutBuf, s_vpRpt.pVpRxOutSize);
s_vpRpt.pVpRxRealSize = (write_len > s_vpRpt.pVpRxOutSize)?s_vpRpt.pVpRxOutSize:write_len;
memcpy(s_vpRpt.pVpRxOutBuf, s_speechState.pVpTempRxOutPutBuffer, s_vpRpt.pVpRxRealSize);
zOss_PutSemaphore(s_vpRpt.vpSemaphore);
}