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:
Thu Mar 16 08:25:34 2017 +0000
Revision:
10:eb439bbba0f2
Parent:
9:25a9655d6a0e
Child:
12:61e2c3cc79a3
11

Who changed what in which revision?

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