オーディオと LE Audio¶
IPRO7 は、アナログマイクと PDM マイク用のオーディオ ADC(AUADC)、10 ビット DAC(GPDAC)、I2S を備えています。SDK はその上に components/audio の入力フレームワークと出力フレームワークを置き、LC3 などのコーデック、CherryUSB による USB オーディオ、BLE ホストの LE Audio プロファイルを加えています。IPRO7AI Reef EVK では、出荷時ファームウェア ipro7ai_reef_demo がシェルからすべてのオーディオブロックを操作でき、その src/audio.c がこのページのリファレンスコードです。
要点
- Reef のオーディオ:PDM マイク、ジャック J2 のヘッドセットマイク、GPDAC から出力するスピーカーアンプとヘッドホン出力。
ipro7ai_reef_demoで録音、再生、モニター、SD カードへの WAV ファイルの録音(mic sdrec)ができ、ボードを USB マイクにすること(mic usb)もできます。 - 構成:
CONFIG_AUDIO_CAPTURE=y、CONFIG_AUDIO_OUTPUT=y、CONFIG_DMA_CHANNEL_ALLOCATOR=y。USB オーディオにはCONFIG_CHERRYUSB_DEVICE_AUDIO=yを追加します。 - LE Audio:ユニキャストヘッドセット
ipro_le_audio_headset(defconfig_reef)、CONFIG_EM_SIZE=32のbt54_iso2コントローラー、ビルド済みライブラリの LC3。その README では、スマートフォンからのオーディオ再生は未検証とされています。 - V2.2.1 に含まれないもの:FreeRTOS の LE Audio ブロードキャストのサンプル、USB から BLE へのオーディオブリッジ。
アーキテクチャ¶
flowchart LR
PDM["PDM マイク"] --> AUADC["AUADC"]
HS["ヘッドセットマイク(J2)"] --> AUADC
AUADC --> CAP["audio_capture"]
CAP --> APP["アプリケーション<br/>(録音、モニター、ASRC)"]
APP --> OUT["audio_output"]
OUT --> DAC["GPDAC → スピーカーアンプ / ヘッドホン"]
OUT --> UAC["USB UAC → ホスト"]
ISO["LE Audio ISO(CIS)"] --> DEC["LC3 デコード"] --> HDAC["ヘッドセットの DAC 経路"]
| 部分 | 場所 | 説明 |
|---|---|---|
| オーディオ HAL | bsp/hal/inc/hal_auadc.h、hal_dac.h、hal_i2s.h |
オーディオ ADC、DAC、I2S |
| 入力 | components/audio/include/audio_capture.h |
アナログマイク(AUDIO_SRC_AMIC)、PDM マイク(AUDIO_SRC_DMIC)、I2S(AUDIO_SRC_I2S)から 16 ビットモノラルの PCM フレームへ。複数のコンシューマーがそれぞれ自分のコピーを読み出します |
| 出力 | components/audio/include/audio_output.h |
AUDIO_OUTPUT_DAC、AUDIO_OUTPUT_UAC、AUDIO_OUTPUT_I2S、AUDIO_OUTPUT_DUMP に共通の API |
| 処理 | audio_resampler.h、audio_asrc.h、audio_speaker_eq.h、audio_bass_boost.h、mp3_decoder.h |
リサンプリング、レベルコントローラー付きのクロックドリフト補正リサンプラー、スピーカー EQ、低音強調、MP3 デコード |
| コーデック | components/3rdparty/liblc3(ビルド済み)、libsbc、opus、minimp3 |
LC3 は LE Audio で使用 |
| LE Audio | components/wireless/bluetooth/ipro_bt_host/upstream/zephyr/subsys/bluetooth/audio/ |
Zephyr v4.4.0 の LE Audio プロファイルのソース |
| USB オーディオ | components/cherryusb/class/audio/ |
USB Audio Class デバイス |
オーディオハードウェア¶
IPRO7AI Reef EVK V4.0 のオーディオブロックと、コードで使うボードヘッダーの名前(bsp/board/ipro7/ipro7ai_reef_board_config.h):
| ブロック | ピン | ボードヘッダー |
|---|---|---|
| PDM マイク MK1 | CLK GPIO16、DATA GPIO17、左スロット | BOARD_MIC_CLK_PIN、BOARD_MIC_DAT_PIN、BOARD_MIC_PDM_CHANNEL |
| ヘッドセットマイク(ジャック J2) | AIN7(GPIO13)+、AIN6(GPIO12)−、差動 | BOARD_HSMIC_POS_CH、BOARD_HSMIC_NEG_CH |
| GPDAC 出力 | DAC チャネル A、GPIO23。ヘッドホン段(J2)とスピーカーアンプに同時に出力 | BOARD_SPK_DAC_PIN |
| スピーカーアンプ PAM8302A(J_SPK) | イネーブル GPIO25、High = オン | BOARD_SPK_EN_PIN、BOARD_SPK_EN_ACTIVE(1) |
| ヘッドセットプラグの検出 | GPIO26、Low = プラグ挿入 | BOARD_HP_DET_PIN、BOARD_HP_DET_ACTIVE(0) |
- ヘッドホンジャックには常に DAC の信号が出力されます。「ヘッドホンのみ」とはスピーカーアンプをオフにしておくことで、それ以外に経路を切り替えるスイッチはありません。
- PDM の経路は 16,000 Hz ちょうどではありません。公称値は 15,875 Hz(2.032 MHz ÷ 128)で、Reef での実測値は約 15,872 Hz です。
mic sdrecは測定したレートを WAV ヘッダーに書き込み、mic usbはaudio_asrcでホストの 16,000 Hz に変換します。 audio_outputの DAC バックエンドは 32 kHz 固定で動作します(audio_capture.hのDAC_RATE)。それ以外のサンプリングレートはリサンプリングされます。- アンプのゲインは高く(デモの README では 30 V/V)、デモはデフォルトで振幅 20 % でトーンを再生します。
CONFIG_DMA_CHANNEL_ALLOCATOR=yを設定してください。入力、再生、USB のアイソクロナスエンドポイントが、衝突することなく実行時に DMA チャネルを取得できます。
ジャックの種類、コネクター、ピン配置の全体は IPRO7AI Reef EVK ページにあります。IPRO7 EVB と IPRO7AI EVK には独自のオーディオサンプル(ipro_pdm_mic_demo、ipro7ai_evk_demo)があります。それぞれのボードのページを参照してください。
オーディオフレームワーク¶
CONFIG_AUDIO_OUTPUT=y
CONFIG_AUDIO_CAPTURE=y
CONFIG_DMA_CHANNEL_ALLOCATOR=y
# audio_output の UAC バックエンドによる USB マイク
CONFIG_COMPONENTS_CHERRYUSB_ENABLE=y
CONFIG_CHERRYUSB_DEVICE=y
CONFIG_CHERRYUSB_DEVICE_AUDIO=y
| キー | 効果 |
|---|---|
CONFIG_AUDIO_CAPTURE |
audio_capture.c と PDM マイクのチェーン audio_pdm_mic.c をビルド |
CONFIG_AUDIO_OUTPUT |
DAC とダンプのバックエンドを含む audio_output.c をビルド |
CONFIG_CHERRYUSB_DEVICE_AUDIO |
CONFIG_AUDIO_OUTPUT と組み合わせると、UAC バックエンド audio_output_uac.c もビルド |
CONFIG_AUDIO_OUTPUT_UAC_EXCLUDE |
独自の USB オーディオデバイスを実装するアプリケーション向けに、UAC バックエンドを除外(両方が usbd_audio_* コールバックを定義してしまうため) |
CONFIG_BSP_USING_I2S0 |
CONFIG_AUDIO_OUTPUT と組み合わせると、I2S バックエンドをビルド |
リサンプラー、クロックドリフト補正リサンプラー(audio_asrc)、スピーカー EQ、低音強調は常にビルドされます。
各部分の使い方:
audio_capture_init()はaudio_capture_cfg_t(ソースの種類、サンプリングレート、フレームサイズ、PDM またはアナログの設定)を受け取ります。audio_capture_add_consumer()は専用のバッファーを持つコンシューマー ID を返し、audio_capture_start()が DMA を開始し、audio_capture_read(id, buf, bytes, timeout_ms)が PCM を返します。audio_output_create()はaudio_output_cfg_tを受け取ります。AUDIO_OUTPUT_MODE_STREAMINGでは循環 DMA リングから連続して再生し、audio_output_write(out, pcm, samples)はリングがいっぱいのときに短時間だけブロックします。AUDIO_OUTPUT_MODE_ONESHOTではバッファー全体の再生が終わるまでブロックします。audio_output_write()の 3 番目の引数はバイト数ではなく、チャネルあたりのサンプル数です。- DAC バックエンドでは、アンプのイネーブルピンとそのアクティブレベル(
dac_spk_gpio、dac_spk_en_active)を渡します。audio_output_start()がアンプをオンにします。
Reef でのハンズオン¶
PDM マイクから 3 秒間録音してヘッドホンで再生し、続いて SD カードに WAV ファイルを録音し、ボードを USB マイクとして使います。すべて ipro7ai_reef_demo で動作します。抜粋は、独自のアプリケーションで再利用するコードです。
-
構成
デモの
.configのオーディオ関連の行(オーディオフレームワークに掲載)と Reef ボードの行があれば、アプリケーションに必要なものはそろいます。 -
コード
PDM マイクと DAC 出力を開く部分です。ピンとレベルのマクロは Reef のボードヘッダーから来ています。
apps/platform/ipro7ai_reef_demo/src/audio.c(抜粋)static audio_output_t *sink_open(uint32_t rate, audio_route_t route) { audio_output_cfg_t cfg = { .type = AUDIO_OUTPUT_DAC, .mode = AUDIO_OUTPUT_MODE_STREAMING, .sample_rate = rate, .channels = 1, .dac_spk_gpio = BOARD_SPK_EN_PIN, .dac_spk_en_active = BOARD_SPK_EN_ACTIVE ? 1 : -1, }; audio_output_t *out = audio_output_create(&cfg); if (!out) { IPRO_LOGE(LOG_TAG, "audio_output_create failed"); return NULL; } if (audio_output_start(out) != 0) { IPRO_LOGE(LOG_TAG, "audio_output_start failed"); audio_output_destroy(out); return NULL; } /* start() switched the amplifier on; the route decides whether it stays. */ route_apply(route); return out; } static int capture_open(audio_in_t src, uint32_t consumer_bytes, int *consumer) { audio_capture_cfg_t cfg = { .sample_rate = AUDIO_RATE_HZ, /* 16000 */ .frame_samples = AUDIO_FRAME_SAMPLES, /* 320 = 20 ms */ }; switch (src) { case AUDIO_IN_PDM: cfg.type = AUDIO_SRC_DMIC; cfg.dmic.clk_pin = BOARD_MIC_CLK_PIN; cfg.dmic.data_pin = BOARD_MIC_DAT_PIN; cfg.dmic.channel = (uint8_t)s_pdm_ch; cfg.dmic.digital_gain_db = MIC_DIGITAL_GAIN_DB; /* 18.0f */ break; case AUDIO_IN_HSMIC: cfg.type = AUDIO_SRC_AMIC; cfg.amic.single_ended = 0; cfg.amic.pos_ch = BOARD_HSMIC_POS_CH; cfg.amic.neg_ch = BOARD_HSMIC_NEG_CH; cfg.amic.gain_db = HSMIC_ANALOG_GAIN_DB; /* 24 */ break; /* ... */ } if (audio_capture_init(&cfg) != 0) { return -1; } *consumer = audio_capture_add_consumer(consumer_bytes); if (*consumer < 0) { audio_capture_deinit(); return -1; } if (audio_capture_start() != 0) { audio_capture_deinit(); return -1; } return 0; }ライブモニター(
mic loop)は、フレームを入力から出力へ移します。apps/platform/ipro7ai_reef_demo/src/audio.c(do_loop からの抜粋)while (!s_stop_req && (frames == 0 || done < frames)) { size_t got = audio_capture_read(consumer, chunk, sizeof(chunk), 200); if (got == 0) { IPRO_LOGW(LOG_TAG, "capture stalled"); break; } gain_apply(chunk, got / sizeof(int16_t)); audio_output_write(out, chunk, got / sizeof(int16_t)); done++; }同じコードを独自のアプリケーションで使うには、
ipro_ble_remoteが Reef 用ビルドで行っているように、デモのsrc/audio.cをCMakeLists.txtに追加します(audio.cが呼び出すrgb_led.c、keys.c、sdcard.cも列挙されています)。アプリケーションの作成については最初の独自アプリケーションを作るを参照してください。 -
ビルド
出力:
apps/platform/ipro7ai_reef_demo/build/build_out/ipro7ai_reef_demo_IPRO7.bin -
書き込み
Reef をダウンロードモードにし(SW1 を押したまま SW2 を短く押し、SW1 を離します)、IntelProCube のディレクトリから書き込みツールを実行します。
cd <ICUBE> ./ipro_iot_tool_macos --chipname ipro7 --chip-variant IPRO7AI \ --port /dev/cu.usbserial-XXXX --baudrate 921600 \ --pt chips/ipro7/partition/partition_cfg_2M.toml \ --firmware <SDK>/apps/platform/ipro7ai_reef_demo/build/build_out/ipro7ai_reef_demo_IPRO7.bin[All Success]を確認し、SW2 を押します。他のホストやbuild_freertos.shについては書き込みとシリアルコンソールを参照してください。 -
実行と確認
ヘッドホンを J2 に挿し、U6 のコンソールを 115200 baud で開きます。起動時のバナーは、コマンドグループを列挙する
REEF: shell readyの行で終わります。続いて次のように入力します。ipro /> spk tone 1000 500 1000 Hz for 500 ms at 20% -> speaker+headphone ipro /> mic rec pdm 3 recording 3 s from pdm... I (…) AUDIO: recorded 48000 samples from pdm: peak … dBFS, rms … dBFS, dc …, voice band (300-3400 Hz) rms … dBFS; first 100 ms left out (peak there … dBFS) ipro /> mic play hp playing 48000 samples, +20 dBトーンがスピーカーとヘッドホンから聞こえ、続いて録音した音声がヘッドホンからのみ聞こえます(
hpはアンプをオフのままにします)。FAT でフォーマットした microSD カードをスロットに挿している場合:ipro /> mic sdrec pdm take1 10 recording 10 s from pdm to sd:/rec/take1.wav (LED red; `mic stop` ends it) I (…) AUDIO: sdrec: sd:/rec/take1.wav … samples (10 s) at … Hz, measured … Hz, peak … dBFS, stalls 0 ipro /> mic usb pdm USB microphone from pdm: 16 kHz mono UAC on the board's USB-C (LED red; `mic stop` ends it)mic usbの実行中は、Reef の USB-C に接続したコンピューターから USB マイク(VID 0x3896、PID 0x0003)として認識され、録音できます。mic statusで USB キューのレベルを確認でき、mic stopで終了します。
これらの確認を繰り返し実行できるテストにするには、アプリケーションのテストを参照してください。
LE Audio¶
LE Audio は ISO チャネルで LC3 オーディオを伝送します。ユニキャストには CIS、ブロードキャストには BIS を使います。受信側のデータ経路は次のとおりです。
flowchart LR
P["スマートフォン(ユニキャストクライアント)"] -->|"CIS"| C["コントローラー bt54_iso2"]
C --> H["ホスト:ASCS / BAP"]
H --> Q["アプリケーションのキュー"]
Q --> D["LC3 デコードタスク"]
D --> O["DAC"]
.config に必要な設定(ipro_le_audio_headset/defconfig_reef からの抜粋):
CONFIG_BT_CTLR_IPRO=y
CONFIG_IPRO_BLE_CTLR_LIB="link1_periph"
CONFIG_IPRO_BLE_CTLR_FEATURE="bt54_iso2"
CONFIG_IPRO_BLE_CTLR_CFG_DBG=y
CONFIG_EM_SIZE=32
CONFIG_BT_CONN=1
CONFIG_BT_SETTINGS=y
CONFIG_BT_AUDIO=y
CONFIG_BT_AUDIO_RX=y
CONFIG_COMPONENTS_LC3_ENABLE=y
ビルドは Kconfig の依存関係を解決しないため、この抜粋ではなく defconfig_reef 全体から始めてください。このファイルは BAP、PACS、ASCS、ISO、CAP、CSIP、VCP も有効にしています。コントローラーアーカイブのルールは BLE 開発を参照してください。
ユニキャストヘッドセット¶
apps/bluetooth/le_audio/ipro_le_audio_headset は IPRO-LE-Audio としてアドバタイズします。LE Audio のユニキャストクライアントが接続し、ボードへの CIS を確立します。
本リリースでの状況
アプリケーションの README では、これは完成したヘッドセットではなく、LE Audio プロファイルと ISO 受信経路の立ち上げとして説明されています。CIS の確立と ISO 受信経路は 2 台のボードによるテストで検証済みですが、スマートフォンからのオーディオ再生は未検証とされています。
| 項目 | 詳細 |
|---|---|
| ロール | BAP ユニキャストサーバー、PACS、ASCS(シンク ASE のみ)、CSIP セットメンバーを兼ねる CAP アクセプター、VCP ボリュームレンダラー |
| PACS の機能 | LC3、16/32/48 kHz、7.5/10 ms フレーム、モノラル、1 フレームあたり 26~155 オクテット |
| セキュリティ | SMP ペアリング。CONFIG_BT_SETTINGS でボンディング情報を Flash に保存 |
| コントローラー | link1_periph / bt54_iso2、32 KB の EM、デバッグ版アーカイブ(CONFIG_IPRO_BLE_CTLR_CFG_DBG=y) |
make -C apps/bluetooth/le_audio/ipro_le_audio_headset DEFCONFIG=defconfig_reef # 出力は build_reef/build_out/
Reef では、defconfig_reef は DAC 版です。出力は GPDAC へ送られ(J2 のヘッドホン、J2 にプラグが挿さっていないときはスピーカーアンプ)、VCP ボリュームレンダラーを通じて SW3 と SW4 で音量を下げ/上げ、SW5 でミュートします。このアプリケーションの他の構成(.config、DAC.config、UAC.config)は IPRO7 EVB 向けにビルドされます。ビルド、ペアリング、確認事項は LE Audio 入門を参照してください。
src/bap_server.c が PACS と ASCS を登録する部分(抜粋。ログと条件付きコンパイルを省略して簡略化しています。unicast_server_cb は同じファイルで定義されています):
static const struct bt_audio_codec_cap lc3_sink_codec_cap =
BT_AUDIO_CODEC_CAP_LC3(BT_AUDIO_CODEC_CAP_FREQ_16KHZ |
BT_AUDIO_CODEC_CAP_FREQ_32KHZ |
BT_AUDIO_CODEC_CAP_FREQ_48KHZ,
BT_AUDIO_CODEC_CAP_DURATION_7_5 |
BT_AUDIO_CODEC_CAP_DURATION_10 |
BT_AUDIO_CODEC_CAP_DURATION_PREFER_10,
BT_AUDIO_CODEC_CAP_CHAN_COUNT_SUPPORT(1),
26, 155, 1,
BT_AUDIO_CONTEXT_TYPE_MEDIA |
BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL);
static struct bt_pacs_cap lc3_sink_cap = {
.codec_cap = &lc3_sink_codec_cap,
};
int bap_server_init(void)
{
struct bt_pacs_register_param pacs_param = {
.snk_pac = true,
.snk_loc = true,
};
struct bt_bap_unicast_server_register_param server_param = {
.snk_cnt = CONFIG_BT_ASCS_MAX_ASE_SNK_COUNT,
.src_cnt = CONFIG_BT_ASCS_MAX_ASE_SRC_COUNT,
};
int err;
err = bt_pacs_register(&pacs_param); /* 1. PACS service */
if (err != 0 && err != -EALREADY) {
return err;
}
err = bt_pacs_cap_register(BT_AUDIO_DIR_SINK, &lc3_sink_cap); /* 2. LC3 capability */
if (err != 0) {
return err;
}
err = bt_pacs_set_location(BT_AUDIO_DIR_SINK, BT_AUDIO_LOCATION_FRONT_LEFT);
if (err != 0) {
return err;
}
bt_pacs_set_supported_contexts(BT_AUDIO_DIR_SINK,
BT_AUDIO_CONTEXT_TYPE_MEDIA |
BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL |
BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED);
bt_pacs_set_available_contexts(BT_AUDIO_DIR_SINK,
BT_AUDIO_CONTEXT_TYPE_MEDIA |
BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL |
BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED);
err = bt_bap_unicast_server_register(&server_param); /* 3. ASCS endpoints */
if (err != 0 && err != -EALREADY) {
return err;
}
return bt_bap_unicast_server_register_cb(&unicast_server_cb); /* 4. BAP callbacks */
}
ブロードキャスト¶
本リリースには BIS ブロードキャストを行う FreeRTOS アプリケーションはありません。ホストには bt_bap_broadcast_source_* と bt_bap_broadcast_sink_* の API が含まれており、zephyr/samples/bap_broadcast_source と bap_broadcast_sink が IPRO7 EVB と IPRO7AI EVK 上の Zephyr でそれらを示しています。Reef 用の Zephyr ボードはありません(Zephyr RTOS を参照)。
プロファイル¶
ホストの subsys/bluetooth/audio/ には、Zephyr v4.4.0 の LE Audio プロファイル(BAP、CAP、PACS、ASCS、VCP、CSIP、MICP、MCP、TMAP など)のソースがあります。ヘッドセットが有効にしているもの:
| プロファイル | .config |
ロール |
|---|---|---|
| BAP | CONFIG_BT_BAP_UNICAST_SERVER=y |
ユニキャストサーバー |
| PACS | CONFIG_BT_PACS=y、CONFIG_BT_PAC_SNK=y |
シンクの機能を公開 |
| ASCS | CONFIG_BT_ASCS=y |
オーディオストリームのエンドポイント |
| CAP | CONFIG_BT_CAP_ACCEPTOR=y |
アクセプター |
| CSIP | CONFIG_BT_CSIP_SET_MEMBER=y |
セットメンバー |
| VCP | CONFIG_BT_VCP_VOL_REND=y |
ボリュームレンダラー |
LC3¶
- ビルド済みライブラリ
components/3rdparty/liblc3/lib/libliblc3.aとヘッダーlc3.h。CONFIG_COMPONENTS_LC3_ENABLE=yで追加します。 - ビットレートは 16~320 kbps(
LC3_MIN_BITRATE、LC3_MAX_BITRATE)。 components/3rdpartyにある他のコーデック:SBC(libsbc)、Opus(opus、ipro_agora_sentinoが使用)、minimp3。
USB オーディオ¶
USB オーディオは、Reef の USB-C(Full Speed)で CherryUSB の UAC デバイスクラスを使います。
CONFIG_AUDIO_OUTPUT=y も設定すると、audio_output に UAC バックエンドが加わります。.type = AUDIO_OUTPUT_UAC で出力を作成し、DAC と同じように PCM を書き込みます。ipro7ai_reef_demo は 2 つのコマンドでこれを使っています。
| コマンド | USB デバイス | 動作 |
|---|---|---|
mic usb <pdm\|headset> |
16 kHz モノラルのマイク | 選択したマイクの音声をホストへストリーミングします。入力は、UAC キューを約 1,800 サンプルに保つレベルコントローラー付きの audio_asrc を通るため、遅い PDM クロックでもホスト側でアンダーランが起きません |
mic usb host |
16 kHz モノラルのスピーカーとマイク | デジタル注入用のループバック。ホストがボードに再生した音声が、weak フック audio_usbhost_process() を通ってマイクとして戻ります |
どちらも VID 0x3896、PID 0x0003 として認識されます。独自の USB オーディオデバイスを実装するアプリケーションは CONFIG_AUDIO_OUTPUT_UAC_EXCLUDE=y を設定します。IPRO7 EVB のサンプル ipro_pdm_mic_demo と、ipro_le_audio_headset の UAC.config は、それぞれ独自の UAC デバイスを持っています。
PDM 録音¶
ipro7ai_reef_demo は PDM マイク(pdm)またはヘッドセットマイク(headset)から録音します。
| コマンド | 録音先 | 上限 |
|---|---|---|
mic rec <src> <s> |
PSRAM、16 kHz モノラル。mic play [hp] でメイクアップゲインをかけて再生 |
10 秒 |
mic sdrec <src> <name> <s> |
sd:/rec/<name>.wav、16 ビットモノラル。ヘッダーには測定したレートが入ります |
2 時間 |
mic loop <src> [s] [hp] |
出力へのライブモニター。時間を省略すると mic stop まで実行 |
— |
mic gain <dB>で再生時のメイクアップゲイン(0~40 dB、デフォルト 20 dB)を設定し、mic ch <0|1>で PDM のスロットを選択します。mic statusは、直前の録音のピーク、RMS、音声帯域(300~3,400 Hz)のレベルを dBFS で表示します。デシメーターはステップ状に立ち上がるため、開始後最初の 100 ms はこれらの値から除外されます。mic sdrecは 30 秒ごとにファイルをフラッシュするため、電源を切っても失われるのは最大で最後の 30 秒です。測定したレートが公称値の 15,875 Hz から 80 Hz を超えてずれている場合は、サンプルの欠落として報告され、ヘッダーには 15,875 Hz が書き込まれます。- マイクの音をスピーカーでモニターするとハウリングが起きます。ヘッドホンと
hpを使ってください。
IPRO7 EVB と IPRO7AI EVK 用の PDM 録音のサンプルは ipro_pdm_mic_demo です(LC3 による BLE 転送、Android コンパニオンアプリのソースは tools/android/IproMicDemo/)。
本リリースの制限事項¶
ipro_le_audio_headset:スマートフォンからのオーディオ再生は未検証です(README を参照)。ヘッドセットにはソース ASE がなく、マイクの音声は送り返しません。- FreeRTOS の LE Audio ブロードキャストのサンプルはありません。ブロードキャストは IPRO7 EVB と IPRO7AI EVK 用の Zephyr サンプルとしてのみ存在します。
bt54_iso2には 32 KB 以上の EM が必要ですが、コントローラーの PDS スリープは 16 KB の EM プロファイルにしか対応していないため、LE Audio の構成ではコントローラーは PDS に入りません。- Reef V4.0 にはライン入力がありません。デモの README にある
auxソースと AUX-IN の記述は、以前のボードについてのものです。 - USB から BLE へのオーディオブリッジのサンプルは含まれていません。
関連するサンプルとドキュメント¶
| サンプル | Reef の構成 | 内容 |
|---|---|---|
ipro7ai_reef_demo |
.config |
スピーカー、ヘッドホン、PDM マイクとヘッドセットマイク、SD カードへの録音、USB マイク。ipro7ai_reef_demo を参照 |
ipro_le_audio_headset |
defconfig_reef |
LE Audio ユニキャストヘッドセット、DAC 版。ipro_le_audio_headset を参照 |
ipro_ble_remote |
defconfig_reef |
Reef のハードウェアサービスでデモの audio.c を再利用 |
ipro_reef_teach |
.config |
voice モード:PDM マイクによる話者認識。声紋認識を参照 |
- LE Audio 入門
- BLE 開発:コントローラーの選択、初期化の順序、GATT
- オーディオ API
- IPRO7AI Reef EVK:ジャック、スピーカーコネクター、ピン