audiocore ========= .. raw:: html

作者:朱天华  2020年07月08日 .. raw:: html

.. raw:: html

脚本lib中audio库对audiocore进行了二次封装 .. raw:: html

.. raw:: html

建议直接使用脚本lib中的audio库来设计程序 .. raw:: html

.. raw:: html

不建议直接使用core中的audiocore库来设计程序 .. raw:: html

.. raw:: html

本章节audiocore 接口可帮助理解脚本lib中的audio库代码 .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

audiocore.play(audioFilePath)  .. raw:: html

.. raw:: html

功能: .. raw:: html

.. raw:: html

播放音频文件 .. raw:: html

.. raw:: html

音频文件格式支持:mp3、wav、amr、pcm .. raw:: html

.. raw:: html

参数: .. raw:: html

.. raw:: html

audioFilePath: string类型;音频文件的完整路径 .. raw:: html

.. raw:: html

如果是Luatools烧录的音频文件xxx.mp3,则文件完整路径为/lua/xxx.mp3 .. raw:: html

.. raw:: html

如果是sd卡中根目录下的音频文件yyy.mp3,则文件完整路径为/sdcard0/yyy.mp3 .. raw:: html

.. raw:: html

返回值: .. raw:: html

.. raw:: html

result: bool类型;同步播放结果 .. raw:: html

.. raw:: html

false表示不允许播放 .. raw:: html

.. raw:: html

true表示允许播放,并且已经去执行播放动作;异步播放结果通过消息rtos.MSG_AUDIO通知到Lua脚本,消息携带参数msg.play_end_ind,true表示播放成功结束,其余值表示播放失败 .. raw:: html

.. raw:: html

示例:  .. raw:: html

.. raw:: html

local function audioMsg(msg) .. raw:: html

.. raw:: html

    log.info(“audio.MSG_AUDIO”,msg.play_end_ind) .. raw:: html

.. raw:: html

    sys.publish(“LIB_AUDIO_PLAY_IND”,“RESULT”,msg.play_end_ind) .. raw:: html

.. raw:: html

end .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

–注册core上报的rtos.MSG_AUDIO消息的处理函数 .. raw:: html

.. raw:: html

rtos.on(rtos.MSG_AUDIO,audioMsg) .. raw:: html

.. raw:: html

audiocore.play(“/lua/call.mp3”) .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

   .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

audiocore.playdata(audioData,audioFormat[,audioLoop])  .. raw:: html

.. raw:: html

功能: .. raw:: html

.. raw:: html

播放音频数据 .. raw:: html

.. raw:: html

音频数据格式支持:mp3、wav、amr、pcm、spx .. raw:: html

.. raw:: html

参数: .. raw:: html

.. raw:: html

audioData: string类型;音频数据 .. raw:: html

.. raw:: html

audioFormat: number类型;音频数据格式;支持audiocore.MP3、audiocore.WAV、audiocore.AMR、audiocore.PCM、audiocore.SPX .. raw:: html

.. raw:: html

audioLoop: bool类型,可选参数,默认不循环;是否循环播放;true表示循环播放,false或者nil表示仅播放一次,不循环播放 .. raw:: html

.. raw:: html

返回值: .. raw:: html

.. raw:: html

result: bool类型;同步播放结果 .. raw:: html

.. raw:: html

false表示不允许播放 .. raw:: html

.. raw:: html

true表示允许播放,并且已经去执行播放动作;异步播放结果通过消息rtos.MSG_AUDIO通知到Lua脚本,消息携带参数msg.play_end_ind,true表示播放成功结束,其余值表示播放失败 .. raw:: html

.. raw:: html

示例:  .. raw:: html

.. raw:: html

local function audioMsg(msg) .. raw:: html

.. raw:: html

    log.info(“audio.MSG_AUDIO”,msg.play_end_ind) .. raw:: html

.. raw:: html

    sys.publish(“LIB_AUDIO_PLAY_IND”,“RESULT”,msg.play_end_ind) .. raw:: html

.. raw:: html

end .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

–注册core上报的rtos.MSG_AUDIO消息的处理函数 .. raw:: html

.. raw:: html

rtos.on(rtos.MSG_AUDIO,audioMsg) .. raw:: html

.. raw:: html

audiocore.play(io.readFile(“/lua/call.mp3”),audiocore.MP3) .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

   .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

audiocore.streamplay(audioFormat,audioData)  .. raw:: html

.. raw:: html

功能: .. raw:: html

.. raw:: html

流式播放音频数据 .. raw:: html

.. raw:: html

音频数据格式支持:mp3、wav、amr、pcm、spx .. raw:: html

.. raw:: html

参数: .. raw:: html

.. raw:: html

audioFormat: number类型;音频数据格式;支持audiocore.MP3、audiocore.WAV、audiocore.AMR、audiocore.PCM、audiocore.SPX .. raw:: html

.. raw:: html

audioData: string类型;音频数据 .. raw:: html

.. raw:: html

返回值: .. raw:: html

.. raw:: html

acceptedAudioDataLen: number类型;接收的音频数据长度 .. raw:: html

.. raw:: html

注意事项: .. raw:: html

.. raw:: html

流式播放音频数据时,在core中有一个4K字节的缓冲区,用来存放音频数据,调用audiocore.streamplay接口时,音频数据被填充到这个缓冲区内,被填充的最大长度为缓冲区的剩余字节数;例如缓冲区还剩1000字节可以填充,如果此时调用audiocore.streamplay填充3000字节数据,则实际只能将这3000字节数据的前1000字节填充到缓冲区,返回值acceptedAudioDataLen的值为1000,表示填充的字节数,剩余的2000字节被丢弃 .. raw:: html

.. raw:: html

示例:  .. raw:: html

.. raw:: html

local tBuffer = {} .. raw:: html

.. raw:: html

local tStreamType .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

local function consumer() .. raw:: html

.. raw:: html

    sys.taskInit(function() .. raw:: html

.. raw:: html

        audio.setVolume(7) .. raw:: html

.. raw:: html

        while true do .. raw:: html

.. raw:: html

            while #tBuffer==0 do .. raw:: html

.. raw:: html

                sys.waitUntil(“DATA_STREAM_IND”) .. raw:: html

.. raw:: html

            end .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

            local data = table.remove(tBuffer,1) .. raw:: html

.. raw:: html

            –log.info(“testAudioStream.consumer remove”,data:len()) .. raw:: html

.. raw:: html

            local procLen = audiocore.streamplay(tStreamType,data) .. raw:: html

.. raw:: html

            if procLen .. raw:: html

                –log.warn(“produce fast”) .. raw:: html

.. raw:: html

                table.insert(tBuffer,1,data:sub(procLen+1,-1)) .. raw:: html

.. raw:: html

                sys.wait(5) .. raw:: html

.. raw:: html

            end .. raw:: html

.. raw:: html

        end .. raw:: html

.. raw:: html

    end) .. raw:: html

.. raw:: html

end .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

local function producer(streamType) .. raw:: html

.. raw:: html

    sys.taskInit(function() .. raw:: html

.. raw:: html

        while true do .. raw:: html

.. raw:: html

            tStreamType = streamType .. raw:: html

.. raw:: html

            local tAudioFile = .. raw:: html

.. raw:: html

            { .. raw:: html

.. raw:: html

                [audiocore.AMR] = “tip.amr”, .. raw:: html

.. raw:: html

                [audiocore.SPX] = “record.spx”, .. raw:: html

.. raw:: html

                [audiocore.PCM] = “alarm_door.pcm”, .. raw:: html

.. raw:: html

            } .. raw:: html

.. raw:: html

             .. raw:: html

.. raw:: html

            local fileHandle = io.open(“/lua/”..tAudioFile[streamType],“rb”) .. raw:: html

.. raw:: html

            if not fileHandle then .. raw:: html

.. raw:: html

                log.error(“testAudioStream.producer open file error”) .. raw:: html

.. raw:: html

                return .. raw:: html

.. raw:: html

            end .. raw:: html

.. raw:: html

             .. raw:: html

.. raw:: html

            while true do .. raw:: html

.. raw:: html

                local data = fileHandle:read(streamType==audiocore.SPX and 1200 or 1024) .. raw:: html

.. raw:: html

                if not data then fileHandle:close() return end .. raw:: html

.. raw:: html

                table.insert(tBuffer,data) .. raw:: html

.. raw:: html

                if #tBuffer==1 then sys.publish(“DATA_STREAM_IND”) end .. raw:: html

.. raw:: html

                –log.info(“testAudioStream.producer”,data:len()) .. raw:: html

.. raw:: html

                sys.wait(10) .. raw:: html

.. raw:: html

            end   .. raw:: html

.. raw:: html

        end .. raw:: html

.. raw:: html

    end) .. raw:: html

.. raw:: html

end .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

sys.timerStart(function() .. raw:: html

.. raw:: html

    –producer(audiocore.AMR) .. raw:: html

.. raw:: html

    –producer(audiocore.SPX) .. raw:: html

.. raw:: html

    producer(audiocore.PCM) .. raw:: html

.. raw:: html

    consumer() .. raw:: html

.. raw:: html

end,3000) .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

.. raw:: html

.. raw:: html

audiocore.streamremain()  .. raw:: html

.. raw:: html

功能: .. raw:: html

.. raw:: html

获取core中流式播放缓冲区剩余未播放的音频流字节数 .. raw:: html

.. raw:: html

参数: .. raw:: html

.. raw:: html

无 .. raw:: html

.. raw:: html

返回值: .. raw:: html

.. raw:: html

remainLen: number类型;缓冲区剩余未播放的音频流字节数 .. raw:: html

.. raw:: html

注意事项: .. raw:: html

.. raw:: html

流式播放音频数据时,在core中有一个4K字节的缓冲区,用来存放音频数据,调用audiocore.streamplay接口时,音频数据被填充到这个缓冲区内,audiocore.streamreamin接口的返回值是缓冲区内未播放的音频流数据字节数 .. raw:: html

.. raw:: html

示例:  .. raw:: html

.. raw:: html

sys.taskInit(function() .. raw:: html

.. raw:: html

    sys.wait(5000) .. raw:: html

.. raw:: html

    local audioData = io.readFile(“/lua/tip.amr”) .. raw:: html

.. raw:: html

     .. raw:: html

.. raw:: html

    –此处audiocore.streamremain()返回0 .. raw:: html

.. raw:: html

    log.info(“begin streamremain”,audiocore.streamremain()) .. raw:: html

.. raw:: html

     .. raw:: html

.. raw:: html

    audiocore.streamplay(audiocore.AMR,audioData:sub(1,2000)) .. raw:: html

.. raw:: html

    –此处audiocore.streamremain()返回值不定,和core中rtos系统调度有关 .. raw:: html

.. raw:: html

    log.info(“after streamplay 2000, streamremain”,audiocore.streamremain()) .. raw:: html

.. raw:: html

     .. raw:: html

.. raw:: html

    sys.wait(2000) .. raw:: html

.. raw:: html

    –此处audiocore.streamremain()返回0 .. raw:: html

.. raw:: html

    log.info(“play done, streamremain”,audiocore.streamremain()) .. raw:: html

.. raw:: html

end) .. raw:: html

.. raw:: html

  .. raw:: html

.. raw:: html

.. raw:: html

.. raw:: html

audiocore.stop()  .. raw:: html

.. raw:: html

功能: .. raw:: html

.. raw:: html

停止音频播放 .. raw:: html

.. raw:: html

参数: .. raw:: html

.. raw:: html

无 .. raw:: html

.. raw:: html

返回值: .. raw:: html

.. raw:: html

无 .. raw:: html

.. raw:: html

注意事项: .. raw:: html

.. raw:: html

在音频播放状态下,调用audiocore.stop()后,会有一个异步消息rtos.MSG_AUDIO通知到Lua脚本,消息携带参数msg.play_end_ind的值为false,表示播放失败 .. raw:: html

.. raw:: html

无音频播放状态下,调用audiocore.stop()后,没有任何消息通知到Lua脚本 .. raw:: html