2016-12-25 3 views
0

こんにちは、私はボードから録音しようとしています。 問題は、私がさらに時間を記録しようとすると、十分なメモリがないことを伝えるエラーが発生したことです。私の目標は、5分のファイルを記録することです。 これまでサンプルであるsnIn [256]という名前のバッファを作成しました。 大きなバッファー[16K * 4sec]に送信し、いっぱいになるとwavファイルを作成します。RAMを使い果たすことなくwavファイルを作成

#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); 
} 

私は何度も何度も(代わりmy_bufferを使用する)snIn [256]バッファに直接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

あなたのバイトレートは正しく計算されていません。また、あなたは、メタデータを記述するためにwavfile_write_infoを呼び出していない式

num_channels * sample_rate * (bits_per_sample/8) 

に従う必要があります。あなたは戻り値をチェックする習慣にする必要があります。私。例えば

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; 
} 
関連する問題