From d20597e07c05cce84f80535b4ec35cfb1cd59038 Mon Sep 17 00:00:00 2001 From: Tormod Volden Date: Fri, 16 Aug 2024 14:21:43 +0200 Subject: [PATCH 1/3] hctltest1.py: Skip read/write if no values in element Signed-off-by: Tormod Volden --- test/hctltest1.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/hctltest1.py b/test/hctltest1.py index 9962af6..88b9dfb 100755 --- a/test/hctltest1.py +++ b/test/hctltest1.py @@ -32,6 +32,8 @@ def value(element): if a.startswith('__'): continue print(' %s: %s' % (a, getattr(value, a))) + if info.count == 0: + return values = value.get_tuple(info.type, info.count) print(' Values:', values) value.set_tuple(info.type, values) From 3b720b5654d82b63dd1e395672c105b24e428c33 Mon Sep 17 00:00:00 2001 From: Tormod Volden Date: Fri, 16 Aug 2024 14:20:09 +0200 Subject: [PATCH 2/3] alsahcontrol.c: Use PyBytes for IEC958 values Signed-off-by: Tormod Volden --- pyalsa/alsahcontrol.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/pyalsa/alsahcontrol.c b/pyalsa/alsahcontrol.c index 2d7d627..f15ccce 100644 --- a/pyalsa/alsahcontrol.c +++ b/pyalsa/alsahcontrol.c @@ -1052,13 +1052,13 @@ pyalsahcontrolvalue_get1(struct pyalsahcontrolvalue *self, PyObject *args, int l } snd_ctl_elem_value_get_iec958(self->value, iec958); if (!list) { - PyTuple_SET_ITEM(t, 0, PyUnicode_FromStringAndSize((char *)iec958->status, sizeof(iec958->status))); - PyTuple_SET_ITEM(t, 1, PyUnicode_FromStringAndSize((char *)iec958->subcode, sizeof(iec958->subcode))); - PyTuple_SET_ITEM(t, 2, PyUnicode_FromStringAndSize((char *)iec958->dig_subframe, sizeof(iec958->dig_subframe))); + PyTuple_SET_ITEM(t, 0, PyBytes_FromStringAndSize((char *)iec958->status, sizeof(iec958->status))); + PyTuple_SET_ITEM(t, 1, PyBytes_FromStringAndSize((char *)iec958->subcode, sizeof(iec958->subcode))); + PyTuple_SET_ITEM(t, 2, PyBytes_FromStringAndSize((char *)iec958->dig_subframe, sizeof(iec958->dig_subframe))); } else { - PyList_SetItem(t, 0, PyUnicode_FromStringAndSize((char *)iec958->status, sizeof(iec958->status))); - PyList_SetItem(t, 1, PyUnicode_FromStringAndSize((char *)iec958->subcode, sizeof(iec958->subcode))); - PyList_SetItem(t, 2, PyUnicode_FromStringAndSize((char *)iec958->dig_subframe, sizeof(iec958->dig_subframe))); + PyList_SetItem(t, 0, PyBytes_FromStringAndSize((char *)iec958->status, sizeof(iec958->status))); + PyList_SetItem(t, 1, PyBytes_FromStringAndSize((char *)iec958->subcode, sizeof(iec958->subcode))); + PyList_SetItem(t, 2, PyBytes_FromStringAndSize((char *)iec958->dig_subframe, sizeof(iec958->dig_subframe))); } free(iec958); break; @@ -1176,30 +1176,33 @@ pyalsahcontrolvalue_settuple(struct pyalsahcontrolvalue *self, PyObject *args) Py_DECREF(t); Py_RETURN_NONE; } - len = 0; v = !list ? PyTuple_GET_ITEM(t, 0) : PyList_GetItem(t, 0); Py_INCREF(v); - if (PyBytes_AsStringAndSize(v, &str, &len)) + if (!PyBytes_Check(v)) goto err1; + len = PyBytes_Size(v); if (len > (Py_ssize_t)sizeof(iec958->status)) - len = sizeof(iec958->status); - memcpy(iec958->status, str, len); - len = 0; + len = (Py_ssize_t)sizeof(iec958->status); + str = PyBytes_AsString(v); + memcpy(iec958->status, str, (size_t)len); v = !list ? PyTuple_GET_ITEM(t, 1) : PyList_GetItem(t, 1); Py_INCREF(v); - if (PyBytes_AsStringAndSize(v, &str, &len)) + if (!PyBytes_Check(v)) goto err1; + len = PyBytes_Size(v); if (len > (Py_ssize_t)sizeof(iec958->subcode)) - len = sizeof(iec958->subcode); - memcpy(iec958->subcode, str, len); - len = 0; + len = (Py_ssize_t)sizeof(iec958->subcode); + str = PyBytes_AsString(v); + memcpy(iec958->subcode, str, (size_t)len); v = !list ? PyTuple_GET_ITEM(t, 2) : PyList_GetItem(t, 2); Py_INCREF(v); - if (PyBytes_AsStringAndSize(v, &str, &len)) + if (!PyBytes_Check(v)) goto err1; + len = PyBytes_Size(v); if (len > (Py_ssize_t)sizeof(iec958->dig_subframe)) - len = sizeof(iec958->dig_subframe); - memcpy(iec958->dig_subframe, str, len); + len = (Py_ssize_t)sizeof(iec958->dig_subframe); + str = PyBytes_AsString(v); + memcpy(iec958->dig_subframe, str, (size_t)len); free(iec958); break; err1: From a777fd27493b2cc8a9aae7e82f3a0b23dffc2f81 Mon Sep 17 00:00:00 2001 From: Tormod Volden Date: Fri, 16 Aug 2024 17:47:15 +0200 Subject: [PATCH 3/3] alsahcontrol.c: Actually set IEC958 values with Value.set_tuple() The IEC958 structure was prepared, but not actually written. Signed-off-by: Tormod Volden --- pyalsa/alsahcontrol.c | 1 + 1 file changed, 1 insertion(+) diff --git a/pyalsa/alsahcontrol.c b/pyalsa/alsahcontrol.c index f15ccce..70e3476 100644 --- a/pyalsa/alsahcontrol.c +++ b/pyalsa/alsahcontrol.c @@ -1203,6 +1203,7 @@ pyalsahcontrolvalue_settuple(struct pyalsahcontrolvalue *self, PyObject *args) len = (Py_ssize_t)sizeof(iec958->dig_subframe); str = PyBytes_AsString(v); memcpy(iec958->dig_subframe, str, (size_t)len); + snd_ctl_elem_value_set_iec958(self->value, iec958); free(iec958); break; err1: