音乐播放例程的困惑?readlen=(size/4)*3

2019-07-20 17:27发布

[mw_shl_code=c,true]//填充buf
//buf:数据区
//size:填充数据量
//bits:位数(16/24)
//返回值:读到的数据个数
u32 wav_buffill(u8 *buf,u16 size,u8 bits)
{
        u16 readlen=0;
        u32 bread;
        u16 i;
        u8 *p;
        if(bits==24)//24bit音频,需要处理一下
        {
                readlen=(size/4)*3;                                                        //此次要读取的字节数
                f_read(audiodev.file,audiodev.tbuf,readlen,(UINT*)&bread);        //读取数据
                p=audiodev.tbuf;
                for(i=0;i<size;)
                {
                        buf[i++]=p[1];
                        buf=p[2];
                        i+=2;
                        buf[i++]=p[0];
                        p+=3;
                }
                bread=(bread*4)/3;                //填充后的大小.
        }else
        {
                f_read(audiodev.file,buf,size,(UINT*)&bread);//16bit音频,直接读取数据  
                if(bread<size)//不够数据了,补充0
                {
                        for(i=bread;i<size-bread;i++)buf=0;
                }
        }
        return bread;
}  [/mw_shl_code]

readlen=(size/4)*3 这个要怎么理解?

16位的双声道长度为32,24位的双声道数据长度为48.如果原来一帧的要4个字节,现在要6个。读相同的帧数据量多了50%才对,为啥是size/4*3呢。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。