2016-12-25 21 views
0

嗨,我正在尝试从电路板进行记录,并且我已成功记录4秒。 问题是当我尝试记录更多时间时,我得到一个错误,告诉我没有足够的内存。我的目标是记录一个5分钟的文件。 直到现在我已经创建了一个名为snIn [256]的缓冲区,其中是样本。 我把它发送到[16K * 4sec]的大缓冲区,当它已满时,我创建wav文件。创建wav文件,而不会用完ram

#define WAVFILE_SAMPLES_PER_SECOND 16000 
#define REC_TIME 4 

const int NUM_SAMPLES = WAVFILE_SAMPLES_PER_SECOND * REC_TIME; 
Array<int16_t> my_buffer(NUM_SAMPLES); 

int rec(const char *filename, Array<int16_t> my_buffer) { 

    WavFileResult result; 
    wavfile_info_t info; 
    wavfile_data_t data; 

    // code for filling the info of the wav file: sample rate, byte rate , channels etc.. 

    WAVFILE *wf = wavfile_open(filename, WavFileModeWrite, &result); 
    WAVFILE_DATA_NUM_CHANNELS(&data) = 1; rp = 0; 
    wavfile_write_info(wf, &info); 


    while (rp < NUM_SAMPLES) { 
     WAVFILE_DATA_CHANNEL_DATA(&data, 0) = my_buffer[rp];//fill the data of the wav file  
     wavfile_write_data(wf, &data); 
     rp += 1; 
    } 
    wavfile_close(wf); 
    return 0; 
} 

void fill_buffer (Array<int16_t> snIn , int &j) { 

     for (int i=0 ; i < SEG_SIZE ; i++) { 
      my_buffer[j] = snIn[i]; //puts all the 256 values in my_buffer 
      j++; } 

      if (sent_array == ((int)NUM_SAMPLES/SEG_SIZE)){ // if my_buffer is full, go to rec and make a wav file 
       rec (target_filename , my_buffer); } 
} 

int main() 
{ 
     Array<int16_t> snIn(256); 

      for (int n=0; n<256 ; n++) 
      { //snIn gets new 256 values } 
     sent_array ++; 
     fill_buffer (snIn , j); 
} 

我连连想过一个可能的解决方案,以直接填写与SnIn系[256]缓冲液(而不是使用my_buffer)的wavefile的“数据区”,并在端部关闭wavfile。 请让我知道您对此和其他解决方案的看法。

+0

欢迎堆栈溢出。请花些时间阅读[The Tour](http://stackoverflow.com/tour),并参阅[帮助中心](http://stackoverflow.com/help/asking)中的资料,了解您可以在这里问。 –

+0

解决这些问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –

+0

问题是,我无法找到我使用的编译器中的任何调试器。就像我写的,我编程mbed.org在线编译器,这是非常简单的... – gab55

回答

0

您的字节速率计算不正确。您需要按照公式

num_channels * sample_rate * (bits_per_sample/8) 

而且你已经不叫wavfile_write_info写的元数据。顺便说一句,你应该让自己习惯于检查返回值。即像

result = wavfile_write_data(wf, &data); 
if (result != WavFileResultOK) { 
    wavfile_result_string(result, res_buf, RES_STR_SIZE); 
    printf("%s", res_buf); 
    return result; 
} 

其中res_buf之前分配。你应该把它归因于一个函数。

下面是完整的代码(我扯下了嵌入特定代码在我的计算机上运行它):

rp = 0; 
    WAVFILE_DATA_NUM_CHANNELS(&data) = 1; 
    while (rp<100) { 
     WAVFILE_DATA_CHANNEL_DATA(&data, 0) = buffer[rp]; 
     result = wavfile_write_data(wf, &data); 
     if (result != WavFileResultOK) { 
      wavfile_result_string(result, res_buf, RES_STR_SIZE); 
      printf("%s", res_buf); 
      return result; 
     } 
     rp += 1; 
    } 
    result = wavfile_close(wf); 
    if (result != WavFileResultOK) { 
     wavfile_result_string(result, res_buf, RES_STR_SIZE); 
     printf("%s", res_buf); 
     return result; 
    } 
    printf("Success rec !\r\n"); 
    return 0; 

} 

int main(void) 
{ 
    static const char *target_filename = "rectest.wav"; 
    for (int t=0 ; t<100 ; t++){ 
     buffer[t]= sin(2*3.14*t); 
    } 

    int res = rec(target_filename); 
    if (res != 0) { 
     return 1; 
    } 

    printf("success program!\r\n"); 
    return 0; 
}