This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC3200官方的音频demo播放问题



demo里面是定义了两个环形队列,使用DMA传输,但是在播放内存卡的音频时存在问题,存到播放队列里的音频会一直重复播放,我该如何处理?然音频只播放一次

  • demo默认是进入loopback mode,即设备获取音频样本并传递给codec
    By default the application runs in loopback mode until a connection is established between the two Launchpads

    详细介绍请看: processors.wiki.ti.com/.../CC3200_Wi-Fi_Audio_Application
  • 你可能需要使用codec.c的驱动接口。配置好codec,然后I2S推流出去就可以。只用 UDMAChannelSelect(UDMA_CH4_I2S_RX, NULL);
    SetupPingPongDMATransferTx(pRecordBuffer);
  • 我现在想播放音乐,但是想播放完这一段就自己停下来,该如何实现呢?
  • 如上面所说,你只需要配置好codec,然后用使用SetupPingPongDMATransferTx去推流,你应该是自己读的SD卡读完整个buffer 不推流就不会播放了。
    UDMAChannelSelect(UDMA_CH4_I2S_RX, NULL);
    SetupPingPongDMATransferTx(pRecordBuffer);
  • f_mount(&fs,"0",1);
    res = f_opendir(&dir,"/");
    if( res == FR_OK)
    {
    Message("Opening root directory.................... [ok]\n\n\r");
    Message("/\n\r");
    ListDirectory(&dir);
    }
    else
    {
    Message("Opening root directory.................... [Failed]\n\n\r");
    }

    Message("\n\rReading open file...\n\r");
    res = f_open(&fp,"open.PCM",FA_READ);
    if(res == FR_OK)
    {
    unsigned int n=0;
    for(n=0;n<16;n++) //读83次
    {
    f_lseek(&fp,n*5000);
    f_read(&fp,g_cBsdBuf,5000,&Size);
    //Report("Read : %d Bytes\n\n\r",Size);
    // for(unsigned int i=0;i<10000;i++)
    // Report("%02X",pbuff[i]);
    //Report("FillBuffer \r\n");
    lRetVal = FillBuffer(pPlayBuffer,\
    g_cBsdBuf, \
    5000); //填充接收到的音频数据到播放缓冲区
    if(lRetVal < 0)
    {
    UART_PRINT("Unable to fill buffer\n\r");
    }
    delay_play(13);
    //MAP_UtilsDelay(1500);
    MAP_UtilsDelay(65000);
    UpdateReadPtr(pPlayBuffer, PACKET_SIZE);

    }
    f_lseek(&fp,n*5000);
    f_read(&fp,g_cBsdBuf,3000,&Size);
    // for(unsigned int i=0;i<3000;i++)
    // Report("%02X",pbuff[i]);
    lRetVal = FillBuffer(pPlayBuffer,\
    g_cBsdBuf, \
    3000); //填充接收到的音频数据到播放缓冲区
    if(lRetVal < 0)
    {
    UART_PRINT("Unable to fill buffer\n\r");
    }
    // delay_play(1);
    // MAP_UtilsDelay(1000);
    // MAP_UtilsDelay(1000);
    UpdateReadPtr(pPlayBuffer, PACKET_SIZE);
    // //Report("Read : %d Bytes\n\n\r",Size);
    f_close(&fp);
    }
    else
    {

    Report("Failed to open open.PCM,error%d\n\r",res);
    }
    Report("\ndelay1\n");
    //delay_play(1);
    //delay(3); ///延时0.3S
    // Report("\ndelay2\n");
    // FillZeroes(pPlayBuffer,PLAY_BUFFER_SIZE);//清空buff
    // Report("\ndelay3\n");
    while(1);
    由于内存有限,我分段从内存卡读取音频open.pcm,音频内容是:“已开机”,但是播放了一次“已开机”后会一直循环的出现播放“开机”这两个字,我的配置是按照官方音频demo来的,没有做任何改变。调用这个FillZeroes(pPlayBuffer,PLAY_BUFFER_SIZE);//清空buff后及会停止播放了,但是如果这个清空buff放到任务里就会卡死,整个任务都不走了,PLAY_BUFFER_SIZE的大小是70KByte
  • 建议你填充完fillbuff 推流出去就释放掉FillZeroes,循环利用而不是一直去开辟他。