diff options
author | Tom Rondeau | 2012-12-05 12:45:30 -0500 |
---|---|---|
committer | Tom Rondeau | 2012-12-05 12:45:30 -0500 |
commit | 3ccdc6cd9469894dbf3ce34544b4ec21764456de (patch) | |
tree | d0673469e3eb694a43486b40bedba85a585a8095 /gnuradio-core | |
parent | 611959d2f9af4595200186acf85a64f5bf318fac (diff) | |
download | gnuradio-3ccdc6cd9469894dbf3ce34544b4ec21764456de.tar.gz gnuradio-3ccdc6cd9469894dbf3ce34544b4ec21764456de.tar.bz2 gnuradio-3ccdc6cd9469894dbf3ce34544b4ec21764456de.zip |
core: Update metadata file sink to better handle tags in the right spot.
Diffstat (limited to 'gnuradio-core')
-rw-r--r-- | gnuradio-core/src/lib/io/gr_file_meta_sink.cc | 46 | ||||
-rw-r--r-- | gnuradio-core/src/lib/io/gr_file_meta_sink.h | 1 |
2 files changed, 43 insertions, 4 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 ff35a01fc..e2b892efd 100644 --- a/gnuradio-core/src/lib/io/gr_file_meta_sink.cc +++ b/gnuradio-core/src/lib/io/gr_file_meta_sink.cc @@ -213,13 +213,53 @@ gr_file_meta_sink::work(int noutput_items, } } else { - update_last_header(); - if(update_header(itr->key, itr->value)) { - write_and_update(); + int item_offset = (int)(itr->offset - abs_N); + + std::cerr << "New tag found with absolute index: " << itr->offset + << " and relative index: " << item_offset << std::endl; + std::cerr << "Current segment size: " << d_total_seg_size << std::endl; + std::cerr << "Tag key: " << pmt_symbol_to_string(itr->key) << std::endl; + std::cerr << "Tag Val: "; + pmt_print(itr->value); + std::cerr << std::endl; + + // Write date to file up to the next tag location + while(nwritten < item_offset) { + size_t towrite = std::min(d_max_seg_size - d_total_seg_size, + (size_t)(item_offset - nwritten)); + int count = fwrite(inbuf, d_itemsize, towrite, d_fp); + if(count == 0) // FIXME add error handling + break; + nwritten += count; + inbuf += count * d_itemsize; + + d_total_seg_size += count; + + // Only add a new header if we are not at the position of the + // next tag + if((d_total_seg_size == d_max_seg_size) && + (nwritten < item_offset)) { + update_last_header(); + write_and_update(); + d_total_seg_size = 0; + } + } + + if(d_total_seg_size > 0) { + update_last_header(); + if(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(); } } } + // Finish up the rest of the data after tags while(nwritten < noutput_items) { size_t towrite = std::min(d_max_seg_size - d_total_seg_size, (size_t)(noutput_items - nwritten)); 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 f02c2c4ad..ed3a9f1db 100644 --- a/gnuradio-core/src/lib/io/gr_file_meta_sink.h +++ b/gnuradio-core/src/lib/io/gr_file_meta_sink.h @@ -122,7 +122,6 @@ class GR_CORE_API gr_file_meta_sink : public gr_sync_block, public gr_file_sink_ bool update_header(pmt_t key, pmt_t value); void update_last_header(); void write_and_update(); - uint64_t get_last_header_loc(); public: ~gr_file_meta_sink(); |