SAI_IO class for using CODEC (MW8994) as analog input and output. このライブラリを登録した際のプログラム:「F746_AudioIO_Demo」
Dependents: F746_SD_WavPlayer F746_SD_GraphicEqualizer_ren0620 Joerg_turbo_ede CW_Decoder_using_FFT_on_DiscoF746NG ... more
Diff: SAI_InOut.cpp
- Revision:
- 5:20cc265d7aec
- Parent:
- 4:2170289dfe94
- Child:
- 7:60c57b2dc83e
--- a/SAI_InOut.cpp Wed Jun 15 12:53:20 2016 +0000 +++ b/SAI_InOut.cpp Sat Jul 23 06:13:40 2016 +0000 @@ -1,10 +1,9 @@ //----------------------------------------------------------- // SiaIO class -// 2016/06/16, Copyright (c) 2016 MIKAMI, Naoki +// 2016/07/23, Copyright (c) 2016 MIKAMI, Naoki //----------------------------------------------------------- #include "SAI_InOut.hpp" -#include "MyBSP_AUDIO_IN_OUT_Init.hpp" namespace Mikami { @@ -18,14 +17,14 @@ if (ioBoth != OUTPUT) { - inBuffer_ = new int16_t[(size*2)*2]; + inBuffer_.SetSize((size*2)*2); inOffset_ = 0; captured_ = false; } if (ioBoth != INPUT) { - outBuffer_ = new int16_t[(size*2)*2]; - tmp_ = new int16_t[size*2]; + outBuffer_.SetSize((size*2)*2); + tmp_.SetSize(size*2); tmpIndex_ = 0; xferred_ = false; ClearBuffer(); @@ -33,17 +32,10 @@ InitCodec(inputDevice); } - SaiIO::~SaiIO() - { - delete[] tmp_; - delete[] outBuffer_; - if (IOBOTH_ != OUTPUT) delete[] inBuffer_; - } - // Input start void SaiIO::RecordIn() { - if (BSP_AUDIO_IN_Record((uint16_t*)inBuffer_, + if (BSP_AUDIO_IN_Record((uint16_t *)((int16_t *)inBuffer_), bufferSize_) == AUDIO_ERROR) ErrorTrap(); } @@ -69,22 +61,16 @@ return true; } - // Input from input buffer - void SaiIO::Input(int16_t &xL, int16_t &xR) - { - xL = inBuffer_[inIndex_++]; - xR = inBuffer_[inIndex_++]; - } - void SaiIO::PlayOut() { ClearBuffer(); BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02); - if (BSP_AUDIO_OUT_Play((uint16_t *)outBuffer_, + if (BSP_AUDIO_OUT_Play((uint16_t *)((int16_t *)outBuffer_), bufferSize_*AUDIODATA_SIZE) == AUDIO_ERROR) ErrorTrap(); } + // Return true if transfer completion to output bool SaiIO::IsXferred() { if (!xferred_) return false; @@ -127,11 +113,13 @@ void SaiIO::InitInput(uint16_t inputDevice) { int audioInVolume = (inputDevice == INPUT_DEVICE_INPUT_LINE_1) ? - 60 : 100; + 70 : 100; + InputFp = (inputDevice == INPUT_DEVICE_INPUT_LINE_1) ? + &SaiIO::InputNormal : &SaiIO::InputReversal; if (IOBOTH_ == BOTH) - if (MyBSP_AUDIO_IN_OUT_Init(inputDevice, OUTPUT_DEVICE_HEADPHONE, - audioInVolume, FS_) == AUDIO_ERROR) + if (BSP_AUDIO_IN_OUT_Init(inputDevice, OUTPUT_DEVICE_HEADPHONE, + audioInVolume, FS_) == AUDIO_ERROR) ErrorTrap(); if (IOBOTH_ == INPUT) @@ -151,12 +139,6 @@ NVIC_SetVector(AUDIO_OUT_SAIx_DMAx_IRQ, (uint32_t)AUDIO_OUT_SAIx_DMAx_IRQHandler); BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02); - - // Set output volume of headphone maximum - // AUDIO_IO_Write() is defined in "stm32746g_discovery.c" - // AUDIO_I2C_ADDRESS is defined in "stm32746g_discovery.h" - AUDIO_IO_Write(AUDIO_I2C_ADDRESS, 0x1C, 0x17F); // 0x1C: R28 of WM8994 - AUDIO_IO_Write(AUDIO_I2C_ADDRESS, 0x1D, 0x17F); // 0x1D: R29 of WM8994 } void SaiIO::ClearBuffer() @@ -167,6 +149,20 @@ for (int n=0; n<nData_*2; n++) tmp_[n] = 0; } + // For line input + void SaiIO::InputNormal(int16_t &xL, int16_t &xR) + { + xL = inBuffer_[inIndex_++]; + xR = inBuffer_[inIndex_++]; + } + + // For MEMS microphone input + void SaiIO::InputReversal(int16_t &xL, int16_t &xR) + { + xR = inBuffer_[inIndex_++]; + xL = inBuffer_[inIndex_++]; + } + void SaiIO::Captured(int32_t offset) { captured_ = true; @@ -187,7 +183,7 @@ __IO bool SaiIO::captured_; __IO int32_t SaiIO::inOffset_; - int16_t* SaiIO::outBuffer_; - int16_t* SaiIO::tmp_; + Array<int16_t> SaiIO::outBuffer_; + Array<int16_t> SaiIO::tmp_; __IO bool SaiIO::xferred_; }