mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-12-17 08:56:45 -05:00
alisp - removed all memory leaks from alisp_snd.c discovered by hctl.lisp script
This commit is contained in:
parent
b2a1abf7bd
commit
a741526c44
1 changed files with 246 additions and 110 deletions
|
|
@ -59,12 +59,16 @@ struct flags {
|
||||||
unsigned int mask;
|
unsigned int mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned int get_flags(struct alisp_object * obj, const struct flags * flags, unsigned int deflt)
|
static unsigned int get_flags(struct alisp_instance * instance,
|
||||||
|
struct alisp_object * obj,
|
||||||
|
const struct flags * flags,
|
||||||
|
unsigned int deflt)
|
||||||
{
|
{
|
||||||
const char *key;
|
const char *key;
|
||||||
int invert;
|
int invert;
|
||||||
unsigned int result;
|
unsigned int result;
|
||||||
const struct flags *ptr;
|
const struct flags *ptr;
|
||||||
|
struct alisp_object *n;
|
||||||
|
|
||||||
if (obj == &alsa_lisp_nil)
|
if (obj == &alsa_lisp_nil)
|
||||||
return deflt;
|
return deflt;
|
||||||
|
|
@ -86,21 +90,32 @@ static unsigned int get_flags(struct alisp_object * obj, const struct flags * fl
|
||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
obj = cdr(obj);
|
delete_tree(instance, car(obj));
|
||||||
|
obj = cdr(n = obj);
|
||||||
|
delete_object(instance, n);
|
||||||
} while (obj != &alsa_lisp_nil);
|
} while (obj != &alsa_lisp_nil);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void *get_ptr(struct alisp_object * obj, const char *_ptr_id)
|
static const void *get_ptr(struct alisp_instance * instance,
|
||||||
|
struct alisp_object * obj,
|
||||||
|
const char *_ptr_id)
|
||||||
{
|
{
|
||||||
const char *ptr_id;
|
const char *ptr_id;
|
||||||
|
const void *ptr;
|
||||||
|
|
||||||
ptr_id = get_string(car(obj), NULL);
|
ptr_id = get_string(car(obj), NULL);
|
||||||
if (ptr_id == NULL)
|
if (ptr_id == NULL) {
|
||||||
|
delete_tree(instance, obj);
|
||||||
return NULL;
|
return NULL;
|
||||||
if (strcmp(ptr_id, _ptr_id))
|
}
|
||||||
|
if (strcmp(ptr_id, _ptr_id)) {
|
||||||
|
delete_tree(instance, obj);
|
||||||
return NULL;
|
return NULL;
|
||||||
return get_pointer(cdr(obj));
|
}
|
||||||
|
ptr = get_pointer(cdr(obj));
|
||||||
|
delete_tree(instance, obj);
|
||||||
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct alisp_object * new_lexpr(struct alisp_instance * instance, int err)
|
static struct alisp_object * new_lexpr(struct alisp_instance * instance, int err)
|
||||||
|
|
@ -111,83 +126,84 @@ static struct alisp_object * new_lexpr(struct alisp_instance * instance, int err
|
||||||
if (lexpr == NULL)
|
if (lexpr == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
lexpr->value.c.car = new_integer(instance, err);
|
lexpr->value.c.car = new_integer(instance, err);
|
||||||
if (lexpr->value.c.car == NULL)
|
if (lexpr->value.c.car == NULL) {
|
||||||
|
delete_object(instance, lexpr);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
|
lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
|
||||||
if (lexpr->value.c.cdr == NULL)
|
if (lexpr->value.c.cdr == NULL) {
|
||||||
|
delete_object(instance, lexpr->value.c.car);
|
||||||
|
delete_object(instance, lexpr);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
return lexpr;
|
return lexpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct alisp_object * add_cons(struct alisp_instance * instance, struct alisp_object *lexpr, int cdr, const char *id, struct alisp_object *obj)
|
static struct alisp_object * add_cons(struct alisp_instance * instance,
|
||||||
|
struct alisp_object *lexpr,
|
||||||
|
int cdr, const char *id,
|
||||||
|
struct alisp_object *obj)
|
||||||
{
|
{
|
||||||
struct alisp_object * p1;
|
struct alisp_object * p1, * p2;
|
||||||
|
|
||||||
if (lexpr == NULL || obj == NULL)
|
if (lexpr == NULL || obj == NULL) {
|
||||||
|
delete_tree(instance, obj);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
if (cdr) {
|
if (cdr) {
|
||||||
p1 = lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
|
p1 = lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
|
||||||
} else {
|
} else {
|
||||||
p1 = lexpr->value.c.car = new_object(instance, ALISP_OBJ_CONS);
|
p1 = lexpr->value.c.car = new_object(instance, ALISP_OBJ_CONS);
|
||||||
}
|
}
|
||||||
lexpr = p1;
|
lexpr = p1;
|
||||||
if (p1 == NULL)
|
if (p1 == NULL) {
|
||||||
|
delete_tree(instance, obj);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
p1->value.c.car = new_object(instance, ALISP_OBJ_CONS);
|
p1->value.c.car = new_object(instance, ALISP_OBJ_CONS);
|
||||||
if ((p1 = p1->value.c.car) == NULL)
|
if ((p2 = p1->value.c.car) == NULL)
|
||||||
|
goto __err;
|
||||||
|
p2->value.c.car = new_string(instance, id);
|
||||||
|
if (p2->value.c.car == NULL) {
|
||||||
|
__err:
|
||||||
|
if (cdr)
|
||||||
|
lexpr->value.c.cdr = NULL;
|
||||||
|
else
|
||||||
|
lexpr->value.c.car = NULL;
|
||||||
|
delete_tree(instance, p1);
|
||||||
|
delete_tree(instance, obj);
|
||||||
return NULL;
|
return NULL;
|
||||||
p1->value.c.car = new_string(instance, id);
|
}
|
||||||
if (p1->value.c.car == NULL)
|
p2->value.c.cdr = obj;
|
||||||
return NULL;
|
|
||||||
p1->value.c.cdr = obj;
|
|
||||||
return lexpr;
|
return lexpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
static struct alisp_object * add_cons2(struct alisp_instance * instance,
|
||||||
static struct alisp_object * add_cons1(struct alisp_instance * instance, struct alisp_object *lexpr, int cdr, int id, struct alisp_object *obj)
|
struct alisp_object *lexpr,
|
||||||
|
int cdr, struct alisp_object *obj)
|
||||||
{
|
{
|
||||||
struct alisp_object * p1;
|
struct alisp_object * p1;
|
||||||
|
|
||||||
if (lexpr == NULL || obj == NULL)
|
if (lexpr == NULL || obj == NULL) {
|
||||||
|
delete_tree(instance, obj);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
if (cdr) {
|
if (cdr) {
|
||||||
p1 = lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
|
p1 = lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
|
||||||
} else {
|
} else {
|
||||||
p1 = lexpr->value.c.car = new_object(instance, ALISP_OBJ_CONS);
|
p1 = lexpr->value.c.car = new_object(instance, ALISP_OBJ_CONS);
|
||||||
}
|
}
|
||||||
lexpr = p1;
|
lexpr = p1;
|
||||||
if (p1 == NULL)
|
if (p1 == NULL) {
|
||||||
|
delete_tree(instance, obj);
|
||||||
return NULL;
|
return NULL;
|
||||||
p1->value.c.car = new_object(instance, ALISP_OBJ_CONS);
|
|
||||||
if ((p1 = p1->value.c.car) == NULL)
|
|
||||||
return NULL;
|
|
||||||
p1->value.c.car = new_integer(instance, id);
|
|
||||||
if (p1->value.c.car == NULL)
|
|
||||||
return NULL;
|
|
||||||
p1->value.c.cdr = obj;
|
|
||||||
return lexpr;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static struct alisp_object * add_cons2(struct alisp_instance * instance, struct alisp_object *lexpr, int cdr, struct alisp_object *obj)
|
|
||||||
{
|
|
||||||
struct alisp_object * p1;
|
|
||||||
|
|
||||||
if (lexpr == NULL || obj == NULL)
|
|
||||||
return NULL;
|
|
||||||
if (cdr) {
|
|
||||||
p1 = lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
|
|
||||||
} else {
|
|
||||||
p1 = lexpr->value.c.car = new_object(instance, ALISP_OBJ_CONS);
|
|
||||||
}
|
}
|
||||||
lexpr = p1;
|
|
||||||
if (p1 == NULL)
|
|
||||||
return NULL;
|
|
||||||
p1->value.c.car = obj;
|
p1->value.c.car = obj;
|
||||||
return lexpr;
|
return lexpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct alisp_object * new_result1(struct alisp_instance * instance, int err, const char *ptr_id, void *ptr)
|
static struct alisp_object * new_result1(struct alisp_instance * instance,
|
||||||
|
int err, const char *ptr_id, void *ptr)
|
||||||
{
|
{
|
||||||
struct alisp_object * lexpr, * p1;
|
struct alisp_object * lexpr, * p1;
|
||||||
|
|
||||||
|
|
@ -197,15 +213,20 @@ static struct alisp_object * new_result1(struct alisp_instance * instance, int e
|
||||||
if (lexpr == NULL)
|
if (lexpr == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
lexpr->value.c.car = new_integer(instance, err);
|
lexpr->value.c.car = new_integer(instance, err);
|
||||||
if (lexpr->value.c.car == NULL)
|
if (lexpr->value.c.car == NULL) {
|
||||||
|
delete_object(instance, lexpr);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
p1 = add_cons(instance, lexpr, 1, ptr_id, new_pointer(instance, ptr));
|
p1 = add_cons(instance, lexpr, 1, ptr_id, new_pointer(instance, ptr));
|
||||||
if (p1 == NULL)
|
if (p1 == NULL) {
|
||||||
|
delete_object(instance, lexpr);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
return lexpr;
|
return lexpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct alisp_object * new_result2(struct alisp_instance * instance, int err, int val)
|
static struct alisp_object * new_result2(struct alisp_instance * instance,
|
||||||
|
int err, int val)
|
||||||
{
|
{
|
||||||
struct alisp_object * lexpr, * p1;
|
struct alisp_object * lexpr, * p1;
|
||||||
|
|
||||||
|
|
@ -216,12 +237,15 @@ static struct alisp_object * new_result2(struct alisp_instance * instance, int e
|
||||||
return NULL;
|
return NULL;
|
||||||
p1 = lexpr->value.c.cdr;
|
p1 = lexpr->value.c.cdr;
|
||||||
p1->value.c.car = new_integer(instance, val);
|
p1->value.c.car = new_integer(instance, val);
|
||||||
if (p1->value.c.car == NULL)
|
if (p1->value.c.car == NULL) {
|
||||||
|
delete_object(instance, lexpr);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
return lexpr;
|
return lexpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct alisp_object * new_result3(struct alisp_instance * instance, int err, const char *str)
|
static struct alisp_object * new_result3(struct alisp_instance * instance,
|
||||||
|
int err, const char *str)
|
||||||
{
|
{
|
||||||
struct alisp_object * lexpr, * p1;
|
struct alisp_object * lexpr, * p1;
|
||||||
|
|
||||||
|
|
@ -232,8 +256,10 @@ static struct alisp_object * new_result3(struct alisp_instance * instance, int e
|
||||||
return NULL;
|
return NULL;
|
||||||
p1 = lexpr->value.c.cdr;
|
p1 = lexpr->value.c.cdr;
|
||||||
p1->value.c.car = new_string(instance, str);
|
p1->value.c.car = new_string(instance, str);
|
||||||
if (p1->value.c.car == NULL)
|
if (p1->value.c.car == NULL) {
|
||||||
|
delete_object(instance, lexpr);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
return lexpr;
|
return lexpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -259,6 +285,7 @@ static struct alisp_object * FA_int_pp_strp_int(struct alisp_instance * instance
|
||||||
const char *name;
|
const char *name;
|
||||||
int err, mode;
|
int err, mode;
|
||||||
void *handle;
|
void *handle;
|
||||||
|
struct alisp_object *p1, *p2;
|
||||||
static struct flags flags[] = {
|
static struct flags flags[] = {
|
||||||
{ "nonblock", SND_CTL_NONBLOCK },
|
{ "nonblock", SND_CTL_NONBLOCK },
|
||||||
{ "async", SND_CTL_ASYNC },
|
{ "async", SND_CTL_ASYNC },
|
||||||
|
|
@ -266,12 +293,16 @@ static struct alisp_object * FA_int_pp_strp_int(struct alisp_instance * instance
|
||||||
{ NULL, 0 }
|
{ NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
name = get_string(eval(instance, car(args)), NULL);
|
name = get_string(p1 = eval(instance, car(args)), NULL);
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
mode = get_flags(eval(instance, car(cdr(args))), flags, 0);
|
mode = get_flags(instance, p2 = eval(instance, car(cdr(args))), flags, 0);
|
||||||
|
delete_tree(instance, cdr(cdr(args)));
|
||||||
|
delete_object(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
delete_tree(instance, p2);
|
||||||
err = ((snd_int_pp_strp_int_t)item->xfunc)(&handle, name, mode);
|
err = ((snd_int_pp_strp_int_t)item->xfunc)(&handle, name, mode);
|
||||||
|
delete_tree(instance, p1);
|
||||||
return new_result1(instance, err, item->prefix, handle);
|
return new_result1(instance, err, item->prefix, handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -280,13 +311,18 @@ static struct alisp_object * FA_int_pp_p(struct alisp_instance * instance, struc
|
||||||
int err;
|
int err;
|
||||||
void *handle;
|
void *handle;
|
||||||
const char *prefix1;
|
const char *prefix1;
|
||||||
|
struct alisp_object *p1;
|
||||||
|
|
||||||
if (item->xfunc == &snd_hctl_open_ctl)
|
if (item->xfunc == &snd_hctl_open_ctl)
|
||||||
prefix1 = "ctl";
|
prefix1 = "ctl";
|
||||||
else
|
else {
|
||||||
|
delete_tree(instance, args);
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
args = eval(instance, car(args));
|
}
|
||||||
handle = (void *)get_ptr(args, prefix1);
|
p1 = eval(instance, car(args));
|
||||||
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
handle = (void *)get_ptr(instance, p1, prefix1);
|
||||||
if (handle == NULL)
|
if (handle == NULL)
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
err = ((snd_int_pp_p_t)item->xfunc)(&handle, handle);
|
err = ((snd_int_pp_p_t)item->xfunc)(&handle, handle);
|
||||||
|
|
@ -297,6 +333,7 @@ static struct alisp_object * FA_p_p(struct alisp_instance * instance, struct aca
|
||||||
{
|
{
|
||||||
void *handle;
|
void *handle;
|
||||||
const char *prefix1;
|
const char *prefix1;
|
||||||
|
struct alisp_object * p1;
|
||||||
|
|
||||||
if (item->xfunc == &snd_hctl_first_elem ||
|
if (item->xfunc == &snd_hctl_first_elem ||
|
||||||
item->xfunc == &snd_hctl_last_elem ||
|
item->xfunc == &snd_hctl_last_elem ||
|
||||||
|
|
@ -305,10 +342,14 @@ static struct alisp_object * FA_p_p(struct alisp_instance * instance, struct aca
|
||||||
prefix1 = "hctl_elem";
|
prefix1 = "hctl_elem";
|
||||||
else if (item->xfunc == &snd_hctl_ctl)
|
else if (item->xfunc == &snd_hctl_ctl)
|
||||||
prefix1 = "ctl";
|
prefix1 = "ctl";
|
||||||
else
|
else {
|
||||||
|
delete_tree(instance, args);
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
args = eval(instance, car(args));
|
}
|
||||||
handle = (void *)get_ptr(args, item->prefix);
|
p1 = eval(instance, car(args));
|
||||||
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
handle = (void *)get_ptr(instance, p1, item->prefix);
|
||||||
if (handle == NULL)
|
if (handle == NULL)
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
handle = ((snd_p_p_t)item->xfunc)(handle);
|
handle = ((snd_p_p_t)item->xfunc)(handle);
|
||||||
|
|
@ -318,9 +359,12 @@ static struct alisp_object * FA_p_p(struct alisp_instance * instance, struct aca
|
||||||
static struct alisp_object * FA_int_p(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
|
static struct alisp_object * FA_int_p(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
|
||||||
{
|
{
|
||||||
void *handle;
|
void *handle;
|
||||||
|
struct alisp_object * p1;
|
||||||
|
|
||||||
args = eval(instance, car(args));
|
p1 = eval(instance, car(args));
|
||||||
handle = (void *)get_ptr(args, item->prefix);
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
handle = (void *)get_ptr(instance, p1, item->prefix);
|
||||||
if (handle == NULL)
|
if (handle == NULL)
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
return new_integer(instance, ((snd_int_p_t)item->xfunc)(handle));
|
return new_integer(instance, ((snd_int_p_t)item->xfunc)(handle));
|
||||||
|
|
@ -329,9 +373,12 @@ static struct alisp_object * FA_int_p(struct alisp_instance * instance, struct a
|
||||||
static struct alisp_object * FA_str_p(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
|
static struct alisp_object * FA_str_p(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
|
||||||
{
|
{
|
||||||
void *handle;
|
void *handle;
|
||||||
|
struct alisp_object * p1;
|
||||||
|
|
||||||
args = eval(instance, car(args));
|
p1 = eval(instance, car(args));
|
||||||
handle = (void *)get_ptr(args, item->prefix);
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
handle = (void *)get_ptr(instance, p1, item->prefix);
|
||||||
if (handle == NULL)
|
if (handle == NULL)
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
return new_string(instance, ((snd_str_p_t)item->xfunc)(handle));
|
return new_string(instance, ((snd_str_p_t)item->xfunc)(handle));
|
||||||
|
|
@ -340,11 +387,17 @@ static struct alisp_object * FA_str_p(struct alisp_instance * instance, struct a
|
||||||
static struct alisp_object * FA_int_intp(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
|
static struct alisp_object * FA_int_intp(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
|
||||||
{
|
{
|
||||||
int val, err;
|
int val, err;
|
||||||
|
struct alisp_object * p1;
|
||||||
|
|
||||||
args = eval(instance, car(args));
|
p1 = eval(instance, car(args));
|
||||||
if (!alisp_compare_type(args, ALISP_OBJ_INTEGER))
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
if (!alisp_compare_type(p1, ALISP_OBJ_INTEGER)) {
|
||||||
|
delete_tree(instance, p1);
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
val = args->value.i;
|
}
|
||||||
|
val = p1->value.i;
|
||||||
|
delete_tree(instance, p1);
|
||||||
err = ((snd_int_intp_t)item->xfunc)(&val);
|
err = ((snd_int_intp_t)item->xfunc)(&val);
|
||||||
return new_result2(instance, err, val);
|
return new_result2(instance, err, val);
|
||||||
}
|
}
|
||||||
|
|
@ -352,12 +405,18 @@ static struct alisp_object * FA_int_intp(struct alisp_instance * instance, struc
|
||||||
static struct alisp_object * FA_int_str(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
|
static struct alisp_object * FA_int_str(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
struct alisp_object * p1;
|
||||||
|
|
||||||
args = eval(instance, car(args));
|
p1 = eval(instance, car(args));
|
||||||
if (!alisp_compare_type(args, ALISP_OBJ_STRING) &&
|
delete_tree(instance, cdr(args));
|
||||||
!alisp_compare_type(args, ALISP_OBJ_IDENTIFIER))
|
delete_object(instance, args);
|
||||||
|
if (!alisp_compare_type(p1, ALISP_OBJ_STRING) &&
|
||||||
|
!alisp_compare_type(p1, ALISP_OBJ_IDENTIFIER)) {
|
||||||
|
delete_tree(instance, p1);
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
err = ((snd_int_str_t)item->xfunc)(args->value.s);
|
}
|
||||||
|
err = ((snd_int_str_t)item->xfunc)(p1->value.s);
|
||||||
|
delete_tree(instance, p1);
|
||||||
return new_integer(instance, err);
|
return new_integer(instance, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -365,11 +424,19 @@ static struct alisp_object * FA_int_int_strp(struct alisp_instance * instance, s
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
char *str;
|
char *str;
|
||||||
|
long val;
|
||||||
|
struct alisp_object * p1;
|
||||||
|
|
||||||
args = eval(instance, car(args));
|
p1 = eval(instance, car(args));
|
||||||
if (!alisp_compare_type(args, ALISP_OBJ_INTEGER))
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
if (!alisp_compare_type(p1, ALISP_OBJ_INTEGER)) {
|
||||||
|
delete_tree(instance, p1);
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
err = ((snd_int_int_strp_t)item->xfunc)(args->value.i, &str);
|
}
|
||||||
|
val = p1->value.i;
|
||||||
|
delete_tree(instance, p1);
|
||||||
|
err = ((snd_int_int_strp_t)item->xfunc)(val, &str);
|
||||||
return new_result3(instance, err, str);
|
return new_result3(instance, err, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -377,11 +444,13 @@ static struct alisp_object * FA_card_info(struct alisp_instance * instance, stru
|
||||||
{
|
{
|
||||||
snd_ctl_t *handle;
|
snd_ctl_t *handle;
|
||||||
struct alisp_object * lexpr, * p1;
|
struct alisp_object * lexpr, * p1;
|
||||||
snd_ctl_card_info_t *info;
|
snd_ctl_card_info_t * info;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
args = eval(instance, car(args));
|
p1 = eval(instance, car(args));
|
||||||
handle = (snd_ctl_t *)get_ptr(args, item->prefix);
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
handle = (snd_ctl_t *)get_ptr(instance, p1, item->prefix);
|
||||||
if (handle == NULL)
|
if (handle == NULL)
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
snd_ctl_card_info_alloca(&info);
|
snd_ctl_card_info_alloca(&info);
|
||||||
|
|
@ -395,8 +464,10 @@ static struct alisp_object * FA_card_info(struct alisp_instance * instance, stru
|
||||||
p1 = add_cons(instance, p1, 1, "longname", new_string(instance, snd_ctl_card_info_get_longname(info)));
|
p1 = add_cons(instance, p1, 1, "longname", new_string(instance, snd_ctl_card_info_get_longname(info)));
|
||||||
p1 = add_cons(instance, p1, 1, "mixername", new_string(instance, snd_ctl_card_info_get_mixername(info)));
|
p1 = add_cons(instance, p1, 1, "mixername", new_string(instance, snd_ctl_card_info_get_mixername(info)));
|
||||||
p1 = add_cons(instance, p1, 1, "components", new_string(instance, snd_ctl_card_info_get_components(info)));
|
p1 = add_cons(instance, p1, 1, "components", new_string(instance, snd_ctl_card_info_get_components(info)));
|
||||||
if (p1 == NULL)
|
if (p1 == NULL) {
|
||||||
|
delete_tree(instance, lexpr);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
return lexpr;
|
return lexpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -411,7 +482,9 @@ static struct alisp_object * create_ctl_elem_id(struct alisp_instance * instance
|
||||||
return cons;
|
return cons;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parse_ctl_elem_id(struct alisp_object * cons, snd_ctl_elem_id_t * id)
|
static int parse_ctl_elem_id(struct alisp_instance * instance,
|
||||||
|
struct alisp_object * cons,
|
||||||
|
snd_ctl_elem_id_t * id)
|
||||||
{
|
{
|
||||||
struct alisp_object *p1;
|
struct alisp_object *p1;
|
||||||
const char *xid;
|
const char *xid;
|
||||||
|
|
@ -440,7 +513,9 @@ static int parse_ctl_elem_id(struct alisp_object * cons, snd_ctl_elem_id_t * id)
|
||||||
snd_ctl_elem_id_set_index(id, get_integer(p1->value.c.cdr));
|
snd_ctl_elem_id_set_index(id, get_integer(p1->value.c.cdr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cons = cdr(cons);
|
delete_tree(instance, p1);
|
||||||
|
cons = cdr(p1 = cons);
|
||||||
|
delete_object(instance, p1);
|
||||||
} while (cons != &alsa_lisp_nil);
|
} while (cons != &alsa_lisp_nil);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -449,12 +524,20 @@ static struct alisp_object * FA_hctl_find_elem(struct alisp_instance * instance,
|
||||||
{
|
{
|
||||||
snd_hctl_t *handle;
|
snd_hctl_t *handle;
|
||||||
snd_ctl_elem_id_t *id;
|
snd_ctl_elem_id_t *id;
|
||||||
|
struct alisp_object *p1;
|
||||||
|
|
||||||
handle = (snd_hctl_t *)get_ptr(car(args), item->prefix);
|
handle = (snd_hctl_t *)get_ptr(instance, car(args), item->prefix);
|
||||||
if (handle == NULL)
|
if (handle == NULL) {
|
||||||
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
|
}
|
||||||
snd_ctl_elem_id_alloca(&id);
|
snd_ctl_elem_id_alloca(&id);
|
||||||
if (parse_ctl_elem_id(eval(instance, car(cdr(args))), id) < 0)
|
p1 = car(cdr(args));
|
||||||
|
delete_tree(instance, cdr(cdr(args)));
|
||||||
|
delete_object(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
if (parse_ctl_elem_id(instance, eval(instance, p1), id) < 0)
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
return new_cons_pointer(instance, "hctl_elem", snd_hctl_find_elem(handle, id));
|
return new_cons_pointer(instance, "hctl_elem", snd_hctl_find_elem(handle, id));
|
||||||
}
|
}
|
||||||
|
|
@ -468,8 +551,10 @@ static struct alisp_object * FA_hctl_elem_info(struct alisp_instance * instance,
|
||||||
snd_ctl_elem_type_t type;
|
snd_ctl_elem_type_t type;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
args = eval(instance, car(args));
|
p1 = eval(instance, car(args));
|
||||||
handle = (snd_hctl_elem_t *)get_ptr(args, item->prefix);
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
handle = (snd_hctl_elem_t *)get_ptr(instance, p1, item->prefix);
|
||||||
if (handle == NULL)
|
if (handle == NULL)
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
snd_ctl_elem_info_alloca(&info);
|
snd_ctl_elem_info_alloca(&info);
|
||||||
|
|
@ -481,8 +566,10 @@ static struct alisp_object * FA_hctl_elem_info(struct alisp_instance * instance,
|
||||||
type = snd_ctl_elem_info_get_type(info);
|
type = snd_ctl_elem_info_get_type(info);
|
||||||
p1 = add_cons(instance, lexpr->value.c.cdr, 0, "id", p2 = new_object(instance, ALISP_OBJ_CONS));
|
p1 = add_cons(instance, lexpr->value.c.cdr, 0, "id", p2 = new_object(instance, ALISP_OBJ_CONS));
|
||||||
snd_ctl_elem_info_get_id(info, id);
|
snd_ctl_elem_info_get_id(info, id);
|
||||||
if (create_ctl_elem_id(instance, id, p2) == NULL)
|
if (create_ctl_elem_id(instance, id, p2) == NULL) {
|
||||||
|
delete_tree(instance, lexpr);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
p1 = add_cons(instance, p1, 1, "type", new_string(instance, snd_ctl_elem_type_name(type)));
|
p1 = add_cons(instance, p1, 1, "type", new_string(instance, snd_ctl_elem_type_name(type)));
|
||||||
p1 = add_cons(instance, p1, 1, "readable", new_integer(instance, snd_ctl_elem_info_is_readable(info)));
|
p1 = add_cons(instance, p1, 1, "readable", new_integer(instance, snd_ctl_elem_info_is_readable(info)));
|
||||||
p1 = add_cons(instance, p1, 1, "writeable", new_integer(instance, snd_ctl_elem_info_is_writable(info)));
|
p1 = add_cons(instance, p1, 1, "writeable", new_integer(instance, snd_ctl_elem_info_is_writable(info)));
|
||||||
|
|
@ -528,8 +615,10 @@ static struct alisp_object * FA_hctl_elem_info(struct alisp_instance * instance,
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (p1 == NULL)
|
if (p1 == NULL) {
|
||||||
|
delete_tree(instance, lexpr);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
return lexpr;
|
return lexpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -543,8 +632,10 @@ static struct alisp_object * FA_hctl_elem_read(struct alisp_instance * instance,
|
||||||
unsigned int idx, count;
|
unsigned int idx, count;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
args = eval(instance, car(args));
|
p1 = eval(instance, car(args));
|
||||||
handle = (snd_hctl_elem_t *)get_ptr(args, item->prefix);
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
handle = (snd_hctl_elem_t *)get_ptr(instance, p1, item->prefix);
|
||||||
if (handle == NULL)
|
if (handle == NULL)
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
snd_ctl_elem_info_alloca(&info);
|
snd_ctl_elem_info_alloca(&info);
|
||||||
|
|
@ -588,8 +679,10 @@ static struct alisp_object * FA_hctl_elem_read(struct alisp_instance * instance,
|
||||||
p1 = add_cons2(instance, p1, 1, obj);
|
p1 = add_cons2(instance, p1, 1, obj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (p1 == NULL)
|
if (p1 == NULL) {
|
||||||
|
delete_tree(instance, lexpr);
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
|
}
|
||||||
return lexpr;
|
return lexpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -604,15 +697,22 @@ static struct alisp_object * FA_hctl_elem_write(struct alisp_instance * instance
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
p1 = car(cdr(args));
|
p1 = car(cdr(args));
|
||||||
args = eval(instance, car(args));
|
obj = eval(instance, car(args));
|
||||||
handle = (snd_hctl_elem_t *)get_ptr(args, item->prefix);
|
delete_tree(instance, cdr(cdr(args)));
|
||||||
if (handle == NULL)
|
delete_object(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
handle = (snd_hctl_elem_t *)get_ptr(instance, obj, item->prefix);
|
||||||
|
if (handle == NULL) {
|
||||||
|
delete_tree(instance, p1);
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
|
}
|
||||||
snd_ctl_elem_info_alloca(&info);
|
snd_ctl_elem_info_alloca(&info);
|
||||||
snd_ctl_elem_value_alloca(&value);
|
snd_ctl_elem_value_alloca(&value);
|
||||||
err = snd_hctl_elem_info(handle, info);
|
err = snd_hctl_elem_info(handle, info);
|
||||||
if (err < 0)
|
if (err < 0) {
|
||||||
|
delete_tree(instance, p1);
|
||||||
return new_integer(instance, err);
|
return new_integer(instance, err);
|
||||||
|
}
|
||||||
type = snd_ctl_elem_info_get_type(info);
|
type = snd_ctl_elem_info_get_type(info);
|
||||||
count = snd_ctl_elem_info_get_count(info);
|
count = snd_ctl_elem_info_get_count(info);
|
||||||
if (type == SND_CTL_ELEM_TYPE_IEC958) {
|
if (type == SND_CTL_ELEM_TYPE_IEC958) {
|
||||||
|
|
@ -621,8 +721,10 @@ static struct alisp_object * FA_hctl_elem_write(struct alisp_instance * instance
|
||||||
}
|
}
|
||||||
idx = -1;
|
idx = -1;
|
||||||
do {
|
do {
|
||||||
if (++idx >= count)
|
if (++idx >= count) {
|
||||||
|
delete_tree(instance, p1);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
obj = car(p1);
|
obj = car(p1);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SND_CTL_ELEM_TYPE_BOOLEAN:
|
case SND_CTL_ELEM_TYPE_BOOLEAN:
|
||||||
|
|
@ -641,10 +743,11 @@ static struct alisp_object * FA_hctl_elem_write(struct alisp_instance * instance
|
||||||
snd_ctl_elem_value_set_byte(value, idx, get_integer(obj));
|
snd_ctl_elem_value_set_byte(value, idx, get_integer(obj));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
obj = NULL;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
p1 = cdr(p1);
|
delete_tree(instance, obj);
|
||||||
|
p1 = cdr(obj = p1);
|
||||||
|
delete_object(instance, obj);
|
||||||
} while (p1 != &alsa_lisp_nil);
|
} while (p1 != &alsa_lisp_nil);
|
||||||
err = snd_hctl_elem_write(handle, value);
|
err = snd_hctl_elem_write(handle, value);
|
||||||
return new_integer(instance, err);
|
return new_integer(instance, err);
|
||||||
|
|
@ -657,8 +760,10 @@ static struct alisp_object * FA_pcm_info(struct alisp_instance * instance, struc
|
||||||
snd_pcm_info_t *info;
|
snd_pcm_info_t *info;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
args = eval(instance, car(args));
|
p1 = eval(instance, car(args));
|
||||||
handle = (snd_pcm_t *)get_ptr(args, item->prefix);
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
handle = (snd_pcm_t *)get_ptr(instance, p1, item->prefix);
|
||||||
if (handle == NULL)
|
if (handle == NULL)
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
snd_pcm_info_alloca(&info);
|
snd_pcm_info_alloca(&info);
|
||||||
|
|
@ -722,29 +827,56 @@ static struct alisp_object * F_acall(struct alisp_instance *instance, struct ali
|
||||||
struct acall_table key, *item;
|
struct acall_table key, *item;
|
||||||
|
|
||||||
p1 = eval(instance, car(args));
|
p1 = eval(instance, car(args));
|
||||||
if (!alisp_compare_type(p1, ALISP_OBJ_IDENTIFIER) &&
|
|
||||||
!alisp_compare_type(p1, ALISP_OBJ_STRING))
|
|
||||||
return &alsa_lisp_nil;
|
|
||||||
p2 = cdr(args);
|
p2 = cdr(args);
|
||||||
|
delete_object(instance, args);
|
||||||
|
if (!alisp_compare_type(p1, ALISP_OBJ_IDENTIFIER) &&
|
||||||
|
!alisp_compare_type(p1, ALISP_OBJ_STRING)) {
|
||||||
|
delete_tree(instance, p2);
|
||||||
|
return &alsa_lisp_nil;
|
||||||
|
}
|
||||||
key.name = p1->value.s;
|
key.name = p1->value.s;
|
||||||
if ((item = bsearch(&key, acall_table,
|
if ((item = bsearch(&key, acall_table,
|
||||||
sizeof acall_table / sizeof acall_table[0],
|
sizeof acall_table / sizeof acall_table[0],
|
||||||
sizeof acall_table[0], acall_compar)) != NULL)
|
sizeof acall_table[0], acall_compar)) != NULL) {
|
||||||
|
delete_tree(instance, p1);
|
||||||
return item->func(instance, item, p2);
|
return item->func(instance, item, p2);
|
||||||
|
}
|
||||||
|
delete_tree(instance, p1);
|
||||||
|
delete_tree(instance, p2);
|
||||||
lisp_warn(instance, "acall function %s' is undefined", p1->value.s);
|
lisp_warn(instance, "acall function %s' is undefined", p1->value.s);
|
||||||
return &alsa_lisp_nil;
|
return &alsa_lisp_nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct alisp_object * F_ahandle(struct alisp_instance *instance ATTRIBUTE_UNUSED, struct alisp_object * args)
|
static struct alisp_object * F_ahandle(struct alisp_instance *instance, struct alisp_object * args)
|
||||||
{
|
{
|
||||||
return car(cdr(eval(instance, car(args))));
|
struct alisp_object *p1;
|
||||||
|
|
||||||
|
p1 = eval(instance, car(args));
|
||||||
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
args = car(cdr(p1));
|
||||||
|
delete_tree(instance, cdr(cdr(p1)));
|
||||||
|
delete_object(instance, cdr(p1));
|
||||||
|
delete_tree(instance, car(p1));
|
||||||
|
delete_object(instance, p1);
|
||||||
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct alisp_object * F_aerror(struct alisp_instance *instance, struct alisp_object * args)
|
static struct alisp_object * F_aerror(struct alisp_instance *instance, struct alisp_object * args)
|
||||||
{
|
{
|
||||||
args = car(eval(instance, car(args)));
|
struct alisp_object *p1;
|
||||||
if (args == &alsa_lisp_nil)
|
|
||||||
|
p1 = eval(instance, car(args));
|
||||||
|
delete_tree(instance, cdr(args));
|
||||||
|
delete_object(instance, args);
|
||||||
|
args = car(p1);
|
||||||
|
if (args == &alsa_lisp_nil) {
|
||||||
|
delete_tree(instance, p1);
|
||||||
return new_integer(instance, SND_ERROR_ALISP_NIL);
|
return new_integer(instance, SND_ERROR_ALISP_NIL);
|
||||||
|
} else {
|
||||||
|
delete_tree(instance, cdr(p1));
|
||||||
|
delete_object(instance, p1);
|
||||||
|
}
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -755,8 +887,10 @@ static int common_error(snd_output_t **rout, struct alisp_instance *instance, st
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = snd_output_buffer_open(&out);
|
err = snd_output_buffer_open(&out);
|
||||||
if (err < 0)
|
if (err < 0) {
|
||||||
|
delete_tree(instance, args);
|
||||||
return err;
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
p1 = eval(instance, car(p));
|
p1 = eval(instance, car(p));
|
||||||
|
|
@ -764,7 +898,9 @@ static int common_error(snd_output_t **rout, struct alisp_instance *instance, st
|
||||||
snd_output_printf(out, "%s", p1->value.s);
|
snd_output_printf(out, "%s", p1->value.s);
|
||||||
else
|
else
|
||||||
princ_object(out, p1);
|
princ_object(out, p1);
|
||||||
p = cdr(p);
|
delete_tree(instance, p1);
|
||||||
|
p = cdr(p1 = p);
|
||||||
|
delete_object(instance, p1);
|
||||||
} while (p != &alsa_lisp_nil);
|
} while (p != &alsa_lisp_nil);
|
||||||
|
|
||||||
*rout = out;
|
*rout = out;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue