• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/ap/gpl/iserver/alsa-lib-1.0.26/src/pcm/

Lines Matching defs:dmix

59 int snd_pcm_direct_semaphore_create_or_connect(snd_pcm_direct_t *dmix)
65 dmix->semid = semget(dmix->ipc_key, DIRECT_IPC_SEMS,
66 IPC_CREAT | dmix->ipc_perm);
67 if (dmix->semid < 0)
69 if (dmix->ipc_gid < 0)
73 if (semctl(dmix->semid, i, IPC_STAT, s) < 0) {
75 snd_pcm_direct_semaphore_discard(dmix);
78 buf.sem_perm.gid = dmix->ipc_gid;
80 semctl(dmix->semid, i, IPC_SET, s);
91 int snd_pcm_direct_shm_create_or_connect(snd_pcm_direct_t *dmix)
97 dmix->shmid = shmget(dmix->ipc_key, sizeof(snd_pcm_direct_share_t),
98 IPC_CREAT | dmix->ipc_perm);
100 if (dmix->shmid < 0){
102 if ((tmpid = shmget(dmix->ipc_key, 0, dmix->ipc_perm)) != -1)
110 dmix->shmptr = shmat(dmix->shmid, 0, 0);
111 if (dmix->shmptr == (void *) -1) {
113 snd_pcm_direct_shm_discard(dmix);
116 mlock(dmix->shmptr, sizeof(snd_pcm_direct_share_t));
117 if (shmctl(dmix->shmid, IPC_STAT, &buf) < 0) {
119 snd_pcm_direct_shm_discard(dmix);
123 memset(dmix->shmptr, 0, sizeof(snd_pcm_direct_share_t));
124 if (dmix->ipc_gid >= 0) {
125 buf.shm_perm.gid = dmix->ipc_gid;
126 shmctl(dmix->shmid, IPC_SET, &buf);
128 dmix->shmptr->magic = SND_PCM_DIRECT_MAGIC;
131 if (dmix->shmptr->magic != SND_PCM_DIRECT_MAGIC) {
132 snd_pcm_direct_shm_discard(dmix);
146 static int _snd_pcm_direct_shm_discard(snd_pcm_direct_t *dmix)
151 if (dmix->shmid < 0)
153 if (dmix->shmptr != (void *) -1 && shmdt(dmix->shmptr) < 0)
155 dmix->shmptr = (void *) -1;
156 if (shmctl(dmix->shmid, IPC_STAT, &buf) < 0)
159 if (shmctl(dmix->shmid, IPC_RMID, NULL) < 0)
163 dmix->shmid = -1;
168 int snd_pcm_direct_shm_discard(snd_pcm_direct_t *dmix)
170 return _snd_pcm_direct_shm_discard(dmix);
182 snprintf(filename, size, TMPDIR "/alsa-dmix-%i-%li-%li", (int)getpid(), (long)tv.tv_sec, (long)tv.tv_usec);
252 static void server_cleanup(snd_pcm_direct_t *dmix)
254 close(dmix->server_fd);
255 close(dmix->hw_fd);
256 if (dmix->server_free)
257 dmix->server_free(dmix);
258 unlink(dmix->shmptr->socket_name);
259 _snd_pcm_direct_shm_discard(dmix);
260 snd_pcm_direct_semaphore_discard(dmix);
305 static void server_job(snd_pcm_direct_t *dmix)
311 server_job_dmix = dmix;
324 if (i != dmix->server_fd && i != dmix->hw_fd)
331 pfds[0].fd = dmix->server_fd;
346 snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT);
347 if (shmctl(dmix->shmid, IPC_STAT, &buf) < 0) {
348 _snd_pcm_direct_shm_discard(dmix);
349 snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT);
355 snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT);
360 sck = accept(dmix->server_fd, 0, 0);
369 _snd_send_fd(sck, &buf, 1, dmix->hw_fd);
399 server_cleanup(dmix);
407 int snd_pcm_direct_server_create(snd_pcm_direct_t *dmix)
411 dmix->server_fd = -1;
413 ret = get_tmp_name(dmix->shmptr->socket_name, sizeof(dmix->shmptr->socket_name));
417 ret = make_local_socket(dmix->shmptr->socket_name, 1, dmix->ipc_perm, dmix->ipc_gid);
420 dmix->server_fd = ret;
422 ret = listen(dmix->server_fd, 4);
424 close(dmix->server_fd);
430 close(dmix->server_fd);
435 server_job(dmix);
440 dmix->server_pid = ret;
441 dmix->server = 1;
445 int snd_pcm_direct_server_discard(snd_pcm_direct_t *dmix)
447 if (dmix->server) {
448 //kill(dmix->server_pid, SIGTERM);
449 //waitpid(dmix->server_pid, NULL, 0);
450 dmix->server_pid = (pid_t)-1;
452 if (dmix->server_fd > 0) {
453 close(dmix->server_fd);
454 dmix->server_fd = -1;
456 dmix->server = 0;
464 int snd_pcm_direct_client_connect(snd_pcm_direct_t *dmix)
469 ret = make_local_socket(dmix->shmptr->socket_name, 0, -1, -1);
472 dmix->comm_fd = ret;
474 ret = snd_receive_fd(dmix->comm_fd, &buf, 1, &dmix->hw_fd);
476 close(dmix->comm_fd);
477 dmix->comm_fd = -1;
481 dmix->client = 1;
485 int snd_pcm_direct_client_discard(snd_pcm_direct_t *dmix)
487 if (dmix->client) {
488 close(dmix->comm_fd);
489 dmix->comm_fd = -1;
506 snd_pcm_direct_t *dmix = pcm->private_data;
507 return snd_timer_async(dmix->timer, sig, pid);
511 void snd_pcm_direct_clear_timer_queue(snd_pcm_direct_t *dmix)
513 if (dmix->timer_need_poll) {
514 while (poll(&dmix->timer_fd, 1, 0) > 0) {
516 if (dmix->tread) {
518 snd_timer_read(dmix->timer, rbuf, sizeof(rbuf));
521 snd_timer_read(dmix->timer, &rbuf, sizeof(rbuf));
525 if (dmix->tread) {
528 while ((len = snd_timer_read(dmix->timer, rbuf,
534 while (snd_timer_read(dmix->timer, &rbuf, sizeof(rbuf)) > 0)
540 int snd_pcm_direct_timer_stop(snd_pcm_direct_t *dmix)
542 snd_timer_stop(dmix->timer);
548 snd_pcm_direct_t *dmix = pcm->private_data;
566 switch (snd_pcm_state(dmix->spcm)) {
574 snd_pcm_direct_clear_timer_queue(dmix);
595 snd_pcm_direct_t *dmix = pcm->private_data;
597 if (dmix->spcm && !dmix->shmptr->use_server)
598 return snd_pcm_info(dmix->spcm, info);
755 snd_pcm_direct_t *dmix = pcm->private_data;
757 params->info = dmix->shmptr->s.info;
758 params->rate_num = dmix->shmptr->s.rate;
761 params->msbits = dmix->shmptr->s.msbits;
794 snd_pcm_direct_t *dmix = pcm->private_data;
797 snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT);
798 err = snd_pcm_resume(dmix->spcm);
801 snd_pcm_prepare(dmix->spcm);
802 snd_pcm_start(dmix->spcm);
805 snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT);
809 #define COPY_SLAVE(field) (dmix->shmptr->s.field = spcm->field)
812 static void save_slave_setting(snd_pcm_direct_t *dmix, snd_pcm_t *spcm)
851 int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, struct slave_params *params)
905 if (ret < 0 && dmix->type != SND_PCM_TYPE_DMIX) {
985 dmix->shmptr->hw.format = snd_mask_value(hw_param_mask(hw_params, SND_PCM_HW_PARAM_FORMAT));
986 dmix->shmptr->hw.rate = *hw_param_interval(hw_params, SND_PCM_HW_PARAM_RATE);
987 dmix->shmptr->hw.buffer_size = *hw_param_interval(hw_params, SND_PCM_HW_PARAM_BUFFER_SIZE);
988 dmix->shmptr->hw.buffer_time = *hw_param_interval(hw_params, SND_PCM_HW_PARAM_BUFFER_TIME);
989 dmix->shmptr->hw.period_size = *hw_param_interval(hw_params, SND_PCM_HW_PARAM_PERIOD_SIZE);
990 dmix->shmptr->hw.period_time = *hw_param_interval(hw_params, SND_PCM_HW_PARAM_PERIOD_TIME);
991 dmix->shmptr->hw.periods = *hw_param_interval(hw_params, SND_PCM_HW_PARAM_PERIODS);
1012 * the slave timestamp is copied appropriately in dsnoop/dmix/dshare
1022 if (dmix->type != SND_PCM_TYPE_DMIX)
1044 if (dmix->type == SND_PCM_TYPE_DSHARE) {
1061 dmix->hw_fd = fd.fd;
1063 save_slave_setting(dmix, spcm);
1065 /* Currently, we assume that each dmix client has the same
1072 dmix->slave_buffer_size = spcm->buffer_size;
1073 dmix->slave_period_size = spcm->period_size;
1074 dmix->slave_boundary = spcm->boundary;
1082 dmix->shmptr->use_server = 1;
1093 int snd_pcm_direct_initialize_poll_fd(snd_pcm_direct_t *dmix)
1098 int capture = dmix->type == SND_PCM_TYPE_DSNOOP ? 1 : 0;
1100 dmix->tread = 1;
1101 dmix->timer_need_poll = 0;
1103 ret = snd_pcm_info(dmix->spcm, info);
1113 ret = snd_timer_open(&dmix->timer, name, SND_TIMER_OPEN_NONBLOCK | SND_TIMER_OPEN_TREAD);
1115 dmix->tread = 0;
1116 ret = snd_timer_open(&dmix->timer, name, SND_TIMER_OPEN_NONBLOCK);
1123 if (snd_timer_poll_descriptors_count(dmix->timer) != 1) {
1127 snd_timer_poll_descriptors(dmix->timer, &dmix->timer_fd, 1);
1128 dmix->poll_fd = dmix->timer_fd.fd;
1130 dmix->timer_events = (1<<SND_TIMER_EVENT_MSUSPEND) |
1139 ioctl(dmix->poll_fd, SNDRV_TIMER_IOCTL_PVERSION, &ver);
1145 dmix->timer_need_poll = 1;
1151 dmix->timer_events &= ~((1<<SND_TIMER_EVENT_MSUSPEND) |
1153 dmix->timer_events |= (1<<SND_TIMER_EVENT_MPAUSE) |
1159 dmix->timer_events |= 1<<SND_TIMER_EVENT_START;
1174 #define COPY_SLAVE(field) (spcm->field = dmix->shmptr->s.field)
1177 static void copy_slave_setting(snd_pcm_direct_t *dmix, snd_pcm_t *spcm)
1207 spcm->boundary = recalc_boundary_size(dmix->shmptr->s.boundary, spcm->buffer_size);
1216 int snd_pcm_direct_open_secondary_client(snd_pcm_t **spcmp, snd_pcm_direct_t *dmix, const char *client_name)
1221 ret = snd_pcm_hw_open_fd(spcmp, client_name, dmix->hw_fd, 0, 0);
1231 copy_slave_setting(dmix, spcm);
1234 dmix->slave_buffer_size = spcm->buffer_size;
1235 dmix->slave_period_size = dmix->shmptr->s.period_size;
1236 dmix->slave_boundary = spcm->boundary;
1249 int snd_pcm_direct_initialize_secondary_slave(snd_pcm_direct_t *dmix,
1258 copy_slave_setting(dmix, spcm);
1261 dmix->slave_buffer_size = spcm->buffer_size;
1262 dmix->slave_period_size = dmix->shmptr->s.period_size;
1263 dmix->slave_boundary = spcm->boundary;
1273 int snd_pcm_direct_set_timer_params(snd_pcm_direct_t *dmix)
1281 if (dmix->type != SND_PCM_TYPE_DSNOOP)
1284 if (dmix->tread) {
1286 dmix->timer_events;
1289 ret = snd_timer_params(dmix->timer, params);
1300 int snd_pcm_direct_check_interleave(snd_pcm_direct_t *dmix, snd_pcm_t *pcm)
1310 channels = dmix->channels;
1311 dst_areas = snd_pcm_mmap_areas(dmix->spcm);
1324 if (dmix->bindings && dmix->bindings[chn] != chn) {
1339 return dmix->interleaved = interleaved;
1347 int snd_pcm_direct_parse_bindings(snd_pcm_direct_t *dmix,
1356 dmix->channels = UINT_MAX;
1408 if (dmix->type == SND_PCM_TYPE_DSNOOP ||
1409 ! dmix->bindings)
1415 if (bindings[chn] == dmix->bindings[chn1]) {
1423 dmix->bindings = bindings;
1424 dmix->channels = count;