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 May 05 11:12:45 2016 +0000
Revision:
0:eade5d3ae0eb
Child:
1:48ed86c8430a
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:eade5d3ae0eb 1 //-----------------------------------------------------------
MikamiUitOpen 0:eade5d3ae0eb 2 // SiaIO class
MikamiUitOpen 0:eade5d3ae0eb 3 // 2016/05/05, 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 0:eade5d3ae0eb 25 outBuffer_ = new int16_t[(size*2)*2];
MikamiUitOpen 0:eade5d3ae0eb 26 tmp_ = new int16_t[size*2];
MikamiUitOpen 0:eade5d3ae0eb 27 tmpIndex_ = 0;
MikamiUitOpen 0:eade5d3ae0eb 28 xferred_ = false;
MikamiUitOpen 0:eade5d3ae0eb 29
MikamiUitOpen 0:eade5d3ae0eb 30 ClearBuffer();
MikamiUitOpen 0:eade5d3ae0eb 31 InitCodec(inputDevice);
MikamiUitOpen 0:eade5d3ae0eb 32 }
MikamiUitOpen 0:eade5d3ae0eb 33
MikamiUitOpen 0:eade5d3ae0eb 34 SaiIO::~SaiIO()
MikamiUitOpen 0:eade5d3ae0eb 35 {
MikamiUitOpen 0:eade5d3ae0eb 36 delete[] tmp_;
MikamiUitOpen 0:eade5d3ae0eb 37 delete[] outBuffer_;
MikamiUitOpen 0:eade5d3ae0eb 38 if (IOBOTH_ != OUTPUT) delete[] inBuffer_;
MikamiUitOpen 0:eade5d3ae0eb 39 }
MikamiUitOpen 0:eade5d3ae0eb 40
MikamiUitOpen 0:eade5d3ae0eb 41 // Stop audio input
MikamiUitOpen 0:eade5d3ae0eb 42 void SaiIO::StopAudioIn()
MikamiUitOpen 0:eade5d3ae0eb 43 {
MikamiUitOpen 0:eade5d3ae0eb 44 if (BSP_AUDIO_IN_Stop(CODEC_PDWN_SW) == AUDIO_ERROR)
MikamiUitOpen 0:eade5d3ae0eb 45 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 46 }
MikamiUitOpen 0:eade5d3ae0eb 47
MikamiUitOpen 0:eade5d3ae0eb 48 // Switching input device and run
MikamiUitOpen 0:eade5d3ae0eb 49 void SaiIO::SwitchInputDevice(int sw)
MikamiUitOpen 0:eade5d3ae0eb 50 {
MikamiUitOpen 0:eade5d3ae0eb 51 uint16_t dev = (sw == 0) ?
MikamiUitOpen 0:eade5d3ae0eb 52 INPUT_DEVICE_DIGITAL_MICROPHONE_2
MikamiUitOpen 0:eade5d3ae0eb 53 : INPUT_DEVICE_INPUT_LINE_1;
MikamiUitOpen 0:eade5d3ae0eb 54 InitCodec(dev);
MikamiUitOpen 0:eade5d3ae0eb 55 }
MikamiUitOpen 0:eade5d3ae0eb 56
MikamiUitOpen 0:eade5d3ae0eb 57 // If captured, return true
MikamiUitOpen 0:eade5d3ae0eb 58 bool SaiIO::IsCaptured()
MikamiUitOpen 0:eade5d3ae0eb 59 {
MikamiUitOpen 0:eade5d3ae0eb 60 if (!captured_) return false;
MikamiUitOpen 0:eade5d3ae0eb 61
MikamiUitOpen 0:eade5d3ae0eb 62 inIndex_ = inOffset_;
MikamiUitOpen 0:eade5d3ae0eb 63 return true;
MikamiUitOpen 0:eade5d3ae0eb 64 }
MikamiUitOpen 0:eade5d3ae0eb 65
MikamiUitOpen 0:eade5d3ae0eb 66 // Input from input buffer
MikamiUitOpen 0:eade5d3ae0eb 67 void SaiIO::Input(int16_t &xL, int16_t &xR)
MikamiUitOpen 0:eade5d3ae0eb 68 {
MikamiUitOpen 0:eade5d3ae0eb 69 xL = inBuffer_[inIndex_++];
MikamiUitOpen 0:eade5d3ae0eb 70 xR = inBuffer_[inIndex_++];
MikamiUitOpen 0:eade5d3ae0eb 71 }
MikamiUitOpen 0:eade5d3ae0eb 72
MikamiUitOpen 0:eade5d3ae0eb 73 bool SaiIO::IsXferred()
MikamiUitOpen 0:eade5d3ae0eb 74 {
MikamiUitOpen 0:eade5d3ae0eb 75 if (!xferred_) return false;
MikamiUitOpen 0:eade5d3ae0eb 76
MikamiUitOpen 0:eade5d3ae0eb 77 tmpIndex_ = 0;
MikamiUitOpen 0:eade5d3ae0eb 78 return true;
MikamiUitOpen 0:eade5d3ae0eb 79 }
MikamiUitOpen 0:eade5d3ae0eb 80
MikamiUitOpen 0:eade5d3ae0eb 81 void SaiIO::Output(int16_t xL, int16_t xR)
MikamiUitOpen 0:eade5d3ae0eb 82 {
MikamiUitOpen 0:eade5d3ae0eb 83 tmp_[tmpIndex_++] = xL; // Left
MikamiUitOpen 0:eade5d3ae0eb 84 tmp_[tmpIndex_++] = xR; // Right
MikamiUitOpen 0:eade5d3ae0eb 85 }
MikamiUitOpen 0:eade5d3ae0eb 86
MikamiUitOpen 0:eade5d3ae0eb 87 void SaiIO::Pause()
MikamiUitOpen 0:eade5d3ae0eb 88 {
MikamiUitOpen 0:eade5d3ae0eb 89 BSP_AUDIO_OUT_SetMute(AUDIO_MUTE_ON);
MikamiUitOpen 0:eade5d3ae0eb 90 BSP_AUDIO_IN_Pause();
MikamiUitOpen 0:eade5d3ae0eb 91 BSP_AUDIO_OUT_Pause();
MikamiUitOpen 0:eade5d3ae0eb 92 ClearBuffer();
MikamiUitOpen 0:eade5d3ae0eb 93 }
MikamiUitOpen 0:eade5d3ae0eb 94
MikamiUitOpen 0:eade5d3ae0eb 95 void SaiIO::Resume()
MikamiUitOpen 0:eade5d3ae0eb 96 {
MikamiUitOpen 0:eade5d3ae0eb 97 BSP_AUDIO_IN_Resume();
MikamiUitOpen 0:eade5d3ae0eb 98 BSP_AUDIO_OUT_Resume();
MikamiUitOpen 0:eade5d3ae0eb 99 BSP_AUDIO_OUT_SetMute(AUDIO_MUTE_OFF);
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 0:eade5d3ae0eb 116 int audioInVolume = 0;
MikamiUitOpen 0:eade5d3ae0eb 117 if (inputDevice != 0)
MikamiUitOpen 0:eade5d3ae0eb 118 audioInVolume = (inputDevice == INPUT_DEVICE_INPUT_LINE_1) ?
MikamiUitOpen 0:eade5d3ae0eb 119 60 : 100;
MikamiUitOpen 0:eade5d3ae0eb 120
MikamiUitOpen 0:eade5d3ae0eb 121 if (IOBOTH_ == BOTH)
MikamiUitOpen 0:eade5d3ae0eb 122 if (MyBSP_AUDIO_IN_OUT_Init(inputDevice, OUTPUT_DEVICE_HEADPHONE,
MikamiUitOpen 0:eade5d3ae0eb 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 if (IOBOTH_ == OUTPUT)
MikamiUitOpen 0:eade5d3ae0eb 132 if (BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_HEADPHONE,
MikamiUitOpen 0:eade5d3ae0eb 133 90, FS_) == AUDIO_ERROR)
MikamiUitOpen 0:eade5d3ae0eb 134 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 135
MikamiUitOpen 0:eade5d3ae0eb 136 if (IOBOTH_ != OUTPUT) InitInput();
MikamiUitOpen 0:eade5d3ae0eb 137 if (IOBOTH_ != INPUT) InitOutput();
MikamiUitOpen 0:eade5d3ae0eb 138 }
MikamiUitOpen 0:eade5d3ae0eb 139
MikamiUitOpen 0:eade5d3ae0eb 140 void SaiIO::InitInput()
MikamiUitOpen 0:eade5d3ae0eb 141 {
MikamiUitOpen 0:eade5d3ae0eb 142 NVIC_SetVector(AUDIO_IN_SAIx_DMAx_IRQ,
MikamiUitOpen 0:eade5d3ae0eb 143 (uint32_t)AUDIO_IN_SAIx_DMAx_IRQHandler);
MikamiUitOpen 0:eade5d3ae0eb 144
MikamiUitOpen 0:eade5d3ae0eb 145 if (BSP_AUDIO_IN_Record((uint16_t*)inBuffer_,
MikamiUitOpen 0:eade5d3ae0eb 146 bufferSize_) == AUDIO_ERROR)
MikamiUitOpen 0:eade5d3ae0eb 147 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 148 }
MikamiUitOpen 0:eade5d3ae0eb 149
MikamiUitOpen 0:eade5d3ae0eb 150 void SaiIO::InitOutput()
MikamiUitOpen 0:eade5d3ae0eb 151 {
MikamiUitOpen 0:eade5d3ae0eb 152 NVIC_SetVector(AUDIO_OUT_SAIx_DMAx_IRQ,
MikamiUitOpen 0:eade5d3ae0eb 153 (uint32_t)AUDIO_OUT_SAIx_DMAx_IRQHandler);
MikamiUitOpen 0:eade5d3ae0eb 154 BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
MikamiUitOpen 0:eade5d3ae0eb 155
MikamiUitOpen 0:eade5d3ae0eb 156 if (BSP_AUDIO_OUT_Play((uint16_t *)outBuffer_,
MikamiUitOpen 0:eade5d3ae0eb 157 bufferSize_*AUDIODATA_SIZE) == AUDIO_ERROR)
MikamiUitOpen 0:eade5d3ae0eb 158 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 159
MikamiUitOpen 0:eade5d3ae0eb 160 // Set output volume of headphone maximum
MikamiUitOpen 0:eade5d3ae0eb 161 // AUDIO_IO_Write() is defined in "stm32746g_discovery.c"
MikamiUitOpen 0:eade5d3ae0eb 162 // AUDIO_I2C_ADDRESS is defined in "stm32746g_discovery.h"
MikamiUitOpen 0:eade5d3ae0eb 163 AUDIO_IO_Write(AUDIO_I2C_ADDRESS, 0x1C, 0x17F); // 0x1C: R28 of WM8994
MikamiUitOpen 0:eade5d3ae0eb 164 AUDIO_IO_Write(AUDIO_I2C_ADDRESS, 0x1D, 0x17F); // 0x1D: R29 of WM8994
MikamiUitOpen 0:eade5d3ae0eb 165 }
MikamiUitOpen 0:eade5d3ae0eb 166
MikamiUitOpen 0:eade5d3ae0eb 167 void SaiIO::ClearBuffer()
MikamiUitOpen 0:eade5d3ae0eb 168 {
MikamiUitOpen 0:eade5d3ae0eb 169 if (IOBOTH_ != OUTPUT)
MikamiUitOpen 0:eade5d3ae0eb 170 for (int n=0; n<bufferSize_; n++) inBuffer_[n] = 0;
MikamiUitOpen 0:eade5d3ae0eb 171 for (int n=0; n<bufferSize_; n++) outBuffer_[n] = 0;
MikamiUitOpen 0:eade5d3ae0eb 172 for (int n=0; n<nData_*2; n++) tmp_[n] = 0;
MikamiUitOpen 0:eade5d3ae0eb 173 }
MikamiUitOpen 0:eade5d3ae0eb 174
MikamiUitOpen 0:eade5d3ae0eb 175 void SaiIO::Captured(int32_t offset)
MikamiUitOpen 0:eade5d3ae0eb 176 {
MikamiUitOpen 0:eade5d3ae0eb 177 captured_ = true;
MikamiUitOpen 0:eade5d3ae0eb 178 inOffset_ = offset;
MikamiUitOpen 0:eade5d3ae0eb 179 }
MikamiUitOpen 0:eade5d3ae0eb 180
MikamiUitOpen 0:eade5d3ae0eb 181 void SaiIO::FillBuffer(uint32_t offset)
MikamiUitOpen 0:eade5d3ae0eb 182 {
MikamiUitOpen 0:eade5d3ae0eb 183 int k = offset;
MikamiUitOpen 0:eade5d3ae0eb 184 for (int n=0; n<nData_*2; n++)
MikamiUitOpen 0:eade5d3ae0eb 185 outBuffer_[k++] = tmp_[n];
MikamiUitOpen 0:eade5d3ae0eb 186 xferred_ = true;
MikamiUitOpen 0:eade5d3ae0eb 187 }
MikamiUitOpen 0:eade5d3ae0eb 188
MikamiUitOpen 0:eade5d3ae0eb 189 int32_t SaiIO::nData_;
MikamiUitOpen 0:eade5d3ae0eb 190 int32_t SaiIO::bufferSize_;
MikamiUitOpen 0:eade5d3ae0eb 191
MikamiUitOpen 0:eade5d3ae0eb 192 __IO bool SaiIO::captured_;
MikamiUitOpen 0:eade5d3ae0eb 193 __IO int32_t SaiIO::inOffset_;
MikamiUitOpen 0:eade5d3ae0eb 194
MikamiUitOpen 0:eade5d3ae0eb 195 int16_t* SaiIO::outBuffer_;
MikamiUitOpen 0:eade5d3ae0eb 196 int16_t* SaiIO::tmp_;
MikamiUitOpen 0:eade5d3ae0eb 197 __IO bool SaiIO::xferred_;
MikamiUitOpen 0:eade5d3ae0eb 198 }
MikamiUitOpen 0:eade5d3ae0eb 199