/* 
 | 
 * BlueALSA - bluealsa.c 
 | 
 * Copyright (c) 2016-2018 Arkadiusz Bokowy 
 | 
 * 
 | 
 * This file is a part of bluez-alsa. 
 | 
 * 
 | 
 * This project is licensed under the terms of the MIT license. 
 | 
 * 
 | 
 */ 
 | 
  
 | 
#include "bluealsa.h" 
 | 
  
 | 
#include <grp.h> 
 | 
  
 | 
#if ENABLE_LDAC 
 | 
# include <ldacBT.h> 
 | 
#endif 
 | 
  
 | 
#include "hfp.h" 
 | 
#include "transport.h" 
 | 
  
 | 
  
 | 
/* Initialize global configuration variable. */ 
 | 
struct ba_config config = { 
 | 
  
 | 
    /* enable output profiles by default */ 
 | 
    .enable.a2dp_source = false, 
 | 
    .enable.a2dp_sink = true, 
 | 
    .enable.hsp_ag = false, 
 | 
    .enable.hfp_ag = false, 
 | 
    .enable.hfp_hf = true, 
 | 
  
 | 
    /* omit chown if audio group is not defined */ 
 | 
    .gid_audio = -1, 
 | 
  
 | 
    /* initialization flags */ 
 | 
    .ctl.socket_created = false, 
 | 
    .ctl.thread_created = false, 
 | 
  
 | 
    .ctl.evt = { -1, -1 }, 
 | 
  
 | 
    .hfp.features_sdp_hf = 
 | 
        SDP_HFP_HF_FEAT_CLI | 
 | 
        SDP_HFP_HF_FEAT_VOLUME, 
 | 
    .hfp.features_sdp_ag = 0, 
 | 
    .hfp.features_rfcomm_hf = 
 | 
        HFP_HF_FEAT_CLI | 
 | 
        HFP_HF_FEAT_VOLUME | 
 | 
        HFP_HF_FEAT_ECS | 
 | 
        HFP_HF_FEAT_ECC | 
 | 
        HFP_HF_FEAT_CODEC, 
 | 
    .hfp.features_rfcomm_ag = 
 | 
        HFP_AG_FEAT_REJECT | 
 | 
        HFP_AG_FEAT_ECS | 
 | 
        HFP_AG_FEAT_ECC | 
 | 
        HFP_AG_FEAT_EERC | 
 | 
        HFP_AG_FEAT_CODEC, 
 | 
  
 | 
    .a2dp.volume = false, 
 | 
    .a2dp.force_mono = false, 
 | 
    .a2dp.force_44100 = false, 
 | 
    .a2dp.keep_alive = 0, 
 | 
  
 | 
#if ENABLE_AAC 
 | 
    /* There are two issues with the afterburner: a) it uses a LOT of power, 
 | 
     * b) it generates larger payload. These two reasons are good enough to 
 | 
     * not enable afterburner by default. */ 
 | 
    .aac_afterburner = false, 
 | 
    .aac_vbr_mode = 4, 
 | 
#endif 
 | 
  
 | 
#if ENABLE_LDAC 
 | 
    .ldac_abr = false, 
 | 
    /* Use standard encoder quality as a reasonable default. */ 
 | 
    .ldac_eqmid = LDACBT_EQMID_SQ, 
 | 
#endif 
 | 
  
 | 
}; 
 | 
  
 | 
int bluealsa_config_init(void) { 
 | 
  
 | 
    struct group *grp; 
 | 
  
 | 
    config.main_thread = pthread_self(); 
 | 
  
 | 
    pthread_mutex_init(&config.devices_mutex, NULL); 
 | 
    config.devices = g_hash_table_new_full(g_str_hash, g_str_equal, 
 | 
            g_free, (GDestroyNotify)device_free); 
 | 
  
 | 
    config.dbus_objects = g_hash_table_new_full(g_direct_hash, g_direct_equal, 
 | 
            NULL, g_free); 
 | 
  
 | 
    /* use proper ACL group for our audio device */ 
 | 
    if ((grp = getgrnam("audio")) != NULL) 
 | 
        config.gid_audio = grp->gr_gid; 
 | 
  
 | 
    config.a2dp.codecs = bluez_a2dp_codecs; 
 | 
  
 | 
    return 0; 
 | 
} 
 | 
  
 | 
void bluealsa_config_free(void) { 
 | 
    pthread_mutex_destroy(&config.devices_mutex); 
 | 
    g_hash_table_unref(config.devices); 
 | 
    g_hash_table_unref(config.dbus_objects); 
 | 
} 
 |