

SonyのSpresenseにてアナログマイクを用いて録音を行っています。  
コンパイル環境はArduino IDEで、Windows10です。  
使用しているSDカードはSony製MicroSDHCメモリーカードのSR-32UX2Aで32GBです。

192kHzにて録音をしており、数回は録音が行われSDカードにWavファイルが保存されます。  
そのWavファイルについてもPCにて確認を行いましたが、問題なく録音が行われています。

ただ、数回録音すると、  
シリアルモニターに

[code]

    Attension:module[4][0] attension id[1]/code[6] {objects/media_recorder/audio_recorder_sink.cpp L84}
    
[/code]

と表示が出たのち、毎回エラーとなり、録音が行わません。

電源を再投入すれば、また一つ目のファイルから録音していきます。

録音動作そのものが出来ていないわけではないので、プログラムやセンサーの接続的な問題ではないと思うのですが、何が問題なのでしょうか。

SDカードを変更すると、SDカードによっては起動後の最初からこのメッセージが表示され、  
エラーとなってしまい、録音できないことからSDカードに関連した問題かと考えているのですが、対処法も思いつかずにいます。  
※5種類ぐらいSDカードは試してみましたが、どれも遅かれ早かれ同様のエラーが起きているのが現状です。

プログラムは以下に添付いたします。  
プログラム最終部、FileNo += 1の後のsleep(3)は本来不要なのですが、エラーが起きる確率が少し下がったので追加しています。

[code]

    /*
     *  recorder_wav.ino - Recorder example application for WAV(PCM)
     *  Copyright 2018 Sony Semiconductor Solutions Corporation
     *
     *  This library is free software; you can redistribute it and/or
     *  modify it under the terms of the GNU Lesser General Public
     *  License as published by the Free Software Foundation; either
     *  version 2.1 of the License, or (at your option) any later version.
     *
     *  This library is distributed in the hope that it will be useful,
     *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     *  Lesser General Public License for more details.
     *
     *  You should have received a copy of the GNU Lesser General Public
     *  License along with this library; if not, write to the Free Software
     *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     */
    
    #include <SDHCI.h>
    #include <Audio.h>
    
    // ファイルのナンバリング用
    #include <string.h>
    #include <SoftwareSerial.h>
    
    #include <arch/board/board.h>
    
    SDClass theSD;
    AudioClass *theAudio;
    
    File myFile;
    
    unsigned int FileNo,loop_no;
    String s_fileNo,filename;
    
    bool ErrEnd = false;
    
    /**
     * @brief Audio attention callback
     *
     * When audio internal error occurc, this function will be called back.
     */
    
    static void audio_attention_cb(const ErrorAttentionParam *atprm)
    {
      puts("Attention!");
    
      if (atprm->error_code >= AS_ATTENTION_CODE_WARNING)
        {
          ErrEnd = true;
       }
    }
    
    /**
     * @brief Setup recording of mp3 stream to file
     *
     * Select input device as microphone <br>
     * Initialize filetype to stereo wav with 48 Kb/s sampling rate <br>
     * Open "Sound.wav" file in write mode
     */
    
    /* Sampling rate
     * Set 16000 or 48000
     */
    
    
    static const uint32_t recoding_sampling_rate = 192000;
    
    
    /* Number of input channels
     * Set either 1, 2, or 4.
     */
    
    static const uint8_t  recoding_cannel_number = 1;
    
    /* Audio bit depth
     * Set 16 or 24
     */
    
    static const uint8_t  recoding_bit_length = 24;
    
    /* Recording time[second] */
    
    static const uint32_t recoding_time = 40;
    
    /* Bytes per second */
    
    static const int32_t recoding_byte_per_second = recoding_sampling_rate *
                                                    recoding_cannel_number *
                                                    recoding_bit_length / 8;
    
    /* Total recording size */
    
    static const int32_t recoding_size = recoding_byte_per_second * recoding_time;
    /* 録音時間の調整に4をかけている．
     */
    void setup()
    {
    
      pinMode(LED0, OUTPUT);
      digitalWrite(LED0, LOW);
    
      FileNo =1;
    
    }
    
    void loop() 
    {
      err_t err;
    
    init_WAV_file:
    loop_no=0;
    filename = "Sound";
    filename += FileNo;
    filename += ".wav";
    puts("OK");
    
     theAudio = AudioClass::getInstance();
    
      theAudio->begin(audio_attention_cb);
    
      puts("initialization Audio Library");
    
      /* Select input device as microphone */
      theAudio->setRenderingClockMode(AS_CLKMODE_HIRES);
      theAudio->setRecorderMode(AS_SETRECDR_STS_INPUTDEVICE_MIC);
    
      /* Search for WAVDEC codec in "/mnt/sd0/BIN" directory */
      theAudio->initRecorder(AS_CODECTYPE_WAV,
                             "/mnt/sd0/BIN",
                             AS_SAMPLINGRATE_192000,
                             AS_BITLENGTH_16,
                             AS_CHANNEL_MONO);
      puts("Init Recorder!");
        /* Open file for data write on SD card */
      myFile = theSD.open(filename, FILE_WRITE);
      /* Verify file open */
    
      if (!myFile)
        {
          printf("File open error\n");
          exit(1);
        }
    
      sleep(5);
      theAudio->writeWavHeader(myFile);
      puts("Write Header!");
    
      theAudio->startRecorder();
      puts("Recording Start!");
      digitalWrite(LED0, HIGH);
    
      /* recording end condition */  
      if_sentence:
        if(theAudio->getRecordingSize() > recoding_size)
        // if(loop_no > 200000000)
          {
            theAudio->stopRecorder();
            sleep(1);
            err = theAudio->readFrames(myFile);
            puts("break!");
            goto exitRecording;
          }
    
      /* Read frames to record in file */
      err = theAudio->readFrames(myFile);
    
      if (err != AUDIOLIB_ECODE_OK)
        {
          printf("File End! =%d\n",err);
          theAudio->stopRecorder();
          goto exitRecording;
        }
    
      if (ErrEnd)
        {
          printf("Error End\n");
          theAudio->stopRecorder();
          goto exitRecording;
        }
       /* This sleep is adjusted by the time to write the audio stream file.
         Please adjust in according with the processing contents
         being processed at the same time by Application.
      */
     // usleep(10000);
      usleep(1000);
      loop_no++;
      goto  if_sentence;
      return;
    
    exitRecording:
      theAudio->closeOutputFile(myFile);
      myFile.close();
    
      theAudio->setReadyMode();
      theAudio->end();
    
      puts("End Recording");
      digitalWrite(LED0, LOW);
      FileNo +=1;
      sleep(3);
      goto init_WAV_file;
    
    }
    
[/code]

どなたか御教授ください。  
よろしくお願いします。


CC BY-SA 4.0
2019-12-19T07:18:22.503
61575
2020-09-18T06:06:20.700
36141
question
spresense
Spresenseのマイク録音時に発生するエラーについて


自分は、192kHz/24bit/Monoは、記録できました。

  * Team 8GB class10 
  * 東芝 8GB class10 

のどちらでも可能のようです。

1点変更したのは、フォーマットする際に、アロケーションユニットサイズを64キロバイトにしました。  
これで解決できればと思います。

ちなみに、192kHz/24bit/Stereoは、エラーになってしまうようです。


CC BY-SA 4.0
2020-01-07T05:16:06.033
62023
2020-01-07T05:16:06.033
32281
61575
answer


プログラムのコメントに

[code]

    /**
     * @brief Setup recording of mp3 stream to file  
     *
     * Select input device as microphone <br>
     * Initialize filetype to stereo wav with 48 Kb/s sampling rate <br>
     * Open "Sound.wav" file in write mode
     */
    
    /* Sampling rate
     * Set 16000 or 48000
     */
    
[/code]

とあるので、48Kb/sでステレオ録音用のプログラムなのだと思われます。  
それを無理やり（"sampling
rateは、16000か48000にしてね"との注意書きを無視して）192Kb/sにして常に正常動作するのは厳しいのでしょうね。

USBメモリやSDカード等のフラッシュメモリを使った素子に書き込みを行う際、空白の部分にデータを書き込んでいくのは良いのですが、データがいっぱいになってデータの書き換えをする際にはフラッシュメモリの一定の大きさの領域のデータを全消去(Flash)する動作が入ります(これがFlash
memoryと呼ばれる理由)。Flashしている間はメモリへの書き込みも読み込みも出来ませんので、Flashが起きてもデータが失われないようにバッファを用意しておくなどの対策が必要になります。

コメントにSet 16000 or 48000とあるのは、Flashが起きても48Kb/sなら問題が起きにくいプログラムだとという事でしょう。


CC BY-SA 4.0
2020-01-07T08:34:35.073
62031
2020-01-07T08:34:35.073
217
61575
answer


自分も記録の速度がかなり悪化してしまったSDカードが出てきました。  
PCのクイックフォーマットをしても改善されないので、  
SD Associationにある、SDメモリカードフォーマッターを使って  
物理フォーマットをし直しました。

<https://www.sdcard.org/jp/downloads/formatter/>

これをしたところ、エラーが出ていたカードでも記録できました。

記録できない場合は、一度、物理フォーマットをしてみるのもよいかもしれませんね。


CC BY-SA 4.0
2020-04-13T01:30:41.903
65573
2020-04-13T01:30:41.903
32281
61575
answer