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 May 09 08:32:03 2016 +0000
Revision:
1:48ed86c8430a
Parent:
0:eade5d3ae0eb
Child:
2:1aef7b703249
2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:eade5d3ae0eb 1 //-----------------------------------------------------------
MikamiUitOpen 0:eade5d3ae0eb 2 // SiaIO class
MikamiUitOpen 1:48ed86c8430a 3 // 2016/05/09, 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 1:48ed86c8430a 73 void SaiIO::PlayOut()
MikamiUitOpen 1:48ed86c8430a 74 {
MikamiUitOpen 1:48ed86c8430a 75 if (BSP_AUDIO_OUT_Play((uint16_t *)outBuffer_,
MikamiUitOpen 1:48ed86c8430a 76 bufferSize_*AUDIODATA_SIZE) == AUDIO_ERROR)
MikamiUitOpen 1:48ed86c8430a 77 ErrorTrap();
MikamiUitOpen 1:48ed86c8430a 78 ClearBuffer();
MikamiUitOpen 1:48ed86c8430a 79 }
MikamiUitOpen 1:48ed86c8430a 80
MikamiUitOpen 0:eade5d3ae0eb 81 bool SaiIO::IsXferred()
MikamiUitOpen 0:eade5d3ae0eb 82 {
MikamiUitOpen 0:eade5d3ae0eb 83 if (!xferred_) return false;
MikamiUitOpen 0:eade5d3ae0eb 84
MikamiUitOpen 0:eade5d3ae0eb 85 tmpIndex_ = 0;
MikamiUitOpen 0:eade5d3ae0eb 86 return true;
MikamiUitOpen 0:eade5d3ae0eb 87 }
MikamiUitOpen 0:eade5d3ae0eb 88
MikamiUitOpen 0:eade5d3ae0eb 89 void SaiIO::Output(int16_t xL, int16_t xR)
MikamiUitOpen 0:eade5d3ae0eb 90 {
MikamiUitOpen 0:eade5d3ae0eb 91 tmp_[tmpIndex_++] = xL; // Left
MikamiUitOpen 0:eade5d3ae0eb 92 tmp_[tmpIndex_++] = xR; // Right
MikamiUitOpen 0:eade5d3ae0eb 93 }
MikamiUitOpen 0:eade5d3ae0eb 94
MikamiUitOpen 0:eade5d3ae0eb 95 void SaiIO::Pause()
MikamiUitOpen 0:eade5d3ae0eb 96 {
MikamiUitOpen 0:eade5d3ae0eb 97 BSP_AUDIO_OUT_SetMute(AUDIO_MUTE_ON);
MikamiUitOpen 0:eade5d3ae0eb 98 BSP_AUDIO_IN_Pause();
MikamiUitOpen 0:eade5d3ae0eb 99 BSP_AUDIO_OUT_Pause();
MikamiUitOpen 0:eade5d3ae0eb 100 ClearBuffer();
MikamiUitOpen 0:eade5d3ae0eb 101 }
MikamiUitOpen 0:eade5d3ae0eb 102
MikamiUitOpen 0:eade5d3ae0eb 103 void SaiIO::Resume()
MikamiUitOpen 0:eade5d3ae0eb 104 {
MikamiUitOpen 0:eade5d3ae0eb 105 BSP_AUDIO_IN_Resume();
MikamiUitOpen 0:eade5d3ae0eb 106 BSP_AUDIO_OUT_Resume();
MikamiUitOpen 0:eade5d3ae0eb 107 BSP_AUDIO_OUT_SetMute(AUDIO_MUTE_OFF);
MikamiUitOpen 0:eade5d3ae0eb 108 }
MikamiUitOpen 0:eade5d3ae0eb 109
MikamiUitOpen 0:eade5d3ae0eb 110 void SaiIO::ErrorTrap()
MikamiUitOpen 0:eade5d3ae0eb 111 {
MikamiUitOpen 0:eade5d3ae0eb 112 DigitalOut led1(LED1);
MikamiUitOpen 0:eade5d3ae0eb 113 fprintf(stderr, "\r\n#### ERROR ####\r\n");
MikamiUitOpen 0:eade5d3ae0eb 114 while(true)
MikamiUitOpen 0:eade5d3ae0eb 115 {
MikamiUitOpen 0:eade5d3ae0eb 116 led1 = !led1;
MikamiUitOpen 0:eade5d3ae0eb 117 wait_ms(250);
MikamiUitOpen 0:eade5d3ae0eb 118 }
MikamiUitOpen 0:eade5d3ae0eb 119 }
MikamiUitOpen 0:eade5d3ae0eb 120
MikamiUitOpen 0:eade5d3ae0eb 121 // Initialize audio input and output
MikamiUitOpen 0:eade5d3ae0eb 122 void SaiIO::InitCodec(uint16_t inputDevice)
MikamiUitOpen 0:eade5d3ae0eb 123 {
MikamiUitOpen 0:eade5d3ae0eb 124 int audioInVolume = 0;
MikamiUitOpen 0:eade5d3ae0eb 125 if (inputDevice != 0)
MikamiUitOpen 0:eade5d3ae0eb 126 audioInVolume = (inputDevice == INPUT_DEVICE_INPUT_LINE_1) ?
MikamiUitOpen 0:eade5d3ae0eb 127 60 : 100;
MikamiUitOpen 0:eade5d3ae0eb 128
MikamiUitOpen 0:eade5d3ae0eb 129 if (IOBOTH_ == BOTH)
MikamiUitOpen 0:eade5d3ae0eb 130 if (MyBSP_AUDIO_IN_OUT_Init(inputDevice, OUTPUT_DEVICE_HEADPHONE,
MikamiUitOpen 0:eade5d3ae0eb 131 audioInVolume, FS_) == AUDIO_ERROR)
MikamiUitOpen 0:eade5d3ae0eb 132 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 133
MikamiUitOpen 0:eade5d3ae0eb 134 if (IOBOTH_ == INPUT)
MikamiUitOpen 0:eade5d3ae0eb 135 if (BSP_AUDIO_IN_Init(inputDevice,
MikamiUitOpen 0:eade5d3ae0eb 136 audioInVolume, FS_) == AUDIO_ERROR)
MikamiUitOpen 0:eade5d3ae0eb 137 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 138
MikamiUitOpen 0:eade5d3ae0eb 139 if (IOBOTH_ == OUTPUT)
MikamiUitOpen 0:eade5d3ae0eb 140 if (BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_HEADPHONE,
MikamiUitOpen 0:eade5d3ae0eb 141 90, FS_) == AUDIO_ERROR)
MikamiUitOpen 0:eade5d3ae0eb 142 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 143
MikamiUitOpen 0:eade5d3ae0eb 144 if (IOBOTH_ != OUTPUT) InitInput();
MikamiUitOpen 0:eade5d3ae0eb 145 if (IOBOTH_ != INPUT) InitOutput();
MikamiUitOpen 0:eade5d3ae0eb 146 }
MikamiUitOpen 0:eade5d3ae0eb 147
MikamiUitOpen 0:eade5d3ae0eb 148 void SaiIO::InitInput()
MikamiUitOpen 0:eade5d3ae0eb 149 {
MikamiUitOpen 0:eade5d3ae0eb 150 NVIC_SetVector(AUDIO_IN_SAIx_DMAx_IRQ,
MikamiUitOpen 0:eade5d3ae0eb 151 (uint32_t)AUDIO_IN_SAIx_DMAx_IRQHandler);
MikamiUitOpen 0:eade5d3ae0eb 152
MikamiUitOpen 0:eade5d3ae0eb 153 if (BSP_AUDIO_IN_Record((uint16_t*)inBuffer_,
MikamiUitOpen 0:eade5d3ae0eb 154 bufferSize_) == AUDIO_ERROR)
MikamiUitOpen 0:eade5d3ae0eb 155 ErrorTrap();
MikamiUitOpen 0:eade5d3ae0eb 156 }
MikamiUitOpen 0:eade5d3ae0eb 157
MikamiUitOpen 0:eade5d3ae0eb 158 void SaiIO::InitOutput()
MikamiUitOpen 0:eade5d3ae0eb 159 {
MikamiUitOpen 0:eade5d3ae0eb 160 NVIC_SetVector(AUDIO_OUT_SAIx_DMAx_IRQ,
MikamiUitOpen 0:eade5d3ae0eb 161 (uint32_t)AUDIO_OUT_SAIx_DMAx_IRQHandler);
MikamiUitOpen 0:eade5d3ae0eb 162 BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
MikamiUitOpen 0:eade5d3ae0eb 163
MikamiUitOpen 0:eade5d3ae0eb 164 // Set output volume of headphone maximum
MikamiUitOpen 0:eade5d3ae0eb 165 // AUDIO_IO_Write() is defined in "stm32746g_discovery.c"
MikamiUitOpen 0:eade5d3ae0eb 166 // AUDIO_I2C_ADDRESS is defined in "stm32746g_discovery.h"
MikamiUitOpen 0:eade5d3ae0eb 167 AUDIO_IO_Write(AUDIO_I2C_ADDRESS, 0x1C, 0x17F); // 0x1C: R28 of WM8994
MikamiUitOpen 0:eade5d3ae0eb 168 AUDIO_IO_Write(AUDIO_I2C_ADDRESS, 0x1D, 0x17F); // 0x1D: R29 of WM8994
MikamiUitOpen 1:48ed86c8430a 169
MikamiUitOpen 1:48ed86c8430a 170 PlayOut();
MikamiUitOpen 0:eade5d3ae0eb 171 }
MikamiUitOpen 0:eade5d3ae0eb 172
MikamiUitOpen 0:eade5d3ae0eb 173 void SaiIO::ClearBuffer()
MikamiUitOpen 0:eade5d3ae0eb 174 {
MikamiUitOpen 0:eade5d3ae0eb 175 if (IOBOTH_ != OUTPUT)
MikamiUitOpen 0:eade5d3ae0eb 176 for (int n=0; n<bufferSize_; n++) inBuffer_[n] = 0;
MikamiUitOpen 0:eade5d3ae0eb 177 for (int n=0; n<bufferSize_; n++) outBuffer_[n] = 0;
MikamiUitOpen 0:eade5d3ae0eb 178 for (int n=0; n<nData_*2; n++) tmp_[n] = 0;
MikamiUitOpen 0:eade5d3ae0eb 179 }
MikamiUitOpen 0:eade5d3ae0eb 180
MikamiUitOpen 0:eade5d3ae0eb 181 void SaiIO::Captured(int32_t offset)
MikamiUitOpen 0:eade5d3ae0eb 182 {
MikamiUitOpen 0:eade5d3ae0eb 183 captured_ = true;
MikamiUitOpen 0:eade5d3ae0eb 184 inOffset_ = offset;
MikamiUitOpen 0:eade5d3ae0eb 185 }
MikamiUitOpen 0:eade5d3ae0eb 186
MikamiUitOpen 0:eade5d3ae0eb 187 void SaiIO::FillBuffer(uint32_t offset)
MikamiUitOpen 0:eade5d3ae0eb 188 {
MikamiUitOpen 0:eade5d3ae0eb 189 int k = offset;
MikamiUitOpen 0:eade5d3ae0eb 190 for (int n=0; n<nData_*2; n++)
MikamiUitOpen 0:eade5d3ae0eb 191 outBuffer_[k++] = tmp_[n];
MikamiUitOpen 0:eade5d3ae0eb 192 xferred_ = true;
MikamiUitOpen 0:eade5d3ae0eb 193 }
MikamiUitOpen 0:eade5d3ae0eb 194
MikamiUitOpen 0:eade5d3ae0eb 195 int32_t SaiIO::nData_;
MikamiUitOpen 0:eade5d3ae0eb 196 int32_t SaiIO::bufferSize_;
MikamiUitOpen 0:eade5d3ae0eb 197
MikamiUitOpen 0:eade5d3ae0eb 198 __IO bool SaiIO::captured_;
MikamiUitOpen 0:eade5d3ae0eb 199 __IO int32_t SaiIO::inOffset_;
MikamiUitOpen 0:eade5d3ae0eb 200
MikamiUitOpen 0:eade5d3ae0eb 201 int16_t* SaiIO::outBuffer_;
MikamiUitOpen 0:eade5d3ae0eb 202 int16_t* SaiIO::tmp_;
MikamiUitOpen 0:eade5d3ae0eb 203 __IO bool SaiIO::xferred_;
MikamiUitOpen 0:eade5d3ae0eb 204 }