Other Parts Discussed in Thread: CC3200, , CC2564C
想实现一个从sd卡读取音频数据后播放的功能
方案:
用Launchxl-cc26x2r1+cc3200 audio booster pack的方式实现音频播放,用一个自制的sd卡板作为音频文件的存储,以spi信号连接。
使用example里面的i2secho和fatsd的例子,在I2secho里面加入了fatsd里面sd卡读取部分的代码。
期望实现的是在i2secho流程的基础上,替换i2s的read过来的数据,就是在treatment那里,读取音频文件数据并替换相应的字节。
主要的代码实现:
;例子里面的i2s,spi,ti3254初始化,这里不再重复
/* Get the filesize of the source file */
fseek(src, 0, SEEK_END);
filesize = ftell(src);
rewind(src);
uint32_t file_index = 0;
/* Treatment */
while(1){
/* Wait for transaction ready for treatment */
retc = sem_wait(&semDataReadyForTreatment);
if (retc == -1) {
while (1);
}
I2S_Transaction* transactionToTreat = (I2S_Transaction*) List_head(&treatmentList);
if(transactionToTreat != NULL){
/*
* Treatment:
* The higher the sampling frequency,
* the less time we have to process the data
*/
#if SAMPLE_RATE > 16000
int16_t *buf = transactionToTreat->bufPtr;
/* bufSize is expressed in bytes but samples to consider are 16 bits long */
uint16_t numOfbytes = transactionToTreat->bufSize;
if(file_index+numOfbytes<=filesize)
{
bytesRead = fread((uint8_t*)buf, 1, numOfbytes, src);
file_index += bytesRead;
if(file_index>=filesize)
{
file_index = 0;
rewind(src);
}
}
else
{
bytesRead = fread((uint8_t*)buf, 1, filesize-file_index, src);
rewind(src);
bytesRead = fread((uint8_t*)(buf+filesize-file_index), 1, numOfbytes+file_index-filesize, src);
file_index = bytesRead;
}
#elif SAMPLE_RATE > 8000
/* Data processing */
int16_t *buf = transactionToTreat->bufPtr;
/* bufSize is expressed in bytes but samples to consider are 16 bits long */
uint16_t numOfSamples = transactionToTreat->bufSize / sizeof(uint16_t);
uint16_t n;
for(n=0; n<numOfSamples-3; n=n+2) {
buf[n] = (buf[n] + buf[n+2]) / 2;
buf[n+1] = (buf[n+1] + buf[n+3]) / 2;
}
#else
#endif
/* Place in the write-list the transaction we just treated */
List_remove(&treatmentList, (List_Elem*)transactionToTreat);
List_put(&i2sWriteList, (List_Elem*)transactionToTreat);
}
}
这里SAMPLE_RATE 选的是44100
问题:
一旦在循环中使用fread进行文件读取,不管是将数据读取到buf中,还是读取到一个单独开出来的缓存中(即不去替换buf中的内容),都会造成程序不再进while的循环,
i2s的readCallbackFxn也不会再有数据。
在fread处打断点时,可以看到成功读到数据,确定sd卡功能正常,但是连续运行后,整个while循环都不会再进,此时暂停程序,似乎是进入到了deepsleep
不知道问题出在哪里。或者具体应该以什么方式实现这样的功能。
其实刚开始是想在我们原有的一个基于simple_peripheral的程序里面添加一个类似的功能的,当时是创建了两个task,一个task里面有一部分是初始化sd卡的以及一些其他功能,一个task和i2secho类似,初始化i2s,ti3254,然后在while循环里等待特定的event,出现了类似的问题。所以才用上述方式进行实验,发现还是同样的现象。