Thread (27 messages) 27 messages, 5 authors, 2014-01-19

Re: [PATCH 4/9] android/hal-audio: Initialize SBC encoder

flat view

From: Andrzej Kaczmarek <hidden>
Date: 2014-01-17 19:26:20

Hi Marcel,

On 17 January 2014 19:24, Marcel Holtmann [off-list ref] wrote:
Hi Andrzej,
quoted
---
android/hal-audio.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++=
++++++
quoted
1 file changed, 72 insertions(+)
diff --git a/android/hal-audio.c b/android/hal-audio.c
index f53dba0..e5c646c 100644
--- a/android/hal-audio.c
+++ b/android/hal-audio.c
@@ -32,6 +32,7 @@
#include "hal-log.h"
#include "hal-msg.h"
#include "../profiles/audio/a2dp-codecs.h"
+#include <sbc/sbc.h>

static const uint8_t a2dp_src_uuid[] =3D {
              0x00, 0x00, 0x11, 0x0a, 0x00, 0x00, 0x10, 0x00,
@@ -53,6 +54,8 @@ struct audio_input_config {
struct sbc_data {
      a2dp_sbc_t sbc;
+
+     sbc_t enc;
};

static int sbc_get_presets(struct audio_preset *preset, size_t *len);
@@ -184,6 +187,70 @@ static int sbc_get_presets(struct audio_preset *pre=
set, size_t *len)
quoted
      return i;
}

+static void sbc_init_encoder(struct sbc_data *sbc_data)
+{
+     a2dp_sbc_t *in =3D &sbc_data->sbc;
+     sbc_t *out =3D &sbc_data->enc;
+
+     DBG("");
+
+     sbc_init(out, 0L);
+
+     switch (in->frequency) {
+     case SBC_SAMPLING_FREQ_16000:
+             out->frequency =3D SBC_FREQ_16000;
+             break;
+     case SBC_SAMPLING_FREQ_32000:
+             out->frequency =3D SBC_FREQ_32000;
+             break;
+     case SBC_SAMPLING_FREQ_44100:
+             out->frequency =3D SBC_FREQ_44100;
+             break;
+     case SBC_SAMPLING_FREQ_48000:
+             out->frequency =3D SBC_FREQ_48000;
+             break;
+     }
+
+     out->subbands =3D in->subbands =3D=3D SBC_SUBBANDS_4 ? SBC_SB_4 : =
SBC_SB_8;
quoted
+
+     switch (in->channel_mode) {
+     case SBC_CHANNEL_MODE_MONO:
+             out->mode =3D SBC_MODE_MONO;
+             break;
+     case SBC_CHANNEL_MODE_DUAL_CHANNEL:
+             out->mode =3D SBC_MODE_DUAL_CHANNEL;
+             break;
+     case SBC_CHANNEL_MODE_JOINT_STEREO:
+             out->mode =3D SBC_MODE_JOINT_STEREO;
+             break;
+     case SBC_CHANNEL_MODE_STEREO:
+             out->mode =3D SBC_MODE_STEREO;
+             break;
+     }
+
+     out->endian =3D SBC_LE;
+
+     out->bitpool =3D in->max_bitpool;
+
+     out->allocation =3D in->allocation_method =3D=3D SBC_ALLOCATION_SN=
R ?
quoted
+                             SBC_AM_SNR : SBC_AM_LOUDNESS;
+
+     switch (in->block_length) {
+     case SBC_BLOCK_LENGTH_4:
+             out->blocks =3D SBC_BLK_4;
+             break;
+     case SBC_BLOCK_LENGTH_8:
+             out->blocks =3D SBC_BLK_8;
+             break;
+     case SBC_BLOCK_LENGTH_12:
+             out->blocks =3D SBC_BLK_12;
+             break;
+     case SBC_BLOCK_LENGTH_16:
+             out->blocks =3D SBC_BLK_16;
+             break;
+     }
aren=92t the values all the same? This looks pretty complicated for somet=
hing that should be dead simple. Does Android really had to duplicate every=
 single definition with the same prefix?

Actually symbols for 'in' come from a2dp-codecs.h and 'out' from sbc.h
;-) And they have different values since A2DP uses shifted-bit values
while sbc.h are just ordinal values so cannot assign them directly.


BR,
Andrzej
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help