static int semaphore_create_or_connect(snd_pcm_dmix_t *dmix)
{
- dmix->semid = semget(dmix->ipc_key, 1, O_CREAT | 0666);
+ dmix->semid = semget(dmix->ipc_key, 1, IPC_CREAT | 0666);
if (dmix->semid < 0)
return -errno;
return 0;
struct shmid_ds buf;
int ret = 0;
- dmix->shmid = shmget(dmix->ipc_key, sizeof(snd_pcm_dmix_share_t), O_CREAT | 0666);
+ dmix->shmid = shmget(dmix->ipc_key, sizeof(snd_pcm_dmix_share_t), IPC_CREAT | 0666);
if (dmix->shmid < 0)
return -errno;
dmix->shmptr = shmat(dmix->shmid, 0, 0);
memset(dmix->shmptr, 0, sizeof(snd_pcm_dmix_share_t));
ret = 1;
}
- return 0;
+ return ret;
}
static int shm_discard(snd_pcm_dmix_t *dmix)
static int snd_pcm_dmix_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
{
snd_pcm_dmix_t *dmix = pcm->private_data;
+ //snd_interval_refine_set(
return 0;
}
snd_pcm_hw_params_t *hw_params;
snd_pcm_sw_params_t *sw_params;
int ret, buffer_is_not_initialized;
- snd_pcm_uframes_t buffer_size;
+ snd_pcm_uframes_t boundary, buffer_size;
hw_params = &dmix->shmptr->hw_params;
sw_params = &dmix->shmptr->sw_params;
return ret;
}
- ret = INTERNAL(snd_pcm_hw_params_get_buffer_size)(hw_params, &buffer_size);
+ ret = snd_pcm_sw_params_get_boundary(sw_params, &boundary);
if (ret < 0) {
- SNDERR("unable to get buffer size\n");
+ SNDERR("unable to get boundary\n");
return ret;
}
- ret = snd_pcm_sw_params_set_stop_threshold(spcm, sw_params, buffer_size);
+ ret = snd_pcm_sw_params_set_stop_threshold(spcm, sw_params, boundary);
if (ret < 0) {
SNDERR("unable to set stop threshold\n");
return ret;
}
+ ret = INTERNAL(snd_pcm_hw_params_get_buffer_size)(hw_params, &buffer_size);
+ if (ret < 0) {
+ SNDERR("unable to get buffer size\n");
+ return ret;
+ }
ret = snd_pcm_sw_params_set_silence_threshold(spcm, sw_params, buffer_size);
if (ret < 0) {
SNDERR("unable to set silence threshold\n");
goto _err;
ret = semaphore_create_or_connect(dmix);
- if (ret < 0)
+ if (ret < 0) {
+ SNDERR("unable to create IPC semaphore\n");
goto _err;
+ }
ret = semaphore_down(dmix);
if (ret < 0) {
}
first_instance = ret = shm_create_or_connect(dmix);
- if (ret < 0)
+ if (ret < 0) {
+ SNDERR("unable to create IPC shm instance\n");
goto _err;
+ }
pcm->ops = &snd_pcm_dmix_ops;
pcm->fast_ops = &snd_pcm_dmix_fast_ops;
if (first_instance) {
ret = snd_pcm_open_slave(&spcm, root, sconf, stream, mode);
- if (ret < 0)
+ if (ret < 0) {
+ SNDERR("unable to open slave\n");
goto _err;
+ }
if (snd_pcm_type(spcm) != SND_PCM_TYPE_HW) {
SNDERR("dmix plugin can be only connected to hw plugin");
}
ret = snd_pcm_dmix_initialize_slave(dmix, spcm, params);
- if (ret < 0)
+ if (ret < 0) {
+ SNDERR("unable to initialize slave\n");
goto _err;
+ }
dmix->spcm = spcm;
ret = server_create(dmix);
- if (ret < 0)
+ if (ret < 0) {
+ SNDERR("unable to create server\n");
goto _err;
+ }
} else {
ret = client_connect(dmix);
- if (ret < 0)
+ if (ret < 0) {
+ SNDERR("unable to connect client\n");
return ret;
+ }
ret = snd_pcm_hw_open_fd(&spcm, "dmix_client", dmix->hw_fd, 0);
- if (ret < 0)
+ if (ret < 0) {
+ SNDERR("unable to open hardware\n");
goto _err;
+ }
}
ret = snd_pcm_dmix_initialize_poll_fd(dmix);
- if (ret < 0)
+ if (ret < 0) {
+ SNDERR("unable to initialize poll_fd\n");
goto _err;
+ }
pcm->poll_fd = dmix->poll_fd;
return err;
}
ipc_key = key;
+ continue;
}
if (strcmp(id, "slave") == 0) {
slave = n;