Demo program of SAI_IO class for audio signal input and output. DISCO-F746 搭載の CODEC (WM8994) を使ってオーディオ信号の入出力を行うための SAI_IO クラスの使用例.

Dependencies:   BSP_DISCO_F746NG F746_GUI F746_SAI_IO LCD_DISCO_F746NG TS_DISCO_F746NG mbed

Committer:
MikamiUitOpen
Date:
Mon Mar 12 04:52:03 2018 +0000
Revision:
11:0bb3dfef6d78
Parent:
10:a0fe66103ea4
12

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 4:0beea5d9a205 1 //---------------------------------------------------
MikamiUitOpen 4:0beea5d9a205 2 // CODEC を使い,MEMS マイクから入力した信号をそのまま
MikamiUitOpen 0:089c5e022aa8 3 // リアルタイムでヘッドフォン出力 (CN10) へ出力する
MikamiUitOpen 0:089c5e022aa8 4 //
MikamiUitOpen 7:770d50e8dbb1 5 // ライブラリのリビジョン:
MikamiUitOpen 11:0bb3dfef6d78 6 // F746_GUI 33
MikamiUitOpen 11:0bb3dfef6d78 7 // F746_SAI_IO 12
MikamiUitOpen 11:0bb3dfef6d78 8 // mbed 161
MikamiUitOpen 7:770d50e8dbb1 9 //
MikamiUitOpen 11:0bb3dfef6d78 10 // 2018/03/12, Copyright (c) 2018 MIKAMI, Naoki
MikamiUitOpen 4:0beea5d9a205 11 //---------------------------------------------------
MikamiUitOpen 0:089c5e022aa8 12
MikamiUitOpen 4:0beea5d9a205 13 #include "F746_GUI.hpp"
MikamiUitOpen 0:089c5e022aa8 14 #include "WaveformDisplay.hpp"
MikamiUitOpen 0:089c5e022aa8 15
MikamiUitOpen 0:089c5e022aa8 16 #include "SAI_InOut.hpp"
MikamiUitOpen 0:089c5e022aa8 17 using namespace Mikami;
MikamiUitOpen 0:089c5e022aa8 18
MikamiUitOpen 0:089c5e022aa8 19 int main()
MikamiUitOpen 0:089c5e022aa8 20 {
MikamiUitOpen 0:089c5e022aa8 21 const uint32_t BACK_COLOR = GuiBase::ENUM_BACK;
MikamiUitOpen 0:089c5e022aa8 22 const uint32_t AXIS_COLOR = 0xFFCCFFFF;
MikamiUitOpen 0:089c5e022aa8 23 const uint32_t LINE_COLOR = LCD_COLOR_CYAN;
MikamiUitOpen 0:089c5e022aa8 24
MikamiUitOpen 0:089c5e022aa8 25 const uint32_t N_DATA = 400;
MikamiUitOpen 4:0beea5d9a205 26 SaiIO mySai(SaiIO::BOTH, N_DATA, I2S_AUDIOFREQ_16K,
MikamiUitOpen 4:0beea5d9a205 27 INPUT_DEVICE_DIGITAL_MICROPHONE_2);
MikamiUitOpen 7:770d50e8dbb1 28
MikamiUitOpen 8:6cb2c40946c4 29 LCD_DISCO_F746NG &lcd = GuiBase::GetLcd();
MikamiUitOpen 8:6cb2c40946c4 30 lcd.Clear(BACK_COLOR);
MikamiUitOpen 0:089c5e022aa8 31
MikamiUitOpen 5:d12a1fcf5ad1 32 Label labelTitle(240, 10, "Demo of Audio I/O", Label::CENTER, Font16);
MikamiUitOpen 3:68f16dc80b68 33
MikamiUitOpen 2:034168531ce0 34 const uint16_t BG_LEFT = 370;
MikamiUitOpen 2:034168531ce0 35 const uint16_t BG_WIDTH = 110;
MikamiUitOpen 0:089c5e022aa8 36 const uint16_t BG_HEIGHT = 40;
MikamiUitOpen 0:089c5e022aa8 37
MikamiUitOpen 3:68f16dc80b68 38 ButtonGroup runStop(BG_LEFT, 230, BG_WIDTH/2, BG_HEIGHT,
MikamiUitOpen 4:0beea5d9a205 39 2, (string[]){"RUN", "STOP"}, 0, 0, 2, 0);
MikamiUitOpen 0:089c5e022aa8 40
MikamiUitOpen 8:6cb2c40946c4 41 lcd.SetTextColor(LCD_COLOR_WHITE);
MikamiUitOpen 8:6cb2c40946c4 42 lcd.SetFont(&Font16);
MikamiUitOpen 0:089c5e022aa8 43
MikamiUitOpen 7:770d50e8dbb1 44 const int X_WAV = 30; // x軸の原点
MikamiUitOpen 7:770d50e8dbb1 45 const int Y_WAV = 80; // y軸の原点 (Lチャンネル)
MikamiUitOpen 0:089c5e022aa8 46 WaveformDisplay waveDispL(lcd, X_WAV, Y_WAV, N_DATA, 7,
MikamiUitOpen 0:089c5e022aa8 47 AXIS_COLOR, LINE_COLOR, BACK_COLOR);
MikamiUitOpen 4:0beea5d9a205 48 WaveformDisplay waveDispR(lcd, X_WAV, Y_WAV+80, N_DATA, 7,
MikamiUitOpen 0:089c5e022aa8 49 AXIS_COLOR, LINE_COLOR, BACK_COLOR);
MikamiUitOpen 0:089c5e022aa8 50 Label labelL(445, Y_WAV- 8, "L", Label::LEFT, Font16);
MikamiUitOpen 4:0beea5d9a205 51 Label labelR(445, Y_WAV+72, "R", Label::LEFT, Font16);
MikamiUitOpen 0:089c5e022aa8 52
MikamiUitOpen 0:089c5e022aa8 53 int16_t snL[N_DATA];
MikamiUitOpen 0:089c5e022aa8 54 int16_t snR[N_DATA];
MikamiUitOpen 0:089c5e022aa8 55 bool on = true;
MikamiUitOpen 0:089c5e022aa8 56
MikamiUitOpen 1:7400dd732dbc 57 mySai.RecordIn();
MikamiUitOpen 1:7400dd732dbc 58 mySai.PlayOut();
MikamiUitOpen 3:68f16dc80b68 59 bool run = true; // run
MikamiUitOpen 1:7400dd732dbc 60
MikamiUitOpen 4:0beea5d9a205 61 while (true)
MikamiUitOpen 0:089c5e022aa8 62 {
MikamiUitOpen 0:089c5e022aa8 63 int sw = 0;
MikamiUitOpen 3:68f16dc80b68 64 if (runStop.GetTouchedNumber(sw))
MikamiUitOpen 3:68f16dc80b68 65 {
MikamiUitOpen 0:089c5e022aa8 66 on = (sw == 0) ? true : false;
MikamiUitOpen 3:68f16dc80b68 67 if (on && !run) mySai.ResumeOut();
MikamiUitOpen 3:68f16dc80b68 68 if (!on && run) mySai.PauseOut();
MikamiUitOpen 3:68f16dc80b68 69 run = on;
MikamiUitOpen 3:68f16dc80b68 70 }
MikamiUitOpen 0:089c5e022aa8 71
MikamiUitOpen 0:089c5e022aa8 72 if (mySai.IsCompleted())
MikamiUitOpen 0:089c5e022aa8 73 {
MikamiUitOpen 0:089c5e022aa8 74 for (int n=0; n<mySai.GetLength(); n++)
MikamiUitOpen 0:089c5e022aa8 75 {
MikamiUitOpen 0:089c5e022aa8 76 int16_t xL;
MikamiUitOpen 0:089c5e022aa8 77 int16_t xR;
MikamiUitOpen 0:089c5e022aa8 78 mySai.Input(xL, xR);
MikamiUitOpen 0:089c5e022aa8 79 snL[n] = xL; // 入力波形のモニタのため
MikamiUitOpen 0:089c5e022aa8 80 snR[n] = xR; // 入力波形のモニタのため
MikamiUitOpen 0:089c5e022aa8 81
MikamiUitOpen 0:089c5e022aa8 82 //----------------------------------------
MikamiUitOpen 0:089c5e022aa8 83 // ここにディジタルフィルタなどの処理を書く
MikamiUitOpen 0:089c5e022aa8 84 int16_t yL = xL; // through の場合
MikamiUitOpen 0:089c5e022aa8 85 int16_t yR = xR; // through の場合
MikamiUitOpen 0:089c5e022aa8 86 //----------------------------------------
MikamiUitOpen 0:089c5e022aa8 87
MikamiUitOpen 0:089c5e022aa8 88 mySai.Output(yL, yR);
MikamiUitOpen 0:089c5e022aa8 89 }
MikamiUitOpen 0:089c5e022aa8 90 if (on)
MikamiUitOpen 0:089c5e022aa8 91 {
MikamiUitOpen 0:089c5e022aa8 92 waveDispL.Execute(snL);
MikamiUitOpen 0:089c5e022aa8 93 waveDispR.Execute(snR);
MikamiUitOpen 0:089c5e022aa8 94 }
MikamiUitOpen 0:089c5e022aa8 95 }
MikamiUitOpen 0:089c5e022aa8 96 }
MikamiUitOpen 0:089c5e022aa8 97 }