Use new LC3 encoder API

New API enables us do do some downsampling/upsampling in the
encoder/decoder.

Also ensure that audio framework sampling rate is used for all buffers
that go/come from audio framework.

Bug: 150670922
Test: compilation
Change-Id: I3d455f0fa17ad89807e1a34a9b363ba32f783a22
diff --git a/system/bta/le_audio/broadcaster/broadcaster.cc b/system/bta/le_audio/broadcaster/broadcaster.cc
index 2122fb3..efa2724 100644
--- a/system/bta/le_audio/broadcaster/broadcaster.cc
+++ b/system/bta/le_audio/broadcaster/broadcaster.cc
@@ -542,7 +542,7 @@
 
         encoders_mem_.emplace_back(malloc(encoder_bytes), &std::free);
         encoders_.emplace_back(
-            lc3_setup_encoder(dt_us, sr_hz, encoders_mem_.back().get()));
+            lc3_setup_encoder(dt_us, sr_hz, 0, encoders_mem_.back().get()));
       }
     }
 
diff --git a/system/bta/le_audio/client.cc b/system/bta/le_audio/client.cc
index cb5282f..b1421af 100644
--- a/system/bta/le_audio/client.cc
+++ b/system/bta/le_audio/client.cc
@@ -1820,8 +1820,8 @@
     uint16_t num_of_frames_per_ch;
 
     int dt_us = current_source_codec_config.data_interval_us;
-    int sr_hz = current_source_codec_config.sample_rate;
-    num_of_frames_per_ch = lc3_frame_samples(dt_us, sr_hz);
+    int af_hz = audio_framework_source_config.sample_rate;
+    num_of_frames_per_ch = lc3_frame_samples(dt_us, af_hz);
 
     chan_mono.reserve(num_of_frames_per_ch);
     for (int i = 0; i < pitch * num_of_frames_per_ch; i += pitch) {
@@ -1847,8 +1847,8 @@
     uint16_t number_of_required_samples_per_channel;
 
     int dt_us = current_source_codec_config.data_interval_us;
-    int sr_hz = current_source_codec_config.sample_rate;
-    number_of_required_samples_per_channel = lc3_frame_samples(dt_us, sr_hz);
+    int af_hz = audio_framework_source_config.sample_rate;
+    number_of_required_samples_per_channel = lc3_frame_samples(dt_us, af_hz);
 
     for (auto [cis_handle, audio_location] : stream_conf->sink_streams) {
       if (audio_location & le_audio::codec_spec_conf::kLeAudioLocationAnyLeft)
@@ -1870,22 +1870,16 @@
 
     bool mono = (left_cis_handle == 0) || (right_cis_handle == 0);
 
-    int af_hz = audio_framework_source_config.sample_rate;
-    LOG_ASSERT(af_hz >= sr_hz) << __func__ << " sample freq issue";
-
-    int pitch = af_hz / sr_hz;
-
-    LOG(INFO) << __func__ << " pitch " << pitch
-              << " data size: " << (int)data.size()
+    LOG(INFO) << __func__ << " data size: " << (int)data.size()
               << " byte count: " << byte_count << " mono: " << mono;
     if (!mono) {
-      lc3_encode(lc3_encoder_left, (const int16_t*)data.data(), 2 * pitch,
+      lc3_encode(lc3_encoder_left, (const int16_t*)data.data(), 2,
                  chan_left_enc.size(), chan_left_enc.data());
-      lc3_encode(lc3_encoder_right, ((const int16_t*)data.data()) + 1,
-                 2 * pitch, chan_right_enc.size(), chan_right_enc.data());
+      lc3_encode(lc3_encoder_right, ((const int16_t*)data.data()) + 1, 2,
+                 chan_right_enc.size(), chan_right_enc.data());
     } else {
       std::vector<int16_t> chan_mono;
-      get_mono_stream(data, chan_mono, pitch);
+      get_mono_stream(data, chan_mono);
 
       if (left_cis_handle) {
         lc3_encode(lc3_encoder_left, (const int16_t*)chan_mono.data(), 1,
@@ -1919,8 +1913,8 @@
     uint16_t number_of_required_samples_per_channel;
 
     int dt_us = current_source_codec_config.data_interval_us;
-    int sr_hz = current_source_codec_config.sample_rate;
-    number_of_required_samples_per_channel = lc3_frame_samples(dt_us, sr_hz);
+    int af_hz = audio_framework_source_config.sample_rate;
+    number_of_required_samples_per_channel = lc3_frame_samples(dt_us, af_hz);
 
     if ((int)data.size() < (2 /* bytes per sample */ * num_channels *
                             number_of_required_samples_per_channel)) {
@@ -1929,24 +1923,22 @@
     }
     std::vector<uint8_t> chan_encoded(num_channels * byte_count, 0);
 
-    int af_hz = audio_framework_source_config.sample_rate;
-    LOG_ASSERT(af_hz >= sr_hz) << __func__ << " sample freq issue";
-
-    int pitch = af_hz / sr_hz;
-
     if (num_channels == 1) {
       /* Since we always get two channels from framework, lets make it mono here
        */
       std::vector<int16_t> chan_mono;
-      get_mono_stream(data, chan_mono, pitch);
+      get_mono_stream(data, chan_mono);
 
-      lc3_encode(lc3_encoder_left, (const int16_t*)chan_mono.data(), 1,
-                 byte_count, chan_encoded.data());
+      auto err = lc3_encode(lc3_encoder_left, (const int16_t*)chan_mono.data(),
+                            1, byte_count, chan_encoded.data());
 
+      if (err < 0) {
+        LOG(ERROR) << " error while encoding, error code: " << +err;
+      }
     } else {
-      lc3_encode(lc3_encoder_left, (const int16_t*)data.data(), 2 * pitch,
-                 byte_count, chan_encoded.data());
-      lc3_encode(lc3_encoder_right, (const int16_t*)data.data() + 1, 2 * pitch,
+      lc3_encode(lc3_encoder_left, (const int16_t*)data.data(), 2, byte_count,
+                 chan_encoded.data());
+      lc3_encode(lc3_encoder_right, (const int16_t*)data.data() + 1, 2,
                  byte_count, chan_encoded.data() + byte_count);
     }
 
@@ -2088,23 +2080,19 @@
     }
 
     int dt_us = current_sink_codec_config.data_interval_us;
-    int sr_hz = current_sink_codec_config.sample_rate;
     int af_hz = audio_framework_sink_config.sample_rate;
-    LOG_ASSERT(af_hz >= sr_hz) << __func__ << " sample freq issue";
-
-    int pitch = af_hz / sr_hz;
 
     int pcm_size;
     if (dt_us == 10000) {
-      if (sr_hz == 44100)
+      if (af_hz == 44100)
         pcm_size = 480;
       else
-        pcm_size = sr_hz / 100;
+        pcm_size = af_hz / 100;
     } else if (dt_us == 7500) {
-      if (sr_hz == 44100)
+      if (af_hz == 44100)
         pcm_size = 360;
       else
-        pcm_size = (sr_hz * 3) / 400;
+        pcm_size = (af_hz * 3) / 400;
     } else {
       LOG(ERROR) << "BAD dt_us: " << dt_us;
       return;
@@ -2112,8 +2100,8 @@
 
     std::vector<int16_t> pcm_data_decoded(pcm_size, 0);
 
-    auto err =
-        lc3_decode(lc3_decoder, data, size, pcm_data_decoded.data(), pitch);
+    auto err = lc3_decode(lc3_decoder, data, size, pcm_data_decoded.data(),
+                          1 /* pitch */);
 
     /* TODO: How handle failing decoding ? */
     if (err < 0) {
@@ -2159,14 +2147,17 @@
       }
       int dt_us = current_source_codec_config.data_interval_us;
       int sr_hz = current_source_codec_config.sample_rate;
-      unsigned enc_size = lc3_encoder_size(dt_us, sr_hz);
+      int af_hz = audio_framework_source_config.sample_rate;
+      unsigned enc_size = lc3_encoder_size(dt_us, af_hz);
 
       lc3_encoder_left_mem = malloc(enc_size);
       lc3_encoder_right_mem = malloc(enc_size);
 
-      lc3_encoder_left = lc3_setup_encoder(dt_us, sr_hz, lc3_encoder_left_mem);
+      lc3_encoder_left =
+          lc3_setup_encoder(dt_us, sr_hz, af_hz, lc3_encoder_left_mem);
       lc3_encoder_right =
-          lc3_setup_encoder(dt_us, sr_hz, lc3_encoder_right_mem);
+          lc3_setup_encoder(dt_us, sr_hz, af_hz, lc3_encoder_right_mem);
+
     } else if (CodecManager::GetInstance()->GetCodecLocation() ==
                le_audio::types::CodecLocation::ADSP) {
       CodecManager::GetInstance()->UpdateActiveSourceAudioConfig(
@@ -2245,9 +2236,11 @@
 
       int dt_us = current_sink_codec_config.data_interval_us;
       int sr_hz = current_sink_codec_config.sample_rate;
-      unsigned dec_size = lc3_decoder_size(dt_us, sr_hz);
+      int af_hz = audio_framework_sink_config.sample_rate;
+      unsigned dec_size = lc3_decoder_size(dt_us, af_hz);
       lc3_decoder_mem = malloc(dec_size);
-      lc3_decoder = lc3_setup_decoder(dt_us, sr_hz, lc3_decoder_mem);
+
+      lc3_decoder = lc3_setup_decoder(dt_us, sr_hz, af_hz, lc3_decoder_mem);
     } else if (CodecManager::GetInstance()->GetCodecLocation() ==
                le_audio::types::CodecLocation::ADSP) {
       CodecManager::GetInstance()->UpdateActiveSinkAudioConfig(*stream_conf,
diff --git a/system/embdrv/lc3/fuzzer/liblc3encoder_fuzzer.cpp b/system/embdrv/lc3/fuzzer/liblc3encoder_fuzzer.cpp
index 7979bc7..767dba4 100644
--- a/system/embdrv/lc3/fuzzer/liblc3encoder_fuzzer.cpp
+++ b/system/embdrv/lc3/fuzzer/liblc3encoder_fuzzer.cpp
@@ -37,7 +37,8 @@
 
   void* lc3_encoder_mem = nullptr;
   lc3_encoder_mem = malloc(enc_size);
-  lc3_encoder_t  lc3_encoder = lc3_setup_encoder(dt_us, sr_hz, lc3_encoder_mem);
+  lc3_encoder_t lc3_encoder =
+      lc3_setup_encoder(dt_us, sr_hz, 0, lc3_encoder_mem);
 
   std::vector<uint8_t> output(output_byte_count);
   lc3_encode(lc3_encoder, (const int16_t*)input_frames.data(), 1,