--- android/hal-audio-aptx.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/android/hal-audio-aptx.c b/android/hal-audio-aptx.c index 4099c07..6954c91 100644 --- a/android/hal-audio-aptx.c +++ b/android/hal-audio-aptx.c @@ -170,7 +170,15 @@ static bool aptx_codec_init(struct audio_preset *preset, uint16_t payload_len, memcpy(&aptx_data->aptx, preset->data, preset->len); - /* TODO: initialize encoder */ + aptx_data->enc = calloc(1, aptx_sizeof); + if (!aptx_data->enc) { + error("APTX: failed to create encoder"); + free(aptx_data); + return false; + } + + /* 1 = big-endian, this is what devices are using */ + aptx_init(aptx_data->enc, 1); *codec_data = aptx_data; @@ -215,9 +223,30 @@ static ssize_t aptx_encode_mediapacket(void *codec_data, const uint8_t *buffer, size_t len, struct media_packet *mp, size_t mp_data_len, size_t *written) { - /* TODO: add encoding */ + struct aptx_data *aptx_data = (struct aptx_data *) codec_data; + const int16_t *ptr = (const void *) buffer; + size_t bytes_in = 0; + size_t bytes_out = 0; + + while ((len - bytes_in) >= 16 && (mp_data_len - bytes_out) >= 4) { + int pcm_l[4], pcm_r[4]; + int i; + + for (i = 0; i < 4; i++) { + pcm_l[i] = ptr[0]; + pcm_r[i] = ptr[1]; + ptr += 2; + } + + aptx_encode(aptx_data->enc, pcm_l, pcm_r, &mp->data[bytes_out]); + + bytes_in += 16; + bytes_out += 4; + } + + *written = bytes_out; - return len; + return bytes_in; } static const struct audio_codec codec = { -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html