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:
Wed Jun 15 12:54:02 2016 +0000
Revision:
3:68f16dc80b68
Parent:
2:034168531ce0
Child:
4:0beea5d9a205
4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:089c5e022aa8 1 //----------------------------------------------------------------------
MikamiUitOpen 0:089c5e022aa8 2 // CODEC を使い,MEMS マイクまたはライン (CN11) から入力した信号をそのまま
MikamiUitOpen 0:089c5e022aa8 3 // リアルタイムでヘッドフォン出力 (CN10) へ出力する
MikamiUitOpen 0:089c5e022aa8 4 // ディジタルフィルタなどの雛形として使える
MikamiUitOpen 0:089c5e022aa8 5 //
MikamiUitOpen 0:089c5e022aa8 6 // "stm32746g_discovery_audio.c" の BSP_AUDIO_IN_OUT_Init() 関数は
MikamiUitOpen 0:089c5e022aa8 7 // INPUT_LINE_1 からの入力を禁止しているため,これを禁止しない関数として,
MikamiUitOpen 0:089c5e022aa8 8 // BSP_AUDIO_IN_OUT_Init() の一部を修正し,MyBSP_AUDIO_IN_OUT_Init()
MikamiUitOpen 0:089c5e022aa8 9 // という関数を定義した.
MikamiUitOpen 0:089c5e022aa8 10 // この MyBSP_AUDIO_IN_OUT_Init() は "MyBSP_AUDIO_IN_OUT_Init.hpp" で
MikamiUitOpen 0:089c5e022aa8 11 // 定義されている.
MikamiUitOpen 0:089c5e022aa8 12 //
MikamiUitOpen 3:68f16dc80b68 13 // 2016/06/15, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:089c5e022aa8 14 //----------------------------------------------------------------------
MikamiUitOpen 0:089c5e022aa8 15
MikamiUitOpen 0:089c5e022aa8 16 #include "ButtonGroup.hpp"
MikamiUitOpen 0:089c5e022aa8 17 #include "Label.hpp"
MikamiUitOpen 0:089c5e022aa8 18 #include "WaveformDisplay.hpp"
MikamiUitOpen 0:089c5e022aa8 19
MikamiUitOpen 0:089c5e022aa8 20 #include "SAI_InOut.hpp"
MikamiUitOpen 0:089c5e022aa8 21 using namespace Mikami;
MikamiUitOpen 0:089c5e022aa8 22
MikamiUitOpen 0:089c5e022aa8 23 int main()
MikamiUitOpen 0:089c5e022aa8 24 {
MikamiUitOpen 0:089c5e022aa8 25 const uint32_t BACK_COLOR = GuiBase::ENUM_BACK;
MikamiUitOpen 0:089c5e022aa8 26 const uint32_t AXIS_COLOR = 0xFFCCFFFF;
MikamiUitOpen 0:089c5e022aa8 27 const uint32_t LINE_COLOR = LCD_COLOR_CYAN;
MikamiUitOpen 0:089c5e022aa8 28
MikamiUitOpen 0:089c5e022aa8 29 const uint32_t N_DATA = 400;
MikamiUitOpen 0:089c5e022aa8 30 SaiIO mySai(SaiIO::BOTH, N_DATA, I2S_AUDIOFREQ_16K, INPUT_DEVICE_INPUT_LINE_1);
MikamiUitOpen 0:089c5e022aa8 31
MikamiUitOpen 0:089c5e022aa8 32 LCD_DISCO_F746NG *lcd = GuiBase::GetLcdPtr();
MikamiUitOpen 0:089c5e022aa8 33 lcd->Clear(BACK_COLOR);
MikamiUitOpen 0:089c5e022aa8 34
MikamiUitOpen 3:68f16dc80b68 35 Label labelTitle(240, 10, "Demo of Audio I/O", Label::CENTER, Font16);
MikamiUitOpen 3:68f16dc80b68 36
MikamiUitOpen 2:034168531ce0 37 const uint16_t BG_LEFT = 370;
MikamiUitOpen 2:034168531ce0 38 const uint16_t BG_WIDTH = 110;
MikamiUitOpen 0:089c5e022aa8 39 const uint16_t BG_HEIGHT = 40;
MikamiUitOpen 0:089c5e022aa8 40
MikamiUitOpen 0:089c5e022aa8 41 const string INPUT[2] = {"MIC", "LINE"};
MikamiUitOpen 0:089c5e022aa8 42 ButtonGroup inSw(BG_LEFT, 180, BG_WIDTH/2, BG_HEIGHT,
MikamiUitOpen 0:089c5e022aa8 43 2, INPUT, 0, 0, 2, 1);
MikamiUitOpen 0:089c5e022aa8 44
MikamiUitOpen 3:68f16dc80b68 45 const string RUN_STOP[2] = {"RUN", "STOP"};
MikamiUitOpen 3:68f16dc80b68 46 ButtonGroup runStop(BG_LEFT, 230, BG_WIDTH/2, BG_HEIGHT,
MikamiUitOpen 3:68f16dc80b68 47 2, RUN_STOP, 0, 0, 2, 0);
MikamiUitOpen 0:089c5e022aa8 48
MikamiUitOpen 0:089c5e022aa8 49 lcd->SetTextColor(LCD_COLOR_WHITE);
MikamiUitOpen 0:089c5e022aa8 50 lcd->SetFont(&Font16);
MikamiUitOpen 0:089c5e022aa8 51
MikamiUitOpen 0:089c5e022aa8 52 const int X_WAV = 30; // Origin for x axis of waveform
MikamiUitOpen 0:089c5e022aa8 53 const int Y_WAV = 60; // Origin for y axis of waveform
MikamiUitOpen 0:089c5e022aa8 54 WaveformDisplay waveDispL(lcd, X_WAV, Y_WAV, N_DATA, 7,
MikamiUitOpen 0:089c5e022aa8 55 AXIS_COLOR, LINE_COLOR, BACK_COLOR);
MikamiUitOpen 0:089c5e022aa8 56 WaveformDisplay waveDispR(lcd, X_WAV, Y_WAV+60, N_DATA, 7,
MikamiUitOpen 0:089c5e022aa8 57 AXIS_COLOR, LINE_COLOR, BACK_COLOR);
MikamiUitOpen 0:089c5e022aa8 58 Label labelL(445, Y_WAV- 8, "L", Label::LEFT, Font16);
MikamiUitOpen 0:089c5e022aa8 59 Label labelR(445, Y_WAV+52, "R", Label::LEFT, Font16);
MikamiUitOpen 0:089c5e022aa8 60
MikamiUitOpen 0:089c5e022aa8 61 int16_t snL[N_DATA];
MikamiUitOpen 0:089c5e022aa8 62 int16_t snR[N_DATA];
MikamiUitOpen 0:089c5e022aa8 63 bool on = true;
MikamiUitOpen 0:089c5e022aa8 64 int inSelect = 1; // input: line
MikamiUitOpen 0:089c5e022aa8 65
MikamiUitOpen 1:7400dd732dbc 66 mySai.RecordIn();
MikamiUitOpen 1:7400dd732dbc 67 mySai.PlayOut();
MikamiUitOpen 3:68f16dc80b68 68 bool run = true; // run
MikamiUitOpen 1:7400dd732dbc 69
MikamiUitOpen 0:089c5e022aa8 70 while(1)
MikamiUitOpen 0:089c5e022aa8 71 {
MikamiUitOpen 0:089c5e022aa8 72 int sw = 0;
MikamiUitOpen 3:68f16dc80b68 73 if (runStop.GetTouchedNumber(sw))
MikamiUitOpen 3:68f16dc80b68 74 {
MikamiUitOpen 0:089c5e022aa8 75 on = (sw == 0) ? true : false;
MikamiUitOpen 3:68f16dc80b68 76 if (on && !run) mySai.ResumeOut();
MikamiUitOpen 3:68f16dc80b68 77 if (!on && run) mySai.PauseOut();
MikamiUitOpen 3:68f16dc80b68 78 run = on;
MikamiUitOpen 3:68f16dc80b68 79 }
MikamiUitOpen 0:089c5e022aa8 80
MikamiUitOpen 0:089c5e022aa8 81 int swNow;
MikamiUitOpen 0:089c5e022aa8 82 if (inSw.GetTouchedNumber(swNow) && (swNow != inSelect))
MikamiUitOpen 0:089c5e022aa8 83 {
MikamiUitOpen 0:089c5e022aa8 84 mySai.SwitchInputDevice(swNow);
MikamiUitOpen 0:089c5e022aa8 85 inSelect = swNow;
MikamiUitOpen 0:089c5e022aa8 86 }
MikamiUitOpen 0:089c5e022aa8 87
MikamiUitOpen 0:089c5e022aa8 88 if (mySai.IsCompleted())
MikamiUitOpen 0:089c5e022aa8 89 {
MikamiUitOpen 0:089c5e022aa8 90 for (int n=0; n<mySai.GetLength(); n++)
MikamiUitOpen 0:089c5e022aa8 91 {
MikamiUitOpen 0:089c5e022aa8 92 int16_t xL;
MikamiUitOpen 0:089c5e022aa8 93 int16_t xR;
MikamiUitOpen 0:089c5e022aa8 94 mySai.Input(xL, xR);
MikamiUitOpen 0:089c5e022aa8 95 snL[n] = xL; // 入力波形のモニタのため
MikamiUitOpen 0:089c5e022aa8 96 snR[n] = xR; // 入力波形のモニタのため
MikamiUitOpen 0:089c5e022aa8 97
MikamiUitOpen 0:089c5e022aa8 98 //----------------------------------------
MikamiUitOpen 0:089c5e022aa8 99 // ここにディジタルフィルタなどの処理を書く
MikamiUitOpen 0:089c5e022aa8 100 int16_t yL = xL; // through の場合
MikamiUitOpen 0:089c5e022aa8 101 int16_t yR = xR; // through の場合
MikamiUitOpen 0:089c5e022aa8 102 //----------------------------------------
MikamiUitOpen 0:089c5e022aa8 103
MikamiUitOpen 0:089c5e022aa8 104 mySai.Output(yL, yR);
MikamiUitOpen 0:089c5e022aa8 105 }
MikamiUitOpen 0:089c5e022aa8 106 if (on)
MikamiUitOpen 0:089c5e022aa8 107 {
MikamiUitOpen 0:089c5e022aa8 108 waveDispL.Execute(snL);
MikamiUitOpen 0:089c5e022aa8 109 waveDispR.Execute(snR);
MikamiUitOpen 0:089c5e022aa8 110 }
MikamiUitOpen 0:089c5e022aa8 111 mySai.Reset();
MikamiUitOpen 0:089c5e022aa8 112 }
MikamiUitOpen 0:089c5e022aa8 113 }
MikamiUitOpen 0:089c5e022aa8 114 }