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:
Sat Jul 23 06:13:40 2016 +0000
Revision:
5:20cc265d7aec
Parent:
4:2170289dfe94
Child:
7:60c57b2dc83e
6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:eade5d3ae0eb 1 //-----------------------------------------------------------
MikamiUitOpen 0:eade5d3ae0eb 2 // SiaIO class
MikamiUitOpen 5:20cc265d7aec 3 // 2016/07/23, Copyright (c) 2016 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 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 5:20cc265d7aec 68 if (BSP_AUDIO_OUT_Play((uint16_t *)((int16_t *)outBuffer_),
MikamiUitOpen 1:48ed86c8430a 69 bufferSize_*AUDIODATA_SIZE) == 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 0:eade5d3ae0eb 79 return true;
MikamiUitOpen 0:eade5d3ae0eb 80 }
MikamiUitOpen 0:eade5d3ae0eb 81
MikamiUitOpen 0:eade5d3ae0eb 82 void SaiIO::Output(int16_t xL, int16_t xR)
MikamiUitOpen 0:eade5d3ae0eb 83 {
MikamiUitOpen 0:eade5d3ae0eb 84 tmp_[tmpIndex_++] = xL; // Left
MikamiUitOpen 0:eade5d3ae0eb 85 tmp_[tmpIndex_++] = xR; // Right
MikamiUitOpen 0:eade5d3ae0eb 86 }
MikamiUitOpen 0:eade5d3ae0eb 87
MikamiUitOpen 0:eade5d3ae0eb 88 void SaiIO::ErrorTrap()
MikamiUitOpen 0:eade5d3ae0eb 89 {
MikamiUitOpen 0:eade5d3ae0eb 90 DigitalOut led1(LED1);
MikamiUitOpen 0:eade5d3ae0eb 91 fprintf(stderr, "\r\n#### ERROR ####\r\n");
MikamiUitOpen 0:eade5d3ae0eb 92 while(true)
MikamiUitOpen 0:eade5d3ae0eb 93 {
MikamiUitOpen 0:eade5d3ae0eb 94 led1 = !led1;
MikamiUitOpen 0:eade5d3ae0eb 95 wait_ms(250);
MikamiUitOpen 0:eade5d3ae0eb 96 }
MikamiUitOpen 0:eade5d3ae0eb 97 }
MikamiUitOpen 0:eade5d3ae0eb 98
MikamiUitOpen 0:eade5d3ae0eb 99 // Initialize audio input and output
MikamiUitOpen 0:eade5d3ae0eb 100 void SaiIO::InitCodec(uint16_t inputDevice)
MikamiUitOpen 0:eade5d3ae0eb 101 {
MikamiUitOpen 3:3bfdd8be834f 102 if (inputDevice != 0) InitInput(inputDevice);
MikamiUitOpen 3:3bfdd8be834f 103
MikamiUitOpen 3:3bfdd8be834f 104 if (IOBOTH_ == OUTPUT)
MikamiUitOpen 3:3bfdd8be834f 105 if (BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_HEADPHONE,
MikamiUitOpen 3:3bfdd8be834f 106 90, FS_) == AUDIO_ERROR)
MikamiUitOpen 3:3bfdd8be834f 107 ErrorTrap();
MikamiUitOpen 3:3bfdd8be834f 108
MikamiUitOpen 3:3bfdd8be834f 109 if (IOBOTH_ != OUTPUT) SetInput();
MikamiUitOpen 3:3bfdd8be834f 110 if (IOBOTH_ != INPUT) SetOutput();
MikamiUitOpen 3:3bfdd8be834f 111 }
MikamiUitOpen 3:3bfdd8be834f 112
MikamiUitOpen 3:3bfdd8be834f 113 void SaiIO::InitInput(uint16_t inputDevice)
MikamiUitOpen 3:3bfdd8be834f 114 {
MikamiUitOpen 3:3bfdd8be834f 115 int audioInVolume = (inputDevice == INPUT_DEVICE_INPUT_LINE_1) ?
MikamiUitOpen 5:20cc265d7aec 116 70 : 100;
MikamiUitOpen 5:20cc265d7aec 117 InputFp = (inputDevice == INPUT_DEVICE_INPUT_LINE_1) ?
MikamiUitOpen 5:20cc265d7aec 118 &SaiIO::InputNormal : &SaiIO::InputReversal;
MikamiUitOpen 0:eade5d3ae0eb 119
MikamiUitOpen 0:eade5d3ae0eb 120 if (IOBOTH_ == BOTH)
MikamiUitOpen 5:20cc265d7aec 121 if (BSP_AUDIO_IN_OUT_Init(inputDevice, OUTPUT_DEVICE_HEADPHONE,
MikamiUitOpen 5:20cc265d7aec 122 audioInVolume, FS_) == AUDIO_ERROR)
MikamiUitOpen 0:eade5d3ae0eb 123 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 124
MikamiUitOpen 0:eade5d3ae0eb 125 if (IOBOTH_ == INPUT)
MikamiUitOpen 0:eade5d3ae0eb 126 if (BSP_AUDIO_IN_Init(inputDevice,
MikamiUitOpen 0:eade5d3ae0eb 127 audioInVolume, FS_) == AUDIO_ERROR)
MikamiUitOpen 0:eade5d3ae0eb 128 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 129 }
MikamiUitOpen 0:eade5d3ae0eb 130
MikamiUitOpen 3:3bfdd8be834f 131 void SaiIO::SetInput()
MikamiUitOpen 0:eade5d3ae0eb 132 {
MikamiUitOpen 0:eade5d3ae0eb 133 NVIC_SetVector(AUDIO_IN_SAIx_DMAx_IRQ,
MikamiUitOpen 0:eade5d3ae0eb 134 (uint32_t)AUDIO_IN_SAIx_DMAx_IRQHandler);
MikamiUitOpen 0:eade5d3ae0eb 135 }
MikamiUitOpen 0:eade5d3ae0eb 136
MikamiUitOpen 3:3bfdd8be834f 137 void SaiIO::SetOutput()
MikamiUitOpen 0:eade5d3ae0eb 138 {
MikamiUitOpen 0:eade5d3ae0eb 139 NVIC_SetVector(AUDIO_OUT_SAIx_DMAx_IRQ,
MikamiUitOpen 0:eade5d3ae0eb 140 (uint32_t)AUDIO_OUT_SAIx_DMAx_IRQHandler);
MikamiUitOpen 0:eade5d3ae0eb 141 BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
MikamiUitOpen 0:eade5d3ae0eb 142 }
MikamiUitOpen 0:eade5d3ae0eb 143
MikamiUitOpen 0:eade5d3ae0eb 144 void SaiIO::ClearBuffer()
MikamiUitOpen 0:eade5d3ae0eb 145 {
MikamiUitOpen 0:eade5d3ae0eb 146 if (IOBOTH_ != OUTPUT)
MikamiUitOpen 0:eade5d3ae0eb 147 for (int n=0; n<bufferSize_; n++) inBuffer_[n] = 0;
MikamiUitOpen 0:eade5d3ae0eb 148 for (int n=0; n<bufferSize_; n++) outBuffer_[n] = 0;
MikamiUitOpen 0:eade5d3ae0eb 149 for (int n=0; n<nData_*2; n++) tmp_[n] = 0;
MikamiUitOpen 0:eade5d3ae0eb 150 }
MikamiUitOpen 0:eade5d3ae0eb 151
MikamiUitOpen 5:20cc265d7aec 152 // For line input
MikamiUitOpen 5:20cc265d7aec 153 void SaiIO::InputNormal(int16_t &xL, int16_t &xR)
MikamiUitOpen 5:20cc265d7aec 154 {
MikamiUitOpen 5:20cc265d7aec 155 xL = inBuffer_[inIndex_++];
MikamiUitOpen 5:20cc265d7aec 156 xR = inBuffer_[inIndex_++];
MikamiUitOpen 5:20cc265d7aec 157 }
MikamiUitOpen 5:20cc265d7aec 158
MikamiUitOpen 5:20cc265d7aec 159 // For MEMS microphone input
MikamiUitOpen 5:20cc265d7aec 160 void SaiIO::InputReversal(int16_t &xL, int16_t &xR)
MikamiUitOpen 5:20cc265d7aec 161 {
MikamiUitOpen 5:20cc265d7aec 162 xR = inBuffer_[inIndex_++];
MikamiUitOpen 5:20cc265d7aec 163 xL = inBuffer_[inIndex_++];
MikamiUitOpen 5:20cc265d7aec 164 }
MikamiUitOpen 5:20cc265d7aec 165
MikamiUitOpen 0:eade5d3ae0eb 166 void SaiIO::Captured(int32_t offset)
MikamiUitOpen 0:eade5d3ae0eb 167 {
MikamiUitOpen 0:eade5d3ae0eb 168 captured_ = true;
MikamiUitOpen 0:eade5d3ae0eb 169 inOffset_ = offset;
MikamiUitOpen 0:eade5d3ae0eb 170 }
MikamiUitOpen 0:eade5d3ae0eb 171
MikamiUitOpen 0:eade5d3ae0eb 172 void SaiIO::FillBuffer(uint32_t offset)
MikamiUitOpen 0:eade5d3ae0eb 173 {
MikamiUitOpen 0:eade5d3ae0eb 174 int k = offset;
MikamiUitOpen 0:eade5d3ae0eb 175 for (int n=0; n<nData_*2; n++)
MikamiUitOpen 0:eade5d3ae0eb 176 outBuffer_[k++] = tmp_[n];
MikamiUitOpen 0:eade5d3ae0eb 177 xferred_ = true;
MikamiUitOpen 0:eade5d3ae0eb 178 }
MikamiUitOpen 0:eade5d3ae0eb 179
MikamiUitOpen 0:eade5d3ae0eb 180 int32_t SaiIO::nData_;
MikamiUitOpen 0:eade5d3ae0eb 181 int32_t SaiIO::bufferSize_;
MikamiUitOpen 0:eade5d3ae0eb 182
MikamiUitOpen 0:eade5d3ae0eb 183 __IO bool SaiIO::captured_;
MikamiUitOpen 0:eade5d3ae0eb 184 __IO int32_t SaiIO::inOffset_;
MikamiUitOpen 0:eade5d3ae0eb 185
MikamiUitOpen 5:20cc265d7aec 186 Array<int16_t> SaiIO::outBuffer_;
MikamiUitOpen 5:20cc265d7aec 187 Array<int16_t> SaiIO::tmp_;
MikamiUitOpen 0:eade5d3ae0eb 188 __IO bool SaiIO::xferred_;
MikamiUitOpen 0:eade5d3ae0eb 189 }