Final version.
Fork of F746_SAI_IO by
SAI_InOut.hpp@13:2757dd069581, 2017-08-30 (annotated)
- Committer:
- mladjo1993
- Date:
- Wed Aug 30 07:43:12 2017 +0000
- Revision:
- 13:2757dd069581
- Parent:
- 11:66f6a85cebc6
Final version.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:eade5d3ae0eb | 1 | //----------------------------------------------------------- |
MikamiUitOpen | 9:25a9655d6a0e | 2 | // SaiIO class (Header) |
MikamiUitOpen | 11:66f6a85cebc6 | 3 | // 2017/03/17, Copyright (c) 2017 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 | |
mladjo1993 | 13:2757dd069581 | 15 | namespace etf |
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 | 5:20cc265d7aec | 39 | // Input using SAI |
MikamiUitOpen | 5:20cc265d7aec | 40 | void Input(int16_t &xL, int16_t &xR) |
MikamiUitOpen | 5:20cc265d7aec | 41 | { (this->*InputFp)(xL, xR); } |
MikamiUitOpen | 0:eade5d3ae0eb | 42 | |
MikamiUitOpen | 2:1aef7b703249 | 43 | void StopIn() { BSP_AUDIO_IN_Stop(CODEC_PDWN_SW); } |
MikamiUitOpen | 2:1aef7b703249 | 44 | void PauseIn() { BSP_AUDIO_IN_Pause(); } |
MikamiUitOpen | 2:1aef7b703249 | 45 | void ResumeIn() { BSP_AUDIO_IN_Resume(); } |
MikamiUitOpen | 2:1aef7b703249 | 46 | |
MikamiUitOpen | 1:48ed86c8430a | 47 | void PlayOut(); |
MikamiUitOpen | 0:eade5d3ae0eb | 48 | bool IsXferred(); |
MikamiUitOpen | 5:20cc265d7aec | 49 | // Output using SAI |
MikamiUitOpen | 0:eade5d3ae0eb | 50 | void Output(int16_t xL, int16_t xR); |
MikamiUitOpen | 2:1aef7b703249 | 51 | |
MikamiUitOpen | 2:1aef7b703249 | 52 | void StopOut() { BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW); } |
MikamiUitOpen | 2:1aef7b703249 | 53 | void PauseOut() { BSP_AUDIO_OUT_Pause(); } |
MikamiUitOpen | 2:1aef7b703249 | 54 | void ResumeOut() { BSP_AUDIO_OUT_Resume(); } |
MikamiUitOpen | 0:eade5d3ae0eb | 55 | |
MikamiUitOpen | 0:eade5d3ae0eb | 56 | // IF you use both input and output of SAI, |
MikamiUitOpen | 11:66f6a85cebc6 | 57 | // you can use following function |
MikamiUitOpen | 0:eade5d3ae0eb | 58 | bool IsCompleted() |
MikamiUitOpen | 0:eade5d3ae0eb | 59 | { return IsCaptured() && IsXferred(); } |
MikamiUitOpen | 0:eade5d3ae0eb | 60 | |
MikamiUitOpen | 0:eade5d3ae0eb | 61 | // Following two member functions are called from |
MikamiUitOpen | 0:eade5d3ae0eb | 62 | // callback functions in "BSP_AudioIn_Overwrite.cpp" |
MikamiUitOpen | 0:eade5d3ae0eb | 63 | static void Captured1st() { Captured(0); } |
MikamiUitOpen | 0:eade5d3ae0eb | 64 | static void Captured2nd() { Captured(bufferSize_/2); } |
MikamiUitOpen | 0:eade5d3ae0eb | 65 | |
MikamiUitOpen | 0:eade5d3ae0eb | 66 | // Following two member functions are called from |
MikamiUitOpen | 0:eade5d3ae0eb | 67 | // callback functions in "BSP_AudioOut_Overwrite.cpp" |
MikamiUitOpen | 0:eade5d3ae0eb | 68 | static void FillBuffer1st() { FillBuffer(0); } |
MikamiUitOpen | 0:eade5d3ae0eb | 69 | static void FillBuffer2nd() { FillBuffer(bufferSize_/2); } |
MikamiUitOpen | 0:eade5d3ae0eb | 70 | |
MikamiUitOpen | 0:eade5d3ae0eb | 71 | // Called form the functions in "BSP_AudioIn_Overwrite.cpp" |
MikamiUitOpen | 0:eade5d3ae0eb | 72 | // and "BSP_AudioOut_Overwrite.cpp" |
MikamiUitOpen | 0:eade5d3ae0eb | 73 | static void ErrorTrap(); |
MikamiUitOpen | 0:eade5d3ae0eb | 74 | |
MikamiUitOpen | 0:eade5d3ae0eb | 75 | private: |
MikamiUitOpen | 0:eade5d3ae0eb | 76 | const int FS_; |
MikamiUitOpen | 0:eade5d3ae0eb | 77 | const InOutBoth IOBOTH_; |
MikamiUitOpen | 0:eade5d3ae0eb | 78 | |
MikamiUitOpen | 10:eb439bbba0f2 | 79 | Array<uint16_t> inBuffer_; |
MikamiUitOpen | 10:eb439bbba0f2 | 80 | static Array<uint16_t> outBuffer_; |
MikamiUitOpen | 10:eb439bbba0f2 | 81 | static Array<uint16_t> tmp_; |
MikamiUitOpen | 10:eb439bbba0f2 | 82 | |
MikamiUitOpen | 0:eade5d3ae0eb | 83 | __IO int32_t inIndex_; |
MikamiUitOpen | 0:eade5d3ae0eb | 84 | __IO int32_t tmpIndex_; |
MikamiUitOpen | 0:eade5d3ae0eb | 85 | |
MikamiUitOpen | 0:eade5d3ae0eb | 86 | static int32_t nData_; |
MikamiUitOpen | 0:eade5d3ae0eb | 87 | static int32_t bufferSize_; |
MikamiUitOpen | 0:eade5d3ae0eb | 88 | static __IO bool captured_; |
MikamiUitOpen | 0:eade5d3ae0eb | 89 | static __IO int32_t inOffset_; |
MikamiUitOpen | 0:eade5d3ae0eb | 90 | static __IO bool xferred_; |
MikamiUitOpen | 0:eade5d3ae0eb | 91 | |
MikamiUitOpen | 0:eade5d3ae0eb | 92 | void InitCodec(uint16_t inputDevice); |
MikamiUitOpen | 3:3bfdd8be834f | 93 | void InitInput(uint16_t inputDevice); |
MikamiUitOpen | 3:3bfdd8be834f | 94 | void SetInput(); |
MikamiUitOpen | 3:3bfdd8be834f | 95 | void SetOutput(); |
MikamiUitOpen | 0:eade5d3ae0eb | 96 | void ClearBuffer(); |
MikamiUitOpen | 0:eade5d3ae0eb | 97 | |
MikamiUitOpen | 5:20cc265d7aec | 98 | // This function pointer is assigned by |
MikamiUitOpen | 5:20cc265d7aec | 99 | // InputNormal() or InputReversal() |
MikamiUitOpen | 5:20cc265d7aec | 100 | void (SaiIO::*InputFp)(int16_t &, int16_t &); |
MikamiUitOpen | 5:20cc265d7aec | 101 | // For line input |
MikamiUitOpen | 5:20cc265d7aec | 102 | void InputNormal(int16_t &xL, int16_t &xR); |
MikamiUitOpen | 5:20cc265d7aec | 103 | // For MEMS microphone input |
MikamiUitOpen | 5:20cc265d7aec | 104 | void InputReversal(int16_t &xL, int16_t &xR); |
MikamiUitOpen | 5:20cc265d7aec | 105 | |
MikamiUitOpen | 0:eade5d3ae0eb | 106 | static void Captured(int32_t offset); |
MikamiUitOpen | 0:eade5d3ae0eb | 107 | static void FillBuffer(uint32_t offset); |
MikamiUitOpen | 0:eade5d3ae0eb | 108 | }; |
MikamiUitOpen | 0:eade5d3ae0eb | 109 | } |
MikamiUitOpen | 0:eade5d3ae0eb | 110 | #endif // F746_SAI_IO_HPP |