/* mixer_hw.c
**
** Copyright (c) 2019, The Linux Foundation. All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above
**     copyright notice, this list of conditions and the following
**     disclaimer in the documentation and/or other materials provided
**     with the distribution.
**   * Neither the name of The Linux Foundation nor the names of its
**     contributors may be used to endorse or promote products derived
**     from this software without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
** ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
** BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
** OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
** IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**/

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <ctype.h>
#include <poll.h>

#include <sys/ioctl.h>

#include <linux/ioctl.h>
#include <sound/asound.h>

#include "mixer_io.h"

struct mixer_hw_data {
    unsigned int card;
    int fd;
};

static void mixer_hw_close(void *data)
{
    struct mixer_hw_data *hw_data = data;

    if (!hw_data)
        return;

    if (hw_data->fd >= 0)
        close(hw_data->fd);

    hw_data->fd = -1;
    free(hw_data);
    hw_data = NULL;
}

static int mixer_hw_ioctl(void *data, unsigned int cmd, ...)
{
    struct mixer_hw_data *hw_data = data;
    va_list ap;
    void *arg;

    va_start(ap, cmd);
    arg = va_arg(ap, void *);
    va_end(ap);

    return ioctl(hw_data->fd, cmd, arg);
}

static ssize_t mixer_hw_read_event(void *data, struct snd_ctl_event *ev,
                                   size_t size)
{
    struct mixer_hw_data *hw_data = data;

    return read(hw_data->fd, ev, size);
}

static struct mixer_ops mixer_hw_ops = {
    .close = mixer_hw_close,
    .get_poll_fd = NULL,
    .read_event = mixer_hw_read_event,
    .ioctl = mixer_hw_ioctl,
};

int mixer_hw_open(unsigned int card, void **data,
                  struct mixer_ops **ops)
{
    struct mixer_hw_data *hw_data;
    int fd;
    char fn[256];

    snprintf(fn, sizeof(fn), "/dev/snd/controlC%u", card);
    fd = open(fn, O_RDWR);
    if (fd < 0)
        return fd;

    hw_data = calloc(1, sizeof(*hw_data));
    if (!hw_data) {
        close(fd);
        return -1;
    }

    hw_data->card = card;
    hw_data->fd = fd;
    *data = hw_data;
    *ops = &mixer_hw_ops;

    return fd;
}
