SPKT

Dependencies:   Array_Matrix

Dependents:   Player

Committer:
phungductung
Date:
Fri Jun 07 05:10:10 2019 +0000
Revision:
0:f255629eada1
spkt; ;

Who changed what in which revision?

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