static long snd_pcm_shm_action_fd(snd_pcm_t *pcm, int *fd) { snd_pcm_shm_t *shm = pcm->private_data; int err; char buf[1]; volatile snd_pcm_shm_ctrl_t *ctrl = shm->ctrl; if (ctrl->hw.changed || ctrl->appl.changed) return -EBADFD; err = write(shm->socket, buf, 1); if (err != 1) return -EBADFD; err = snd_receive_fd(shm->socket, buf, 1, fd); if (err != 1) return -EBADFD; if (ctrl->cmd) { SNDERR("Server has not done the cmd"); return -EBADFD; } if (ctrl->hw.changed) { err = snd_pcm_shm_new_rbptr(pcm, shm, &pcm->hw, &ctrl->hw); if (err < 0) return err; ctrl->hw.changed = 0; } if (ctrl->appl.changed) { err = snd_pcm_shm_new_rbptr(pcm, shm, &pcm->appl, &ctrl->appl); if (err < 0) return err; ctrl->appl.changed = 0; } return ctrl->result; }
static int snd_ctl_shm_action_fd(snd_ctl_t *ctl, int *fd) { snd_ctl_shm_t *shm = ctl->private_data; int err; char buf[1]; volatile snd_ctl_shm_ctrl_t *ctrl = shm->ctrl; err = write(shm->socket, buf, 1); if (err != 1) return -EBADFD; err = snd_receive_fd(shm->socket, buf, 1, fd); if (err != 1) return -EBADFD; if (ctrl->cmd) { SNDERR("Server has not done the cmd"); return -EBADFD; } return ctrl->result; }
int snd_pcm_direct_client_connect(snd_pcm_direct_t *dmix) { int ret; unsigned char buf; ret = make_local_socket(dmix->shmptr->socket_name, 0, -1, -1); if (ret < 0) return ret; dmix->comm_fd = ret; ret = snd_receive_fd(dmix->comm_fd, &buf, 1, &dmix->hw_fd); if (ret < 1 || buf != 'A') { close(dmix->comm_fd); dmix->comm_fd = -1; return ret; } dmix->client = 1; return 0; }