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
main.cpp@1:7400dd732dbc, 2016-05-09 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon May 09 13:34:21 2016 +0000
- Revision:
- 1:7400dd732dbc
- Parent:
- 0:089c5e022aa8
- Child:
- 2:034168531ce0
2
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:7400dd732dbc | 13 | // 2016/05/09, 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 | 0:089c5e022aa8 | 35 | const uint16_t BG_LEFT = 380; |
MikamiUitOpen | 0:089c5e022aa8 | 36 | const uint16_t BG_WIDTH = 100; |
MikamiUitOpen | 0:089c5e022aa8 | 37 | const uint16_t BG_HEIGHT = 40; |
MikamiUitOpen | 0:089c5e022aa8 | 38 | |
MikamiUitOpen | 0:089c5e022aa8 | 39 | const string INPUT[2] = {"MIC", "LINE"}; |
MikamiUitOpen | 0:089c5e022aa8 | 40 | ButtonGroup inSw(BG_LEFT, 180, BG_WIDTH/2, BG_HEIGHT, |
MikamiUitOpen | 0:089c5e022aa8 | 41 | 2, INPUT, 0, 0, 2, 1); |
MikamiUitOpen | 0:089c5e022aa8 | 42 | |
MikamiUitOpen | 0:089c5e022aa8 | 43 | const string ON_OFF[2] = {"ON", "OFF"}; |
MikamiUitOpen | 0:089c5e022aa8 | 44 | ButtonGroup onOff(BG_LEFT, 230, BG_WIDTH/2, BG_HEIGHT, |
MikamiUitOpen | 0:089c5e022aa8 | 45 | 2, ON_OFF, 0, 0, 2, 0); |
MikamiUitOpen | 0:089c5e022aa8 | 46 | |
MikamiUitOpen | 0:089c5e022aa8 | 47 | lcd->SetTextColor(LCD_COLOR_WHITE); |
MikamiUitOpen | 0:089c5e022aa8 | 48 | lcd->SetFont(&Font16); |
MikamiUitOpen | 0:089c5e022aa8 | 49 | |
MikamiUitOpen | 0:089c5e022aa8 | 50 | const int X_WAV = 30; // Origin for x axis of waveform |
MikamiUitOpen | 0:089c5e022aa8 | 51 | const int Y_WAV = 60; // Origin for y axis of waveform |
MikamiUitOpen | 0:089c5e022aa8 | 52 | WaveformDisplay waveDispL(lcd, X_WAV, Y_WAV, N_DATA, 7, |
MikamiUitOpen | 0:089c5e022aa8 | 53 | AXIS_COLOR, LINE_COLOR, BACK_COLOR); |
MikamiUitOpen | 0:089c5e022aa8 | 54 | WaveformDisplay waveDispR(lcd, X_WAV, Y_WAV+60, N_DATA, 7, |
MikamiUitOpen | 0:089c5e022aa8 | 55 | AXIS_COLOR, LINE_COLOR, BACK_COLOR); |
MikamiUitOpen | 0:089c5e022aa8 | 56 | Label labelL(445, Y_WAV- 8, "L", Label::LEFT, Font16); |
MikamiUitOpen | 0:089c5e022aa8 | 57 | Label labelR(445, Y_WAV+52, "R", Label::LEFT, Font16); |
MikamiUitOpen | 0:089c5e022aa8 | 58 | |
MikamiUitOpen | 0:089c5e022aa8 | 59 | int16_t snL[N_DATA]; |
MikamiUitOpen | 0:089c5e022aa8 | 60 | int16_t snR[N_DATA]; |
MikamiUitOpen | 0:089c5e022aa8 | 61 | bool on = true; |
MikamiUitOpen | 0:089c5e022aa8 | 62 | int inSelect = 1; // input: line |
MikamiUitOpen | 0:089c5e022aa8 | 63 | |
MikamiUitOpen | 1:7400dd732dbc | 64 | mySai.RecordIn(); |
MikamiUitOpen | 1:7400dd732dbc | 65 | mySai.PlayOut(); |
MikamiUitOpen | 1:7400dd732dbc | 66 | |
MikamiUitOpen | 0:089c5e022aa8 | 67 | while(1) |
MikamiUitOpen | 0:089c5e022aa8 | 68 | { |
MikamiUitOpen | 0:089c5e022aa8 | 69 | int sw = 0; |
MikamiUitOpen | 0:089c5e022aa8 | 70 | if (onOff.GetTouchedNumber(sw)) |
MikamiUitOpen | 0:089c5e022aa8 | 71 | on = (sw == 0) ? true : false; |
MikamiUitOpen | 0:089c5e022aa8 | 72 | |
MikamiUitOpen | 0:089c5e022aa8 | 73 | int swNow; |
MikamiUitOpen | 0:089c5e022aa8 | 74 | if (inSw.GetTouchedNumber(swNow) && (swNow != inSelect)) |
MikamiUitOpen | 0:089c5e022aa8 | 75 | { |
MikamiUitOpen | 0:089c5e022aa8 | 76 | mySai.SwitchInputDevice(swNow); |
MikamiUitOpen | 1:7400dd732dbc | 77 | mySai.RecordIn(); |
MikamiUitOpen | 1:7400dd732dbc | 78 | mySai.PlayOut(); |
MikamiUitOpen | 0:089c5e022aa8 | 79 | inSelect = swNow; |
MikamiUitOpen | 0:089c5e022aa8 | 80 | } |
MikamiUitOpen | 0:089c5e022aa8 | 81 | |
MikamiUitOpen | 0:089c5e022aa8 | 82 | if (mySai.IsCompleted()) |
MikamiUitOpen | 0:089c5e022aa8 | 83 | { |
MikamiUitOpen | 0:089c5e022aa8 | 84 | for (int n=0; n<mySai.GetLength(); n++) |
MikamiUitOpen | 0:089c5e022aa8 | 85 | { |
MikamiUitOpen | 0:089c5e022aa8 | 86 | int16_t xL; |
MikamiUitOpen | 0:089c5e022aa8 | 87 | int16_t xR; |
MikamiUitOpen | 0:089c5e022aa8 | 88 | mySai.Input(xL, xR); |
MikamiUitOpen | 0:089c5e022aa8 | 89 | snL[n] = xL; // 入力波形のモニタのため |
MikamiUitOpen | 0:089c5e022aa8 | 90 | snR[n] = xR; // 入力波形のモニタのため |
MikamiUitOpen | 0:089c5e022aa8 | 91 | |
MikamiUitOpen | 0:089c5e022aa8 | 92 | //---------------------------------------- |
MikamiUitOpen | 0:089c5e022aa8 | 93 | // ここにディジタルフィルタなどの処理を書く |
MikamiUitOpen | 0:089c5e022aa8 | 94 | int16_t yL = xL; // through の場合 |
MikamiUitOpen | 0:089c5e022aa8 | 95 | int16_t yR = xR; // through の場合 |
MikamiUitOpen | 0:089c5e022aa8 | 96 | //---------------------------------------- |
MikamiUitOpen | 0:089c5e022aa8 | 97 | |
MikamiUitOpen | 0:089c5e022aa8 | 98 | mySai.Output(yL, yR); |
MikamiUitOpen | 0:089c5e022aa8 | 99 | } |
MikamiUitOpen | 0:089c5e022aa8 | 100 | if (on) |
MikamiUitOpen | 0:089c5e022aa8 | 101 | { |
MikamiUitOpen | 0:089c5e022aa8 | 102 | waveDispL.Execute(snL); |
MikamiUitOpen | 0:089c5e022aa8 | 103 | waveDispR.Execute(snR); |
MikamiUitOpen | 0:089c5e022aa8 | 104 | } |
MikamiUitOpen | 0:089c5e022aa8 | 105 | mySai.Reset(); |
MikamiUitOpen | 0:089c5e022aa8 | 106 | } |
MikamiUitOpen | 0:089c5e022aa8 | 107 | } |
MikamiUitOpen | 0:089c5e022aa8 | 108 | } |