OSDN Git Service

Added mode argument to open functions where it was missing. First part of CTL documen...
[android-x86/external-alsa-lib.git] / aserver / aserver.c
index d6dd0c3..e46cc5d 100644 (file)
 #include <sys/un.h>
 #include <sys/uio.h>
 #include <stdio.h>
-#include <errno.h>
 #include <unistd.h>
 #include <fcntl.h>
-#include <assert.h>
 #include <stddef.h>
 #include <getopt.h>
 #include <netinet/in.h>
 #include <netdb.h>
 #include <limits.h>
 
-#include "asoundlib.h"
 #include "aserver.h"
 #include "list.h"
 
@@ -275,11 +272,11 @@ int pcm_shm_open(client_t *client, int *cookie)
        snd_pcm_t *pcm;
        int err;
        int result;
-       err = snd_pcm_open(&pcm, client->name, client->stream, SND_PCM_NONBLOCK);
+       err = snd_pcm_open(&pcm, client->name, snd_int_to_enum(client->stream), SND_PCM_NONBLOCK);
        if (err < 0)
                return err;
        client->device.pcm.handle = pcm;
-       client->device.pcm.fd = snd_pcm_poll_descriptor(pcm);
+       client->device.pcm.fd = _snd_pcm_poll_descriptor(pcm);
 
        shmid = shmget(IPC_PRIVATE, PCM_SHM_SIZE, 0666);
        if (shmid < 0) {
@@ -373,78 +370,78 @@ int pcm_shm_cmd(client_t *client)
        ctrl->cmd = 0;
        pcm = client->device.pcm.handle;
        switch (cmd) {
-       case SND_PCM_IOCTL_CARD:
-               ctrl->result = snd_pcm_card(pcm);
-               break;
        case SND_PCM_IOCTL_ASYNC:
                ctrl->result = snd_pcm_async(pcm, ctrl->u.async.sig, ctrl->u.async.pid);
                break;
-       case SND_PCM_IOCTL_INFO:
+       case SNDRV_PCM_IOCTL_INFO:
                ctrl->result = snd_pcm_info(pcm, (snd_pcm_info_t *) &ctrl->u.info);
                break;
-       case SND_PCM_IOCTL_HW_REFINE:
+       case SNDRV_PCM_IOCTL_HW_REFINE:
                ctrl->result = snd_pcm_hw_refine(pcm, (snd_pcm_hw_params_t *) &ctrl->u.hw_refine);
                break;
-       case SND_PCM_IOCTL_HW_PARAMS:
+       case SNDRV_PCM_IOCTL_HW_PARAMS:
                ctrl->result = snd_pcm_hw_params(pcm, (snd_pcm_hw_params_t *) &ctrl->u.hw_params);
                break;
-       case SND_PCM_IOCTL_SW_PARAMS:
+       case SNDRV_PCM_IOCTL_HW_FREE:
+               ctrl->result = snd_pcm_hw_free(pcm);
+               break;
+       case SNDRV_PCM_IOCTL_SW_PARAMS:
                ctrl->result = snd_pcm_sw_params(pcm, (snd_pcm_sw_params_t *) &ctrl->u.sw_params);
                break;
-       case SND_PCM_IOCTL_STATUS:
+       case SNDRV_PCM_IOCTL_STATUS:
                ctrl->result = snd_pcm_status(pcm, (snd_pcm_status_t *) &ctrl->u.status);
                break;
        case SND_PCM_IOCTL_STATE:
-               ctrl->result = snd_pcm_state(pcm);
+               ctrl->result = snd_enum_to_int(snd_pcm_state(pcm));
                break;
-       case SND_PCM_IOCTL_DELAY:
-               ctrl->result = snd_pcm_delay(pcm, (ssize_t *) &ctrl->u.delay.frames);
+       case SNDRV_PCM_IOCTL_DELAY:
+               ctrl->result = snd_pcm_delay(pcm, (snd_pcm_sframes_t *) &ctrl->u.delay.frames);
                break;
        case SND_PCM_IOCTL_AVAIL_UPDATE:
                ctrl->result = snd_pcm_avail_update(pcm);
                ctrl->hw_ptr = *pcm->hw_ptr;
                break;
-       case SND_PCM_IOCTL_PREPARE:
+       case SNDRV_PCM_IOCTL_PREPARE:
                ctrl->result = snd_pcm_prepare(pcm);
                ctrl->appl_ptr = *pcm->appl_ptr;
                ctrl->hw_ptr = *pcm->hw_ptr;
                break;
-       case SND_PCM_IOCTL_RESET:
+       case SNDRV_PCM_IOCTL_RESET:
                ctrl->result = snd_pcm_reset(pcm);
                ctrl->appl_ptr = *pcm->appl_ptr;
                ctrl->hw_ptr = *pcm->hw_ptr;
                break;
-       case SND_PCM_IOCTL_START:
+       case SNDRV_PCM_IOCTL_START:
                ctrl->result = snd_pcm_start(pcm);
                ctrl->appl_ptr = *pcm->appl_ptr;
                ctrl->hw_ptr = *pcm->hw_ptr;
                break;
-       case SND_PCM_IOCTL_DRAIN:
+       case SNDRV_PCM_IOCTL_DRAIN:
                ctrl->result = snd_pcm_drain(pcm);
                break;
-       case SND_PCM_IOCTL_DROP:
+       case SNDRV_PCM_IOCTL_DROP:
                ctrl->result = snd_pcm_drop(pcm);
                break;
-       case SND_PCM_IOCTL_PAUSE:
+       case SNDRV_PCM_IOCTL_PAUSE:
                ctrl->result = snd_pcm_pause(pcm, ctrl->u.pause.enable);
                break;
-       case SND_PCM_IOCTL_CHANNEL_INFO:
+       case SNDRV_PCM_IOCTL_CHANNEL_INFO:
                ctrl->result = snd_pcm_channel_info(pcm, (snd_pcm_channel_info_t *) &ctrl->u.channel_info);
                if (ctrl->result >= 0 &&
                    ctrl->u.channel_info.type == SND_PCM_AREA_MMAP)
                        return shm_ack_fd(client, ctrl->u.channel_info.u.mmap.fd);
                break;
-       case SND_PCM_IOCTL_REWIND:
+       case SNDRV_PCM_IOCTL_REWIND:
                ctrl->result = snd_pcm_rewind(pcm, ctrl->u.rewind.frames);
                ctrl->appl_ptr = *pcm->appl_ptr;
                break;
-       case SND_PCM_IOCTL_LINK:
+       case SNDRV_PCM_IOCTL_LINK:
        {
                /* FIXME */
                ctrl->result = -ENOSYS;
                break;
        }
-       case SND_PCM_IOCTL_UNLINK:
+       case SNDRV_PCM_IOCTL_UNLINK:
                ctrl->result = snd_pcm_unlink(pcm);
                break;
        case SND_PCM_IOCTL_MMAP:
@@ -462,7 +459,7 @@ int pcm_shm_cmd(client_t *client)
                break;
        case SND_PCM_IOCTL_POLL_DESCRIPTOR:
                ctrl->result = 0;
-               return shm_ack_fd(client, snd_pcm_poll_descriptor(pcm));
+               return shm_ack_fd(client, _snd_pcm_poll_descriptor(pcm));
        case SND_PCM_IOCTL_CLOSE:
                client->ops->close(client);
                break;
@@ -502,11 +499,11 @@ int ctl_shm_open(client_t *client, int *cookie)
        snd_ctl_t *ctl;
        int err;
        int result;
-       err = snd_ctl_open(&ctl, client->name);
+       err = snd_ctl_open(&ctl, client->name, SND_CTL_NONBLOCK);
        if (err < 0)
                return err;
        client->device.control.handle = ctl;
-       client->device.control.fd = snd_ctl_poll_descriptor(ctl);
+       client->device.control.fd = _snd_ctl_poll_descriptor(ctl);
 
        shmid = shmget(IPC_PRIVATE, CTL_SHM_SIZE, 0666);
        if (shmid < 0) {
@@ -558,8 +555,6 @@ int ctl_shm_close(client_t *client)
        return 0;
 }
 
-extern int snd_ctl_read1(snd_ctl_t *ctl, snd_ctl_event_t *event);
-
 int ctl_shm_cmd(client_t *client)
 {
        snd_ctl_shm_ctrl_t *ctrl = client->transport.shm.ctrl;
@@ -574,65 +569,68 @@ int ctl_shm_cmd(client_t *client)
        ctrl->cmd = 0;
        ctl = client->device.control.handle;
        switch (cmd) {
-       case SND_CTL_IOCTL_HW_INFO:
-               ctrl->result = snd_ctl_hw_info(ctl, &ctrl->u.hw_info);
+       case SND_CTL_IOCTL_ASYNC:
+               ctrl->result = snd_ctl_async(ctl, ctrl->u.async.sig, ctrl->u.async.pid);
+               break;
+       case SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS:
+               ctrl->result = snd_ctl_subscribe_events(ctl, ctrl->u.subscribe_events);
                break;
-       case SND_CTL_IOCTL_CONTROL_LIST:
+       case SNDRV_CTL_IOCTL_CARD_INFO:
+               ctrl->result = snd_ctl_card_info(ctl, &ctrl->u.card_info);
+               break;
+       case SNDRV_CTL_IOCTL_ELEM_LIST:
        {
                size_t maxsize = CTL_SHM_DATA_MAXLEN;
-               if (ctrl->u.clist.controls_request * sizeof(*ctrl->u.clist.pids) > maxsize) {
+               if (ctrl->u.element_list.space * sizeof(*ctrl->u.element_list.pids) > maxsize) {
                        ctrl->result = -EFAULT;
                        break;
                }
-               ctrl->u.clist.pids = (snd_control_id_t*) ctrl->data;
-               ctrl->result = snd_ctl_clist(ctl, &ctrl->u.clist);
+               ctrl->u.element_list.pids = (snd_ctl_elem_id_t*) ctrl->data;
+               ctrl->result = snd_ctl_elem_list(ctl, &ctrl->u.element_list);
                break;
        }
-       case SND_CTL_IOCTL_CONTROL_INFO:
-               ctrl->result = snd_ctl_cinfo(ctl, &ctrl->u.cinfo);
+       case SNDRV_CTL_IOCTL_ELEM_INFO:
+               ctrl->result = snd_ctl_elem_info(ctl, &ctrl->u.element_info);
                break;
-       case SND_CTL_IOCTL_CONTROL_READ:
-               ctrl->result = snd_ctl_cread(ctl, &ctrl->u.cread);
+       case SNDRV_CTL_IOCTL_ELEM_READ:
+               ctrl->result = snd_ctl_elem_read(ctl, &ctrl->u.element_read);
                break;
-       case SND_CTL_IOCTL_CONTROL_WRITE:
-               ctrl->result = snd_ctl_cwrite(ctl, &ctrl->u.cwrite);
+       case SNDRV_CTL_IOCTL_ELEM_WRITE:
+               ctrl->result = snd_ctl_elem_write(ctl, &ctrl->u.element_write);
                break;
-       case SND_CTL_IOCTL_HWDEP_NEXT_DEVICE:
+       case SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE:
                ctrl->result = snd_ctl_hwdep_next_device(ctl, &ctrl->u.device);
                break;
-       case SND_CTL_IOCTL_HWDEP_INFO:
+       case SNDRV_CTL_IOCTL_HWDEP_INFO:
                ctrl->result = snd_ctl_hwdep_info(ctl, &ctrl->u.hwdep_info);
                break;
-       case SND_CTL_IOCTL_PCM_NEXT_DEVICE:
+       case SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE:
                ctrl->result = snd_ctl_pcm_next_device(ctl, &ctrl->u.device);
                break;
-       case SND_CTL_IOCTL_PCM_INFO:
+       case SNDRV_CTL_IOCTL_PCM_INFO:
                ctrl->result = snd_ctl_pcm_info(ctl, &ctrl->u.pcm_info);
                break;
-       case SND_CTL_IOCTL_PCM_PREFER_SUBDEVICE:
+       case SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE:
                ctrl->result = snd_ctl_pcm_prefer_subdevice(ctl, ctrl->u.pcm_prefer_subdevice);
                break;
-       case SND_CTL_IOCTL_RAWMIDI_NEXT_DEVICE:
+       case SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE:
                ctrl->result = snd_ctl_rawmidi_next_device(ctl, &ctrl->u.device);
                break;
-       case SND_CTL_IOCTL_RAWMIDI_INFO:
+       case SNDRV_CTL_IOCTL_RAWMIDI_INFO:
                ctrl->result = snd_ctl_rawmidi_info(ctl, &ctrl->u.rawmidi_info);
                break;
-       case SND_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE:
+       case SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE:
                ctrl->result = snd_ctl_rawmidi_prefer_subdevice(ctl, ctrl->u.rawmidi_prefer_subdevice);
                break;
        case SND_CTL_IOCTL_READ:
-               ctrl->result = snd_ctl_read1(ctl, &ctrl->u.read);
+               ctrl->result = snd_ctl_read(ctl, &ctrl->u.read);
                break;
        case SND_CTL_IOCTL_CLOSE:
                client->ops->close(client);
                break;
-       case SND_CTL_IOCTL_CARD:
-               ctrl->result = snd_ctl_card(ctl);
-               break;
        case SND_CTL_IOCTL_POLL_DESCRIPTOR:
                ctrl->result = 0;
-               return shm_ack_fd(client, snd_ctl_poll_descriptor(ctl));
+               return shm_ack_fd(client, _snd_ctl_poll_descriptor(ctl));
        default:
                ERROR("Bogus cmd: %x", ctrl->cmd);
                ctrl->result = -ENOSYS;
@@ -841,7 +839,7 @@ int inet_handler(waiter_t *waiter, unsigned short events ATTRIBUTE_UNUSED)
        return 0;
 }
 
-int server(char *sockname, int port)
+int server(const char *sockname, int port)
 {
        int err;
        unsigned int k;
@@ -942,9 +940,9 @@ int main(int argc, char **argv)
        };
        int c;
        snd_config_t *conf;
-       snd_config_iterator_t i;
-       char *socket = NULL;
-       char *host = NULL;
+       snd_config_iterator_t i, next;
+       const char *socket = NULL;
+       const char *host = NULL;
        long port = -1;
        int err;
        char *srvname;
@@ -970,40 +968,45 @@ int main(int argc, char **argv)
                return 1;
        }
        srvname = argv[optind];
-       err = snd_config_searchv(snd_config, &conf, "server", srvname, 0);
+       err = snd_config_search_alias(snd_config, "server", srvname, &conf);
        if (err < 0) {
                ERROR("Missing definition for server %s", srvname);
                return 1;
        }
-       snd_config_foreach(i, conf) {
-               snd_config_t *n = snd_config_entry(i);
-               if (strcmp(n->id, "comment") == 0)
+       if (snd_config_get_type(conf) != SND_CONFIG_TYPE_COMPOUND) {
+               SNDERR("Invalid type for server %s definition", srvname);
+               return -EINVAL;
+       }
+       snd_config_for_each(i, next, conf) {
+               snd_config_t *n = snd_config_iterator_entry(i);
+               const char *id = snd_config_get_id(n);
+               if (strcmp(id, "comment") == 0)
                        continue;
-               if (strcmp(n->id, "host") == 0) {
-                       err = snd_config_string_get(n, &host);
+               if (strcmp(id, "host") == 0) {
+                       err = snd_config_get_string(n, &host);
                        if (err < 0) {
-                               ERROR("Invalid type for %s", n->id);
+                               ERROR("Invalid type for %s", id);
                                return 1;
                        }
                        continue;
                }
-               if (strcmp(n->id, "socket") == 0) {
-                       err = snd_config_string_get(n, &socket);
+               if (strcmp(id, "socket") == 0) {
+                       err = snd_config_get_string(n, &socket);
                        if (err < 0) {
-                               ERROR("Invalid type for %s", n->id);
+                               ERROR("Invalid type for %s", id);
                                return 1;
                        }
                        continue;
                }
-               if (strcmp(n->id, "port") == 0) {
-                       err = snd_config_integer_get(n, &port);
+               if (strcmp(id, "port") == 0) {
+                       err = snd_config_get_integer(n, &port);
                        if (err < 0) {
-                               ERROR("Invalid type for %s", n->id);
+                               ERROR("Invalid type for %s", id);
                                return 1;
                        }
                        continue;
                }
-               ERROR("Unknown field %s", n->id);
+               ERROR("Unknown field %s", id);
                return 1;
        }
        if (!host) {