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 Jan 23 13:35:07 2017 +0000
Revision:
9:25a9655d6a0e
Parent:
8:9893f8e53b07
Child:
10:eb439bbba0f2
10

Who changed what in which revision?

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