|
Packit Service |
db8eaa |
/*
|
|
Packit Service |
db8eaa |
* PCM - Direct Stream Mixing
|
|
Packit Service |
db8eaa |
* Copyright (c) 2003 by Jaroslav Kysela <perex@perex.cz>
|
|
Packit Service |
db8eaa |
*
|
|
Packit Service |
db8eaa |
*
|
|
Packit Service |
db8eaa |
* This library is free software; you can redistribute it and/or modify
|
|
Packit Service |
db8eaa |
* it under the terms of the GNU Lesser General Public License as
|
|
Packit Service |
db8eaa |
* published by the Free Software Foundation; either version 2.1 of
|
|
Packit Service |
db8eaa |
* the License, or (at your option) any later version.
|
|
Packit Service |
db8eaa |
*
|
|
Packit Service |
db8eaa |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
db8eaa |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
db8eaa |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
db8eaa |
* GNU Lesser General Public License for more details.
|
|
Packit Service |
db8eaa |
*
|
|
Packit Service |
db8eaa |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit Service |
db8eaa |
* License along with this library; if not, write to the Free Software
|
|
Packit Service |
db8eaa |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit Service |
db8eaa |
*
|
|
Packit Service |
db8eaa |
*/
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
#include "pcm_local.h"
|
|
Packit Service |
db8eaa |
#include "../timer/timer_local.h"
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
#define DIRECT_IPC_SEMS 1
|
|
Packit Service |
db8eaa |
#define DIRECT_IPC_SEM_CLIENT 0
|
|
Packit Service |
db8eaa |
/* Seconds representing in Milli seconds */
|
|
Packit Service |
db8eaa |
#define SEC_TO_MS 1000
|
|
Packit Service |
db8eaa |
/* slave_period time for low latency requirements in ms */
|
|
Packit Service |
db8eaa |
#define LOW_LATENCY_PERIOD_TIME 10
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
typedef void (mix_areas_t)(unsigned int size,
|
|
Packit Service |
db8eaa |
volatile void *dst, void *src,
|
|
Packit Service |
db8eaa |
volatile signed int *sum, size_t dst_step,
|
|
Packit Service |
db8eaa |
size_t src_step, size_t sum_step);
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
typedef void (mix_areas_16_t)(unsigned int size,
|
|
Packit Service |
db8eaa |
volatile signed short *dst, signed short *src,
|
|
Packit Service |
db8eaa |
volatile signed int *sum, size_t dst_step,
|
|
Packit Service |
db8eaa |
size_t src_step, size_t sum_step);
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
typedef void (mix_areas_32_t)(unsigned int size,
|
|
Packit Service |
db8eaa |
volatile signed int *dst, signed int *src,
|
|
Packit Service |
db8eaa |
volatile signed int *sum, size_t dst_step,
|
|
Packit Service |
db8eaa |
size_t src_step, size_t sum_step);
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
typedef void (mix_areas_24_t)(unsigned int size,
|
|
Packit Service |
db8eaa |
volatile unsigned char *dst, unsigned char *src,
|
|
Packit Service |
db8eaa |
volatile signed int *sum, size_t dst_step,
|
|
Packit Service |
db8eaa |
size_t src_step, size_t sum_step);
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
typedef void (mix_areas_u8_t)(unsigned int size,
|
|
Packit Service |
db8eaa |
volatile unsigned char *dst, unsigned char *src,
|
|
Packit Service |
db8eaa |
volatile signed int *sum, size_t dst_step,
|
|
Packit Service |
db8eaa |
size_t src_step, size_t sum_step);
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
typedef enum snd_pcm_direct_hw_ptr_alignment {
|
|
Packit Service |
db8eaa |
SND_PCM_HW_PTR_ALIGNMENT_NO = 0, /* use the hw_ptr as is and do no rounding */
|
|
Packit Service |
db8eaa |
SND_PCM_HW_PTR_ALIGNMENT_ROUNDUP = 1, /* round the slave_appl_ptr up to slave_period */
|
|
Packit Service |
db8eaa |
SND_PCM_HW_PTR_ALIGNMENT_ROUNDDOWN = 2, /* round slave_hw_ptr and slave_appl_ptr down to slave_period */
|
|
Packit Service |
db8eaa |
SND_PCM_HW_PTR_ALIGNMENT_AUTO = 3 /* automatic selection */
|
|
Packit Service |
db8eaa |
} snd_pcm_direct_hw_ptr_alignment_t;
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
struct slave_params {
|
|
Packit Service |
db8eaa |
snd_pcm_format_t format;
|
|
Packit Service |
db8eaa |
int rate;
|
|
Packit Service |
db8eaa |
int channels;
|
|
Packit Service |
db8eaa |
int period_time;
|
|
Packit Service |
db8eaa |
int buffer_time;
|
|
Packit Service |
db8eaa |
snd_pcm_sframes_t period_size;
|
|
Packit Service |
db8eaa |
snd_pcm_sframes_t buffer_size;
|
|
Packit Service |
db8eaa |
unsigned int periods;
|
|
Packit Service |
db8eaa |
};
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
/* shared among direct plugin clients - be careful to be 32/64bit compatible! */
|
|
Packit Service |
db8eaa |
typedef struct {
|
|
Packit Service |
db8eaa |
unsigned int magic; /* magic number */
|
|
Packit Service |
db8eaa |
char socket_name[256]; /* name of communication socket */
|
|
Packit Service |
db8eaa |
snd_pcm_type_t type; /* PCM type (currently only hw) */
|
|
Packit Service |
db8eaa |
int use_server;
|
|
Packit Service |
db8eaa |
struct {
|
|
Packit Service |
db8eaa |
unsigned int format;
|
|
Packit Service |
db8eaa |
snd_interval_t rate;
|
|
Packit Service |
db8eaa |
snd_interval_t buffer_size;
|
|
Packit Service |
db8eaa |
snd_interval_t buffer_time;
|
|
Packit Service |
db8eaa |
snd_interval_t period_size;
|
|
Packit Service |
db8eaa |
snd_interval_t period_time;
|
|
Packit Service |
db8eaa |
snd_interval_t periods;
|
|
Packit Service |
db8eaa |
} hw;
|
|
Packit Service |
db8eaa |
struct {
|
|
Packit Service |
db8eaa |
/* copied to slave PCMs */
|
|
Packit Service |
db8eaa |
snd_pcm_access_t access;
|
|
Packit Service |
db8eaa |
snd_pcm_format_t format;
|
|
Packit Service |
db8eaa |
snd_pcm_subformat_t subformat;
|
|
Packit Service |
db8eaa |
unsigned int channels;
|
|
Packit Service |
db8eaa |
unsigned int rate;
|
|
Packit Service |
db8eaa |
unsigned int period_size;
|
|
Packit Service |
db8eaa |
unsigned int period_time;
|
|
Packit Service |
db8eaa |
snd_interval_t periods;
|
|
Packit Service |
db8eaa |
snd_pcm_tstamp_t tstamp_mode;
|
|
Packit Service |
db8eaa |
snd_pcm_tstamp_type_t tstamp_type;
|
|
Packit Service |
db8eaa |
unsigned int period_step;
|
|
Packit Service |
db8eaa |
unsigned int sleep_min; /* not used */
|
|
Packit Service |
db8eaa |
unsigned int avail_min;
|
|
Packit Service |
db8eaa |
unsigned int start_threshold;
|
|
Packit Service |
db8eaa |
unsigned int stop_threshold;
|
|
Packit Service |
db8eaa |
unsigned int silence_threshold;
|
|
Packit Service |
db8eaa |
unsigned int silence_size;
|
|
Packit Service |
db8eaa |
unsigned int recoveries; /* no of executed recoveries on slave*/
|
|
Packit Service |
db8eaa |
unsigned long long boundary;
|
|
Packit Service |
db8eaa |
unsigned int info;
|
|
Packit Service |
db8eaa |
unsigned int msbits;
|
|
Packit Service |
db8eaa |
unsigned int rate_num;
|
|
Packit Service |
db8eaa |
unsigned int rate_den;
|
|
Packit Service |
db8eaa |
unsigned int hw_flags;
|
|
Packit Service |
db8eaa |
unsigned int fifo_size;
|
|
Packit Service |
db8eaa |
unsigned int buffer_size;
|
|
Packit Service |
db8eaa |
snd_interval_t buffer_time;
|
|
Packit Service |
db8eaa |
unsigned int sample_bits;
|
|
Packit Service |
db8eaa |
unsigned int frame_bits;
|
|
Packit Service |
db8eaa |
} s;
|
|
Packit Service |
db8eaa |
union {
|
|
Packit Service |
db8eaa |
struct {
|
|
Packit Service |
db8eaa |
unsigned long long chn_mask;
|
|
Packit Service |
db8eaa |
} dshare;
|
|
Packit Service |
db8eaa |
} u;
|
|
Packit Service |
db8eaa |
} snd_pcm_direct_share_t;
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
typedef struct snd_pcm_direct snd_pcm_direct_t;
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
struct snd_pcm_direct {
|
|
Packit Service |
db8eaa |
snd_pcm_type_t type; /* type (dmix, dsnoop, dshare) */
|
|
Packit Service |
db8eaa |
key_t ipc_key; /* IPC key for semaphore and memory */
|
|
Packit Service |
db8eaa |
mode_t ipc_perm; /* IPC socket permissions */
|
|
Packit Service |
db8eaa |
int ipc_gid; /* IPC socket gid */
|
|
Packit Service |
db8eaa |
int semid; /* IPC global semaphore identification */
|
|
Packit Service |
db8eaa |
int locked[DIRECT_IPC_SEMS]; /* local lock counter */
|
|
Packit Service |
db8eaa |
int shmid; /* IPC global shared memory identification */
|
|
Packit Service |
db8eaa |
snd_pcm_direct_share_t *shmptr; /* pointer to shared memory area */
|
|
Packit Service |
db8eaa |
snd_pcm_t *spcm; /* slave PCM handle */
|
|
Packit Service |
db8eaa |
snd_pcm_uframes_t appl_ptr;
|
|
Packit Service |
db8eaa |
snd_pcm_uframes_t last_appl_ptr;
|
|
Packit Service |
db8eaa |
snd_pcm_uframes_t hw_ptr;
|
|
Packit Service |
db8eaa |
snd_pcm_uframes_t avail_max;
|
|
Packit Service |
db8eaa |
snd_pcm_uframes_t slave_appl_ptr;
|
|
Packit Service |
db8eaa |
snd_pcm_uframes_t slave_hw_ptr;
|
|
Packit Service |
db8eaa |
snd_pcm_uframes_t slave_period_size;
|
|
Packit Service |
db8eaa |
snd_pcm_uframes_t slave_buffer_size;
|
|
Packit Service |
db8eaa |
snd_pcm_uframes_t slave_boundary;
|
|
Packit Service |
db8eaa |
int (*sync_ptr)(snd_pcm_t *pcm);
|
|
Packit Service |
db8eaa |
snd_pcm_state_t state;
|
|
Packit Service |
db8eaa |
snd_htimestamp_t trigger_tstamp;
|
|
Packit Service |
db8eaa |
snd_htimestamp_t update_tstamp;
|
|
Packit Service |
db8eaa |
int server, client;
|
|
Packit Service |
db8eaa |
int comm_fd; /* communication file descriptor (socket) */
|
|
Packit Service |
db8eaa |
int hw_fd; /* hardware file descriptor */
|
|
Packit Service |
db8eaa |
struct pollfd timer_fd;
|
|
Packit Service |
db8eaa |
int poll_fd;
|
|
Packit Service |
db8eaa |
int tread: 1;
|
|
Packit Service |
db8eaa |
int timer_need_poll: 1;
|
|
Packit Service |
db8eaa |
unsigned int timer_events;
|
|
Packit Service |
db8eaa |
unsigned int timer_ticks;
|
|
Packit Service |
db8eaa |
int server_fd;
|
|
Packit Service |
db8eaa |
pid_t server_pid;
|
|
Packit Service |
db8eaa |
snd_timer_t *timer; /* timer used as poll_fd */
|
|
Packit Service |
db8eaa |
int interleaved; /* we have interleaved buffer */
|
|
Packit Service |
db8eaa |
int slowptr; /* use slow but more precise ptr updates */
|
|
Packit Service |
db8eaa |
int max_periods; /* max periods (-1 = fixed periods, 0 = max buffer size) */
|
|
Packit Service |
db8eaa |
int var_periodsize; /* allow variable period size if max_periods is != -1*/
|
|
Packit Service |
db8eaa |
unsigned int channels; /* client's channels */
|
|
Packit Service |
db8eaa |
unsigned int *bindings;
|
|
Packit Service |
db8eaa |
unsigned int recoveries; /* mirror of executed recoveries on slave */
|
|
Packit Service |
db8eaa |
int direct_memory_access; /* use arch-optimized buffer RW */
|
|
Packit Service |
db8eaa |
snd_pcm_direct_hw_ptr_alignment_t hw_ptr_alignment;
|
|
Packit Service |
db8eaa |
int tstamp_type; /* cached from conf, can be -1(default) on top of real types */
|
|
Packit Service |
db8eaa |
union {
|
|
Packit Service |
db8eaa |
struct {
|
|
Packit Service |
db8eaa |
int shmid_sum; /* IPC global sum ring buffer memory identification */
|
|
Packit Service |
db8eaa |
signed int *sum_buffer; /* shared sum buffer */
|
|
Packit Service |
db8eaa |
mix_areas_16_t *mix_areas_16;
|
|
Packit Service |
db8eaa |
mix_areas_32_t *mix_areas_32;
|
|
Packit Service |
db8eaa |
mix_areas_24_t *mix_areas_24;
|
|
Packit Service |
db8eaa |
mix_areas_u8_t *mix_areas_u8;
|
|
Packit Service |
db8eaa |
mix_areas_16_t *remix_areas_16;
|
|
Packit Service |
db8eaa |
mix_areas_32_t *remix_areas_32;
|
|
Packit Service |
db8eaa |
mix_areas_24_t *remix_areas_24;
|
|
Packit Service |
db8eaa |
mix_areas_u8_t *remix_areas_u8;
|
|
Packit Service |
db8eaa |
unsigned int use_sem;
|
|
Packit Service |
db8eaa |
} dmix;
|
|
Packit Service |
db8eaa |
struct {
|
|
Packit Service |
db8eaa |
unsigned long long chn_mask;
|
|
Packit Service |
db8eaa |
} dshare;
|
|
Packit Service |
db8eaa |
} u;
|
|
Packit Service |
db8eaa |
void (*server_free)(snd_pcm_direct_t *direct);
|
|
Packit Service |
db8eaa |
};
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
/* make local functions really local */
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_semaphore_create_or_connect \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_semaphore_create_or_connect
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_shm_create_or_connect \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_shm_create_or_connect
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_shm_discard \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_shm_discard
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_server_create \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_server_create
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_server_discard \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_server_discard
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_client_connect \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_client_connect
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_client_discard \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_client_discard
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_initialize_slave \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_initialize_slave
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_initialize_secondary_slave \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_initialize_secondary_slave
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_initialize_poll_fd \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_initialize_poll_fd
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_check_interleave \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_check_interleave
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_parse_bindings \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_parse_bindings
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_nonblock \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_nonblock
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_async \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_async
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_poll_revents \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_poll_revents
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_info \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_info
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_hw_refine \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_hw_refine
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_hw_params \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_hw_params
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_hw_free \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_hw_free
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_sw_params \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_sw_params
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_channel_info \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_channel_info
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_mmap \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_mmap
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_munmap \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_munmap
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_prepare \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_prepare
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_resume \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_resume
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_timer_stop \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_timer_stop
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_clear_timer_queue \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_clear_timer_queue
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_set_timer_params \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_set_timer_params
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_open_secondary_client \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_open_secondary_client
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_parse_open_conf \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_parse_open_conf
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_query_chmaps \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_query_chmaps
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_get_chmap \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_get_chmap
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_set_chmap \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_set_chmap
|
|
Packit Service |
db8eaa |
#define snd_pcm_direct_reset_slave_ptr \
|
|
Packit Service |
db8eaa |
snd1_pcm_direct_reset_slave_ptr
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_semaphore_create_or_connect(snd_pcm_direct_t *dmix);
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
static inline int snd_pcm_direct_semaphore_discard(snd_pcm_direct_t *dmix)
|
|
Packit Service |
db8eaa |
{
|
|
Packit Service |
db8eaa |
if (dmix->semid >= 0) {
|
|
Packit Service |
db8eaa |
if (semctl(dmix->semid, 0, IPC_RMID, NULL) < 0)
|
|
Packit Service |
db8eaa |
return -errno;
|
|
Packit Service |
db8eaa |
dmix->semid = -1;
|
|
Packit Service |
db8eaa |
}
|
|
Packit Service |
db8eaa |
return 0;
|
|
Packit Service |
db8eaa |
}
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
static inline int snd_pcm_direct_semaphore_down(snd_pcm_direct_t *dmix, int sem_num)
|
|
Packit Service |
db8eaa |
{
|
|
Packit Service |
db8eaa |
struct sembuf op[2] = { { sem_num, 0, 0 }, { sem_num, 1, SEM_UNDO } };
|
|
Packit Service |
db8eaa |
int err = semop(dmix->semid, op, 2);
|
|
Packit Service |
db8eaa |
if (err == 0)
|
|
Packit Service |
db8eaa |
dmix->locked[sem_num]++;
|
|
Packit Service |
db8eaa |
else if (err == -1)
|
|
Packit Service |
db8eaa |
err = -errno;
|
|
Packit Service |
db8eaa |
return err;
|
|
Packit Service |
db8eaa |
}
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
static inline int snd_pcm_direct_semaphore_up(snd_pcm_direct_t *dmix, int sem_num)
|
|
Packit Service |
db8eaa |
{
|
|
Packit Service |
db8eaa |
struct sembuf op = { sem_num, -1, SEM_UNDO | IPC_NOWAIT };
|
|
Packit Service |
db8eaa |
int err = semop(dmix->semid, &op, 1);
|
|
Packit Service |
db8eaa |
if (err == 0)
|
|
Packit Service |
db8eaa |
dmix->locked[sem_num]--;
|
|
Packit Service |
db8eaa |
else if (err == -1)
|
|
Packit Service |
db8eaa |
err = -errno;
|
|
Packit Service |
db8eaa |
return err;
|
|
Packit Service |
db8eaa |
}
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
static inline int snd_pcm_direct_semaphore_final(snd_pcm_direct_t *dmix, int sem_num)
|
|
Packit Service |
db8eaa |
{
|
|
Packit Service |
db8eaa |
if (dmix->locked[sem_num] != 1) {
|
|
Packit Service |
db8eaa |
SNDMSG("invalid semaphore count to finalize %d: %d", sem_num, dmix->locked[sem_num]);
|
|
Packit Service |
db8eaa |
return -EBUSY;
|
|
Packit Service |
db8eaa |
}
|
|
Packit Service |
db8eaa |
return snd_pcm_direct_semaphore_up(dmix, sem_num);
|
|
Packit Service |
db8eaa |
}
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_shm_create_or_connect(snd_pcm_direct_t *dmix);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_shm_discard(snd_pcm_direct_t *dmix);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_server_create(snd_pcm_direct_t *dmix);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_server_discard(snd_pcm_direct_t *dmix);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_client_connect(snd_pcm_direct_t *dmix);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_client_discard(snd_pcm_direct_t *dmix);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, struct slave_params *params);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_initialize_secondary_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, struct slave_params *params);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_initialize_poll_fd(snd_pcm_direct_t *dmix);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_check_interleave(snd_pcm_direct_t *dmix, snd_pcm_t *pcm);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_parse_bindings(snd_pcm_direct_t *dmix,
|
|
Packit Service |
db8eaa |
struct slave_params *params,
|
|
Packit Service |
db8eaa |
snd_config_t *cfg);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_nonblock(snd_pcm_t *pcm, int nonblock);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_async(snd_pcm_t *pcm, int sig, pid_t pid);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds,
|
|
Packit Service |
db8eaa |
unsigned int space);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_info(snd_pcm_t *pcm, snd_pcm_info_t * info);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t * params);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_hw_free(snd_pcm_t *pcm);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t * params);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t * info);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_mmap(snd_pcm_t *pcm);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_munmap(snd_pcm_t *pcm);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_prepare(snd_pcm_t *pcm);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_resume(snd_pcm_t *pcm);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_timer_stop(snd_pcm_direct_t *dmix);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_clear_timer_queue(snd_pcm_direct_t *dmix);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_set_timer_params(snd_pcm_direct_t *dmix);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_open_secondary_client(snd_pcm_t **spcmp, snd_pcm_direct_t *dmix, const char *client_name);
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
snd_pcm_chmap_query_t **snd_pcm_direct_query_chmaps(snd_pcm_t *pcm);
|
|
Packit Service |
db8eaa |
snd_pcm_chmap_t *snd_pcm_direct_get_chmap(snd_pcm_t *pcm);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_set_chmap(snd_pcm_t *pcm, const snd_pcm_chmap_t *map);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_slave_recover(snd_pcm_direct_t *direct);
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_client_chk_xrun(snd_pcm_direct_t *direct, snd_pcm_t *pcm);
|
|
Packit Service |
db8eaa |
int snd_timer_async(snd_timer_t *timer, int sig, pid_t pid);
|
|
Packit Service |
db8eaa |
struct timespec snd_pcm_hw_fast_tstamp(snd_pcm_t *pcm);
|
|
Packit Service |
db8eaa |
void snd_pcm_direct_reset_slave_ptr(snd_pcm_t *pcm, snd_pcm_direct_t *dmix);
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
struct snd_pcm_direct_open_conf {
|
|
Packit Service |
db8eaa |
key_t ipc_key;
|
|
Packit Service |
db8eaa |
mode_t ipc_perm;
|
|
Packit Service |
db8eaa |
int ipc_gid;
|
|
Packit Service |
db8eaa |
int slowptr;
|
|
Packit Service |
db8eaa |
int max_periods;
|
|
Packit Service |
db8eaa |
int var_periodsize;
|
|
Packit Service |
db8eaa |
int direct_memory_access;
|
|
Packit Service |
db8eaa |
snd_pcm_direct_hw_ptr_alignment_t hw_ptr_alignment;
|
|
Packit Service |
db8eaa |
int tstamp_type;
|
|
Packit Service |
db8eaa |
snd_config_t *slave;
|
|
Packit Service |
db8eaa |
snd_config_t *bindings;
|
|
Packit Service |
db8eaa |
};
|
|
Packit Service |
db8eaa |
|
|
Packit Service |
db8eaa |
int snd_pcm_direct_parse_open_conf(snd_config_t *root, snd_config_t *conf, int stream, struct snd_pcm_direct_open_conf *rec);
|