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:
Wed Jun 15 12:53:20 2016 +0000
Revision:
4:2170289dfe94
Parent:
3:3bfdd8be834f
Child:
5:20cc265d7aec
5

Who changed what in which revision?

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