]> sigrok.org Git - libsigrok.git/blobdiff - src/session.c
sr_packet_copy: Support SR_DF_ANALOG2.
[libsigrok.git] / src / session.c
index ad27a8152c610e35c1fa40d72f46214c82d48f56..eb381f5978e1e2a452e2e0c434b327299e1eaa6c 100644 (file)
@@ -18,6 +18,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -985,8 +986,8 @@ SR_PRIV int sr_session_source_add_internal(struct sr_session *session,
        return ret;
 }
 
-static int attach_fd_source(struct sr_session *session,
-               void *key, int fd, int events, int timeout,
+SR_PRIV int sr_session_fd_source_add(struct sr_session *session,
+               void *key, gintptr fd, int events, int timeout,
                sr_receive_data_callback cb, void *cb_data)
 {
        GSource *source;
@@ -1027,7 +1028,7 @@ SR_API int sr_session_source_add(struct sr_session *session, int fd,
                sr_err("Cannot create timer source without timeout.");
                return SR_ERR_ARG;
        }
-       return attach_fd_source(session, GINT_TO_POINTER(fd),
+       return sr_session_fd_source_add(session, GINT_TO_POINTER(fd),
                        fd, events, timeout, cb, cb_data);
 }
 
@@ -1054,7 +1055,7 @@ SR_API int sr_session_source_add_pollfd(struct sr_session *session,
                sr_err("%s: pollfd was NULL", __func__);
                return SR_ERR_ARG;
        }
-       return attach_fd_source(session, pollfd, pollfd->fd,
+       return sr_session_fd_source_add(session, pollfd, pollfd->fd,
                        pollfd->events, timeout, cb, cb_data);
 }
 
@@ -1093,7 +1094,7 @@ SR_API int sr_session_source_add_channel(struct sr_session *session,
        pollfd.fd = g_io_channel_unix_get_fd(channel);
        pollfd.events = events;
 #endif
-       return attach_fd_source(session, channel, pollfd.fd,
+       return sr_session_fd_source_add(session, channel, pollfd.fd,
                        pollfd.events, timeout, cb, cb_data);
 }
 
@@ -1247,6 +1248,8 @@ SR_PRIV int sr_packet_copy(const struct sr_datafeed_packet *packet,
        struct sr_datafeed_logic *logic_copy;
        const struct sr_datafeed_analog *analog;
        struct sr_datafeed_analog *analog_copy;
+       const struct sr_datafeed_analog2 *analog2;
+       struct sr_datafeed_analog2 *analog2_copy;
        uint8_t *payload;
 
        *copy = g_malloc0(sizeof(struct sr_datafeed_packet));
@@ -1284,10 +1287,29 @@ SR_PRIV int sr_packet_copy(const struct sr_datafeed_packet *packet,
                analog_copy->mq = analog->mq;
                analog_copy->unit = analog->unit;
                analog_copy->mqflags = analog->mqflags;
+               analog_copy->data = g_malloc(analog->num_samples * sizeof(float));
                memcpy(analog_copy->data, analog->data,
                                analog->num_samples * sizeof(float));
                (*copy)->payload = analog_copy;
                break;
+       case SR_DF_ANALOG2:
+               analog2 = packet->payload;
+               analog2_copy = g_malloc(sizeof(analog2));
+               analog2_copy->data = g_malloc(
+                               analog2->encoding->unitsize * analog2->num_samples);
+               memcpy(analog2_copy->data, analog2->data,
+                               analog2->encoding->unitsize * analog2->num_samples);
+               analog2_copy->num_samples = analog2->num_samples;
+               analog2_copy->encoding = g_memdup(analog2->encoding,
+                               sizeof(struct sr_analog_encoding));
+               analog2_copy->meaning = g_memdup(analog2->meaning,
+                               sizeof(struct sr_analog_meaning));
+               analog2_copy->meaning->channels = g_slist_copy(
+                               analog2->meaning->channels);
+               analog2_copy->spec = g_memdup(analog2->spec,
+                               sizeof(struct sr_analog_spec));
+               (*copy)->payload = analog2_copy;
+               break;
        default:
                sr_err("Unknown packet type %d", packet->type);
                return SR_ERR;