-(setq ctl (acall 'ctl_open ('default nil)))
-(setq ctl (car (cdr ctl)))
-(setq hctl (acall 'hctl_open_ctl ctl))
-(setq hctl (car (cdr hctl)))
-(setq hctl (acall 'hctl_close hctl))
+(setq card (acall 'card_next -1))
+(setq card (aresult card))
+(while (>= card 0)
+ (progn
+ (princ "found card: " card "\n")
+ (princ " name : " (aresult (acall 'card_get_name card)) "\n")
+ (princ " longname: " (aresult (acall 'card_get_longname card)) "\n")
+ (setq card (acall 'card_next card))
+ (setq card (aresult card))
+ )
+)
+
+(princ "card_get_index test (SI7018): " (acall 'card_get_index "SI7018") "\n")
+(princ "card_get_index test (ABCD): " (acall 'card_get_index "ABCD") "\n")
(setq hctl (acall 'hctl_open ('default nil)))
-(if (= (car hctl) 0)
+(if (= (aerror hctl) 0)
(progn
(princ "open success: " hctl "\n")
- (setq hctl (car (cdr hctl)))
+ (setq hctl (ahandle hctl))
(princ "open hctl: " hctl "\n")
(setq hctl (acall 'hctl_close hctl))
(if (= hctl 0)
)
(setq ctl (acall 'ctl_open ('default nil)))
-(if (= (car ctl) 0)
+(if (= (aerror ctl) 0)
(progn
(princ "ctl open success: " ctl "\n")
- (setq ctl (car (cdr ctl)))
+ (setq ctl (ahandle ctl))
+ (setq info (aresult (acall 'ctl_card_info ctl)))
+ (princ "ctl card info: " info "\n")
+ (princ "ctl card info (mixername): " (cdr (assq "mixername" info)) "\n")
(setq hctl (acall 'hctl_open_ctl ctl))
- (if (= (car hctl) 0)
+ (if (= (aerror hctl) 0)
(progn
(princ "hctl open success: " hctl "\n")
- (setq hctl (car (cdr hctl)))
+ (setq hctl (ahandle hctl))
(princ "open hctl: " hctl "\n")
(setq hctl (acall 'hctl_close hctl))
(if (= hctl 0)
)
(progn
(princ "hctl open failed: " ctl "\n")
+ (acall 'ctl_close ctl)
)
)
)
return get_pointer(cdr(obj));
}
+static struct alisp_object * new_lexpr(struct alisp_instance * instance, int err)
+{
+ struct alisp_object * lexpr;
+
+ lexpr = new_object(instance, ALISP_OBJ_CONS);
+ if (lexpr == NULL)
+ return NULL;
+ lexpr->value.c.car = new_integer(instance, err);
+ if (lexpr->value.c.car == NULL)
+ return NULL;
+ lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
+ if (lexpr->value.c.cdr == NULL)
+ return NULL;
+ 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)
+{
+ 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 = new_object(instance, ALISP_OBJ_CONS);
+ if ((p1 = p1->value.c.car) == NULL)
+ return NULL;
+ p1->value.c.car = new_string(instance, id);
+ if (p1->value.c.car == NULL)
+ return NULL;
+ p1->value.c.cdr = obj;
+ return lexpr;
+}
+
static inline struct alisp_object * new_result(struct alisp_instance * instance, int err)
{
return new_integer(instance, err);
lexpr->value.c.car = new_integer(instance, err);
if (lexpr->value.c.car == NULL)
return NULL;
- p1 = lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
+ p1 = add_cons(instance, lexpr, 1, ptr_id, new_pointer(instance, ptr));
if (p1 == NULL)
return NULL;
- p1->value.c.car = new_object(instance, ALISP_OBJ_CONS);
- if ((p1 = p1->value.c.car) == NULL)
+ return lexpr;
+}
+
+static struct alisp_object * new_result2(struct alisp_instance * instance, int err, int val)
+{
+ struct alisp_object * lexpr, * p1;
+
+ if (err < 0)
+ val = 0;
+ lexpr = new_lexpr(instance, err);
+ if (lexpr == NULL)
return NULL;
- p1->value.c.car = new_string(instance, ptr_id);
+ p1 = lexpr->value.c.cdr;
+ p1->value.c.car = new_integer(instance, val);
if (p1->value.c.car == NULL)
return NULL;
- p1->value.c.cdr = new_pointer(instance, ptr);
- if (p1->value.c.cdr == NULL)
+ return lexpr;
+}
+
+static struct alisp_object * new_result3(struct alisp_instance * instance, int err, const char *str)
+{
+ struct alisp_object * lexpr, * p1;
+
+ if (err < 0)
+ str = "";
+ lexpr = new_lexpr(instance, err);
+ if (lexpr == NULL)
+ return NULL;
+ p1 = lexpr->value.c.cdr;
+ p1->value.c.car = new_string(instance, str);
+ if (p1->value.c.car == NULL)
return NULL;
return lexpr;
}
typedef int (*snd_xxx_open_t)(void **rctl, const char *name, int mode);
typedef int (*snd_xxx_open1_t)(void **rctl, void *handle);
typedef int (*snd_xxx_close_t)(void **rctl);
+typedef int (*snd_int_intp_t)(int *val);
+typedef int (*snd_int_str_t)(const char *str);
+typedef int (*snd_int_int_strp_t)(int val, char **str);
static struct alisp_object * FA_xxx_open(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
{
return new_result(instance, ((snd_xxx_close_t)item->xfunc)(handle));
}
+static struct alisp_object * FA_int_intp(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
+{
+ int val, err;
+
+ args = eval(instance, args);
+ if (args->type != ALISP_OBJ_INTEGER)
+ return &alsa_lisp_nil;
+ val = args->value.i;
+ err = ((snd_int_intp_t)item->xfunc)(&val);
+ return new_result2(instance, err, val);
+}
+
+static struct alisp_object * FA_int_str(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
+{
+ int err;
+
+ args = eval(instance, 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);
+ return new_result(instance, err);
+}
+
+static struct alisp_object * FA_int_int_strp(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
+{
+ int err;
+ char *str;
+
+ args = eval(instance, args);
+ if (args->type != ALISP_OBJ_INTEGER)
+ return &alsa_lisp_nil;
+ err = ((snd_int_int_strp_t)item->xfunc)(args->value.i, &str);
+ return new_result3(instance, err, str);
+}
+
+static struct alisp_object * FA_card_info(struct alisp_instance * instance, struct acall_table * item, struct alisp_object * args)
+{
+ snd_ctl_t *handle;
+ struct alisp_object * lexpr, * p1;
+ snd_ctl_card_info_t *info;
+ int err;
+
+ args = eval(instance, args);
+ handle = (snd_ctl_t *)get_ptr(args, item->prefix);
+ if (handle == NULL)
+ return &alsa_lisp_nil;
+ snd_ctl_card_info_alloca(&info);
+ err = snd_ctl_card_info(handle, info);
+ lexpr = new_lexpr(instance, err);
+ if (err < 0)
+ return lexpr;
+ p1 = add_cons(instance, lexpr->value.c.cdr, 0, "id", new_string(instance, snd_ctl_card_info_get_id(info)));
+ p1 = add_cons(instance, p1, 1, "driver", new_string(instance, snd_ctl_card_info_get_driver(info)));
+ p1 = add_cons(instance, p1, 1, "name", new_string(instance, snd_ctl_card_info_get_name(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, "components", new_string(instance, snd_ctl_card_info_get_components(info)));
+ if (p1 == NULL)
+ return NULL;
+ return lexpr;
+}
+
/*
* main code
*/
static struct acall_table acall_table[] = {
+ { "card_get_index", &FA_int_str, (void *)snd_card_get_index, NULL },
+ { "card_get_longname", &FA_int_int_strp, (void *)snd_card_get_longname, NULL },
+ { "card_get_name", &FA_int_int_strp, (void *)snd_card_get_name, NULL },
+ { "card_next", &FA_int_intp, (void *)&snd_card_next, NULL },
+ { "ctl_card_info", &FA_card_info, NULL, "ctl" },
{ "ctl_close", &FA_xxx_close, (void *)&snd_ctl_close, "ctl" },
{ "ctl_open", &FA_xxx_open, (void *)&snd_ctl_open, "ctl" },
{ "hctl_close", &FA_xxx_close, (void *)&snd_hctl_close, "hctl" },
return &alsa_lisp_nil;
}
+static struct alisp_object * F_ahandle(struct alisp_instance *instance ATTRIBUTE_UNUSED, struct alisp_object * args)
+{
+ return car(cdr(eval(instance, car(args))));
+}
+
+static struct alisp_object * F_aerror(struct alisp_instance *instance, struct alisp_object * args)
+{
+ args = car(eval(instance, car(args)));
+ if (args == &alsa_lisp_nil)
+ return new_integer(instance, SND_ERROR_ALISP_NIL);
+ return args;
+}
+
static struct intrinsic snd_intrinsics[] = {
{ "acall", F_acall },
+ { "aerror", F_aerror },
+ { "ahandle", F_ahandle },
+ { "aresult", F_ahandle },
};