22 #include "libsigrokdecode-internal.h" 66 *sess = g_malloc(
sizeof(
struct srd_session));
67 (*sess)->session_id = ++max_session_id;
68 (*sess)->di_list = (*sess)->callbacks = NULL;
71 sessions = g_slist_append(sessions, *sess);
73 srd_dbg(
"Creating session %d.", (*sess)->session_id);
99 srd_dbg(
"Calling start() of all instances in session %d.", sess->session_id);
103 for (d = sess->di_list; d; d = d->next) {
105 if ((ret = srd_inst_start(di)) !=
SRD_OK)
119 PyGILState_STATE gstate;
125 gstate = PyGILState_Ensure();
127 if (PyObject_HasAttrString(di->
py_inst,
"metadata")) {
128 py_ret = PyObject_CallMethod(di->
py_inst,
"metadata",
"lK",
130 (
unsigned long long)g_variant_get_uint64(data));
134 PyGILState_Release(gstate);
137 for (l = di->
next_di; l; l = l->next) {
139 if ((ret = srd_inst_send_meta(next_di, key, data)) !=
SRD_OK)
169 srd_err(
"Invalid key.");
174 srd_err(
"Invalid value.");
181 srd_err(
"Unknown config key %d.", key);
184 if (!g_variant_is_of_type(data, G_VARIANT_TYPE_UINT64)) {
185 srd_err(
"Invalid value type: expected uint64, got %s",
186 g_variant_get_type_string(data));
190 srd_dbg(
"Setting session %d samplerate to %"G_GUINT64_FORMAT
".",
191 sess->session_id, g_variant_get_uint64(data));
194 for (l = sess->di_list; l; l = l->next) {
195 if ((ret = srd_inst_send_meta(l->data, key, data)) !=
SRD_OK)
199 g_variant_unref(data);
272 for (d = sess->di_list; d; d = d->next) {
273 if ((ret = srd_inst_decode(d->data, abs_start_samplenum,
274 abs_end_samplenum, inbuf, inbuflen, unitsize)) !=
SRD_OK)
298 for (d = sess->di_list; d; d = d->next) {
299 ret = srd_inst_send_eof(d->data);
337 for (d = sess->di_list; d; d = d->next) {
338 ret = srd_inst_terminate_reset(d->data);
364 session_id = sess->session_id;
366 srd_inst_free_all(sess);
368 g_slist_free_full(sess->callbacks, g_free);
369 sessions = g_slist_remove(sessions, sess);
372 srd_dbg(
"Destroyed session %d.", session_id);
401 srd_dbg(
"Registering new callback for output type %s.",
402 output_type_name(output_type));
408 sess->callbacks = g_slist_append(sess->callbacks, pd_cb);
424 for (l = sess->callbacks; l; l = l->next) {
uint64_t inbuflen
Length (in bytes) of the input sample buffer.
void(* srd_pd_output_callback)(struct srd_proto_data *pdata, void *cb_data)
int srd_session_start(struct srd_session *sess)
Start a decoding session.
uint64_t abs_start_samplenum
Absolute start sample number.
int srd_session_send(struct srd_session *sess, uint64_t abs_start_samplenum, uint64_t abs_end_samplenum, const uint8_t *inbuf, uint64_t inbuflen, uint64_t unitsize)
Send a chunk of logic sample data to a running decoder session.
int srd_session_destroy(struct srd_session *sess)
Destroy a decoding session.
int srd_session_send_eof(struct srd_session *sess)
Communicate the end of the stream of sample data to the session.
int srd_session_new(struct srd_session **sess)
Create a decoding session.
const uint8_t * inbuf
Pointer to the buffer/chunk of input samples.
int srd_pd_output_callback_add(struct srd_session *sess, int output_type, srd_pd_output_callback cb, void *cb_data)
Register/add a decoder output callback function.
uint64_t abs_end_samplenum
Absolute end sample number.
struct srd_session * sess
srd_pd_output_callback cb
int srd_session_metadata_set(struct srd_session *sess, int key, GVariant *data)
Set a metadata configuration key in a session.
The public libsigrokdecode header file to be used by frontends.
int srd_session_terminate_reset(struct srd_session *sess)
Terminate currently executing decoders in a session, reset internal state.