Migrate from libaudioclient to libaaudio

Need to move to a library that doesn't use libbinder.

Bug: 144441978
Test: compile, and verify with an audio sink platform
Change-Id: I9111c34d8611531d2adcaf3b08172f7328f01014
diff --git a/btif/Android.bp b/btif/Android.bp
index 8e55de6..7f5bdc2 100644
--- a/btif/Android.bp
+++ b/btif/Android.bp
@@ -96,7 +96,7 @@
         "libmedia_headers",
     ],
     shared_libs: [
-        "libaudioclient",
+        "libaaudio",
         "libcutils",
         "libfmq",
         "liblog",
@@ -139,7 +139,7 @@
     ],
     header_libs: ["libbluetooth_headers"],
     shared_libs: [
-        "libaudioclient",
+        "libaaudio",
         "android.hardware.bluetooth.a2dp@1.0",
         "android.hardware.bluetooth.audio@2.0",
         "libfmq",
diff --git a/btif/include/btif_avrcp_audio_track.h b/btif/include/btif_avrcp_audio_track.h
index 20b21ff..eeca1c8 100644
--- a/btif/include/btif_avrcp_audio_track.h
+++ b/btif/include/btif_avrcp_audio_track.h
@@ -35,8 +35,8 @@
  * should eventually be
  * deleted using BtifAvrcpAudioTrackDelete (see below).
  */
-void* BtifAvrcpAudioTrackCreate(int trackFreq, int bits_per_sample,
-                                int channelType);
+void* BtifAvrcpAudioTrackCreate(int trackFreq, int bitsPerSample,
+                                int channelCount);
 
 /**
  * Starts the audio track.
@@ -66,4 +66,4 @@
  * Used only for debugging.
  */
 int BtifAvrcpAudioTrackWriteData(void* handle, void* audioBuffer,
-                                 int bufferlen);
+                                 int bufferLength);
diff --git a/btif/src/btif_a2dp_sink.cc b/btif/src/btif_a2dp_sink.cc
index aa75d21..af845a7 100644
--- a/btif/src/btif_a2dp_sink.cc
+++ b/btif/src/btif_a2dp_sink.cc
@@ -595,7 +595,7 @@
   APPL_TRACE_DEBUG("%s: create audio track", __func__);
   btif_a2dp_sink_cb.audio_track =
 #ifndef OS_GENERIC
-      BtifAvrcpAudioTrackCreate(sample_rate, bits_per_sample, channel_type);
+      BtifAvrcpAudioTrackCreate(sample_rate, bits_per_sample, channel_count);
 #else
       NULL;
 #endif
diff --git a/btif/src/btif_avrcp_audio_track.cc b/btif/src/btif_avrcp_audio_track.cc
index 4f3cd35..5cf94e2 100644
--- a/btif/src/btif_avrcp_audio_track.cc
+++ b/btif/src/btif_avrcp_audio_track.cc
@@ -19,8 +19,8 @@
 
 #include "btif_avrcp_audio_track.h"
 
+#include <aaudio/AAudio.h>
 #include <base/logging.h>
-#include <media/AudioTrack.h>
 #include <utils/StrongPointer.h>
 
 #include "bt_target.h"
@@ -28,50 +28,49 @@
 
 using namespace android;
 
-typedef struct { android::sp<android::AudioTrack> track; } BtifAvrcpAudioTrack;
+typedef struct {
+  AAudioStream* stream;
+  int bitsPerSample;
+  int channelCount;
+  float* buffer;
+  size_t bufferLength;
+} BtifAvrcpAudioTrack;
 
 #if (DUMP_PCM_DATA == TRUE)
 FILE* outputPcmSampleFile;
 char outputFilename[50] = "/data/misc/bluedroid/output_sample.pcm";
 #endif
 
-void* BtifAvrcpAudioTrackCreate(int trackFreq, int bits_per_sample,
-                                int channelType) {
-  audio_format_t format;
-  switch (bits_per_sample) {
-    default:
-    case 16:
-      format = AUDIO_FORMAT_PCM_16_BIT;
-      break;
-    case 24:
-      format = AUDIO_FORMAT_PCM_24_BIT_PACKED;
-      break;
-    case 32:
-      format = AUDIO_FORMAT_PCM_32_BIT;
-      break;
-  }
-  LOG_VERBOSE(LOG_TAG,
-              "%s Track.cpp: btCreateTrack freq %d format 0x%x channel %d ",
-              __func__, trackFreq, format, channelType);
-  sp<android::AudioTrack> track = new android::AudioTrack(
-      AUDIO_STREAM_MUSIC, trackFreq, format, channelType,
-      (size_t)0 /*frameCount*/, (audio_output_flags_t)AUDIO_OUTPUT_FLAG_FAST,
-      NULL /*callback_t*/, NULL /*void* user*/, 0 /*notificationFrames*/,
-      AUDIO_SESSION_ALLOCATE, android::AudioTrack::TRANSFER_SYNC);
-  CHECK(track != NULL);
+void* BtifAvrcpAudioTrackCreate(int trackFreq, int bitsPerSample,
+                                int channelCount) {
+  LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btCreateTrack freq %d bps %d channel %d ",
+              __func__, trackFreq, bitsPerSample, channelCount);
+
+  AAudioStreamBuilder* builder;
+  AAudioStream* stream;
+  aaudio_result_t result = AAudio_createStreamBuilder(&builder);
+  AAudioStreamBuilder_setSampleRate(builder, trackFreq);
+  AAudioStreamBuilder_setFormat(builder, AAUDIO_FORMAT_PCM_FLOAT);
+  AAudioStreamBuilder_setChannelCount(builder, channelCount);
+  AAudioStreamBuilder_setSessionId(builder, AAUDIO_SESSION_ID_ALLOCATE);
+  AAudioStreamBuilder_setPerformanceMode(builder,
+                                         AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
+  result = AAudioStreamBuilder_openStream(builder, &stream);
+  CHECK(result == AAUDIO_OK);
+  AAudioStreamBuilder_delete(builder);
 
   BtifAvrcpAudioTrack* trackHolder = new BtifAvrcpAudioTrack;
   CHECK(trackHolder != NULL);
-  trackHolder->track = track;
-
-  if (trackHolder->track->initCheck() != 0) {
-    return nullptr;
-  }
+  trackHolder->stream = stream;
+  trackHolder->bitsPerSample = bitsPerSample;
+  trackHolder->channelCount = channelCount;
+  trackHolder->bufferLength =
+      trackHolder->channelCount * AAudioStream_getBufferSizeInFrames(stream);
+  trackHolder->buffer = new float[trackHolder->bufferLength]();
 
 #if (DUMP_PCM_DATA == TRUE)
   outputPcmSampleFile = fopen(outputFilename, "ab");
 #endif
-  trackHolder->track->setVolume(1, 1);
   return (void*)trackHolder;
 }
 
@@ -82,9 +81,9 @@
   }
   BtifAvrcpAudioTrack* trackHolder = static_cast<BtifAvrcpAudioTrack*>(handle);
   CHECK(trackHolder != NULL);
-  CHECK(trackHolder->track != NULL);
+  CHECK(trackHolder->stream != NULL);
   LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btStartTrack", __func__);
-  trackHolder->track->start();
+  AAudioStream_requestStart(trackHolder->stream);
 }
 
 void BtifAvrcpAudioTrackStop(void* handle) {
@@ -93,9 +92,9 @@
     return;
   }
   BtifAvrcpAudioTrack* trackHolder = static_cast<BtifAvrcpAudioTrack*>(handle);
-  if (trackHolder != NULL && trackHolder->track != NULL) {
+  if (trackHolder != NULL && trackHolder->stream != NULL) {
     LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btStartTrack", __func__);
-    trackHolder->track->stop();
+    AAudioStream_requestStop(trackHolder->stream);
   }
 }
 
@@ -105,8 +104,10 @@
     return;
   }
   BtifAvrcpAudioTrack* trackHolder = static_cast<BtifAvrcpAudioTrack*>(handle);
-  if (trackHolder != NULL && trackHolder->track != NULL) {
+  if (trackHolder != NULL && trackHolder->stream != NULL) {
     LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btStartTrack", __func__);
+    AAudioStream_close(trackHolder->stream);
+    delete trackHolder->buffer;
     delete trackHolder;
   }
 
@@ -124,10 +125,10 @@
     return;
   }
   BtifAvrcpAudioTrack* trackHolder = static_cast<BtifAvrcpAudioTrack*>(handle);
-  if (trackHolder != NULL && trackHolder->track != NULL) {
-    LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btStartTrack", __func__);
-    trackHolder->track->pause();
-    trackHolder->track->flush();
+  if (trackHolder != NULL && trackHolder->stream != NULL) {
+    LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btPauseTrack", __func__);
+    AAudioStream_requestPause(trackHolder->stream);
+    AAudioStream_requestFlush(trackHolder->stream);
   }
 }
 
@@ -136,26 +137,90 @@
     LOG_DEBUG(LOG_TAG, "%s handle is null.", __func__);
     return;
   }
-  BtifAvrcpAudioTrack* trackHolder = static_cast<BtifAvrcpAudioTrack*>(handle);
-  if (trackHolder != NULL && trackHolder->track != NULL) {
-    LOG_VERBOSE(LOG_TAG, "%s set gain %f", __func__, gain);
-    trackHolder->track->setVolume(gain);
-  }
+  // Does nothing right now
 }
 
+constexpr float kScaleQ15ToFloat = 1.0f / 32768.0f;
+constexpr float kScaleQ23ToFloat = 1.0f / 8388608.0f;
+constexpr float kScaleQ31ToFloat = 1.0f / 2147483648.0f;
+
+static size_t sampleSizeFor(BtifAvrcpAudioTrack* trackHolder) {
+  return trackHolder->bitsPerSample / 8;
+}
+
+static size_t transcodeQ15ToFloat(uint8_t* buffer, size_t length,
+                                  BtifAvrcpAudioTrack* trackHolder) {
+  size_t sampleSize = sampleSizeFor(trackHolder);
+  size_t i = 0;
+  for (; i <= length / sampleSize; i++) {
+    trackHolder->buffer[i] = ((int16_t*)buffer)[i] * kScaleQ15ToFloat;
+  }
+  return i * sampleSize;
+}
+
+static size_t transcodeQ23ToFloat(uint8_t* buffer, size_t length,
+                                  BtifAvrcpAudioTrack* trackHolder) {
+  size_t sampleSize = sampleSizeFor(trackHolder);
+  size_t i = 0;
+  for (; i <= length / sampleSize; i++) {
+    size_t offset = i * sampleSize;
+    int32_t sample = *((int32_t*)(buffer + offset - 1)) & 0x00FFFFFF;
+    trackHolder->buffer[i] = sample * kScaleQ23ToFloat;
+  }
+  return i * sampleSize;
+}
+
+static size_t transcodeQ31ToFloat(uint8_t* buffer, size_t length,
+                                  BtifAvrcpAudioTrack* trackHolder) {
+  size_t sampleSize = sampleSizeFor(trackHolder);
+  size_t i = 0;
+  for (; i <= length / sampleSize; i++) {
+    trackHolder->buffer[i] = ((int32_t*)buffer)[i] * kScaleQ31ToFloat;
+  }
+  return i * sampleSize;
+}
+
+static size_t transcodeToPcmFloat(uint8_t* buffer, size_t length,
+                                  BtifAvrcpAudioTrack* trackHolder) {
+  switch (trackHolder->bitsPerSample) {
+    case 16:
+      return transcodeQ15ToFloat(buffer, length, trackHolder);
+    case 24:
+      return transcodeQ23ToFloat(buffer, length, trackHolder);
+    case 32:
+      return transcodeQ31ToFloat(buffer, length, trackHolder);
+  }
+  return -1;
+}
+
+constexpr int64_t kTimeoutNanos = 100 * 1000 * 1000;  // 100 ms
+
 int BtifAvrcpAudioTrackWriteData(void* handle, void* audioBuffer,
-                                 int bufferlen) {
+                                 int bufferLength) {
   BtifAvrcpAudioTrack* trackHolder = static_cast<BtifAvrcpAudioTrack*>(handle);
   CHECK(trackHolder != NULL);
-  CHECK(trackHolder->track != NULL);
-  int retval = -1;
+  CHECK(trackHolder->stream != NULL);
+  aaudio_result_t retval = -1;
 #if (DUMP_PCM_DATA == TRUE)
   if (outputPcmSampleFile) {
-    fwrite((audioBuffer), 1, (size_t)bufferlen, outputPcmSampleFile);
+    fwrite((audioBuffer), 1, (size_t)bufferLength, outputPcmSampleFile);
   }
 #endif
-  retval = trackHolder->track->write(audioBuffer, (size_t)bufferlen);
-  LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btWriteData len = %d ret = %d", __func__,
-              bufferlen, retval);
-  return retval;
+
+  size_t sampleSize = sampleSizeFor(trackHolder);
+  int transcodedCount = 0;
+  do {
+    transcodedCount +=
+        transcodeToPcmFloat(((uint8_t*)audioBuffer) + transcodedCount,
+                            bufferLength - transcodedCount, trackHolder);
+
+    retval = AAudioStream_write(
+        trackHolder->stream, trackHolder->buffer,
+        transcodedCount / (sampleSize * trackHolder->channelCount),
+        kTimeoutNanos);
+    LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btWriteData len = %d ret = %d",
+                __func__, bufferLength, retval);
+  } while (transcodedCount < bufferLength);
+
+  return transcodedCount;
 }
diff --git a/main/Android.bp b/main/Android.bp
index 2a5b8cf..12555f3 100644
--- a/main/Android.bp
+++ b/main/Android.bp
@@ -57,7 +57,7 @@
         "android.hardware.bluetooth@1.1",
         "android.hardware.bluetooth.a2dp@1.0",
         "android.hardware.bluetooth.audio@2.0",
-        "libaudioclient",
+        "libaaudio",
         "libcutils",
         "libdl",
         "libfmq",
diff --git a/stack/Android.bp b/stack/Android.bp
index b573aaf..104f9f7 100644
--- a/stack/Android.bp
+++ b/stack/Android.bp
@@ -205,7 +205,7 @@
         "android.hardware.bluetooth@1.1",
         "android.hardware.bluetooth.a2dp@1.0",
         "android.hardware.bluetooth.audio@2.0",
-        "libaudioclient",
+        "libaaudio",
         "libcutils",
         "libdl",
         "libfmq",