Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1ddb012 authored by Ethan Chen's avatar Ethan Chen Committed by Michael Bestas
Browse files

audio: Extend platform parser to allow device name aliasing

* Supported sections now include device names
* This allows for aliasing device names to a custom name

Change-Id: I880e90a7e887f020517d89ba276199c700c0eeae
parent b5fe896c
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -322,7 +322,7 @@ int pcm_device_table[AUDIO_USECASE_MAX][2] = {
};

/* Array to store sound devices */
static const char * const device_table[SND_DEVICE_MAX] = {
static char * device_table[SND_DEVICE_MAX] = {
    [SND_DEVICE_NONE] = "none",
    /* Playback sound devices */
    [SND_DEVICE_OUT_HANDSET] = "handset",
@@ -4073,6 +4073,7 @@ void platform_get_device_to_be_id_map(int **device_to_be_id, int *length)
     *device_to_be_id = (int*) msm_device_to_be_id;
     *length = msm_be_id_array_len;
}

int platform_set_stream_channel_map(void *platform, audio_channel_mask_t channel_mask, int snd_id)
{
    int ret = 0;
@@ -4711,3 +4712,18 @@ int platform_get_max_mic_count(void *platform) {
    struct platform_data *my_data = (struct platform_data *)platform;
    return my_data->max_mic_count;
}

int platform_set_snd_device_name(snd_device_t device, const char *name)
{
    int ret = 0;

    if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) {
        ALOGE("%s:: Invalid snd_device = %d", __func__, device);
        ret = -EINVAL;
        goto done;
    }

    device_table[device] = strdup(name);
done:
    return ret;
}
+6 −0
Original line number Diff line number Diff line
@@ -1190,3 +1190,9 @@ int platform_get_wsa_mode(void *adev)
{
    return 0;
}

int platform_set_snd_device_name(snd_device_t snd_device __unused,
                                 const char * name __unused)
{
    return -ENOSYS;
}
+17 −1
Original line number Diff line number Diff line
@@ -305,7 +305,7 @@ static int pcm_device_table[AUDIO_USECASE_MAX][2] = {
};

/* Array to store sound devices */
static const char * const device_table[SND_DEVICE_MAX] = {
static char * device_table[SND_DEVICE_MAX] = {
    [SND_DEVICE_NONE] = "none",
    /* Playback sound devices */
    [SND_DEVICE_OUT_HANDSET] = "handset",
@@ -3872,6 +3872,7 @@ void platform_get_device_to_be_id_map(int **device_to_be_id, int *length)
     *device_to_be_id = msm_device_to_be_id;
     *length = msm_be_id_array_len;
}

int platform_set_stream_channel_map(void *platform, audio_channel_mask_t channel_mask, int snd_id)
{
    int ret = 0;
@@ -4472,3 +4473,18 @@ int platform_get_max_mic_count(void *platform) {
    struct platform_data *my_data = (struct platform_data *)platform;
    return my_data->max_mic_count;
}

int platform_set_snd_device_name(snd_device_t device, const char *name)
{
    int ret = 0;

    if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) {
        ALOGE("%s:: Invalid snd_device = %d", __func__, device);
        ret = -EINVAL;
        goto done;
    }

    device_table[device] = strdup(name);
done:
    return ret;
}
+1 −0
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ bool platform_sound_trigger_device_needs_event(snd_device_t snd_device);
bool platform_sound_trigger_usecase_needs_event(audio_usecase_t uc_id);

int platform_set_snd_device_backend(snd_device_t snd_device, const char * backend);
int platform_set_snd_device_name(snd_device_t snd_device, const char * name);

/* From platform_info_parser.c */
int platform_info_init(const char *filename);
+46 −2
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ typedef enum {
    BACKEND_NAME,
    INTERFACE_NAME,
    TZ_NAME,
    DEVICE_NAME,
} section_t;

typedef void (* section_process_fn)(const XML_Char **attr);
@@ -60,6 +61,7 @@ static void process_pcm_id(const XML_Char **attr);
static void process_backend_name(const XML_Char **attr);
static void process_interface_name(const XML_Char **attr);
static void process_tz_name(const XML_Char **attr);
static void process_device_name(const XML_Char **attr);
static void process_root(const XML_Char **attr);

static section_process_fn section_table[] = {
@@ -71,6 +73,7 @@ static section_process_fn section_table[] = {
    [BACKEND_NAME] = process_backend_name,
    [INTERFACE_NAME] = process_interface_name,
    [TZ_NAME] = process_tz_name,
    [DEVICE_NAME] = process_device_name,
};

static section_t section;
@@ -102,6 +105,11 @@ static section_t section;
 * ...
 * ...
 * </tz_names>
 * <device_names>
 * <device name="???" alias="???"/>
 * ...
 * ...
 * </device_names>
 * </audio_platform_info>
 */

@@ -350,6 +358,38 @@ done:
    return;
}

static void process_device_name(const XML_Char **attr)
{
    int index;

    if (strcmp(attr[0], "name") != 0) {
        ALOGE("%s: 'name' not found, no alias set!", __func__);
        goto done;
    }

    index = platform_get_snd_device_index((char *)attr[1]);
    if (index < 0) {
        ALOGE("%s: Device %s in platform info xml not found, no alias set!",
              __func__, attr[1]);
        goto done;
    }

    if (strcmp(attr[2], "alias") != 0) {
        ALOGE("%s: Device %s in platform info xml has no alias, no alias set!",
              __func__, attr[1]);
        goto done;
    }

    if (platform_set_snd_device_name(index, attr[3]) < 0) {
        ALOGE("%s: Device %s, alias %s was not set!",
              __func__, attr[1], attr[3]);
        goto done;
    }

done:
    return;
}

static void start_tag(void *userdata __unused, const XML_Char *tag_name,
                      const XML_Char **attr)
{
@@ -368,10 +408,12 @@ static void start_tag(void *userdata __unused, const XML_Char *tag_name,
        section = TZ_NAME;
    } else if (strcmp(tag_name, "native_configs") == 0) {
        section = NATIVESUPPORT;
    } else if (strcmp(tag_name, "device_names") == 0) {
        section = DEVICE_NAME;
    } else if (strcmp(tag_name, "device") == 0) {
        if ((section != ACDB) && (section != BACKEND_NAME) && (section != BITWIDTH) &&
            (section != INTERFACE_NAME) && (section != TZ_NAME)) {
            ALOGE("device tag only supported for acdb/backend names/bitwitdh/interface/tz names");
            (section != INTERFACE_NAME) && (section != TZ_NAME) && (section != DEVICE_NAME)) {
            ALOGE("device tag only supported for acdb/backend names/bitwitdh/interface/tz names/device names");
            return;
        }

@@ -413,6 +455,8 @@ static void end_tag(void *userdata __unused, const XML_Char *tag_name)
        section = ROOT;
    } else if (strcmp(tag_name, "native_configs") == 0) {
        section = ROOT;
    } else if (strcmp(tag_name, "device_names") == 0) {
        section = ROOT;
    }
}