Add enums to some logs (#1979)

diff --git a/src/aaudio/AudioStreamAAudio.cpp b/src/aaudio/AudioStreamAAudio.cpp
index db7e658..421798d 100644
--- a/src/aaudio/AudioStreamAAudio.cpp
+++ b/src/aaudio/AudioStreamAAudio.cpp
@@ -528,7 +528,7 @@
         if (result == DataCallbackResult::Stop) {
             LOGD("Oboe callback returned DataCallbackResult::Stop");
         } else {
-            LOGE("Oboe callback returned unexpected value = %d", result);
+            LOGE("Oboe callback returned unexpected value. Error: %d", static_cast<int>(result));
         }
 
         // Returning Stop caused various problems before S. See #1230
diff --git a/src/common/AudioStreamBuilder.cpp b/src/common/AudioStreamBuilder.cpp
index f655f9f..b1549b5 100644
--- a/src/common/AudioStreamBuilder.cpp
+++ b/src/common/AudioStreamBuilder.cpp
@@ -96,7 +96,7 @@
 Result AudioStreamBuilder::openStreamInternal(AudioStream **streamPP) {
     auto result = isValidConfig();
     if (result != Result::OK) {
-        LOGW("%s() invalid config %d", __func__, result);
+        LOGW("%s() invalid config. Error %s", __func__, oboe::convertToText(result));
         return result;
     }
 
diff --git a/src/common/DataConversionFlowGraph.cpp b/src/common/DataConversionFlowGraph.cpp
index 374fffd..0bb51ae 100644
--- a/src/common/DataConversionFlowGraph.cpp
+++ b/src/common/DataConversionFlowGraph.cpp
@@ -92,14 +92,14 @@
     int32_t sinkSampleRate = sinkStream->getSampleRate();
     int32_t sinkFramesPerCallback = sinkStream->getFramesPerDataCallback();
 
-    LOGI("%s() flowgraph converts channels: %d to %d, format: %d to %d"
-         ", rate: %d to %d, cbsize: %d to %d, qual = %d",
+    LOGI("%s() flowgraph converts channels: %d to %d, format: %s to %s"
+            ", rate: %d to %d, cbsize: %d to %d, qual = %s",
             __func__,
             sourceChannelCount, sinkChannelCount,
-            sourceFormat, sinkFormat,
+            oboe::convertToText(sourceFormat), oboe::convertToText(sinkFormat),
             sourceSampleRate, sinkSampleRate,
             sourceFramesPerCallback, sinkFramesPerCallback,
-            sourceStream->getSampleRateConversionQuality());
+            oboe::convertToText(sourceStream->getSampleRateConversionQuality()));
 
     // Source
     // IF OUTPUT and using a callback then call back to the app using a SourceCaller.
@@ -128,7 +128,7 @@
                                                                   actualSourceFramesPerCallback);
                 break;
             default:
-                LOGE("%s() Unsupported source caller format = %d", __func__, sourceFormat);
+                LOGE("%s() Unsupported source caller format = %d", __func__, static_cast<int>(sourceFormat));
                 return Result::ErrorIllegalArgument;
         }
         mSourceCaller->setStream(sourceStream);
@@ -150,7 +150,7 @@
                 mSource = std::make_unique<SourceI32>(sourceChannelCount);
                 break;
             default:
-                LOGE("%s() Unsupported source format = %d", __func__, sourceFormat);
+                LOGE("%s() Unsupported source format = %d", __func__, static_cast<int>(sourceFormat));
                 return Result::ErrorIllegalArgument;
         }
         if (isInput) {
@@ -226,7 +226,7 @@
             mSink = std::make_unique<SinkI32>(sinkChannelCount);
             break;
         default:
-            LOGE("%s() Unsupported sink format = %d", __func__, sinkFormat);
+            LOGE("%s() Unsupported sink format = %d", __func__, static_cast<int>(sinkFormat));
             return Result::ErrorIllegalArgument;;
     }
     lastOutput->connect(&mSink->input);
diff --git a/src/common/Utilities.cpp b/src/common/Utilities.cpp
index f6718af..d84d35f 100644
--- a/src/common/Utilities.cpp
+++ b/src/common/Utilities.cpp
@@ -278,6 +278,20 @@
     }
 }
 
+template<>
+const char *convertToText<SampleRateConversionQuality>(SampleRateConversionQuality sampleRateConversionQuality) {
+
+    switch (sampleRateConversionQuality) {
+        case SampleRateConversionQuality::None:     return "None";
+        case SampleRateConversionQuality::Fastest:  return "Fastest";
+        case SampleRateConversionQuality::Low:      return "Low";
+        case SampleRateConversionQuality::Medium:   return "Medium";
+        case SampleRateConversionQuality::High:     return "High";
+        case SampleRateConversionQuality::Best:     return "Best";
+        default:                                    return "Unrecognized sample rate conversion quality";
+    }
+}
+
 std::string getPropertyString(const char * name) {
     std::string result;
 #ifdef __ANDROID__
diff --git a/src/opensles/AudioOutputStreamOpenSLES.cpp b/src/opensles/AudioOutputStreamOpenSLES.cpp
index 0ef87dd..2b68990 100644
--- a/src/opensles/AudioOutputStreamOpenSLES.cpp
+++ b/src/opensles/AudioOutputStreamOpenSLES.cpp
@@ -372,7 +372,7 @@
     } else {
         SLresult slResult = (*mSimpleBufferQueueInterface)->Clear(mSimpleBufferQueueInterface);
         if (slResult != SL_RESULT_SUCCESS){
-            LOGW("Failed to clear buffer queue. OpenSLES error: %d", result);
+            LOGW("Failed to clear buffer queue. OpenSLES error: %s", getSLErrStr(slResult));
             result = Result::ErrorInternal;
         }
     }