oboe: address review comments, better singleton

Use constexpr.
Add new files to CMakeLists.txt
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1a4bfad..1b82a0f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,9 +11,13 @@
         src/fifo/FifoController.cpp
         src/fifo/FifoControllerBase.cpp
         src/fifo/FifoControllerIndirect.cpp
+        src/opensles/AudioInputStreamOpenSLES.cpp
+        src/opensles/AudioOutputStreamOpenSLES.cpp
         src/opensles/AudioStreamBuffered.cpp
         src/opensles/AudioStreamOpenSLES.cpp
+        src/opensles/EngineOpenSLES.cpp
         src/opensles/OpenSLESUtilities.cpp
+        src/opensles/OutputMixerOpenSLES.cpp
         )
 
 add_library(oboe STATIC ${oboe_sources})
@@ -25,4 +29,4 @@
                             PRIVATE -Wall
                             PRIVATE "$<$<CONFIG:DEBUG>:-Werror>") # Only include -Werror when building debug config
 
-target_link_libraries(oboe PRIVATE log OpenSLES)
\ No newline at end of file
+target_link_libraries(oboe PRIVATE log OpenSLES)
diff --git a/src/opensles/AudioInputStreamOpenSLES.cpp b/src/opensles/AudioInputStreamOpenSLES.cpp
index 23e1c66..3ff10e6 100644
--- a/src/opensles/AudioInputStreamOpenSLES.cpp
+++ b/src/opensles/AudioInputStreamOpenSLES.cpp
@@ -59,7 +59,7 @@
     Result oboeResult = AudioStreamOpenSLES::open();
     if (Result::OK != oboeResult)  return oboeResult;
 
-    SLuint32 bitsPerSample = getBytesPerSample() * OBOE_BITS_PER_BYTE;
+    SLuint32 bitsPerSample = getBytesPerSample() * kBitsPerByte;
 
     // configure audio sink
     SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {
@@ -100,7 +100,7 @@
                                       NULL };
     SLDataSource audioSrc = {&loc_dev, NULL };
 
-    SLresult result = EngineOpenSLES::getInstance()->createAudioRecorder(&mObjectInterface,
+    SLresult result = EngineOpenSLES::getInstance().createAudioRecorder(&mObjectInterface,
                                                                        &audioSrc,
                                                                        &audioSink);
     if (SL_RESULT_SUCCESS != result) {
@@ -130,17 +130,17 @@
 
     result = (*mObjectInterface)->GetInterface(mObjectInterface, SL_IID_RECORD, &mRecordInterface);
     if (SL_RESULT_SUCCESS != result) {
-        LOGE("get recorder interface result:%s", getSLErrStr(result));
+        LOGE("GetInterface RECORD result:%s", getSLErrStr(result));
         goto error;
     }
 
     result = AudioStreamOpenSLES::registerBufferQueueCallback();
     if (SL_RESULT_SUCCESS != result) {
-        LOGE("get bufferqueue interface:%p result:%s", mSimpleBufferQueueInterface, getSLErrStr(result));
         goto error;
     }
 
     return Result::OK;
+
 error:
     return Result::ErrorInternal; // TODO convert error from SLES to OBOE
 }
diff --git a/src/opensles/AudioOutputStreamOpenSLES.cpp b/src/opensles/AudioOutputStreamOpenSLES.cpp
index b31d627..2129766 100644
--- a/src/opensles/AudioOutputStreamOpenSLES.cpp
+++ b/src/opensles/AudioOutputStreamOpenSLES.cpp
@@ -35,15 +35,16 @@
 }
 
 // These will wind up in <SLES/OpenSLES_Android.h>
-#define SL_ANDROID_SPEAKER_QUAD (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT \
- | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT)
+constexpr int SL_ANDROID_SPEAKER_STEREO = (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT);
 
-#define SL_ANDROID_SPEAKER_5DOT1 (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT \
- | SL_SPEAKER_FRONT_CENTER  | SL_SPEAKER_LOW_FREQUENCY| SL_SPEAKER_BACK_LEFT \
- | SL_SPEAKER_BACK_RIGHT)
+constexpr int SL_ANDROID_SPEAKER_QUAD = (SL_ANDROID_SPEAKER_STEREO
+        | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT);
 
-#define SL_ANDROID_SPEAKER_7DOT1 (SL_ANDROID_SPEAKER_5DOT1 | SL_SPEAKER_SIDE_LEFT \
- |SL_SPEAKER_SIDE_RIGHT)
+constexpr int SL_ANDROID_SPEAKER_5DOT1 = (SL_ANDROID_SPEAKER_QUAD
+        | SL_SPEAKER_FRONT_CENTER  | SL_SPEAKER_LOW_FREQUENCY);
+
+constexpr int SL_ANDROID_SPEAKER_7DOT1 = (SL_ANDROID_SPEAKER_5DOT1 | SL_SPEAKER_SIDE_LEFT
+        | SL_SPEAKER_SIDE_RIGHT);
 
 int AudioOutputStreamOpenSLES::chanCountToChanMask(int chanCount) {
     int channelMask = 0;
@@ -54,7 +55,7 @@
             break;
 
         case  2:
-            channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
+            channelMask = SL_ANDROID_SPEAKER_STEREO;
             break;
 
         case  4: // Quad
@@ -76,13 +77,13 @@
     Result oboeResult = AudioStreamOpenSLES::open();
     if (Result::OK != oboeResult)  return oboeResult;
 
-    SLresult result = OutputMixerOpenSL::getInstance()->open();
+    SLresult result = OutputMixerOpenSL::getInstance().open();
     if (SL_RESULT_SUCCESS != result) {
         AudioStreamOpenSLES::close();
         return Result::ErrorInternal;
     }
 
-    SLuint32 bitsPerSample = getBytesPerSample() * OBOE_BITS_PER_BYTE;
+    SLuint32 bitsPerSample = getBytesPerSample() * kBitsPerByte;
 
     // configure audio source
     SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {
@@ -116,7 +117,7 @@
         audioSrc.pFormat = &format_pcm_ex;
     }
 
-    result = OutputMixerOpenSL::getInstance()->createAudioPlayer(&mObjectInterface,
+    result = OutputMixerOpenSL::getInstance().createAudioPlayer(&mObjectInterface,
                                                                           &audioSrc);
     if (SL_RESULT_SUCCESS != result) {
         LOGE("createAudioPlayer() result:%s", getSLErrStr(result));
@@ -131,13 +132,12 @@
 
     result = (*mObjectInterface)->GetInterface(mObjectInterface, SL_IID_PLAY, &mPlayInterface);
     if (SL_RESULT_SUCCESS != result) {
-        LOGE("get player interface result:%s", getSLErrStr(result));
+        LOGE("GetInterface PLAY result:%s", getSLErrStr(result));
         goto error;
     }
 
     result = AudioStreamOpenSLES::registerBufferQueueCallback();
     if (SL_RESULT_SUCCESS != result) {
-        LOGE("get bufferqueue interface:%p result:%s", mSimpleBufferQueueInterface, getSLErrStr(result));
         goto error;
     }
 
@@ -150,7 +150,7 @@
     requestPause();
     // invalidate any interfaces
     mPlayInterface = NULL;
-    OutputMixerOpenSL::getInstance()->close();
+    OutputMixerOpenSL::getInstance().close();
     return AudioStreamOpenSLES::close();
 }
 
diff --git a/src/opensles/AudioStreamOpenSLES.cpp b/src/opensles/AudioStreamOpenSLES.cpp
index 0a674af..3830eeb 100644
--- a/src/opensles/AudioStreamOpenSLES.cpp
+++ b/src/opensles/AudioStreamOpenSLES.cpp
@@ -65,7 +65,7 @@
         return Result::ErrorInvalidFormat;
     }
 
-    SLresult result = EngineOpenSLES::getInstance()->open();
+    SLresult result = EngineOpenSLES::getInstance().open();
     if (SL_RESULT_SUCCESS != result) {
         return Result::ErrorInternal;
     }
@@ -119,7 +119,7 @@
 
     }
     mSimpleBufferQueueInterface = NULL;
-    EngineOpenSLES::getInstance()->close();
+    EngineOpenSLES::getInstance().close();
     return Result::OK;
 }
 
@@ -149,7 +149,9 @@
     SLresult result = (*mObjectInterface)->GetInterface(mObjectInterface, SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
                                                 &mSimpleBufferQueueInterface);
     if (SL_RESULT_SUCCESS != result) {
-        LOGE("get bufferqueue interface:%p result:%s", mSimpleBufferQueueInterface, getSLErrStr(result));
+        LOGE("get buffer queue interface:%p result:%s",
+             mSimpleBufferQueueInterface,
+             getSLErrStr(result));
     } else {
         // Register the BufferQueue callback
         result = (*mSimpleBufferQueueInterface)->RegisterCallback(mSimpleBufferQueueInterface,
diff --git a/src/opensles/AudioStreamOpenSLES.h b/src/opensles/AudioStreamOpenSLES.h
index 1688c1e..da4a9ad 100644
--- a/src/opensles/AudioStreamOpenSLES.h
+++ b/src/opensles/AudioStreamOpenSLES.h
@@ -26,10 +26,7 @@
 
 namespace oboe {
 
-#define OBOE_BITS_PER_BYTE            8      // common value TODO modernize
-
-
-
+constexpr int kBitsPerByte = 8;
 
 /**
  * INTERNAL USE ONLY
@@ -51,7 +48,6 @@
     virtual Result open() override;
     virtual Result close() override;
 
-
     /**
      * Query the current state, eg. OBOE_STREAM_STATE_PAUSING
      *
@@ -61,8 +57,6 @@
 
     int32_t getFramesPerBurst() override;
 
-    static SLuint32 getDefaultByteOrder();
-
     virtual int chanCountToChanMask(int chanCount) = 0;
 
     /**
@@ -75,6 +69,8 @@
 
 protected:
 
+    static SLuint32 getDefaultByteOrder();
+
     SLresult registerBufferQueueCallback();
 
     SLresult enqueueCallbackBuffer(SLAndroidSimpleBufferQueueItf bq);
diff --git a/src/opensles/EngineOpenSLES.cpp b/src/opensles/EngineOpenSLES.cpp
index cf87ecc..8df3fed 100644
--- a/src/opensles/EngineOpenSLES.cpp
+++ b/src/opensles/EngineOpenSLES.cpp
@@ -20,9 +20,9 @@
 
 using namespace oboe;
 
-EngineOpenSLES *EngineOpenSLES::getInstance() {
+EngineOpenSLES &EngineOpenSLES::getInstance() {
     static EngineOpenSLES sInstance;
-    return &sInstance;
+    return sInstance;
 }
 
 SLresult EngineOpenSLES::open() {
diff --git a/src/opensles/EngineOpenSLES.h b/src/opensles/EngineOpenSLES.h
index 20564f9..7658c95 100644
--- a/src/opensles/EngineOpenSLES.h
+++ b/src/opensles/EngineOpenSLES.h
@@ -30,7 +30,7 @@
  */
 class EngineOpenSLES {
 public:
-    static EngineOpenSLES *getInstance();
+    static EngineOpenSLES &getInstance();
 
     SLresult open();
 
@@ -46,8 +46,15 @@
                                  SLDataSink *audioSink);
 
 private:
+    // Make this a safe Singleton
+    EngineOpenSLES()= default;
+    ~EngineOpenSLES()= default;
+    EngineOpenSLES(const EngineOpenSLES&)= delete;
+    EngineOpenSLES& operator=(const EngineOpenSLES&)= delete;
+
     std::mutex             mLock;
-    std::atomic<int32_t>   mOpenCount{0};
+    int32_t                mOpenCount = 0;
+
     SLObjectItf            mEngineObject = 0;
     SLEngineItf            mEngineInterface;
 };
diff --git a/src/opensles/OpenSLESUtilities.cpp b/src/opensles/OpenSLESUtilities.cpp
index c764af3..45f1c18 100644
--- a/src/opensles/OpenSLESUtilities.cpp
+++ b/src/opensles/OpenSLESUtilities.cpp
@@ -61,13 +61,15 @@
 
 SLuint32 OpenSLES_ConvertFormatToRepresentation(AudioFormat format) {
     switch(format) {
-        case AudioFormat::Invalid:
-        case AudioFormat::Unspecified:
-            return 0;
         case AudioFormat::I16:
             return SL_ANDROID_PCM_REPRESENTATION_SIGNED_INT;
         case AudioFormat::Float:
             return SL_ANDROID_PCM_REPRESENTATION_FLOAT;
+        case AudioFormat::Invalid:
+        case AudioFormat::Unspecified:
+        default:
+            return 0;
     }
 }
+
 } // namespace oboe
\ No newline at end of file
diff --git a/src/opensles/OutputMixerOpenSLES.cpp b/src/opensles/OutputMixerOpenSLES.cpp
index db36ec1..901e9a7 100644
--- a/src/opensles/OutputMixerOpenSLES.cpp
+++ b/src/opensles/OutputMixerOpenSLES.cpp
@@ -22,9 +22,9 @@
 
 using namespace oboe;
 
-OutputMixerOpenSL *OutputMixerOpenSL::getInstance() {
+OutputMixerOpenSL &OutputMixerOpenSL::getInstance() {
     static OutputMixerOpenSL sInstance;
-    return &sInstance;
+    return sInstance;
 }
 
 SLresult OutputMixerOpenSL::open() {
@@ -33,7 +33,7 @@
     SLresult result = SL_RESULT_SUCCESS;
     if (mOpenCount++ == 0) {
         // get the output mixer
-        result = EngineOpenSLES::getInstance()->createOutputMix(&mOutputMixObject);
+        result = EngineOpenSLES::getInstance().createOutputMix(&mOutputMixObject);
         if (SL_RESULT_SUCCESS != result) {
             LOGE("OutputMixerOpenSL() - createOutputMix() result:%s", getSLErrStr(result));
             goto error;
@@ -70,5 +70,5 @@
                                               SLDataSource *audioSource) {
     SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX, mOutputMixObject};
     SLDataSink audioSink = {&loc_outmix, NULL};
-    return EngineOpenSLES::getInstance()->createAudioPlayer(objectItf, audioSource, &audioSink);
+    return EngineOpenSLES::getInstance().createAudioPlayer(objectItf, audioSource, &audioSink);
 }
diff --git a/src/opensles/OutputMixerOpenSLES.h b/src/opensles/OutputMixerOpenSLES.h
index 5a414df..1fc77e5 100644
--- a/src/opensles/OutputMixerOpenSLES.h
+++ b/src/opensles/OutputMixerOpenSLES.h
@@ -31,7 +31,7 @@
 
 class OutputMixerOpenSL {
 public:
-    static OutputMixerOpenSL *getInstance();
+    static OutputMixerOpenSL &getInstance();
 
     SLresult open();
 
@@ -41,8 +41,15 @@
                                SLDataSource *audioSource);
 
 private:
+    // Make this a safe Singleton
+    OutputMixerOpenSL()= default;
+    ~OutputMixerOpenSL()= default;
+    OutputMixerOpenSL(const OutputMixerOpenSL&)= delete;
+    OutputMixerOpenSL& operator=(const OutputMixerOpenSL&)= delete;
+
     std::mutex            mLock;
-    std::atomic<int32_t>  mOpenCount{0};
+    int32_t               mOpenCount = 0;
+
     SLObjectItf           mOutputMixObject = 0;
 };