spresenseにマイクを1本使用して音声を入力をする際に、拡張ボードのマイクAのみしか選択できず悩んでおります。

現状、マイクA、Bにはそれぞれ3.5mmジャックを、マイクC、DにはそれそれBNC端子を接続しており必要に応じてどれか1つ(もしくは2つ)の端子を使用することを想定しています。

マイク入力ピンの番号(A～D)を選択するにはどのようにしたらよいのでしょうか。

ご回答宜しくお願い致します。
CC BY-SA 4.0
2022-08-10T04:10:56.053
90481
2022-08-22T00:11:10.470
2022-08-10T04:40:45.397
3060
53936
question
spresense
spresense でマイク入力のピン番号を選択するには？
マイクの選択は、SDKでは、以下に記載があります。

<https://developer.sony.com/develop/spresense/docs/sdk_developer_guide_ja.html#_baseband_set_command>

SetMicMap 0x5e SetMicMapCmplt 使用するマイクの選択・順番を設定します。

このマイクのチャンネルマップは、  
<https://developer.sony.com/develop/spresense/docs/sdk_developer_guide_ja.html#_MIC_CHANNEL_SELECT_MAP>

ここにあるような、8byteの設定のようです。

```

    typedef struct
    {
      /*! \brief [in] Set Mic mapping
       *
       *   mic_map[ch(0 <= ch < AS_MIC_CHANNEL_MAX] correspond to
       *   each channels, and you can map analog and digital Mics.
       *
       *   0x1 : Analog Mic 1
       *   0x2 : Analog Mic 2 
       *   0x3 : Analog Mic 3
       *   0x4 : Analog Mic 4
       *   0x5 : Digital Mic 1
       *   0x6 : Digital Mic 2
       *   0x7 : Digital Mic 3
       *   0x8 : Digital Mic 4
       *   0x9 : Digital Mic 5
       *   0xA : Digital Mic 6
       *   0xB : Digital Mic 7
       *   0xC : Digital Mic 8
       *   other : No assing
       *
       */
    
      uint8_t mic_map[AS_MIC_CHANNEL_MAX]; 
    
    } SetMicMapParam;
    
```

ABとCDを入れ替えて使う場合は、

```

      AudioCommand command;
    
      command.header.packet_length = LENGTH_SETMICMAP;
      command.header.command_code  = AUDCMD_SETMICMAP;
      command.header.sub_code      = 0;
    
      command.set_mic_map_param.mic_map = { 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
    
      AS_SendAudioCommand( &command );
    
```

と

```

      AudioCommand command;
    
      command.header.packet_length = LENGTH_SETMICMAP;
      command.header.command_code  = AUDCMD_SETMICMAP;
      command.header.sub_code      = 0;
    
      command.set_mic_map_param.mic_map = { 03, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
    
      AS_SendAudioCommand( &command );
    
```

とし、2chで録音すれば、マイクがABとCDで切り替わりそうです。

また、Arduinoの場合は、マイク順の変更には対応されていないようですが、  
Audio.h の中にある、

```

    err_t AudioClass::set_mic_map(uint8_t map[AS_MIC_CHANNEL_MAX])
    {
      AudioCommand command;
    
      command.header.packet_length = LENGTH_SETMICMAP;
      command.header.command_code  = AUDCMD_SETMICMAP;
      command.header.sub_code      = 0;
    
      memcpy(command.set_mic_map_param.mic_map, map, sizeof(command.set_mic_map_param.mic_map));
    
      AS_SendAudioCommand( &command );
    
      AudioResult result;
      AS_ReceiveAudioResult(&result);
    
      if (result.header.result_code != AUDRLT_SETMICMAPCMPLT)
        {
          print_err("ERROR: Command(0x%x) fails. Result code(0x%x) Module id(%d) Error code(0x%lx) subcode(0x%lx)\n",
                    command.header.command_code, result.header.result_code, result.error_response_param.module_id,
                    result.error_response_param.error_code, result.error_response_param.error_sub_code);
          print_dbg("ERROR: %s\n", error_msg[result.error_response_param.error_code]);
          return AUDIOLIB_ECODE_AUDIOCOMMAND_ERROR;
        }
    
      return AUDIOLIB_ECODE_OK;
    }
    
```

というプライベート関数があるので、こちら呼べるようにしてしまえば、  
変更が可能になりそうです。
CC BY-SA 4.0
2022-08-18T00:51:39.887
90601
2022-08-18T01:51:28.540
2022-08-18T01:51:28.540
3060
32281
90481
answer
Arduinoの場合、MediaRecorderクラスを使うと、こちらの記事にあるように、マイクのマッピングが変更できそうです。

ここでいう、

uint32_t mic_map = 0x56789abc;  
CXD56_AUDIO_ECODE error_code = cxd56_audio_set_micmap(mic_map);

を

uint32_t mic_map = 0x21;  
CXD56_AUDIO_ECODE error_code = cxd56_audio_set_micmap(mic_map);

か、

uint32_t mic_map = 0x43;  
CXD56_AUDIO_ECODE error_code = cxd56_audio_set_micmap(mic_map);

に変える感じでしょうか。

<http://spresense.livedoor.blog/archives/21028830.html>
CC BY-SA 4.0
2022-08-22T00:11:10.470
90680
2022-08-22T00:11:10.470
32281
90481
answer