SAI_IO class for using CODEC (MW8994) as analog input and output. このライブラリを登録した際のプログラム:「F746_AudioIO_Demo」

Dependencies:   Array_Matrix

Dependents:   F746_SD_WavPlayer F746_SD_GraphicEqualizer_ren0620 Joerg_turbo_ede CW_Decoder_using_FFT_on_DiscoF746NG ... more

Committer:
MikamiUitOpen
Date:
Mon Mar 12 04:51:31 2018 +0000
Revision:
12:61e2c3cc79a3
Parent:
10:eb439bbba0f2
13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:eade5d3ae0eb 1 //-----------------------------------------------------------
MikamiUitOpen 9:25a9655d6a0e 2 // SaiIO class
MikamiUitOpen 12:61e2c3cc79a3 3 // BSP_DISCO_F746NG Rev.9 に合わせて変更
MikamiUitOpen 12:61e2c3cc79a3 4 // InitInput() の内容を一部変更(変更前の部分はコメントアウト)
MikamiUitOpen 12:61e2c3cc79a3 5 //
MikamiUitOpen 12:61e2c3cc79a3 6 // 2017/09/17, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 0:eade5d3ae0eb 7 //-----------------------------------------------------------
MikamiUitOpen 0:eade5d3ae0eb 8
MikamiUitOpen 0:eade5d3ae0eb 9 #include "SAI_InOut.hpp"
MikamiUitOpen 0:eade5d3ae0eb 10
MikamiUitOpen 0:eade5d3ae0eb 11 namespace Mikami
MikamiUitOpen 0:eade5d3ae0eb 12 {
MikamiUitOpen 0:eade5d3ae0eb 13 // Constructor
MikamiUitOpen 0:eade5d3ae0eb 14 SaiIO::SaiIO(InOutBoth ioBoth, int size, int fs,
MikamiUitOpen 0:eade5d3ae0eb 15 uint16_t inputDevice)
MikamiUitOpen 0:eade5d3ae0eb 16 : FS_(fs), IOBOTH_(ioBoth)
MikamiUitOpen 0:eade5d3ae0eb 17 {
MikamiUitOpen 0:eade5d3ae0eb 18 nData_ = size;
MikamiUitOpen 0:eade5d3ae0eb 19 bufferSize_ = (size*2)*2;
MikamiUitOpen 0:eade5d3ae0eb 20
MikamiUitOpen 0:eade5d3ae0eb 21 if (ioBoth != OUTPUT)
MikamiUitOpen 0:eade5d3ae0eb 22 {
MikamiUitOpen 5:20cc265d7aec 23 inBuffer_.SetSize((size*2)*2);
MikamiUitOpen 0:eade5d3ae0eb 24 inOffset_ = 0;
MikamiUitOpen 0:eade5d3ae0eb 25 captured_ = false;
MikamiUitOpen 0:eade5d3ae0eb 26 }
MikamiUitOpen 2:1aef7b703249 27 if (ioBoth != INPUT)
MikamiUitOpen 2:1aef7b703249 28 {
MikamiUitOpen 5:20cc265d7aec 29 outBuffer_.SetSize((size*2)*2);
MikamiUitOpen 5:20cc265d7aec 30 tmp_.SetSize(size*2);
MikamiUitOpen 2:1aef7b703249 31 tmpIndex_ = 0;
MikamiUitOpen 2:1aef7b703249 32 xferred_ = false;
MikamiUitOpen 2:1aef7b703249 33 ClearBuffer();
MikamiUitOpen 2:1aef7b703249 34 }
MikamiUitOpen 0:eade5d3ae0eb 35 InitCodec(inputDevice);
MikamiUitOpen 0:eade5d3ae0eb 36 }
MikamiUitOpen 0:eade5d3ae0eb 37
MikamiUitOpen 2:1aef7b703249 38 // Input start
MikamiUitOpen 2:1aef7b703249 39 void SaiIO::RecordIn()
MikamiUitOpen 0:eade5d3ae0eb 40 {
MikamiUitOpen 10:eb439bbba0f2 41 if (BSP_AUDIO_IN_Record(inBuffer_, bufferSize_) == AUDIO_ERROR)
MikamiUitOpen 2:1aef7b703249 42 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 43 }
MikamiUitOpen 0:eade5d3ae0eb 44
MikamiUitOpen 0:eade5d3ae0eb 45 // Switching input device and run
MikamiUitOpen 0:eade5d3ae0eb 46 void SaiIO::SwitchInputDevice(int sw)
MikamiUitOpen 0:eade5d3ae0eb 47 {
MikamiUitOpen 0:eade5d3ae0eb 48 uint16_t dev = (sw == 0) ?
MikamiUitOpen 0:eade5d3ae0eb 49 INPUT_DEVICE_DIGITAL_MICROPHONE_2
MikamiUitOpen 0:eade5d3ae0eb 50 : INPUT_DEVICE_INPUT_LINE_1;
MikamiUitOpen 3:3bfdd8be834f 51 InitInput(dev);
MikamiUitOpen 3:3bfdd8be834f 52 ClearBuffer();
MikamiUitOpen 3:3bfdd8be834f 53 RecordIn();
MikamiUitOpen 3:3bfdd8be834f 54 if (IOBOTH_ == BOTH) PlayOut();
MikamiUitOpen 0:eade5d3ae0eb 55 }
MikamiUitOpen 0:eade5d3ae0eb 56
MikamiUitOpen 0:eade5d3ae0eb 57 // If captured, return true
MikamiUitOpen 0:eade5d3ae0eb 58 bool SaiIO::IsCaptured()
MikamiUitOpen 0:eade5d3ae0eb 59 {
MikamiUitOpen 0:eade5d3ae0eb 60 if (!captured_) return false;
MikamiUitOpen 0:eade5d3ae0eb 61
MikamiUitOpen 0:eade5d3ae0eb 62 inIndex_ = inOffset_;
MikamiUitOpen 9:25a9655d6a0e 63 captured_ = false;
MikamiUitOpen 0:eade5d3ae0eb 64 return true;
MikamiUitOpen 0:eade5d3ae0eb 65 }
MikamiUitOpen 0:eade5d3ae0eb 66
MikamiUitOpen 1:48ed86c8430a 67 void SaiIO::PlayOut()
MikamiUitOpen 1:48ed86c8430a 68 {
MikamiUitOpen 2:1aef7b703249 69 ClearBuffer();
MikamiUitOpen 4:2170289dfe94 70 BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
MikamiUitOpen 10:eb439bbba0f2 71 if (BSP_AUDIO_OUT_Play(outBuffer_, bufferSize_*AUDIODATA_SIZE)
MikamiUitOpen 10:eb439bbba0f2 72 == AUDIO_ERROR)
MikamiUitOpen 1:48ed86c8430a 73 ErrorTrap();
MikamiUitOpen 1:48ed86c8430a 74 }
MikamiUitOpen 1:48ed86c8430a 75
MikamiUitOpen 5:20cc265d7aec 76 // Return true if transfer completion to output
MikamiUitOpen 0:eade5d3ae0eb 77 bool SaiIO::IsXferred()
MikamiUitOpen 0:eade5d3ae0eb 78 {
MikamiUitOpen 0:eade5d3ae0eb 79 if (!xferred_) return false;
MikamiUitOpen 0:eade5d3ae0eb 80
MikamiUitOpen 0:eade5d3ae0eb 81 tmpIndex_ = 0;
MikamiUitOpen 9:25a9655d6a0e 82 xferred_ = false;
MikamiUitOpen 0:eade5d3ae0eb 83 return true;
MikamiUitOpen 0:eade5d3ae0eb 84 }
MikamiUitOpen 0:eade5d3ae0eb 85
MikamiUitOpen 0:eade5d3ae0eb 86 void SaiIO::Output(int16_t xL, int16_t xR)
MikamiUitOpen 0:eade5d3ae0eb 87 {
MikamiUitOpen 0:eade5d3ae0eb 88 tmp_[tmpIndex_++] = xL; // Left
MikamiUitOpen 0:eade5d3ae0eb 89 tmp_[tmpIndex_++] = xR; // Right
MikamiUitOpen 0:eade5d3ae0eb 90 }
MikamiUitOpen 0:eade5d3ae0eb 91
MikamiUitOpen 0:eade5d3ae0eb 92 void SaiIO::ErrorTrap()
MikamiUitOpen 0:eade5d3ae0eb 93 {
MikamiUitOpen 0:eade5d3ae0eb 94 DigitalOut led1(LED1);
MikamiUitOpen 0:eade5d3ae0eb 95 fprintf(stderr, "\r\n#### ERROR ####\r\n");
MikamiUitOpen 0:eade5d3ae0eb 96 while(true)
MikamiUitOpen 0:eade5d3ae0eb 97 {
MikamiUitOpen 0:eade5d3ae0eb 98 led1 = !led1;
MikamiUitOpen 0:eade5d3ae0eb 99 wait_ms(250);
MikamiUitOpen 0:eade5d3ae0eb 100 }
MikamiUitOpen 0:eade5d3ae0eb 101 }
MikamiUitOpen 0:eade5d3ae0eb 102
MikamiUitOpen 0:eade5d3ae0eb 103 // Initialize audio input and output
MikamiUitOpen 0:eade5d3ae0eb 104 void SaiIO::InitCodec(uint16_t inputDevice)
MikamiUitOpen 0:eade5d3ae0eb 105 {
MikamiUitOpen 3:3bfdd8be834f 106 if (inputDevice != 0) InitInput(inputDevice);
MikamiUitOpen 3:3bfdd8be834f 107
MikamiUitOpen 3:3bfdd8be834f 108 if (IOBOTH_ == OUTPUT)
MikamiUitOpen 3:3bfdd8be834f 109 if (BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_HEADPHONE,
MikamiUitOpen 8:9893f8e53b07 110 100, FS_) == AUDIO_ERROR)
MikamiUitOpen 3:3bfdd8be834f 111 ErrorTrap();
MikamiUitOpen 3:3bfdd8be834f 112
MikamiUitOpen 3:3bfdd8be834f 113 if (IOBOTH_ != OUTPUT) SetInput();
MikamiUitOpen 3:3bfdd8be834f 114 if (IOBOTH_ != INPUT) SetOutput();
MikamiUitOpen 3:3bfdd8be834f 115 }
MikamiUitOpen 3:3bfdd8be834f 116
MikamiUitOpen 3:3bfdd8be834f 117 void SaiIO::InitInput(uint16_t inputDevice)
MikamiUitOpen 3:3bfdd8be834f 118 {
MikamiUitOpen 3:3bfdd8be834f 119 int audioInVolume = (inputDevice == INPUT_DEVICE_INPUT_LINE_1) ?
MikamiUitOpen 7:60c57b2dc83e 120 70 : 90;
MikamiUitOpen 5:20cc265d7aec 121 InputFp = (inputDevice == INPUT_DEVICE_INPUT_LINE_1) ?
MikamiUitOpen 5:20cc265d7aec 122 &SaiIO::InputNormal : &SaiIO::InputReversal;
MikamiUitOpen 0:eade5d3ae0eb 123 if (IOBOTH_ == BOTH)
MikamiUitOpen 12:61e2c3cc79a3 124 /*
MikamiUitOpen 5:20cc265d7aec 125 if (BSP_AUDIO_IN_OUT_Init(inputDevice, OUTPUT_DEVICE_HEADPHONE,
MikamiUitOpen 5:20cc265d7aec 126 audioInVolume, FS_) == AUDIO_ERROR)
MikamiUitOpen 12:61e2c3cc79a3 127 */
MikamiUitOpen 12:61e2c3cc79a3 128 if (BSP_AUDIO_IN_OUT_Init(inputDevice, OUTPUT_DEVICE_HEADPHONE,
MikamiUitOpen 12:61e2c3cc79a3 129 FS_, DEFAULT_AUDIO_IN_BIT_RESOLUTION,
MikamiUitOpen 12:61e2c3cc79a3 130 DEFAULT_AUDIO_IN_CHANNEL_NBR) == AUDIO_ERROR)
MikamiUitOpen 0:eade5d3ae0eb 131 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 132
MikamiUitOpen 0:eade5d3ae0eb 133 if (IOBOTH_ == INPUT)
MikamiUitOpen 0:eade5d3ae0eb 134 if (BSP_AUDIO_IN_Init(inputDevice,
MikamiUitOpen 0:eade5d3ae0eb 135 audioInVolume, FS_) == AUDIO_ERROR)
MikamiUitOpen 0:eade5d3ae0eb 136 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 137 }
MikamiUitOpen 0:eade5d3ae0eb 138
MikamiUitOpen 3:3bfdd8be834f 139 void SaiIO::SetInput()
MikamiUitOpen 0:eade5d3ae0eb 140 {
MikamiUitOpen 0:eade5d3ae0eb 141 NVIC_SetVector(AUDIO_IN_SAIx_DMAx_IRQ,
MikamiUitOpen 0:eade5d3ae0eb 142 (uint32_t)AUDIO_IN_SAIx_DMAx_IRQHandler);
MikamiUitOpen 0:eade5d3ae0eb 143 }
MikamiUitOpen 0:eade5d3ae0eb 144
MikamiUitOpen 3:3bfdd8be834f 145 void SaiIO::SetOutput()
MikamiUitOpen 0:eade5d3ae0eb 146 {
MikamiUitOpen 0:eade5d3ae0eb 147 NVIC_SetVector(AUDIO_OUT_SAIx_DMAx_IRQ,
MikamiUitOpen 0:eade5d3ae0eb 148 (uint32_t)AUDIO_OUT_SAIx_DMAx_IRQHandler);
MikamiUitOpen 0:eade5d3ae0eb 149 BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
MikamiUitOpen 0:eade5d3ae0eb 150 }
MikamiUitOpen 0:eade5d3ae0eb 151
MikamiUitOpen 0:eade5d3ae0eb 152 void SaiIO::ClearBuffer()
MikamiUitOpen 0:eade5d3ae0eb 153 {
MikamiUitOpen 0:eade5d3ae0eb 154 if (IOBOTH_ != OUTPUT)
MikamiUitOpen 0:eade5d3ae0eb 155 for (int n=0; n<bufferSize_; n++) inBuffer_[n] = 0;
MikamiUitOpen 0:eade5d3ae0eb 156 for (int n=0; n<bufferSize_; n++) outBuffer_[n] = 0;
MikamiUitOpen 0:eade5d3ae0eb 157 for (int n=0; n<nData_*2; n++) tmp_[n] = 0;
MikamiUitOpen 0:eade5d3ae0eb 158 }
MikamiUitOpen 0:eade5d3ae0eb 159
MikamiUitOpen 5:20cc265d7aec 160 // For line input
MikamiUitOpen 5:20cc265d7aec 161 void SaiIO::InputNormal(int16_t &xL, int16_t &xR)
MikamiUitOpen 5:20cc265d7aec 162 {
MikamiUitOpen 5:20cc265d7aec 163 xL = inBuffer_[inIndex_++];
MikamiUitOpen 5:20cc265d7aec 164 xR = inBuffer_[inIndex_++];
MikamiUitOpen 5:20cc265d7aec 165 }
MikamiUitOpen 5:20cc265d7aec 166
MikamiUitOpen 5:20cc265d7aec 167 // For MEMS microphone input
MikamiUitOpen 5:20cc265d7aec 168 void SaiIO::InputReversal(int16_t &xL, int16_t &xR)
MikamiUitOpen 5:20cc265d7aec 169 {
MikamiUitOpen 5:20cc265d7aec 170 xR = inBuffer_[inIndex_++];
MikamiUitOpen 5:20cc265d7aec 171 xL = inBuffer_[inIndex_++];
MikamiUitOpen 5:20cc265d7aec 172 }
MikamiUitOpen 5:20cc265d7aec 173
MikamiUitOpen 0:eade5d3ae0eb 174 void SaiIO::Captured(int32_t offset)
MikamiUitOpen 0:eade5d3ae0eb 175 {
MikamiUitOpen 0:eade5d3ae0eb 176 captured_ = true;
MikamiUitOpen 0:eade5d3ae0eb 177 inOffset_ = offset;
MikamiUitOpen 0:eade5d3ae0eb 178 }
MikamiUitOpen 0:eade5d3ae0eb 179
MikamiUitOpen 0:eade5d3ae0eb 180 void SaiIO::FillBuffer(uint32_t offset)
MikamiUitOpen 0:eade5d3ae0eb 181 {
MikamiUitOpen 0:eade5d3ae0eb 182 int k = offset;
MikamiUitOpen 0:eade5d3ae0eb 183 for (int n=0; n<nData_*2; n++)
MikamiUitOpen 0:eade5d3ae0eb 184 outBuffer_[k++] = tmp_[n];
MikamiUitOpen 0:eade5d3ae0eb 185 xferred_ = true;
MikamiUitOpen 0:eade5d3ae0eb 186 }
MikamiUitOpen 0:eade5d3ae0eb 187
MikamiUitOpen 0:eade5d3ae0eb 188 int32_t SaiIO::nData_;
MikamiUitOpen 0:eade5d3ae0eb 189 int32_t SaiIO::bufferSize_;
MikamiUitOpen 0:eade5d3ae0eb 190
MikamiUitOpen 0:eade5d3ae0eb 191 __IO bool SaiIO::captured_;
MikamiUitOpen 0:eade5d3ae0eb 192 __IO int32_t SaiIO::inOffset_;
MikamiUitOpen 0:eade5d3ae0eb 193
MikamiUitOpen 10:eb439bbba0f2 194 Array<uint16_t> SaiIO::outBuffer_;
MikamiUitOpen 10:eb439bbba0f2 195 Array<uint16_t> SaiIO::tmp_;
MikamiUitOpen 0:eade5d3ae0eb 196 __IO bool SaiIO::xferred_;
MikamiUitOpen 0:eade5d3ae0eb 197 }