summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/lib/io
diff options
context:
space:
mode:
authorTom Rondeau <trondeau@vt.edu>2012-12-05 14:03:03 -0500
committerTom Rondeau <trondeau@vt.edu>2012-12-05 14:08:42 -0500
commite8cf359e43f533fd3309389e5d62642f3080ac15 (patch)
treebcb9b7e4c2425d0397983e8db746749443cfc629 /gnuradio-core/src/lib/io
parent17c3f992bcd7b671e4e8c0a9dd13c582d256ced9 (diff)
core: update to metadata files to grow the extras dictionary when any tag is seen.
Diffstat (limited to 'gnuradio-core/src/lib/io')
-rw-r--r--gnuradio-core/src/lib/io/gr_file_meta_sink.cc59
-rw-r--r--gnuradio-core/src/lib/io/gr_file_meta_sink.h2
2 files changed, 29 insertions, 32 deletions
diff --git a/gnuradio-core/src/lib/io/gr_file_meta_sink.cc b/gnuradio-core/src/lib/io/gr_file_meta_sink.cc
index f225e4409d..da3be80602 100644
--- a/gnuradio-core/src/lib/io/gr_file_meta_sink.cc
+++ b/gnuradio-core/src/lib/io/gr_file_meta_sink.cc
@@ -123,7 +123,7 @@ gr_file_meta_sink::write_header(pmt_t header, pmt_t extra)
}
}
-bool
+void
gr_file_meta_sink::update_header(pmt_t key, pmt_t value)
{
// Special handling caveat to transform rate from radio source into
@@ -133,16 +133,17 @@ gr_file_meta_sink::update_header(pmt_t key, pmt_t value)
value = pmt_from_double(d_samp_rate*d_relative_rate);
}
+ // If the tag is not part of the standard header, we put it into the
+ // extra data, which either updates the current dictionary or adds a
+ // new item.
if(pmt_dict_has_key(d_header, key)) {
d_header = pmt_dict_add(d_header, key, value);
- return true;
- }
- else if(pmt_dict_has_key(d_extra, key)) {
- d_extra = pmt_dict_add(d_extra, key, value);
- return true;
}
else {
- return false;
+ d_extra = pmt_dict_add(d_extra, key, value);
+ d_extra_size = pmt_serialize_str(d_extra).size();
+ d_header = pmt_dict_add(d_header, mp("strt"),
+ pmt_from_uint64(METADATA_HEADER_SIZE+d_extra_size));
}
}
@@ -154,11 +155,10 @@ gr_file_meta_sink::update_last_header()
size_t hdrlen = METADATA_HEADER_SIZE+d_extra_size;
size_t seg_size = d_itemsize*d_total_seg_size;
pmt_t s = pmt_from_uint64(seg_size);
- if(update_header(mp("size"), s)) {
- fseek(d_fp, -seg_size-hdrlen, SEEK_CUR);
- write_header(d_header, d_extra);
- fseek(d_fp, seg_size, SEEK_CUR);
- }
+ update_header(mp("size"), s);
+ fseek(d_fp, -seg_size-hdrlen, SEEK_CUR);
+ write_header(d_header, d_extra);
+ fseek(d_fp, seg_size, SEEK_CUR);
}
void
@@ -168,15 +168,14 @@ gr_file_meta_sink::write_and_update()
// based on current index + header size.
//uint64_t loc = get_last_header_loc();
pmt_t s = pmt_from_uint64(0);
- if(update_header(mp("size"), s)) {
- // If we have multiple tags on the same offset, this makes
- // sure we just overwrite the same header each time instead
- // of creating a new header per tag.
- s = pmt_from_uint64(METADATA_HEADER_SIZE + d_extra_size);
- if(update_header(mp("strt"), s)) {
- write_header(d_header, d_extra);
- }
- }
+ update_header(mp("size"), s);
+
+ // If we have multiple tags on the same offset, this makes
+ // sure we just overwrite the same header each time instead
+ // of creating a new header per tag.
+ s = pmt_from_uint64(METADATA_HEADER_SIZE + d_extra_size);
+ update_header(mp("strt"), s);
+ write_header(d_header, d_extra);
}
void
@@ -233,10 +232,9 @@ gr_file_meta_sink::work(int noutput_items,
// Special case where info is carried on the first tag, so we just
// overwrite the first header.
if(itr->offset == 0) {
- if(update_header(itr->key, itr->value)) {
- fseek(d_fp, 0, SEEK_SET);
- write_header(d_header, d_extra);
- }
+ update_header(itr->key, itr->value);
+ fseek(d_fp, 0, SEEK_SET);
+ write_header(d_header, d_extra);
}
else {
int item_offset = (int)(itr->offset - abs_N);
@@ -266,14 +264,13 @@ gr_file_meta_sink::work(int noutput_items,
if(d_total_seg_size > 0) {
update_last_header();
- if(update_header(itr->key, itr->value)) {
- write_and_update();
- d_total_seg_size = 0;
- }
+ update_header(itr->key, itr->value);
+ write_and_update();
+ d_total_seg_size = 0;
}
else {
- if(update_header(itr->key, itr->value))
- update_last_header();
+ update_header(itr->key, itr->value);
+ update_last_header();
}
}
}
diff --git a/gnuradio-core/src/lib/io/gr_file_meta_sink.h b/gnuradio-core/src/lib/io/gr_file_meta_sink.h
index efe00c4e6a..929c9634e2 100644
--- a/gnuradio-core/src/lib/io/gr_file_meta_sink.h
+++ b/gnuradio-core/src/lib/io/gr_file_meta_sink.h
@@ -120,7 +120,7 @@ class GR_CORE_API gr_file_meta_sink : public gr_sync_block, public gr_file_sink_
const std::string &extra_dict="");
void write_header(pmt_t header, pmt_t extra);
- bool update_header(pmt_t key, pmt_t value);
+ void update_header(pmt_t key, pmt_t value);
void update_last_header();
void write_and_update();
void update_rx_time();