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
SAI_InOut.hpp@5:20cc265d7aec, 2016-07-23 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sat Jul 23 06:13:40 2016 +0000
- Revision:
- 5:20cc265d7aec
- Parent:
- 4:2170289dfe94
- Child:
- 9:25a9655d6a0e
6
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:eade5d3ae0eb | 1 | //----------------------------------------------------------- |
MikamiUitOpen | 0:eade5d3ae0eb | 2 | // SiaIO class (Header) |
MikamiUitOpen | 5:20cc265d7aec | 3 | // 2016/07/23, Copyright (c) 2016 MIKAMI, Naoki |
MikamiUitOpen | 0:eade5d3ae0eb | 4 | //----------------------------------------------------------- |
MikamiUitOpen | 0:eade5d3ae0eb | 5 | |
MikamiUitOpen | 0:eade5d3ae0eb | 6 | #ifndef F746_SAI_IO_HPP |
MikamiUitOpen | 0:eade5d3ae0eb | 7 | #define F746_SAI_IO_HPP |
MikamiUitOpen | 0:eade5d3ae0eb | 8 | |
MikamiUitOpen | 0:eade5d3ae0eb | 9 | #include "mbed.h" |
MikamiUitOpen | 0:eade5d3ae0eb | 10 | #include "stm32746g_discovery_audio.h" |
MikamiUitOpen | 0:eade5d3ae0eb | 11 | #include "BSP_AudioIn_Overwrite.hpp" |
MikamiUitOpen | 0:eade5d3ae0eb | 12 | #include "BSP_AudioOut_Overwrite.hpp" |
MikamiUitOpen | 5:20cc265d7aec | 13 | #include "Array.hpp" |
MikamiUitOpen | 0:eade5d3ae0eb | 14 | |
MikamiUitOpen | 0:eade5d3ae0eb | 15 | namespace Mikami |
MikamiUitOpen | 0:eade5d3ae0eb | 16 | { |
MikamiUitOpen | 0:eade5d3ae0eb | 17 | class SaiIO |
MikamiUitOpen | 0:eade5d3ae0eb | 18 | { |
MikamiUitOpen | 0:eade5d3ae0eb | 19 | public: |
MikamiUitOpen | 0:eade5d3ae0eb | 20 | enum InOutBoth { INPUT, // input only |
MikamiUitOpen | 0:eade5d3ae0eb | 21 | OUTPUT, // output only |
MikamiUitOpen | 0:eade5d3ae0eb | 22 | BOTH }; // input and output |
MikamiUitOpen | 0:eade5d3ae0eb | 23 | // Constructor |
MikamiUitOpen | 0:eade5d3ae0eb | 24 | // inputDevice: INPUT_DEVICE_DIGITAL_MICROPHONE_2 or |
MikamiUitOpen | 0:eade5d3ae0eb | 25 | // INPUT_DEVICE_INPUT_LINE_1 |
MikamiUitOpen | 0:eade5d3ae0eb | 26 | // inputDevice == 0 : not use input device |
MikamiUitOpen | 0:eade5d3ae0eb | 27 | SaiIO(InOutBoth ioBoth, int size, int fs, |
MikamiUitOpen | 0:eade5d3ae0eb | 28 | uint16_t inputDevice = 0); |
MikamiUitOpen | 5:20cc265d7aec | 29 | virtual ~SaiIO() {} |
MikamiUitOpen | 0:eade5d3ae0eb | 30 | |
MikamiUitOpen | 0:eade5d3ae0eb | 31 | int32_t GetLength() { return nData_; } |
MikamiUitOpen | 0:eade5d3ae0eb | 32 | |
MikamiUitOpen | 2:1aef7b703249 | 33 | void RecordIn(); |
MikamiUitOpen | 0:eade5d3ae0eb | 34 | // sw = 0: DIGITAL_MICROPHONE_2 |
MikamiUitOpen | 0:eade5d3ae0eb | 35 | // 1: LINE_1 |
MikamiUitOpen | 0:eade5d3ae0eb | 36 | void SwitchInputDevice(int sw); |
MikamiUitOpen | 0:eade5d3ae0eb | 37 | |
MikamiUitOpen | 0:eade5d3ae0eb | 38 | bool IsCaptured(); |
MikamiUitOpen | 0:eade5d3ae0eb | 39 | void ResetCaptured() { captured_ = false; } |
MikamiUitOpen | 5:20cc265d7aec | 40 | // Input using SAI |
MikamiUitOpen | 5:20cc265d7aec | 41 | void Input(int16_t &xL, int16_t &xR) |
MikamiUitOpen | 5:20cc265d7aec | 42 | { (this->*InputFp)(xL, xR); } |
MikamiUitOpen | 0:eade5d3ae0eb | 43 | |
MikamiUitOpen | 2:1aef7b703249 | 44 | void StopIn() { BSP_AUDIO_IN_Stop(CODEC_PDWN_SW); } |
MikamiUitOpen | 2:1aef7b703249 | 45 | void PauseIn() { BSP_AUDIO_IN_Pause(); } |
MikamiUitOpen | 2:1aef7b703249 | 46 | void ResumeIn() { BSP_AUDIO_IN_Resume(); } |
MikamiUitOpen | 2:1aef7b703249 | 47 | |
MikamiUitOpen | 1:48ed86c8430a | 48 | void PlayOut(); |
MikamiUitOpen | 0:eade5d3ae0eb | 49 | bool IsXferred(); |
MikamiUitOpen | 0:eade5d3ae0eb | 50 | void ResetXferred() { xferred_ = false; } |
MikamiUitOpen | 5:20cc265d7aec | 51 | // Output using SAI |
MikamiUitOpen | 0:eade5d3ae0eb | 52 | void Output(int16_t xL, int16_t xR); |
MikamiUitOpen | 2:1aef7b703249 | 53 | |
MikamiUitOpen | 2:1aef7b703249 | 54 | void StopOut() { BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW); } |
MikamiUitOpen | 2:1aef7b703249 | 55 | void PauseOut() { BSP_AUDIO_OUT_Pause(); } |
MikamiUitOpen | 2:1aef7b703249 | 56 | void ResumeOut() { BSP_AUDIO_OUT_Resume(); } |
MikamiUitOpen | 0:eade5d3ae0eb | 57 | |
MikamiUitOpen | 0:eade5d3ae0eb | 58 | // IF you use both input and output of SAI, |
MikamiUitOpen | 0:eade5d3ae0eb | 59 | // you can use following two functions. |
MikamiUitOpen | 0:eade5d3ae0eb | 60 | bool IsCompleted() |
MikamiUitOpen | 0:eade5d3ae0eb | 61 | { return IsCaptured() && IsXferred(); } |
MikamiUitOpen | 0:eade5d3ae0eb | 62 | void Reset() |
MikamiUitOpen | 0:eade5d3ae0eb | 63 | { captured_ = false; xferred_ = false; } |
MikamiUitOpen | 0:eade5d3ae0eb | 64 | |
MikamiUitOpen | 0:eade5d3ae0eb | 65 | // Following two member functions are called from |
MikamiUitOpen | 0:eade5d3ae0eb | 66 | // callback functions in "BSP_AudioIn_Overwrite.cpp" |
MikamiUitOpen | 0:eade5d3ae0eb | 67 | static void Captured1st() { Captured(0); } |
MikamiUitOpen | 0:eade5d3ae0eb | 68 | static void Captured2nd() { Captured(bufferSize_/2); } |
MikamiUitOpen | 0:eade5d3ae0eb | 69 | |
MikamiUitOpen | 0:eade5d3ae0eb | 70 | // Following two member functions are called from |
MikamiUitOpen | 0:eade5d3ae0eb | 71 | // callback functions in "BSP_AudioOut_Overwrite.cpp" |
MikamiUitOpen | 0:eade5d3ae0eb | 72 | static void FillBuffer1st() { FillBuffer(0); } |
MikamiUitOpen | 0:eade5d3ae0eb | 73 | static void FillBuffer2nd() { FillBuffer(bufferSize_/2); } |
MikamiUitOpen | 0:eade5d3ae0eb | 74 | |
MikamiUitOpen | 0:eade5d3ae0eb | 75 | // Called form the functions in "BSP_AudioIn_Overwrite.cpp" |
MikamiUitOpen | 0:eade5d3ae0eb | 76 | // and "BSP_AudioOut_Overwrite.cpp" |
MikamiUitOpen | 0:eade5d3ae0eb | 77 | static void ErrorTrap(); |
MikamiUitOpen | 0:eade5d3ae0eb | 78 | |
MikamiUitOpen | 0:eade5d3ae0eb | 79 | private: |
MikamiUitOpen | 0:eade5d3ae0eb | 80 | const int FS_; |
MikamiUitOpen | 0:eade5d3ae0eb | 81 | const InOutBoth IOBOTH_; |
MikamiUitOpen | 0:eade5d3ae0eb | 82 | |
MikamiUitOpen | 5:20cc265d7aec | 83 | Array<int16_t> inBuffer_; |
MikamiUitOpen | 5:20cc265d7aec | 84 | static Array<int16_t> outBuffer_; |
MikamiUitOpen | 5:20cc265d7aec | 85 | static Array<int16_t> tmp_; |
MikamiUitOpen | 0:eade5d3ae0eb | 86 | __IO int32_t inIndex_; |
MikamiUitOpen | 0:eade5d3ae0eb | 87 | __IO int32_t tmpIndex_; |
MikamiUitOpen | 0:eade5d3ae0eb | 88 | |
MikamiUitOpen | 0:eade5d3ae0eb | 89 | static int32_t nData_; |
MikamiUitOpen | 0:eade5d3ae0eb | 90 | static int32_t bufferSize_; |
MikamiUitOpen | 0:eade5d3ae0eb | 91 | static __IO bool captured_; |
MikamiUitOpen | 0:eade5d3ae0eb | 92 | static __IO int32_t inOffset_; |
MikamiUitOpen | 0:eade5d3ae0eb | 93 | static __IO bool xferred_; |
MikamiUitOpen | 0:eade5d3ae0eb | 94 | |
MikamiUitOpen | 0:eade5d3ae0eb | 95 | void InitCodec(uint16_t inputDevice); |
MikamiUitOpen | 3:3bfdd8be834f | 96 | void InitInput(uint16_t inputDevice); |
MikamiUitOpen | 3:3bfdd8be834f | 97 | void SetInput(); |
MikamiUitOpen | 3:3bfdd8be834f | 98 | void SetOutput(); |
MikamiUitOpen | 0:eade5d3ae0eb | 99 | void ClearBuffer(); |
MikamiUitOpen | 0:eade5d3ae0eb | 100 | |
MikamiUitOpen | 5:20cc265d7aec | 101 | // This function pointer is assigned by |
MikamiUitOpen | 5:20cc265d7aec | 102 | // InputNormal() or InputReversal() |
MikamiUitOpen | 5:20cc265d7aec | 103 | void (SaiIO::*InputFp)(int16_t &, int16_t &); |
MikamiUitOpen | 5:20cc265d7aec | 104 | // For line input |
MikamiUitOpen | 5:20cc265d7aec | 105 | void InputNormal(int16_t &xL, int16_t &xR); |
MikamiUitOpen | 5:20cc265d7aec | 106 | // For MEMS microphone input |
MikamiUitOpen | 5:20cc265d7aec | 107 | void InputReversal(int16_t &xL, int16_t &xR); |
MikamiUitOpen | 5:20cc265d7aec | 108 | |
MikamiUitOpen | 0:eade5d3ae0eb | 109 | static void Captured(int32_t offset); |
MikamiUitOpen | 0:eade5d3ae0eb | 110 | static void FillBuffer(uint32_t offset); |
MikamiUitOpen | 0:eade5d3ae0eb | 111 | }; |
MikamiUitOpen | 0:eade5d3ae0eb | 112 | } |
MikamiUitOpen | 0:eade5d3ae0eb | 113 | #endif // F746_SAI_IO_HPP |