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

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_;
 }