}
}
+# uncached memory reads have a high penalty
+HdmiLpeAudio.dmix.direct_memory_access false
+
# default with dmix+softvol
HdmiLpeAudio.pcm.default {
@args [ CARD ]
@func refer
name defaults.pcm.ipc_perm
}
+ direct_memory_access {
+ @func refer
+ name {
+ @func concat
+ strings [
+ "cards."
+ {
+ @func card_driver
+ card $CARD
+ }
+ ".dmix.direct_memory_access"
+ ]
+ }
+ default true
+ }
slave {
pcm {
type hw
rec->slowptr = 1;
rec->max_periods = 0;
rec->var_periodsize = 1;
+ rec->direct_memory_access = 1;
/* read defaults */
if (snd_config_search(root, "defaults.pcm.dmix_max_periods", &n) >= 0) {
rec->var_periodsize = err;
continue;
}
+ if (strcmp(id, "direct_memory_access") == 0) {
+ err = snd_config_get_bool(n);
+ if (err < 0)
+ return err;
+ rec->direct_memory_access = err;
+ continue;
+ }
SNDERR("Unknown field %s", id);
return -EINVAL;
}
unsigned int channels; /* client's channels */
unsigned int *bindings;
unsigned int recoveries; /* mirror of executed recoveries on slave */
+ int direct_memory_access; /* use arch-optimized buffer RW */
union {
struct {
int shmid_sum; /* IPC global sum ring buffer memory identification */
int slowptr;
int max_periods;
int var_periodsize;
+ int direct_memory_access;
snd_config_t *slave;
snd_config_t *bindings;
};
dmix->max_periods = opts->max_periods;
dmix->var_periodsize = opts->var_periodsize;
dmix->sync_ptr = snd_pcm_dmix_sync_ptr;
+ dmix->direct_memory_access = opts->direct_memory_access;
retry:
if (first_instance) {
{
static int smp = 0, mmx = 0, cmov = 0;
+ if (!dmix->direct_memory_access) {
+ generic_mix_select_callbacks(dmix);
+ return;
+ }
+
if (!((1ULL<< dmix->shmptr->s.format) & i386_dmix_supported_format)) {
generic_mix_select_callbacks(dmix);
return;
{
static int smp = 0;
+ if (!dmix->direct_memory_access) {
+ generic_mix_select_callbacks(dmix);
+ return;
+ }
+
if (!((1ULL<< dmix->shmptr->s.format) & x86_64_dmix_supported_format)) {
generic_mix_select_callbacks(dmix);
return;