Skip to content
This repository has been archived by the owner on Jan 25, 2021. It is now read-only.

Commit

Permalink
Make extra A2DP codecs optional at build stage
Browse files Browse the repository at this point in the history
  • Loading branch information
EHfive committed Feb 28, 2019
1 parent ee1b008 commit 2f3a7b2
Show file tree
Hide file tree
Showing 6 changed files with 197 additions and 110 deletions.
60 changes: 47 additions & 13 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_C_FLAGS "$ENV{CFLAGS} -O2 -Wall -Wno-builtin-macro-redefined -Wno-unused -fno-common -DFASTPATH")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__FILE__='\"$(subst ${CMAKE_SOURCE_DIR}/src/,,$(abspath $<))\"'")

option(CODEC_AAC_FDK "LC-AAC support using fdk-aac(-free)" ON)
option(CODEC_APTX_FF "aptX Classic support using FFmpeg" ON)
option(CODEC_APTX_HD_FF "aptX HD support using FFmpeg" ON)
option(CODEC_LDAC "LDAC encoding, abr support using libldac" ON)
option(FORCE_LARGEST_PA_VERSION "Build for largest available version( <= PulseAudio git master) of PulseAudio" OFF)


Expand All @@ -36,16 +40,53 @@ find_package(PkgConfig REQUIRED)
pkg_check_modules(PulseAudio REQUIRED "libpulse")
pkg_check_modules(DBUS REQUIRED "dbus-1")
pkg_check_modules(SBC REQUIRED "sbc")
pkg_check_modules(AVCODEC REQUIRED libavcodec>=58.18.100)
pkg_check_modules(AVUTIL REQUIRED libavutil>=56.14.100)
pkg_check_modules(FDKAAC REQUIRED "fdk-aac>=0.1.5")
pkg_check_modules(LDACENC REQUIRED "ldacBT-enc")
pkg_check_modules(LDACABR REQUIRED "ldacBT-abr")
pkg_check_modules(AVCODEC libavcodec>=58.18.100)
pkg_check_modules(AVUTIL libavutil>=56.14.100)
pkg_check_modules(FDKAAC "fdk-aac>=0.1.5")
pkg_check_modules(LDACENC "ldacBT-enc")
pkg_check_modules(LDACABR "ldacBT-abr")

set(LDAC_INCLUDE_DIRS ${LDACENC_INCLUDE_DIRS} ${LDACABR_INCLUDE_DIRS})
set(PulseAudio_CORE_LIBDIR ${PulseAudio_LIBDIR}/pulseaudio)
set(MOD_BT_DIR ${PROJECT_SOURCE_DIR}/src/modules/bluetooth)

set(bluez5_util_SOURCES
${MOD_BT_DIR}/backend-native.c
${MOD_BT_DIR}/backend-ofono.c
${MOD_BT_DIR}/bluez5-util.c
${MOD_BT_DIR}/a2dp/a2dp_sbc.c
${MOD_BT_DIR}/a2dp/a2dp_util.c
)

if(${AVCODEC_FOUND} AND ${AVUTIL_FOUND})
if(${CODEC_APTX_FF} STREQUAL "ON")
set(PA_A2DP_CODEC_APTX_FF 1)
message("[A2DP] FFmpeg aptX support enabled")
endif()
if(${CODEC_APTX_HD_FF} STREQUAL "ON")
set(PA_A2DP_CODEC_APTX_HD_FF 1)
message("[A2DP] FFmpeg aptX HD support enabled")
endif()

if ("${PA_A2DP_CODEC_APTX_FF}" OR "${PA_A2DP_CODEC_APTX_HD_FF}")
set(bluez5_util_SOURCES ${bluez5_util_SOURCES} ${MOD_BT_DIR}/a2dp/a2dp_aptx.c)
endif ()
endif()
if (${FDKAAC_FOUND})
if(${CODEC_AAC_FDK} STREQUAL "ON")
set(PA_A2DP_CODEC_AAC_FDK 1)
set(bluez5_util_SOURCES ${bluez5_util_SOURCES} ${MOD_BT_DIR}/a2dp/a2dp_aac.c)
message("[A2DP] fdk-aac LC-AAC support enabled")
endif()
endif()
if (${LDACENC_FOUND} AND ${LDACABR_FOUND})
if(${CODEC_LDAC} STREQUAL "ON")
set(PA_A2DP_CODEC_LDAC 1)
set(bluez5_util_SOURCES ${bluez5_util_SOURCES} ${MOD_BT_DIR}/a2dp/a2dp_ldac.c)
message("[A2DP] LDAC support enabled")
endif()
endif ()

include_directories(.)
include_directories(pa/src)
include_directories(${MOD_BT_DIR})
Expand Down Expand Up @@ -98,14 +139,7 @@ set(CMAKE_INSTALL_RPATH ${PulseAudio_CORE_LIBDIR}:${PulseAudio_modlibexecdir})

# libbluez5-util
add_library(bluez5-util SHARED
${MOD_BT_DIR}/backend-native.c
${MOD_BT_DIR}/backend-ofono.c
${MOD_BT_DIR}/bluez5-util.c
${MOD_BT_DIR}/a2dp/a2dp_sbc.c
${MOD_BT_DIR}/a2dp/a2dp_aac.c
${MOD_BT_DIR}/a2dp/a2dp_aptx.c
${MOD_BT_DIR}/a2dp/a2dp_ldac.c
${MOD_BT_DIR}/a2dp/a2dp_util.c
${bluez5_util_SOURCES}
)
target_link_libraries(bluez5-util dl ${SBC_LIBRARIES} ${FDKAAC_LIBRARIES} ${DBUS_LIBRARIES} ${MOD_LIBS})

Expand Down
5 changes: 5 additions & 0 deletions config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,9 @@
#define HAVE_BLUEZ_5_NATIVE_HEADSET
#define PACKAGE_VERSION "@PulseAudio_VERSION@"

#cmakedefine PA_A2DP_CODEC_APTX_FF
#cmakedefine PA_A2DP_CODEC_APTX_HD_FF
#cmakedefine PA_A2DP_CODEC_AAC_FDK
#cmakedefine PA_A2DP_CODEC_LDAC

#include <sys/socket.h>
61 changes: 60 additions & 1 deletion src/modules/bluetooth/a2dp/a2dp-api.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,30 @@ extern const pa_a2dp_codec_t pa_a2dp_aptx;
extern const pa_a2dp_codec_t pa_a2dp_aptx_hd;
extern const pa_a2dp_codec_t pa_a2dp_ldac;

#define PTR_PA_A2DP_SBC (&pa_a2dp_sbc)
#ifdef PA_A2DP_CODEC_AAC_FDK
#define PTR_PA_A2DP_AAC (&pa_a2dp_aac)
#else
#define PTR_PA_A2DP_AAC (NULL)
#endif

#ifdef PA_A2DP_CODEC_APTX_FF
#define PTR_PA_A2DP_APTX (&pa_a2dp_aptx)
#else
#define PTR_PA_A2DP_APTX (NULL)
#endif

#ifdef PA_A2DP_CODEC_APTX_HD_FF
#define PTR_PA_A2DP_APTX_HD (&pa_a2dp_aptx_hd)
#else
#define PTR_PA_A2DP_APTX_HD (NULL)
#endif

#ifdef PA_A2DP_CODEC_LDAC
#define PTR_PA_A2DP_LDAC (&pa_a2dp_ldac)
#else
#define PTR_PA_A2DP_LDAC (NULL)
#endif

/* Implement in module-bluez5-device.c, run from <pa_a2dp_sink_t>.encode */

Expand All @@ -54,18 +78,53 @@ typedef void (*pa_a2dp_source_read_buf_free_cb_t)(const void **read_buf, void *d
typedef enum pa_a2dp_codec_index {
PA_A2DP_SINK_MIN,
PA_A2DP_SINK_SBC,
#ifdef PA_A2DP_CODEC_AAC_FDK
PA_A2DP_SINK_AAC,
#endif
#ifdef PA_A2DP_CODEC_APTX_FF
PA_A2DP_SINK_APTX,
#endif
#ifdef PA_A2DP_CODEC_APTX_HD_FF
PA_A2DP_SINK_APTX_HD,
#endif
PA_A2DP_SINK_MAX,
PA_A2DP_SOURCE_MIN = PA_A2DP_SINK_MAX,
PA_A2DP_SOURCE_SBC,
#ifdef PA_A2DP_CODEC_AAC_FDK
PA_A2DP_SOURCE_AAC,
#endif
#ifdef PA_A2DP_CODEC_APTX_FF
PA_A2DP_SOURCE_APTX,
#endif
#ifdef PA_A2DP_CODEC_APTX_HD_FF
PA_A2DP_SOURCE_APTX_HD,
#endif
#ifdef PA_A2DP_CODEC_LDAC
PA_A2DP_SOURCE_LDAC,
#endif
PA_A2DP_SOURCE_MAX,
PA_A2DP_CODEC_INDEX_UNAVAILABLE
PA_A2DP_CODEC_INDEX_UNAVAILABLE,
#ifndef PA_A2DP_CODEC_AAC_FDK
PA_A2DP_SINK_AAC = PA_A2DP_CODEC_INDEX_UNAVAILABLE,
#endif
#ifndef PA_A2DP_CODEC_APTX_FF
PA_A2DP_SINK_APTX = PA_A2DP_CODEC_INDEX_UNAVAILABLE,
#endif
#ifndef PA_A2DP_CODEC_APTX_HD_FF
PA_A2DP_SINK_APTX_HD = PA_A2DP_CODEC_INDEX_UNAVAILABLE,
#endif
#ifndef PA_A2DP_CODEC_AAC_FDK
PA_A2DP_SOURCE_AAC = PA_A2DP_CODEC_INDEX_UNAVAILABLE,
#endif
#ifndef PA_A2DP_CODEC_APTX_FF
PA_A2DP_SOURCE_APTX = PA_A2DP_CODEC_INDEX_UNAVAILABLE,
#endif
#ifndef PA_A2DP_CODEC_APTX_HD_FF
PA_A2DP_SOURCE_APTX_HD = PA_A2DP_CODEC_INDEX_UNAVAILABLE,
#endif
#ifndef PA_A2DP_CODEC_LDAC
PA_A2DP_SOURCE_LDAC = PA_A2DP_CODEC_INDEX_UNAVAILABLE,
#endif
} pa_a2dp_codec_index_t;

typedef struct pa_a2dp_sink {
Expand Down
100 changes: 41 additions & 59 deletions src/modules/bluetooth/a2dp/a2dp_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -211,37 +211,28 @@ void pa_a2dp_get_ordered_indices(pa_hashmap **ordered_indices, pa_a2dp_config_t


void pa_a2dp_codec_index_to_endpoint(pa_a2dp_codec_index_t codec_index, const char **endpoint) {
switch (codec_index) {
case PA_A2DP_SINK_SBC:
*endpoint = A2DP_SBC_SNK_ENDPOINT;
break;
case PA_A2DP_SOURCE_SBC:
*endpoint = A2DP_SBC_SRC_ENDPOINT;
break;
case PA_A2DP_SINK_AAC:
*endpoint = A2DP_AAC_SNK_ENDPOINT;
break;
case PA_A2DP_SOURCE_AAC:
*endpoint = A2DP_AAC_SRC_ENDPOINT;
break;
case PA_A2DP_SINK_APTX:
*endpoint = A2DP_APTX_SNK_ENDPOINT;
break;
case PA_A2DP_SOURCE_APTX:
*endpoint = A2DP_APTX_SRC_ENDPOINT;
break;
case PA_A2DP_SINK_APTX_HD:
*endpoint = A2DP_APTX_HD_SNK_ENDPOINT;
break;
case PA_A2DP_SOURCE_APTX_HD:
*endpoint = A2DP_APTX_HD_SRC_ENDPOINT;
break;
case PA_A2DP_SOURCE_LDAC:
*endpoint = A2DP_LDAC_SRC_ENDPOINT;
break;
default:
*endpoint = NULL;
}
if(codec_index == PA_A2DP_CODEC_INDEX_UNAVAILABLE)
*endpoint = NULL;
else if(codec_index == PA_A2DP_SINK_SBC)
*endpoint = A2DP_SBC_SNK_ENDPOINT;
else if(codec_index == PA_A2DP_SOURCE_SBC)
*endpoint = A2DP_SBC_SRC_ENDPOINT;
else if(codec_index == PA_A2DP_SINK_AAC)
*endpoint = A2DP_AAC_SNK_ENDPOINT;
else if(codec_index == PA_A2DP_SOURCE_AAC)
*endpoint = A2DP_AAC_SRC_ENDPOINT;
else if(codec_index == PA_A2DP_SINK_APTX)
*endpoint = A2DP_APTX_SNK_ENDPOINT;
else if(codec_index == PA_A2DP_SOURCE_APTX)
*endpoint = A2DP_APTX_SRC_ENDPOINT;
else if(codec_index == PA_A2DP_SINK_APTX_HD)
*endpoint = A2DP_APTX_HD_SNK_ENDPOINT;
else if(codec_index == PA_A2DP_SOURCE_APTX_HD)
*endpoint = A2DP_APTX_HD_SRC_ENDPOINT;
else if(codec_index == PA_A2DP_SOURCE_LDAC)
*endpoint = A2DP_LDAC_SRC_ENDPOINT;
else
pa_assert_not_reached();
};

void pa_a2dp_endpoint_to_codec_index(const char *endpoint, pa_a2dp_codec_index_t *codec_index) {
Expand All @@ -268,29 +259,20 @@ void pa_a2dp_endpoint_to_codec_index(const char *endpoint, pa_a2dp_codec_index_t
};

void pa_a2dp_codec_index_to_a2dp_codec(pa_a2dp_codec_index_t codec_index, const pa_a2dp_codec_t **a2dp_codec) {
switch (codec_index) {
case PA_A2DP_SINK_SBC:
case PA_A2DP_SOURCE_SBC:
*a2dp_codec = &pa_a2dp_sbc;
break;
case PA_A2DP_SINK_AAC:
case PA_A2DP_SOURCE_AAC:
*a2dp_codec = &pa_a2dp_aac;
break;
case PA_A2DP_SINK_APTX:
case PA_A2DP_SOURCE_APTX:
*a2dp_codec = &pa_a2dp_aptx;
break;
case PA_A2DP_SINK_APTX_HD:
case PA_A2DP_SOURCE_APTX_HD:
*a2dp_codec = &pa_a2dp_aptx_hd;
break;
case PA_A2DP_SOURCE_LDAC:
*a2dp_codec = &pa_a2dp_ldac;
break;
default:
*a2dp_codec = NULL;
}
if(codec_index == PA_A2DP_CODEC_INDEX_UNAVAILABLE)
*a2dp_codec = NULL;
else if(codec_index == PA_A2DP_SINK_SBC || codec_index == PA_A2DP_SOURCE_SBC)
*a2dp_codec = PTR_PA_A2DP_SBC;
else if(codec_index == PA_A2DP_SINK_AAC || codec_index == PA_A2DP_SOURCE_AAC)
*a2dp_codec = PTR_PA_A2DP_AAC;
else if(codec_index == PA_A2DP_SINK_APTX || codec_index == PA_A2DP_SOURCE_APTX)
*a2dp_codec = PTR_PA_A2DP_APTX;
else if(codec_index == PA_A2DP_SINK_APTX_HD || codec_index == PA_A2DP_SOURCE_APTX_HD)
*a2dp_codec = PTR_PA_A2DP_APTX_HD;
else if(codec_index == PA_A2DP_SOURCE_LDAC)
*a2dp_codec = PTR_PA_A2DP_LDAC;
else
*a2dp_codec = NULL;
};

void pa_a2dp_a2dp_codec_to_codec_index(const pa_a2dp_codec_t *a2dp_codec, bool is_a2dp_sink,
Expand Down Expand Up @@ -334,26 +316,26 @@ void
pa_a2dp_get_a2dp_codec(uint8_t codec, const a2dp_vendor_codec_t *vendor_codec, const pa_a2dp_codec_t **a2dp_codec) {
switch (codec) {
case A2DP_CODEC_SBC:
*a2dp_codec = &pa_a2dp_sbc;
*a2dp_codec = PTR_PA_A2DP_SBC;
return;
case A2DP_CODEC_MPEG24:
*a2dp_codec = &pa_a2dp_aac;
*a2dp_codec = PTR_PA_A2DP_AAC;
return;
case A2DP_CODEC_VENDOR:
if (!vendor_codec) {
*a2dp_codec = NULL;
pa_assert_not_reached();
} else if (A2DP_GET_VENDOR_ID(*vendor_codec) == APTX_VENDOR_ID &&
A2DP_GET_CODEC_ID(*vendor_codec) == APTX_CODEC_ID) {
*a2dp_codec = &pa_a2dp_aptx;
*a2dp_codec = PTR_PA_A2DP_APTX;
return;
} else if (A2DP_GET_VENDOR_ID(*vendor_codec) == APTX_HD_VENDOR_ID &&
A2DP_GET_CODEC_ID(*vendor_codec) == APTX_HD_CODEC_ID) {
*a2dp_codec = &pa_a2dp_aptx_hd;
*a2dp_codec = PTR_PA_A2DP_APTX_HD;
return;
} else if (A2DP_GET_VENDOR_ID(*vendor_codec) == LDAC_VENDOR_ID &&
A2DP_GET_CODEC_ID(*vendor_codec) == LDAC_CODEC_ID) {
*a2dp_codec = &pa_a2dp_ldac;
*a2dp_codec = PTR_PA_A2DP_LDAC;
return;
}
*a2dp_codec = NULL;
Expand Down
44 changes: 22 additions & 22 deletions src/modules/bluetooth/bluez5-util.c
Original file line number Diff line number Diff line change
Expand Up @@ -1598,28 +1598,28 @@ const char *pa_bluetooth_profile_to_string(pa_bluetooth_profile_t profile) {
}

const char *pa_bluetooth_a2dp_profile_to_string(pa_a2dp_codec_index_t codec_index) {
switch(codec_index) {
case PA_A2DP_SINK_SBC:
return "a2dp_source_sbc";
case PA_A2DP_SINK_AAC:
return "a2dp_source_aac";
case PA_A2DP_SINK_APTX:
return "a2dp_source_aptx";
case PA_A2DP_SINK_APTX_HD:
return "a2dp_source_aptx_hd";
case PA_A2DP_SOURCE_SBC:
return "a2dp_sink_sbc";
case PA_A2DP_SOURCE_AAC:
return "a2dp_sink_aac";
case PA_A2DP_SOURCE_APTX:
return "a2dp_sink_aptx";
case PA_A2DP_SOURCE_APTX_HD:
return "a2dp_sink_aptx_hd";
case PA_A2DP_SOURCE_LDAC:
return "a2dp_sink_ldac";
default:
return NULL;
}
if(codec_index == PA_A2DP_CODEC_INDEX_UNAVAILABLE)
return NULL;
else if(codec_index == PA_A2DP_SINK_SBC)
return "a2dp_source_sbc";
else if(codec_index == PA_A2DP_SOURCE_SBC)
return "a2dp_sink_sbc";
else if(codec_index == PA_A2DP_SINK_AAC)
return "a2dp_source_sbc";
else if(codec_index == PA_A2DP_SOURCE_AAC)
return "a2dp_sink_aac";
else if(codec_index == PA_A2DP_SINK_APTX)
return "a2dp_source_aptx";
else if(codec_index == PA_A2DP_SOURCE_APTX)
return "a2dp_sink_aptx";
else if(codec_index == PA_A2DP_SINK_APTX_HD)
return "a2dp_source_aptx_hd";
else if(codec_index == PA_A2DP_SOURCE_APTX_HD)
return "a2dp_sink_aptx_hd";
else if(codec_index == PA_A2DP_SOURCE_LDAC)
return "a2dp_sink_ldac";
else
return NULL;
}

const char *pa_bluetooth_profile_codec_to_string(pa_bluetooth_profile_t profile, const pa_a2dp_codec_t *a2dp_codec) {
Expand Down

0 comments on commit 2f3a7b2

Please sign in to comment.