Update of /cvsroot/alsa/alsa-lib/src/alisp In directory sc8-pr-cvs1:/tmp/cvs-serv11959/src/alisp
Modified Files: alisp.c alisp_local.h alisp_snd.c Log Message: alisp - implemented hctl_elem_read/write and find Index: alisp.c =================================================================== RCS file: /cvsroot/alsa/alsa-lib/src/alisp/alisp.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- alisp.c 1 Aug 2003 18:21:19 -0000 1.6 +++ alisp.c 3 Aug 2003 20:36:54 -0000 1.7 @@ -35,6 +35,8 @@ #include "alisp.h" #include "alisp_local.h" +#define ALISP_FREE_OBJ_POOL 1000 /* free objects above this pool */ + struct alisp_object alsa_lisp_nil; struct alisp_object alsa_lisp_t; @@ -138,6 +140,8 @@ p->gc = 1; ++instance->used_objs; + if (instance->used_objs + instance->free_objs > instance->max_objs) + instance->max_objs = instance->used_objs + instance->free_objs; return p; } @@ -778,7 +782,7 @@ lisp_debug(instance, "** collecting cons %p", p); free_object(p); - if (instance->free_objs < 1000) { + if (instance->free_objs < ALISP_FREE_OBJ_POOL) { p->next = instance->free_objs_list; instance->free_objs_list = p; ++instance->free_objs; @@ -799,7 +803,7 @@ static void garbage_collect(struct alisp_instance *instance) { - if (++instance->gc_id == INT_MAX) + if (++instance->gc_id == 255) instance->gc_id = 1; do_garbage_collect(instance); } @@ -1892,11 +1896,13 @@ static struct alisp_object * F_stat_memory(struct alisp_instance *instance, struct alisp_object * args ATTRIBUTE_UNUSED) { snd_output_printf(instance->out, "*** Memory stats\n"); - snd_output_printf(instance->out, " used_objs = %i, free_objs = %i, obj_size = %i (total = %i)\n", + snd_output_printf(instance->out, " used_objs = %li, free_objs = %li, max_objs = %li, obj_size = %i (total bytes = %li, max bytes = %li)\n", instance->used_objs, instance->free_objs, + instance->max_objs, sizeof(struct alisp_object), - (instance->used_objs + instance->free_objs) * sizeof(struct alisp_object)); + (instance->used_objs + instance->free_objs) * sizeof(struct alisp_object), + instance->max_objs * sizeof(struct alisp_object)); return &alsa_lisp_nil; } @@ -1967,6 +1973,8 @@ { "setf", F_setq }, { "setq", F_setq }, { "str", F_str }, + { "string=", F_equal }, + { "string-equal", F_equal }, { "unless", F_unless }, { "when", F_when }, { "while", F_while }, Index: alisp_local.h =================================================================== RCS file: /cvsroot/alsa/alsa-lib/src/alisp/alisp_local.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- alisp_local.h 27 Jul 2003 20:20:26 -0000 1.4 +++ alisp_local.h 3 Aug 2003 20:36:54 -0000 1.5 @@ -41,8 +41,8 @@ }; struct alisp_object { - int type; - int gc; + unsigned char type; + unsigned char gc; union { char *id; char *s; @@ -85,15 +85,13 @@ int token_buffer_max; int thistoken; /* object allocator */ - int free_objs; - int used_objs; + long free_objs; + long used_objs; + long max_objs; struct alisp_object *free_objs_list; struct alisp_object *used_objs_list; /* set object */ struct alisp_object_pair *setobjs_list; /* garbage collect */ - int gc_id; - /* alsa configuration */ - snd_config_t *root; /* configuration root */ - snd_config_t *node; /* result */ + unsigned char gc_id; }; Index: alisp_snd.c =================================================================== RCS file: /cvsroot/alsa/alsa-lib/src/alisp/alisp_snd.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- alisp_snd.c 1 Aug 2003 18:21:20 -0000 1.4 +++ alisp_snd.c 3 Aug 2003 20:36:54 -0000 1.5 @@ -30,6 +30,13 @@ * helper functions */ +static inline int get_integer(struct alisp_object * obj) +{ + if (obj->type == ALISP_OBJ_INTEGER) + return obj->value.i; + return 0; +} + static inline const void *get_pointer(struct alisp_object * obj) { if (obj->type == ALISP_OBJ_POINTER) @@ -137,6 +144,7 @@ return lexpr; } +#if 0 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 * p1; @@ -160,6 +168,25 @@ 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; + return lexpr; +} static inline struct alisp_object * new_result(struct alisp_instance * instance, int err) { @@ -281,7 +308,7 @@ prefix1 = "ctl"; else return &alsa_lisp_nil; - args = eval(instance, args); + args = eval(instance, car(args)); handle = (void *)get_ptr(args, prefix1); if (handle == NULL) return &alsa_lisp_nil; @@ -301,7 +328,7 @@ prefix1 = "hctl_elem"; else return &alsa_lisp_nil; - args = eval(instance, args); + args = eval(instance, car(args)); handle = (void *)get_ptr(args, item->prefix); if (handle == NULL) return &alsa_lisp_nil; @@ -313,7 +340,7 @@ { void *handle; - args = eval(instance, args); + args = eval(instance, car(args)); handle = (void *)get_ptr(args, item->prefix); if (handle == NULL) return &alsa_lisp_nil; @@ -324,7 +351,7 @@ { int val, err; - args = eval(instance, args); + args = eval(instance, car(args)); if (args->type != ALISP_OBJ_INTEGER) return &alsa_lisp_nil; val = args->value.i; @@ -336,7 +363,7 @@ { int err; - args = eval(instance, args); + args = eval(instance, car(args)); if (args->type != ALISP_OBJ_STRING && args->type != ALISP_OBJ_IDENTIFIER) return &alsa_lisp_nil; err = ((snd_int_str_t)item->xfunc)(args->value.s); @@ -348,7 +375,7 @@ int err; char *str; - args = eval(instance, args); + args = eval(instance, car(args)); if (args->type != ALISP_OBJ_INTEGER) return &alsa_lisp_nil; err = ((snd_int_int_strp_t)item->xfunc)(args->value.i, &str); @@ -362,7 +389,7 @@ snd_ctl_card_info_t *info; int err; - args = eval(instance, args); + args = eval(instance, car(args)); handle = (snd_ctl_t *)get_ptr(args, item->prefix); if (handle == NULL) return &alsa_lisp_nil; @@ -393,6 +420,55 @@ return cons; } +static int parse_ctl_elem_id(struct alisp_object * cons, snd_ctl_elem_id_t * id) +{ + struct alisp_object *p1; + const char *xid; + + if (cons == NULL) + return -ENOMEM; + snd_ctl_elem_id_clear(id); + id->numid = 0; + do { + p1 = car(cons); + if (p1->type == ALISP_OBJ_CONS) { + xid = get_string(p1->value.c.car, NULL); + printf("id = '%s'\n", xid); + if (xid == NULL) { + /* noop */ + } else if (!strcmp(xid, "numid")) { + snd_ctl_elem_id_set_numid(id, get_integer(p1->value.c.cdr)); + } else if (!strcmp(xid, "iface")) { + snd_ctl_elem_id_set_interface(id, snd_config_get_ctl_iface_ascii(get_string(p1->value.c.cdr, "0"))); + } else if (!strcmp(xid, "dev")) { + snd_ctl_elem_id_set_device(id, get_integer(p1->value.c.cdr)); + } else if (!strcmp(xid, "subdev")) { + snd_ctl_elem_id_set_subdevice(id, get_integer(p1->value.c.cdr)); + } else if (!strcmp(xid, "name")) { + snd_ctl_elem_id_set_name(id, get_string(p1->value.c.cdr, "?")); + } else if (!strcmp(xid, "index")) { + snd_ctl_elem_id_set_index(id, get_integer(p1->value.c.cdr)); + } + } + cons = cdr(cons); + } while (cons != &alsa_lisp_nil); + return 0; +} + +static struct alisp_object * FA_hctl_find_elem(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args) +{ + snd_hctl_t *handle; + snd_ctl_elem_id_t *id; + + handle = (snd_hctl_t *)get_ptr(car(args), item->prefix); + if (handle == NULL) + return &alsa_lisp_nil; + snd_ctl_elem_id_alloca(&id); + if (parse_ctl_elem_id(eval(instance, car(cdr(args))), id) < 0) + return &alsa_lisp_nil; + return new_result4(instance, "hctl_elem", snd_hctl_find_elem(handle, id)); +} + static struct alisp_object * FA_hctl_elem_info(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args) { snd_hctl_elem_t *handle; @@ -402,7 +478,7 @@ snd_ctl_elem_type_t type; int err; - args = eval(instance, args); + args = eval(instance, car(args)); handle = (snd_hctl_elem_t *)get_ptr(args, item->prefix); if (handle == NULL) return &alsa_lisp_nil; @@ -426,26 +502,164 @@ p1 = add_cons(instance, p1, 1, "isowner", new_integer(instance, snd_ctl_elem_info_is_owner(info))); p1 = add_cons(instance, p1, 1, "owner", new_integer(instance, snd_ctl_elem_info_get_owner(info))); p1 = add_cons(instance, p1, 1, "count", new_integer(instance, snd_ctl_elem_info_get_count(info))); - if (type == SND_CTL_ELEM_TYPE_ENUMERATED) { + err = snd_ctl_elem_info_get_dimensions(info); + if (err > 0) { + int idx; + p1 = add_cons(instance, p1, 1, "dimensions", p2 = new_object(instance, ALISP_OBJ_CONS)); + for (idx = 0; idx < err; idx++) + p2 = add_cons2(instance, p2, idx > 0, new_integer(instance, snd_ctl_elem_info_get_dimension(info, idx))); + } + switch (type) { + case SND_CTL_ELEM_TYPE_ENUMERATED: { unsigned int items, item; items = snd_ctl_elem_info_get_items(info); - p1 = add_cons(instance, p1, 1, "items", new_integer(instance, items)); - p1 = add_cons(instance, p1, 1, "inames", p2 = new_object(instance, ALISP_OBJ_CONS)); + p1 = add_cons(instance, p1, 1, "items", p2 = new_object(instance, ALISP_OBJ_CONS)); for (item = 0; item < items; item++) { snd_ctl_elem_info_set_item(info, item); err = snd_hctl_elem_info(handle, info); if (err < 0) { - p2 = add_cons1(instance, p2, item > 0, item, &alsa_lisp_nil); + p2 = add_cons2(instance, p2, item, &alsa_lisp_nil); } else { - p2 = add_cons1(instance, p2, item > 0, item, new_string(instance, snd_ctl_elem_info_get_item_name(info))); + p2 = add_cons2(instance, p2, item, new_string(instance, snd_ctl_elem_info_get_item_name(info))); } } + break; + } + case SND_CTL_ELEM_TYPE_INTEGER: + p1 = add_cons(instance, p1, 1, "min", new_integer(instance, snd_ctl_elem_info_get_min(info))); + p1 = add_cons(instance, p1, 1, "max", new_integer(instance, snd_ctl_elem_info_get_max(info))); + p1 = add_cons(instance, p1, 1, "step", new_integer(instance, snd_ctl_elem_info_get_step(info))); + break; + case SND_CTL_ELEM_TYPE_INTEGER64: + p1 = add_cons(instance, p1, 1, "min64", new_float(instance, snd_ctl_elem_info_get_min64(info))); + p1 = add_cons(instance, p1, 1, "max64", new_float(instance, snd_ctl_elem_info_get_max64(info))); + p1 = add_cons(instance, p1, 1, "step64", new_float(instance, snd_ctl_elem_info_get_step64(info))); + break; + default: + break; } if (p1 == NULL) return NULL; return lexpr; } +static struct alisp_object * FA_hctl_elem_read(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args) +{ + snd_hctl_elem_t *handle; + struct alisp_object * lexpr, * p1 = NULL, * obj; + snd_ctl_elem_info_t *info; + snd_ctl_elem_value_t *value; + snd_ctl_elem_type_t type; + unsigned int idx, count; + int err; + + args = eval(instance, car(args)); + handle = (snd_hctl_elem_t *)get_ptr(args, item->prefix); + if (handle == NULL) + return &alsa_lisp_nil; + snd_ctl_elem_info_alloca(&info); + snd_ctl_elem_value_alloca(&value); + err = snd_hctl_elem_info(handle, info); + if (err >= 0) + err = snd_hctl_elem_read(handle, value); + lexpr = new_lexpr(instance, err); + if (err < 0) + return lexpr; + type = snd_ctl_elem_info_get_type(info); + count = snd_ctl_elem_info_get_count(info); + if (type == SND_CTL_ELEM_TYPE_IEC958) { + count = sizeof(snd_aes_iec958_t); + type = SND_CTL_ELEM_TYPE_BYTES; + } + for (idx = 0; idx < count; idx++) { + switch (type) { + case SND_CTL_ELEM_TYPE_BOOLEAN: + obj = new_integer(instance, snd_ctl_elem_value_get_boolean(value, idx)); + break; + case SND_CTL_ELEM_TYPE_INTEGER: + obj = new_integer(instance, snd_ctl_elem_value_get_integer(value, idx)); + break; + case SND_CTL_ELEM_TYPE_INTEGER64: + obj = new_integer(instance, snd_ctl_elem_value_get_integer64(value, idx)); + break; + case SND_CTL_ELEM_TYPE_ENUMERATED: + obj = new_integer(instance, snd_ctl_elem_value_get_enumerated(value, idx)); + break; + case SND_CTL_ELEM_TYPE_BYTES: + obj = new_integer(instance, snd_ctl_elem_value_get_byte(value, idx)); + break; + default: + obj = NULL; + break; + } + if (idx == 0) { + p1 = add_cons2(instance, lexpr->value.c.cdr, 0, obj); + } else { + p1 = add_cons2(instance, p1, 1, obj); + } + } + if (p1 == NULL) + return &alsa_lisp_nil; + return lexpr; +} + +static struct alisp_object * FA_hctl_elem_write(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args) +{ + snd_hctl_elem_t *handle; + struct alisp_object * p1 = NULL, * obj; + snd_ctl_elem_info_t *info; + snd_ctl_elem_value_t *value; + snd_ctl_elem_type_t type; + unsigned int idx, count; + int err; + + p1 = car(cdr(args)); + args = eval(instance, car(args)); + handle = (snd_hctl_elem_t *)get_ptr(args, item->prefix); + if (handle == NULL) + return &alsa_lisp_nil; + snd_ctl_elem_info_alloca(&info); + snd_ctl_elem_value_alloca(&value); + err = snd_hctl_elem_info(handle, info); + if (err < 0) + return new_result(instance, err); + type = snd_ctl_elem_info_get_type(info); + count = snd_ctl_elem_info_get_count(info); + if (type == SND_CTL_ELEM_TYPE_IEC958) { + count = sizeof(snd_aes_iec958_t); + type = SND_CTL_ELEM_TYPE_BYTES; + } + idx = -1; + do { + if (++idx >= count) + break; + obj = car(p1); + switch (type) { + case SND_CTL_ELEM_TYPE_BOOLEAN: + snd_ctl_elem_value_set_boolean(value, idx, get_integer(obj)); + break; + case SND_CTL_ELEM_TYPE_INTEGER: + snd_ctl_elem_value_set_integer(value, idx, get_integer(obj)); + break; + case SND_CTL_ELEM_TYPE_INTEGER64: + snd_ctl_elem_value_set_integer64(value, idx, get_integer(obj)); + break; + case SND_CTL_ELEM_TYPE_ENUMERATED: + snd_ctl_elem_value_set_enumerated(value, idx, get_integer(obj)); + break; + case SND_CTL_ELEM_TYPE_BYTES: + snd_ctl_elem_value_set_byte(value, idx, get_integer(obj)); + break; + default: + obj = NULL; + break; + } + p1 = cdr(p1); + } while (p1 != &alsa_lisp_nil); + err = snd_hctl_elem_write(handle, value); + return new_result(instance, err); +} + /* * main code */ @@ -462,6 +676,9 @@ { "hctl_elem_info", &FA_hctl_elem_info, (void *)&snd_hctl_elem_info, "hctl_elem" }, { "hctl_elem_next", &FA_p_p, (void *)&snd_hctl_elem_next, "hctl_elem" }, { "hctl_elem_prev", &FA_p_p, (void *)&snd_hctl_elem_prev, "hctl_elem" }, + { "hctl_elem_read", &FA_hctl_elem_read, (void *)&snd_hctl_elem_read, "hctl_elem" }, + { "hctl_elem_write", &FA_hctl_elem_write, (void *)&snd_hctl_elem_write, "hctl_elem" }, + { "hctl_find_elem", &FA_hctl_find_elem, (void *)&snd_hctl_find_elem, "hctl" }, { "hctl_first_elem", &FA_p_p, (void *)&snd_hctl_first_elem, "hctl" }, { "hctl_free", &FA_int_p, (void *)&snd_hctl_free, "hctl" }, { "hctl_last_elem", &FA_p_p, (void *)&snd_hctl_last_elem, "hctl" }, @@ -484,7 +701,7 @@ p1 = eval(instance, car(args)); if (p1->type != ALISP_OBJ_IDENTIFIER && p1->type != ALISP_OBJ_STRING) return &alsa_lisp_nil; - p2 = car(cdr(args)); + p2 = cdr(args); key.name = p1->value.s; if ((item = bsearch(&key, acall_table, sizeof acall_table / sizeof acall_table[0], ------------------------------------------------------- This SF.Net email sponsored by: Free pre-built ASP.NET sites including Data Reports, E-commerce, Portals, and Forums are available now. Download today and enter to win an XBOX or Visual Studio .NET. http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01 _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog