demo里面是定义了两个环形队列,使用DMA传输,但是在播放内存卡的音频时存在问题,存到播放队列里的音频会一直重复播放,我该如何处理?然音频只播放一次
Viki Shi:
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
Alvin Chen:
你可能需要使用codec.c的驱动接口。配置好codec,然后I2S推流出去就可以。只用 UDMAChannelSelect(UDMA_CH4_I2S_RX, NULL);SetupPingPongDMATransferTx(pRecordBuffer);
yao xie:
回复 Viki Shi:
我现在想播放音乐,但是想播放完这一段就自己停下来,该如何实现呢?
Alvin Chen:
回复 yao xie:
如上面所说,你只需要配置好codec,然后用使用SetupPingPongDMATransferTx去推流,你应该是自己读的SD卡读完整个buffer 不推流就不会播放了。UDMAChannelSelect(UDMA_CH4_I2S_RX, NULL);
SetupPingPongDMATransferTx(pRecordBuffer);
yao xie:
回复 Alvin Chen:
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
Alvin Chen:
回复 yao xie:
建议你填充完fillbuff 推流出去就释放掉FillZeroes,循环利用而不是一直去开辟他。