yangjking

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking  发布于  2016-11-17 11:34:55
采纳率 0%
8个问答
12558

[结帖]关于音频数据的发送调用HI_MPI_AO_SendFrame

 
本帖最后由 yangjking 于 2016-11-19 15:23 编辑

Hi All,
    在前期使用sample_aio demo测试已经可用后。我就开始对接与远程手机的对讲demo。
    现在是手机接收从板子过来的声音成功,但是手机发送声音数据后,板子接收到数据,然后我调用HI_MPI_AO_SendFrame函数就报如下错误log。
------------------------------------错误 log ---------------------------------------
/tmp # ./testdanavideo
------test 21-------------
th_talkback join in
MMB LEAK(pid=1415): 0x84043000, 65536 bytes, 'AO(0,0) CirBuf'
mmz_userdev_release: mmb<0x84043000> mapped to userspace 0xb2d08000 will be force unmaped!
Segmentation fault
/tmp #
-------------------------------------------------------------------------------------
可否帮忙看下是哪出问题?
-----------------------------------------------------------------------------------------------------------------------
解决: 基本无法直接使用Ao_SendFrame。需经过dec再使用Ao,对于原始数据可用PT_LPCM来解压
----------------------------------------------------------------------------------------------------------------------
相关代码如下:
[code]///////////////////////////////////////////////////////////////////////
UCHAR run_flag = 0;

/*
*  线程1,手机发送声音数据给板子接收。
*  正确接收后,调用函数发送。
*  结果接收数据正常,但是audio_data_write里报错
*/
void* th_talkback(void *arg) {
    MYDATA *mydata = (MYDATA *)arg;
    int err = 0;
    uint32_t timeout_usec = 1000*1000; // 1000ms
        printf("%s join in\n", __FUNCTION__);
    while (mydata->run_talkback)
    {
        dana_audio_packet_t *pmsg = lib_readaudio(mydata->conn, timeout_usec);
        if (pmsg) {
                /*
                 *  run_flag 标志用于判断底层是否准备就绪
                 */
                        if (run_flag){
                                err = audio_data_write(pmsg->data , pmsg->len);
                                if(err < 0){
                                        printf("audio data write error!\n");
                                        mydata->run_talkback = 0;
                                }
                        }
            lib_audio_packet_destroy(pmsg);
        } else {
            usleep(10*1000); // 10ms
        }
    }

    printf("th_talkback exit\n");
    mydata->exit_talback = true;
    return NULL;
}

/*
* 线程二,mic通过板子发送音频给手机,这个可以正常运行。
*/
void* th_audio_media(void *arg)
{
    MYDATA *mydata = (MYDATA *)arg;

    uint32_t timeout_usec = 1000*1000; // 1000ms


    BYTE *pBuff = NULL;
    DWORD timestamp, media_type, size, isKeyFrame;

    DWORD timestamp_base = 0;
        int err = 0;

        printf("------test 21-------------\n");

        /*
        *   mpp 接口相关初始化。
        */
        err = audio_init();
        if (err < 0){
                printf("init audio false!\n");
                goto fin;
        }
        run_flag = 1;
       
    pBuff = (BYTE*) calloc(1, 300*1024);
    if (NULL == pBuff) {
        dbg("th_audio_media cant't calloc pBuff\n");
        goto fin;
    }
        size = 300*1024;
   
    while (mydata->run_audio_media)
        {
        err = audio_data_read(×tamp, &isKeyFrame, pBuff, size);
                if (err > 0){
                        dbg("%s:get the timestamp %d err %d\n", __FUNCTION__, timestamp, err);
                        timestamp = 0;
                        if (lib_conn_send(mydata->conn, audio_stream, PCM, mydata->chan_no, isKeyFrame,
                                timestamp + timestamp_base, (const char*)pBuff, err, timeout_usec)) {
                                dbg("th_audio_media send test file [%u] succeeded\n", size);
                        } else {
                                dbg("th_audio_media send test file [%u] failed\n", size);
                                usleep(200*1000);
                                continue;
                        }
               
        } else if (err < 0){
            dbg("th_audio_media read file error: %u\n", err);
        }

    }
    printf("%s exit while \n", __FUNCTION__);
fin:
    if (pBuff) {
        free(pBuff);
    }
        run_flag = 0;
        audio_delete();
    dbg("th_audio_media exit\n");
    mydata->exit_audio_media = true;
    return NULL;
}
#define SAMPLE_DBG(s32Ret)\
        do{\
                printf("s32Ret=%#x,fuc:%s,line:%d\n", s32Ret, __FUNCTION__, __LINE__);\
        }while(0)

static HI_S32 s32AiChnCnt                  = 0;   
static HI_S32 s32AoChnCnt                  = 0;          
static AUDIO_DEV   AiDev                   = SAMPLE_AUDIO_AI_DEV;          
static AI_CHN            AiChn                  = 0;       
static AUDIO_DEV        AoDev                  = SAMPLE_AUDIO_AO_DEV;       
static AO_CHN                AoChn                  = 0;
static AUDIO_SAMPLE_RATE_E enInSampleRate  = AUDIO_SAMPLE_RATE_BUTT;
static AUDIO_SAMPLE_RATE_E enOutSampleRate = AUDIO_SAMPLE_RATE_BUTT;
static HI_BOOL gs_bAioReSample             = HI_FALSE;
static HI_S32 AiFd                         = 0;


/******************************************************************************
* function : to process abnormal case
******************************************************************************/
static void SAMPLE_AUDIO_HandleSig(HI_S32 signo)
{   
        if (SIGINT == signo || SIGTERM == signo)   
        {        
                SAMPLE_COMM_AUDIO_DestoryAllTrd();        
                SAMPLE_COMM_SYS_Exit();        
                printf("\033[0;31mprogram exit abnormally!\033[0;39m\n");   
        }   
        exit(0);
}

int audio_init(void)
{
        HI_S32 s32Ret = HI_SUCCESS;
        VB_CONF_S stVbConf;
        AIO_ATTR_S stAiAttr, stAoAttr;
        AI_CHN_PARAM_S stAiChnPara;

    signal(SIGINT, SAMPLE_AUDIO_HandleSig);   
        signal(SIGTERM, SAMPLE_AUDIO_HandleSig);

    memset(&stVbConf, 0, sizeof(VB_CONF_S));   
        s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);   
        if (HI_SUCCESS != s32Ret)   
        {
                printf("%s: system init failed with %d!\n", __FUNCTION__, s32Ret);        
                return HI_FAILURE;   
        }
        /* set the ai attr */       
        stAiAttr.enSamplerate = AUDIO_SAMPLE_RATE_16000;       
        stAiAttr.enBitwidth = AUDIO_BIT_WIDTH_16;       
        stAiAttr.enWorkmode = AIO_MODE_I2S_SLAVE;       
        stAiAttr.enSoundmode = AUDIO_SOUND_MODE_STEREO;       
        stAiAttr.u32EXFlag = 0;       
        stAiAttr.u32FrmNum = 30;       
        stAiAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;       
        stAiAttr.u32ChnCnt = 2;       
        stAiAttr.u32ClkSel = 0;       
        /* set the ao attr */       
        stAoAttr = stAiAttr;       
        stAoAttr.enWorkmode = AIO_MODE_I2S_MASTER;

        enInSampleRate        = AUDIO_SAMPLE_RATE_BUTT;                 
        enOutSampleRate = AUDIO_SAMPLE_RATE_BUTT;

        /* enable AI channle */   
        s32AiChnCnt = stAiAttr.u32ChnCnt;       
        s32Ret = SAMPLE_COMM_AUDIO_StartAi(AiDev, s32AiChnCnt, &stAiAttr, enOutSampleRate, gs_bAioReSample, NULL, 0);         
        if (s32Ret != HI_SUCCESS)          
        {           
                SAMPLE_DBG(s32Ret);                  
                return HI_FAILURE;       
        }

        /* enable AO channle */   
        s32AoChnCnt = stAoAttr.u32ChnCnt;       
        s32Ret = SAMPLE_COMM_AUDIO_StartAo(AoDev, s32AoChnCnt, &stAoAttr, enInSampleRate, gs_bAioReSample, NULL, 0);       
        if (s32Ret != HI_SUCCESS)         
        {                  
                SAMPLE_DBG(s32Ret);                 
                return HI_FAILURE;   
        }

        s32Ret = HI_MPI_AI_GetChnParam(AiDev, AiChn, &stAiChnPara);
        if (HI_SUCCESS != s32Ret)
        {
                printf("%s: Get ai chn param failed\n", __FUNCTION__);
                return -1;
        }
        stAiChnPara.u32UsrFrmDepth = 30;
    s32Ret = HI_MPI_AI_SetChnParam(AiDev, AiChn, &stAiChnPara);
    if (HI_SUCCESS != s32Ret)
    {
        printf("%s: set ai chn param failed\n", __FUNCTION__);
        return -1;
    }
        AiFd = HI_MPI_AI_GetFd(AiDev, AiChn);
       
        return HI_SUCCESS;
}

int audio_delete(void)
{
        HI_S32 s32Ret = HI_SUCCESS;
    s32Ret = SAMPLE_COMM_AUDIO_StopAi(AiDev, s32AiChnCnt, gs_bAioReSample, HI_FALSE);   
        if (s32Ret != HI_SUCCESS)   
        {        
                SAMPLE_DBG(s32Ret);        
                return HI_FAILURE;   
        }   
        s32Ret = SAMPLE_COMM_AUDIO_StopAo(AoDev, s32AoChnCnt, gs_bAioReSample, HI_FALSE);   
        if (s32Ret != HI_SUCCESS)   
        {        
                SAMPLE_DBG(s32Ret);        
                return HI_FAILURE;   
        }

        SAMPLE_COMM_SYS_Exit();
        printf("audio task delete\n");

        return HI_SUCCESS;
}

/*   A U D I O _ D A T A _ R E A D   */
/*-------------------------------------------------------------------------
    Owner: George Yang
        return success >0; no data =0;
   
-------------------------------------------------------------------------*/
int audio_data_read(DWORD *timeStamp, DWORD *flag, BYTE *buf, DWORD size)
{
        HI_S32 s32Ret;
       
        fd_set read_fds;
        struct timeval TimeoutVal;
       
       
        AUDIO_FRAME_S stFrame;
        AEC_FRAME_S   stAecFrm;
       
        TimeoutVal.tv_sec = 1;
        TimeoutVal.tv_usec = 0;

    FD_ZERO(&read_fds);
    FD_SET(AiFd, &read_fds);

        s32Ret = select(AiFd + 1, &read_fds, NULL, NULL, &TimeoutVal);
        if (s32Ret < 0)
        {
                printf("%s: select error \n", __FUNCTION__);
                return -1;
        }
        else if (0 == s32Ret)
        {
                printf("%s: get ai frame select time out\n", __FUNCTION__);
                return -1;
        }

        if (FD_ISSET(AiFd, &read_fds))
        {
                /* get frame from ai chn */
                memset(&stAecFrm, 0, sizeof(AEC_FRAME_S));
                s32Ret = HI_MPI_AI_GetFrame(AiDev, AiChn, &stFrame, &stAecFrm, HI_FALSE);
                if (HI_SUCCESS != s32Ret )
                {
                        printf("%s: HI_MPI_AI_GetFrame(%d, %d), failed with %#x!\n", \
                                   __FUNCTION__, AiDev, AiChn, s32Ret);
                        return -1;
                }

                if (stFrame.u32Len <= size){
                        size = stFrame.u32Len;
                } else {
                        printf("%s: the read size is not long enough!\n", size);
                }
                memcpy(buf, stFrame.pVirAddr[0], size);
               
                /* finally you must release the stream */
                s32Ret = HI_MPI_AI_ReleaseFrame(AiDev, AiChn, &stFrame, &stAecFrm);
                if (HI_SUCCESS != s32Ret )
                {
                        printf("%s: HI_MPI_AI_ReleaseFrame(%d, %d), failed with %#x!\n", \
                                   __FUNCTION__, AiDev, AiChn, s32Ret);
                        return -1;
                }

                *timeStamp = (stFrame.u64TimeStamp / 1000);
                *flag = 0;
               
                return size;
        }

        return 0;
}

int audio_data_write(char *data , DWORD len)
{
        HI_S32 s32Ret;
        AUDIO_FRAME_S stAoFrame;
        char *pAoBuf = malloc(len);

        memset(&stAoFrame, 0, sizeof(AUDIO_FRAME_S));
        memcpy(pAoBuf, data, len);
        stAoFrame.pVirAddr[0]   = (void *)pAoBuf;
        stAoFrame.u32Len        = len;
        stAoFrame.enBitwidth    = AUDIO_BIT_WIDTH_16;
        stAoFrame.enSoundmode   = AUDIO_SOUND_MODE_STEREO;
        stAoFrame.u64TimeStamp  = 0;
        stAoFrame.u32Seq        = 0;
       
        s32Ret = HI_MPI_AO_SendFrame(AoDev, AoChn, &stAoFrame, 1000);
        if (HI_SUCCESS != s32Ret )
        {
                printf("%s: HI_MPI_AO_SendFrame(%d, %d), failed with %#x!\n", \
                           __FUNCTION__, AoDev, AoChn, s32Ret);
                return -1;
        }

        free(stAoFrame.pVirAddr[0]);

        return 0;
}
[/code]
我来回答
回答21个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-11-17 11:47:16
认可0
楼主直接把虚拟地址送去给AO(malloc出来的), 这个显然是不对的

海思的硬件处理模块都需要使用物理地址, 也就是需要MMZ内存, 这个是基本概念

试一下用HI_MPI_SYS_MmzAlloc_Cached来分配一块MMZ内存来代替malloc, stAoFrame结构中u32PhyAddr[0]要写对

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-11-17 11:51:46
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41377&ptid=13383]zhuangweiye 发表于 2016-11-17 11:47[/url]
楼主直接把虚拟地址送去给AO(malloc出来的), 这个显然是不对的

海思的硬件处理模块都需要使用物理地址,  ...[/quote]

Hi zhuangweiye,
是啊,stAoFrame里面有两个成员,u32PhyAddr[0]和pVirAddr[0],可否再详细告知下该如何对这两个进行赋值?可否提供下参考代码。
3Q

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-11-17 11:59:26
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41378&ptid=13383]yangjking 发表于 2016-11-17 11:51[/url]
Hi zhuangweiye,
是啊,stAoFrame里面有两个成员,u32PhyAddr[0]和pVirAddr[0],可否再详细告知下该如 ...[/quote]


s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&stAoFrame.u32PhyAddr[0], (HI_VOID **)&stAoFrame.pVirAddr[0], "AObuffer", HI_NULL, u32Size);
if(s32Ret != HI_SUCCESS)
{
        printf("can't alloc ao buffer ! s32Ret =  %x\n",s32Ret);
        return -1;
}

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-11-17 15:14:57
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41379&ptid=13383]zhuangweiye 发表于 2016-11-17 11:59[/url]
s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&stAoFrame.u32PhyAddr[0], (HI_VOID **)&stAoFrame.pVirAddr[0] ...[/quote]

Hi zhuangweiye,
还是不行哦,错误log如下
--------------------
/tmp # ./testdanavideo
------test 29-------------
th_audio_media exit while
audio task delete
~~~~~~~1~~~~~~
------test 29-------------
th_talkback join in
MMB LEAK(pid=1635): 0x84043000, 65536 bytes, 'AO(0,0) CirBuf'
mmz_userdev_release: mmb<0x84043000> mapped to userspace 0xb2d1f000 will be force unmaped!
MMB LEAK(pid=1638): 0x84053000, 4096 bytes, ''
mmz_userdev_release: mmb<0x84053000> mapped to userspace 0xb2d1e000 will be force unmaped!
Segmentation fault
/tmp #
---------------------------------
我两种函数都用过了,不行哦。修改代码如下:
[code]int audio_data_write(char *data , DWORD len)
{
        HI_S32 s32Ret;
        AUDIO_FRAME_S stAoFrame;
       

        memset(&stAoFrame, 0, sizeof(AUDIO_FRAME_S));

        s32Ret = HI_MPI_SYS_MmzAlloc(&u32PhyAddr, (void**)&pu32VirAddr, NULL, NULL, len);
        if (s32Ret != HI_SUCCESS)
        {
                SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n", s32Ret);
                return HI_FAILURE;
        }
        memcpy((char *)pu32VirAddr, data, len);
       
//        if (len > writeBufMax){
//                printf("%s the len is too long %d\n", __FUNCTION__, len);
//                return -1;
//        }
//        memcpy((char *)pu32VirAddr, data, len);
//        s32Ret = HI_MPI_SYS_MmzFlushCache(u32PhyAddr, (void *)pu32VirAddr, writeBufMax);
//        if (s32Ret != HI_SUCCESS)
//        {
//                SAMPLE_PRT("HI_MPI_SYS_MmzFlushCache fail,Error(%#x)\n", s32Ret);
//                return -1;
//        }

        stAoFrame.pVirAddr[0]   = (void *)pu32VirAddr;
        stAoFrame.u32PhyAddr[0] = u32PhyAddr;
        stAoFrame.u32Len        = len;
        stAoFrame.enBitwidth    = AUDIO_BIT_WIDTH_16;
        stAoFrame.enSoundmode   = AUDIO_SOUND_MODE_STEREO;
        stAoFrame.u64TimeStamp  = 0;
        stAoFrame.u32Seq        = 0;
       
        s32Ret = HI_MPI_AO_SendFrame(AoDev, AoChn, &stAoFrame, 1000);
        if (HI_SUCCESS != s32Ret )
        {
                printf("%s: HI_MPI_AO_SendFrame(%d, %d), failed with %#x!\n", \
                           __FUNCTION__, AoDev, AoChn, s32Ret);
                return -1;
        }

        HI_MPI_SYS_MmzFree(u32PhyAddr, pu32VirAddr);
        return 0;
}
[/code]
[code]//int audio_write_buf_malloc(void)
//{
//        HI_S32 s32Ret = 0;
//       
//        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&u32PhyAddr, (void**)&pu32VirAddr, NULL, HI_NULL, writeBufMax);
//        if (s32Ret != HI_SUCCESS)
//        {
//                SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n", s32Ret);
//                return -1;
//        }

//        return 0;
//}

//int audio_write_buf_free(void)
//{
//        HI_MPI_SYS_MmzFree(u32PhyAddr, pu32VirAddr);
//        return 0;
//}
[/code]

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-11-17 15:36:47
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41396&ptid=13383]yangjking 发表于 2016-11-17 15:14[/url]
Hi zhuangweiye,
还是不行哦,错误log如下
--------------------
[/quote]

先加点打印, 看看运行到哪里出了问题

另外, 楼主是AUDIO_SOUND_MODE_STEREO

stAoFrame.u32Len(音频帧长度)指单个声道的数据长度, 是不是这里的问题?

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-11-17 15:42:48
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41398&ptid=13383]zhuangweiye 发表于 2016-11-17 15:36[/url]
先加点打印, 看看运行到哪里出了问题

另外, 楼主是AUDIO_SOUND_MODE_STEREO
[/quote]

打印加了,就是HI_MPI_AO_SendFrame这个地方挂的,新加代码
[code]        printf("%s I'm here~ len %d\n", __FUNCTION__, len);
        stAoFrame.pVirAddr[0]   = (void *)pu32VirAddr;
        stAoFrame.u32PhyAddr[0] = u32PhyAddr;
        stAoFrame.u32Len        = len;
        stAoFrame.enBitwidth    = AUDIO_BIT_WIDTH_16;
        stAoFrame.enSoundmode   = AUDIO_SOUND_MODE_STEREO;
        stAoFrame.u64TimeStamp  = 0;
        stAoFrame.u32Seq        = 0;
       
        s32Ret = HI_MPI_AO_SendFrame(AoDev, AoChn, &stAoFrame, 1000);
        if (HI_SUCCESS != s32Ret )
        {
                printf("%s: HI_MPI_AO_SendFrame(%d, %d), failed with %#x!\n", \
                           __FUNCTION__, AoDev, AoChn, s32Ret);
                return -1;
        }[/code]
----------------------打印log-----------------------
------test 33-------------
th_talkback join in
audio_data_write I'm here~ len 512        // 这句打出来就挂了
MMB LEAK(pid=1788): 0x84053000, 4096 bytes, ''
mmz_userdev_release: mmb<0x84053000> mapped to userspace 0xb2d36000 will be force unmaped!
MMB LEAK(pid=1772): 0x84043000, 65536 bytes, 'AO(0,0) CirBuf'
mmz_userdev_release: mmb<0x84043000> mapped to userspace 0xb2d37000 will be force unmaped!
Segmentation fault
/tmp #
-----------------------------------------------------------------------
--> 我再把len减半试试

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-11-17 15:43:23
认可0
各位大神们是如何使用audio这输出AO输出的?

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-11-17 15:48:34
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41398&ptid=13383]zhuangweiye 发表于 2016-11-17 15:36[/url]
先加点打印, 看看运行到哪里出了问题

另外, 楼主是AUDIO_SOUND_MODE_STEREO
[/quote]

在sample_aio里面,它将Ai->Ao,里面用的是同一个stFrame,不会是Ai 和Ao 的物理地址是同一个吧?

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-11-17 15:51:16
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41398&ptid=13383]zhuangweiye 发表于 2016-11-17 15:36[/url]
先加点打印, 看看运行到哪里出了问题

另外, 楼主是AUDIO_SOUND_MODE_STEREO
[/quote]

len赋值减半,还是失败

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-11-17 15:53:39
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41405&ptid=13383]yangjking 发表于 2016-11-17 15:51[/url]
len赋值减半,还是失败[/quote]

不是len减半哦

stAoFrame.u32Len        = len;
改成 stAoFrame.u32Len        = len/2;

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-11-17 15:59:24
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41406&ptid=13383]zhuangweiye 发表于 2016-11-17 15:53[/url]
不是len减半哦

stAoFrame.u32Len        = len;
[/quote]

我就是这么改的,还是不行:)
[code]        printf("%s I'm here~ len %d\n", __FUNCTION__, len);
        stAoFrame.pVirAddr[0]   = (void *)pu32VirAddr;
        stAoFrame.u32PhyAddr[0] = u32PhyAddr;
        stAoFrame.u32Len        = len/2;
        stAoFrame.enBitwidth    = AUDIO_BIT_WIDTH_16;
        stAoFrame.enSoundmode   = AUDIO_SOUND_MODE_STEREO;
        stAoFrame.u64TimeStamp  = 0;
        stAoFrame.u32Seq        = 0;
       
        s32Ret = HI_MPI_AO_SendFrame(AoDev, AoChn, &stAoFrame, 1000);[/code]

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-11-17 16:19:29
认可0
本帖最后由 zhuangweiye 于 2016-11-17 16:22 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=41408&ptid=13383]yangjking 发表于 2016-11-17 15:59[/url]
我就是这么改的,还是不行[/quote]


没有注意到音频的AUDIO_FRAME_S结构中还有u32PoolId[2]

看来只能用和视频sendframe一样来处理喽

1 . HI_MPI_VB_CreatePool
2.  HI_MPI_VB_GetBlock
3.  HI_MPI_VB_Handle2PhysAddr
4.  HI_MPI_SYS_Mmap
然后填写stAoFrame, copy data, sendframe
5.  HI_MPI_SYS_Munmap;
6.  HI_MPI_VB_ReleaseBlock;
7. HI_MPI_VB_DestroyPool


其中 2-6放在while中

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-11-17 16:33:45
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41409&ptid=13383]zhuangweiye 发表于 2016-11-17 16:19[/url]
没有注意到音频的AUDIO_FRAME_S结构中还有u32PoolId[2]

看来只能用和视频sendframe一样来处理喽
[/quote]

对于新手的我来说真是越来越复杂了XD
zhuangweiye这个有没有啥参考程序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-11-17 16:45:53
认可0
本帖最后由 zhuangweiye 于 2016-11-17 16:46 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=41410&ptid=13383]yangjking 发表于 2016-11-17 16:33[/url]
对于新手的我来说真是越来越复杂了XD
zhuangweiye这个有没有啥参考程序[/quote]

只有简单流程, 供楼主参考一下

    hPool   = HI_MPI_VB_CreatePool( u32BlkSize, u32BlkCnt,NULL );

        while( 1 )
    {
                //1. 取VB
                do
                {
                        hBlock = HI_MPI_VB_GetBlock(hPool, u32BlkSize,NULL);
                }
                while (VB_INVALID_HANDLE == hBlock);

                // 2. 得到VB物理地址和虚拟地址
        u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(hBlock);
        pVirAddr = (HI_U8 *) HI_MPI_SYS_Mmap(u32PhyAddr, u32BlkSize);
        u32PoolId = HI_MPI_VB_Handle2PoolId(hBlock);
   
                // 3. 填写AUDIO_FRAME_S结构
        memset(&stAoFrame, 0, sizeof(AUDIO_FRAME_S));
                ... //基本和楼主的代码一样, 就是多一样u32PoolId
               
                // 4. 填数据
                ...
        
                // 5. 发送
        s32Ret = HI_MPI_AO_SendFrame(Ao_dev, Ao_chn, &stAoFrame, 1000);

                // 6. 释放虚拟地址和 VB
        HI_MPI_SYS_Munmap(pVirAddr, u32BlkSize);
        HI_MPI_VB_ReleaseBlock(hBlock);
    }

    HI_MPI_VB_DestroyPool( hPool );

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-11-17 17:04:49
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41410&ptid=13383]yangjking 发表于 2016-11-17 16:33[/url]
对于新手的我来说真是越来越复杂了XD
zhuangweiye这个有没有啥参考程序[/quote]

另外: 是否可以考虑使用 Adec-->Ao的方式

当编码或解码协议选择 LPCM 时,音频编码和解码模块可以录制和播放LPCM 格式的原始音频文件

这样就不用去开MMZ或VB了

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-11-17 18:02:08
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41415&ptid=13383]zhuangweiye 发表于 2016-11-17 17:04[/url]
另外: 是否可以考虑使用 Adec-->Ao的方式

当编码或解码协议选择 LPCM 时,音频编码和解码模块可以录制 ...[/quote]

我现在正准备这么搞呢,上面提的那个太复杂。
话说如果是LPCM时,我receive数据后,还得加海思的包头,再送入dec是吧?

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-11-18 08:09:35
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41428&ptid=13383]yangjking 发表于 2016-11-17 18:02[/url]
我现在正准备这么搞呢,上面提的那个太复杂。
话说如果是LPCM时,我receive数据后,还得加海思的包头, ...[/quote]

如果是测试, 还可以考虑打开Ai, 从Ai GetFrame的方式得到buffer

mr_gui

0个粉丝

2

问答

0

专栏

0

资料

mr_gui 2018-10-09 10:47:24
认可0
请问楼主这个问题后续进展怎样了,我现在想要使用海思播放一段存储了pcm格式数据的buf,无从下手

celinessl

0个粉丝

3

问答

0

专栏

1

资料

celinessl 2019-01-15 17:24:39
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41411&ptid=13383]zhuangweiye 发表于 2016-11-17 16:45[/url]
只有简单流程, 供楼主参考一下

    hPool   = HI_MPI_VB_CreatePool( u32BlkSize, u32BlkCnt,NULL ) ...[/quote]

谢谢大神,我也是海思3531收到用户原始音频pcm,发往aenc编码,看到您的参考代码,才调试成功
附上我的代码,可以让后来人参考
        void Ai_proc(void )
        {
                HI_S32 s32Ret;
                AUDIO_FRAME_S stFrame2;
                char buf[1024];
                static int aits=0;
                unsigned char *pbuf;
                VB_BLK VbBlk;
    unsigned int u32PhyAddr;
    unsigned char *pVirAddr;
                VB_POOL vbpool;

                struct sockaddr peerAddr;
                bzero(&peerAddr, sizeof peerAddr);
                socklen_t addrLen = sizeof peerAddr;
                ssize_t nr = recvfrom(sock, buf, 1024, 0, &peerAddr, &addrLen);

                if ( nr <= 0 ) {
                        printf("recvfrom ret: %d\n", nr);
                        return;
                }

                stFrame2.u32Len=nr;
                stFrame2.enBitwidth=AUDIO_BIT_WIDTH_16;
                stFrame2.enSoundmode=AUDIO_SOUND_MODE_STEREO;//AUDIO_SOUND_MODE_MONO;
                stFrame2.u32Seq=1;
                stFrame2.u32PhyAddr[1]=0;
                stFrame2.u32PoolId[1]=0;
                stFrame2.u64TimeStamp = aits++;

    VbBlk = HI_MPI_VB_GetBlock(hPool, nr, NULL);
    if (VB_INVALID_HANDLE == VbBlk)
    {
        printf("HI_MPI_VB_GetBlock err! size:%d\n",nr);
        return ;
    }
    u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(VbBlk);
    if (0 == u32PhyAddr)
    {
        printf("Func:%s, Info:HI_MPI_VB_Handle2PhysAddr fail\n", __FUNCTION__);
        HI_MPI_VB_ReleaseBlock(VbBlk);
        return;
    }
                stFrame2.u32PoolId[0]= HI_MPI_VB_Handle2PoolId(VbBlk);
    pVirAddr = (unsigned char *)HI_MPI_SYS_Mmap(u32PhyAddr,nr);
    if (NULL == pVirAddr)
    {
        printf("Func:%s, Info:HI_MPI_SYS_Mmap fail\n", __FUNCTION__);
        HI_MPI_VB_ReleaseBlock(VbBlk);
        return;
    }
                memcpy(pVirAddr,buf,nr);
                stFrame2.u32PhyAddr[0]= u32PhyAddr;
                stFrame2.pVirAddr[0] = pVirAddr;
                /*
                LOG_INFO << "ai2len=" <                         << ";bw=" <                         << ";bs=" <                         << ";sq=" <                         << ";pa0=" <                         << ";pa1=" <                         << ";po0=" <                         << ";po1=" <                         << ";ts0=" <                 */
                s32Ret = HI_MPI_AENC_SendFrame(0, &stFrame2, NULL);
                if (HI_SUCCESS != s32Ret )
                {
                        printf("%s: HI_MPI_AENC_SendFrame(0, 0), failed with %#x!\n",\
                       __FUNCTION__, s32Ret);
                        return ;
                }
                HI_MPI_SYS_Munmap(pVirAddr,nr);
                HI_MPI_VB_ReleaseBlock(VbBlk);
                HI_MPI_AI_ReleaseFrame(0,0,&stFrame2, NULL);

        }

TT1111

0个粉丝

0

问答

0

专栏

0

资料

TT1111 2020-06-28 16:04:15
认可0

不好意思,来晚了,可以使用这个函数申请虚拟地址HI_MPI_SYS_MmzAlloc

加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区