summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'gnuradio-core/src/lib')
-rw-r--r--gnuradio-core/src/lib/io/CMakeLists.txt2
-rw-r--r--gnuradio-core/src/lib/io/gr_file_meta_sink.cc457
-rw-r--r--gnuradio-core/src/lib/io/gr_file_meta_sink.h169
-rw-r--r--gnuradio-core/src/lib/io/gr_file_meta_sink.i63
-rw-r--r--gnuradio-core/src/lib/io/gr_file_meta_source.cc427
-rw-r--r--gnuradio-core/src/lib/io/gr_file_meta_source.h126
-rw-r--r--gnuradio-core/src/lib/io/gr_file_meta_source.i45
-rw-r--r--gnuradio-core/src/lib/io/io.i4
8 files changed, 0 insertions, 1293 deletions
diff --git a/gnuradio-core/src/lib/io/CMakeLists.txt b/gnuradio-core/src/lib/io/CMakeLists.txt
index 1cbcd2daf..59ca06b5a 100644
--- a/gnuradio-core/src/lib/io/CMakeLists.txt
+++ b/gnuradio-core/src/lib/io/CMakeLists.txt
@@ -85,10 +85,8 @@ endif(ENABLE_PYTHON)
########################################################################
set(gr_core_io_triple_threats
gr_file_sink
- gr_file_meta_sink
gr_file_sink_base
gr_file_source
- gr_file_meta_source
gr_file_descriptor_sink
gr_file_descriptor_source
gr_message_debug
diff --git a/gnuradio-core/src/lib/io/gr_file_meta_sink.cc b/gnuradio-core/src/lib/io/gr_file_meta_sink.cc
deleted file mode 100644
index ab0acbdb4..000000000
--- a/gnuradio-core/src/lib/io/gr_file_meta_sink.cc
+++ /dev/null
@@ -1,457 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2012 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- *
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU Radio; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <gr_file_meta_sink.h>
-#include <gr_io_signature.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <gruel/thread.h>
-#include <stdexcept>
-
-// win32 (mingw/msvc) specific
-#ifdef HAVE_IO_H
-#include <io.h>
-#endif
-#ifdef O_BINARY
-#define OUR_O_BINARY O_BINARY
-#else
-#define OUR_O_BINARY 0
-#endif
-
-// should be handled via configure
-#ifdef O_LARGEFILE
-#define OUR_O_LARGEFILE O_LARGEFILE
-#else
-#define OUR_O_LARGEFILE 0
-#endif
-
-gr_file_meta_sink_sptr
-gr_make_file_meta_sink(size_t itemsize, const std::string &filename,
- double samp_rate, double relative_rate,
- gr_file_types type, bool complex,
- size_t max_segment_size,
- const std::string &extra_dict,
- bool detached_header)
-{
- return gnuradio::get_initial_sptr
- (new gr_file_meta_sink(itemsize, filename,
- samp_rate, relative_rate,
- type, complex,
- max_segment_size,
- extra_dict,
- detached_header));
-}
-
-gr_file_meta_sink::gr_file_meta_sink(size_t itemsize, const std::string &filename,
- double samp_rate, double relative_rate,
- gr_file_types type, bool complex,
- size_t max_segment_size,
- const std::string &extra_dict,
- bool detached_header)
- : gr_sync_block("file_meta_sink",
- gr_make_io_signature(1, 1, itemsize),
- gr_make_io_signature(0, 0, 0)),
- d_itemsize(itemsize),
- d_samp_rate(samp_rate), d_relative_rate(relative_rate),
- d_max_seg_size(max_segment_size), d_total_seg_size(0),
- d_updated(false), d_unbuffered(false)
-{
- d_fp = 0;
- d_new_fp = 0;
- d_hdr_fp = 0;
- d_new_hdr_fp = 0;
-
- if(detached_header == true)
- d_state = STATE_DETACHED;
- else
- d_state = STATE_INLINE;
-
- if(!open(filename))
- throw std::runtime_error("file_meta_sink: can't open file\n");
-
- pmt_t timestamp = pmt_make_tuple(pmt_from_uint64(0),
- pmt_from_double(0));
-
- // handle extra dictionary
- d_extra = pmt_make_dict();
- if(extra_dict.size() > 0) {
- pmt_t extras = pmt_deserialize_str(extra_dict);
- pmt_t keys = pmt_dict_keys(extras);
- pmt_t vals = pmt_dict_values(extras);
- size_t nitems = pmt_length(keys);
- for(size_t i = 0; i < nitems; i++) {
- d_extra = pmt_dict_add(d_extra,
- pmt_nth(i, keys),
- pmt_nth(i, vals));
- }
- }
-
- d_extra_size = pmt_serialize_str(d_extra).size();
-
- d_header = pmt_make_dict();
- d_header = pmt_dict_add(d_header, mp("version"), mp(METADATA_VERSION));
- d_header = pmt_dict_add(d_header, mp("rx_rate"), mp(samp_rate));
- d_header = pmt_dict_add(d_header, mp("rx_time"), timestamp);
- d_header = pmt_dict_add(d_header, mp("size"), pmt_from_long(d_itemsize));
- d_header = pmt_dict_add(d_header, mp("type"), pmt_from_long(type));
- d_header = pmt_dict_add(d_header, mp("cplx"), complex ? PMT_T : PMT_F);
- d_header = pmt_dict_add(d_header, mp("strt"), pmt_from_uint64(METADATA_HEADER_SIZE+d_extra_size));
- d_header = pmt_dict_add(d_header, mp("bytes"), pmt_from_uint64(0));
-
- do_update();
-
- if(d_state == STATE_DETACHED)
- write_header(d_hdr_fp, d_header, d_extra);
- else
- write_header(d_fp, d_header, d_extra);
-}
-
-gr_file_meta_sink::~gr_file_meta_sink()
-{
- close();
-
- if(d_fp) {
- fclose(d_fp);
- d_fp = 0;
- }
-
- if(d_state == STATE_DETACHED) {
- if(d_hdr_fp) {
- fclose(d_hdr_fp);
- d_hdr_fp = 0;
- }
- }
-}
-
-bool
-gr_file_meta_sink::open(const std::string &filename)
-{
- bool ret = true;
- if(d_state == STATE_DETACHED) {
- std::string s = filename + ".hdr";
- ret = _open(&d_new_hdr_fp, s.c_str());
- }
-
- ret = ret && _open(&d_new_fp, filename.c_str());
- d_updated = true;
- return ret;
-}
-
-bool
-gr_file_meta_sink::_open(FILE **fp, const char *filename)
-{
- gruel::scoped_lock guard(d_mutex); // hold mutex for duration of this function
-
- bool ret = true;
- int fd;
-
- if((fd = ::open(filename,
- O_WRONLY|O_CREAT|O_TRUNC|OUR_O_LARGEFILE|OUR_O_BINARY,
- 0664)) < 0){
- perror(filename);
- return false;
- }
-
- if(*fp) { // if we've already got a new one open, close it
- fclose(*fp);
- fp = 0;
- }
-
- if((*fp = fdopen(fd, "wb")) == NULL) {
- perror(filename);
- ::close(fd); // don't leak file descriptor if fdopen fails.
- }
-
- ret = fp != 0;
-
- return ret;
-}
-
-void
-gr_file_meta_sink::close()
-{
- gruel::scoped_lock guard(d_mutex); // hold mutex for duration of this function
- update_last_header();
-
- if(d_state == STATE_DETACHED) {
- if(d_new_hdr_fp) {
- fclose(d_new_hdr_fp);
- d_new_hdr_fp = 0;
- }
- }
-
- if(d_new_fp) {
- fclose(d_new_fp);
- d_new_fp = 0;
- }
- d_updated = true;
-}
-
-void
-gr_file_meta_sink::do_update()
-{
- if(d_updated) {
- gruel::scoped_lock guard(d_mutex); // hold mutex for duration of this block
- if(d_state == STATE_DETACHED) {
- if(d_hdr_fp)
- fclose(d_hdr_fp);
- d_hdr_fp = d_new_hdr_fp; // install new file pointer
- d_new_hdr_fp = 0;
- }
-
- if(d_fp)
- fclose(d_fp);
- d_fp = d_new_fp; // install new file pointer
- d_new_fp = 0;
-
- d_updated = false;
- }
-}
-
-void
-gr_file_meta_sink::write_header(FILE *fp, pmt_t header, pmt_t extra)
-{
- std::string header_str = pmt_serialize_str(header);
- std::string extra_str = pmt_serialize_str(extra);
-
- if((header_str.size() != METADATA_HEADER_SIZE) && (extra_str.size() != d_extra_size))
- throw std::runtime_error("file_meta_sink: header or extras is wrong size.\n");
-
- size_t nwritten = 0;
- while(nwritten < header_str.size()) {
- std::string sub = header_str.substr(nwritten);
- int count = fwrite(sub.c_str(), sizeof(char), sub.size(), fp);
- nwritten += count;
- if((count == 0) && (ferror(fp))) {
- fclose(fp);
- throw std::runtime_error("file_meta_sink: error writing header to file.\n");
- }
- }
-
- nwritten = 0;
- while(nwritten < extra_str.size()) {
- std::string sub = extra_str.substr(nwritten);
- int count = fwrite(sub.c_str(), sizeof(char), sub.size(), fp);
- nwritten += count;
- if((count == 0) && (ferror(fp))) {
- fclose(fp);
- throw std::runtime_error("file_meta_sink: error writing extra to file.\n");
- }
- }
-
- fflush(fp);
-}
-
-void
-gr_file_meta_sink::update_header(pmt_t key, pmt_t value)
-{
- // Special handling caveat to transform rate from radio source into
- // the rate at this sink.
- if(pmt_eq(key, mp("rx_rate"))) {
- d_samp_rate = pmt_to_double(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);
- }
- else {
- d_extra = pmt_dict_add(d_extra, key, value);
- d_extra_size = pmt_serialize_str(d_extra).size();
- }
-}
-
-void
-gr_file_meta_sink::update_last_header()
-{
- if(d_state == STATE_DETACHED)
- update_last_header_detached();
- else
- update_last_header_inline();
-}
-
-void
-gr_file_meta_sink::update_last_header_inline()
-{
- // Update the last header info with the number of samples this
- // block represents.
-
- size_t hdrlen = pmt_to_uint64(pmt_dict_ref(d_header, mp("strt"), PMT_NIL));
- size_t seg_size = d_itemsize*d_total_seg_size;
- pmt_t s = pmt_from_uint64(seg_size);
- update_header(mp("bytes"), s);
- update_header(mp("strt"), pmt_from_uint64(METADATA_HEADER_SIZE+d_extra_size));
- fseek(d_fp, -seg_size-hdrlen, SEEK_CUR);
- write_header(d_fp, d_header, d_extra);
- fseek(d_fp, seg_size, SEEK_CUR);
-}
-
-void
-gr_file_meta_sink::update_last_header_detached()
-{
- // Update the last header info with the number of samples this
- // block represents.
- size_t hdrlen = pmt_to_uint64(pmt_dict_ref(d_header, mp("strt"), PMT_NIL));
- size_t seg_size = d_itemsize*d_total_seg_size;
- pmt_t s = pmt_from_uint64(seg_size);
- update_header(mp("bytes"), s);
- update_header(mp("strt"), pmt_from_uint64(METADATA_HEADER_SIZE+d_extra_size));
- fseek(d_hdr_fp, -hdrlen, SEEK_CUR);
- write_header(d_hdr_fp, d_header, d_extra);
-}
-
-void
-gr_file_meta_sink::write_and_update()
-{
- // New header, so set current size of chunk to 0 and start of chunk
- // based on current index + header size.
- //uint64_t loc = get_last_header_loc();
- pmt_t s = pmt_from_uint64(0);
- update_header(mp("bytes"), 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);
-
- if(d_state == STATE_DETACHED)
- write_header(d_hdr_fp, d_header, d_extra);
- else
- write_header(d_fp, d_header, d_extra);
-}
-
-void
-gr_file_meta_sink::update_rx_time()
-{
- pmt_t rx_time = pmt_string_to_symbol("rx_time");
- pmt_t r = pmt_dict_ref(d_header, rx_time, PMT_NIL);
- uint64_t secs = pmt_to_uint64(pmt_tuple_ref(r, 0));
- double fracs = pmt_to_double(pmt_tuple_ref(r, 1));
- double diff = d_total_seg_size / (d_samp_rate*d_relative_rate);
-
- //std::cerr << "old secs: " << secs << std::endl;
- //std::cerr << "old fracs: " << fracs << std::endl;
- //std::cerr << "seg size: " << d_total_seg_size << std::endl;
- //std::cerr << "diff: " << diff << std::endl;
-
- fracs += diff;
- uint64_t new_secs = static_cast<uint64_t>(fracs);
- secs += new_secs;
- fracs -= new_secs;
-
- //std::cerr << "new secs: " << secs << std::endl;
- //std::cerr << "new fracs: " << fracs << std::endl << std::endl;
-
- r = pmt_make_tuple(pmt_from_uint64(secs), pmt_from_double(fracs));
- d_header = pmt_dict_add(d_header, rx_time, r);
-}
-
-int
-gr_file_meta_sink::work(int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- char *inbuf = (char*)input_items[0];
- int nwritten = 0;
-
- do_update(); // update d_fp is reqd
-
- if(!d_fp)
- return noutput_items; // drop output on the floor
-
- uint64_t abs_N = nitems_read(0);
- uint64_t end_N = abs_N + (uint64_t)(noutput_items);
- std::vector<gr_tag_t> all_tags;
- get_tags_in_range(all_tags, 0, abs_N, end_N);
-
- std::vector<gr_tag_t>::iterator itr;
- for(itr = all_tags.begin(); itr != all_tags.end(); itr++) {
- int item_offset = (int)(itr->offset - abs_N);
-
- // 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();
- update_rx_time();
- write_and_update();
- d_total_seg_size = 0;
- }
- }
-
- if(d_total_seg_size > 0) {
- update_last_header();
- update_header(itr->key, itr->value);
- write_and_update();
- d_total_seg_size = 0;
- }
- else {
- 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));
- 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;
- if(d_total_seg_size == d_max_seg_size) {
- update_last_header();
- update_rx_time();
- write_and_update();
- d_total_seg_size = 0;
- }
- }
-
- if(d_unbuffered)
- fflush(d_fp);
-
- return 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
deleted file mode 100644
index 9b67cc4c8..000000000
--- a/gnuradio-core/src/lib/io/gr_file_meta_sink.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2012 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- *
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU Radio; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifndef INCLUDED_GR_FILE_META_SINK_H
-#define INCLUDED_GR_FILE_META_SINK_H
-
-#include <gr_core_api.h>
-#include <gr_sync_block.h>
-#include <gruel/pmt.h>
-#include <cstdio>
-
-using namespace pmt;
-
-const char METADATA_VERSION = 0;
-const size_t METADATA_HEADER_SIZE = 149;
-
-enum gr_file_types {
- GR_FILE_BYTE=0,
- GR_FILE_CHAR=0,
- GR_FILE_SHORT=1,
- GR_FILE_INT,
- GR_FILE_LONG,
- GR_FILE_LONG_LONG,
- GR_FILE_FLOAT,
- GR_FILE_DOUBLE,
-};
-
-class gr_file_meta_sink;
-typedef boost::shared_ptr<gr_file_meta_sink> gr_file_meta_sink_sptr;
-
-GR_CORE_API gr_file_meta_sink_sptr
-gr_make_file_meta_sink(size_t itemsize, const std::string &filename,
- double samp_rate=1, double relative_rate=1,
- gr_file_types type=GR_FILE_FLOAT, bool complex=true,
- size_t max_segment_size=1000000,
- const std::string &extra_dict="",
- bool detached_header=false);
-
-/*!
- * \brief Write stream to file with meta-data headers.
- * \ingroup sink_blk
- *
- * These files represent data as binary information in between
- * meta-data headers. The headers contain information about the type
- * of data and properties of the data in the next segment of
- * samples. The information includes:
- *
- * rx_rate (double): sample rate of data.
- * rx_time (uint64_t, double): time stamp of first sample in segment.
- * type (gr_file_types as int32_t): data type.
- * cplx (bool): Is data complex?
- * strt (uint64_t): Starting byte of data in this segment.
- * size (uint64_t): Size in bytes of data in this segment.
- *
- * Tags can be sent to the file to update the information, which will
- * create a new header. Headers are found by searching from the first
- * header (at position 0 in the file) and reading where the data
- * segment starts plus the data segment size. Following will either be
- * a new header or EOF.
- */
-class GR_CORE_API gr_file_meta_sink : public gr_sync_block
-{
- /*!
- * \brief Create a meta-data file sink.
- *
- * \param itemsize (size_t): Size of data type.
- * \param filename (string): Name of file to write data to.
- * \param samp_rate (double): Sample rate of data. If sample rate will be
- * set by a tag, such as rx_tag from a UHD source, this is
- * basically ignored.
- * \param relative_rate (double): Rate chance from source of sample
- * rate tag to sink.
- * \param type (gr_file_types): Data type (int, float, etc.)
- * \param complex (bool): If data stream is complex
- * \param max_segment_size (size_t): Length of a single segment
- * before the header is repeated (in items).
- * \param extra_dict (string): a serialized PMT dictionary of extra
- * information. Currently not supported.
- * \param detached_header (bool): Set to true to store the header
- * info in a separate file (named filename.hdr)
- */
- friend GR_CORE_API gr_file_meta_sink_sptr
- gr_make_file_meta_sink(size_t itemsize, const std::string &filename,
- double samp_rate, double relative_rate,
- gr_file_types type, bool complex,
- size_t max_segment_size,
- const std::string &extra_dict,
- bool detached_header);
-
- private:
- enum meta_state_t {
- STATE_INLINE=0,
- STATE_DETACHED
- };
-
-
- size_t d_itemsize;
- double d_samp_rate;
- double d_relative_rate;
- size_t d_max_seg_size;
- size_t d_total_seg_size;
- pmt_t d_header;
- pmt_t d_extra;
- size_t d_extra_size;
- bool d_updated;
- bool d_unbuffered;
-
- boost::mutex d_mutex;
- FILE *d_new_fp, *d_new_hdr_fp;
- FILE *d_fp, *d_hdr_fp;
- meta_state_t d_state;
-
- protected:
- gr_file_meta_sink(size_t itemsize, const std::string &filename,
- double samp_rate=1, double relative_rate=1,
- gr_file_types type=GR_FILE_FLOAT, bool complex=true,
- size_t max_segment_size=1000000,
- const std::string &extra_dict="",
- bool detached_header=false);
-
- void write_header(FILE *fp, pmt_t header, pmt_t extra);
- void update_header(pmt_t key, pmt_t value);
- void update_last_header();
- void update_last_header_inline();
- void update_last_header_detached();
- void write_and_update();
- void update_rx_time();
-
- bool _open(FILE **fp, const char *filename);
-
- public:
- ~gr_file_meta_sink();
-
- bool open(const std::string &filename);
- void close();
- void do_update();
-
- void set_unbuffered(bool unbuffered)
- {
- d_unbuffered = unbuffered;
- }
-
- //FIXME: add setters/getters for properties.
-
- int work(int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif /* INCLUDED_GR_FILE_META_SINK_H */
diff --git a/gnuradio-core/src/lib/io/gr_file_meta_sink.i b/gnuradio-core/src/lib/io/gr_file_meta_sink.i
deleted file mode 100644
index 6fa34913b..000000000
--- a/gnuradio-core/src/lib/io/gr_file_meta_sink.i
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2012 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- *
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU Radio; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-GR_SWIG_BLOCK_MAGIC(gr,file_meta_sink)
-
-const char METADATA_VERSION = 0;
-const size_t METADATA_HEADER_SIZE = 149;
-
-enum gr_file_types {
- GR_FILE_BYTE=0,
- GR_FILE_CHAR=0,
- GR_FILE_SHORT,
- GR_FILE_INT,
- GR_FILE_LONG,
- GR_FILE_LONG_LONG,
- GR_FILE_FLOAT,
- GR_FILE_DOUBLE,
-};
-
-gr_file_meta_sink_sptr
-gr_make_file_meta_sink(size_t itemsize, const std::string &filename,
- double samp_rate=1, double relative_rate=1,
- gr_file_types type=GR_FILE_FLOAT, bool complex=true,
- size_t max_segment_size=1000000,
- const std::string & extra_dict="",
- bool detached_header=false);
-
-class gr_file_meta_sink : public gr_sync_block
-{
- protected:
- gr_file_meta_sink(size_t itemsize, const std::string &filename,
- double samp_rate, double relative_rate,
- gr_file_types type, bool complex,
- size_t max_segment_size,
- const std::string & extra_dict,
- bool detached_header);
-
- public:
- ~gr_file_meta_sink();
-
- bool open(const std::string &filename);
- void close();
- void set_unbuffered(bool unbuffered);
-};
diff --git a/gnuradio-core/src/lib/io/gr_file_meta_source.cc b/gnuradio-core/src/lib/io/gr_file_meta_source.cc
deleted file mode 100644
index d940e5edc..000000000
--- a/gnuradio-core/src/lib/io/gr_file_meta_source.cc
+++ /dev/null
@@ -1,427 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2012 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- *
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU Radio; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <gr_file_meta_source.h>
-#include <gr_io_signature.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <gruel/thread.h>
-#include <stdexcept>
-
-// win32 (mingw/msvc) specific
-#ifdef HAVE_IO_H
-#include <io.h>
-#endif
-#ifdef O_BINARY
-#define OUR_O_BINARY O_BINARY
-#else
-#define OUR_O_BINARY 0
-#endif
-
-// should be handled via configure
-#ifdef O_LARGEFILE
-#define OUR_O_LARGEFILE O_LARGEFILE
-#else
-#define OUR_O_LARGEFILE 0
-#endif
-
-gr_file_meta_source_sptr
-gr_make_file_meta_source(const std::string &filename,
- bool repeat,
- bool detached_header,
- const std::string &hdr_filename)
-{
- return gnuradio::get_initial_sptr
- (new gr_file_meta_source(filename,
- repeat,
- detached_header,
- hdr_filename));
-}
-
-gr_file_meta_source::gr_file_meta_source(const std::string &filename,
- bool repeat,
- bool detached_header,
- const std::string &hdr_filename)
- : gr_sync_block("file_meta_source",
- gr_make_io_signature(0, 0, 0),
- gr_make_io_signature(1, 1, 1)),
- d_itemsize(0), d_samp_rate(0),
- d_seg_size(0),
- d_updated(false), d_repeat(repeat)
-{
- d_fp = 0;
- d_new_fp = 0;
- d_hdr_fp = 0;
- d_new_hdr_fp = 0;
-
- if(detached_header == true) {
- d_state = STATE_DETACHED;
- }
- else
- d_state = STATE_INLINE;
-
- if(!open(filename, hdr_filename))
- throw std::runtime_error("file_meta_source: can't open file\n");
-
- do_update();
-
- pmt_t hdr = PMT_NIL, extras = PMT_NIL;
- if(read_header(hdr, extras)) {
- parse_header(hdr, 0, d_tags);
- parse_extras(extras, 0, d_tags);
- }
- else
- throw std::runtime_error("file_meta_source: could not read header.\n");
-
- // Set output signature based on itemsize info in header
- set_output_signature(gr_make_io_signature(1, 1, d_itemsize));
-}
-
-gr_file_meta_source::~gr_file_meta_source()
-{
- close();
-
- if(d_fp) {
- fclose(d_fp);
- d_fp = 0;
- }
-
- if(d_state == STATE_DETACHED) {
- if(d_hdr_fp) {
- fclose(d_hdr_fp);
- d_hdr_fp = 0;
- }
- }
-}
-
-bool
-gr_file_meta_source::read_header(pmt_t &hdr, pmt_t &extras)
-{
- // Select which file handle to read from.
- FILE *fp;
- if(d_state == STATE_DETACHED)
- fp = d_hdr_fp;
- else
- fp = d_fp;
-
- size_t ret;
- size_t size = 0;
- std::string str;
- char *hdr_buffer = new char[METADATA_HEADER_SIZE];
- while(size < METADATA_HEADER_SIZE) {
- ret = fread(&hdr_buffer[size], sizeof(char), METADATA_HEADER_SIZE-size, fp);
- if(ret == 0) {
- delete [] hdr_buffer;
- if(feof(fp))
- return false;
- else {
- std::stringstream s;
- s << "file_meta_source: error occurred extracting header: "
- << strerror(errno) << std::endl;
- throw std::runtime_error(s.str());
- }
- }
- size += ret;
- }
-
- // Convert to string or the char array gets confused by the \0
- str.insert(0, hdr_buffer, METADATA_HEADER_SIZE);
- hdr = pmt_deserialize_str(str);
- delete [] hdr_buffer;
-
- uint64_t seg_start, extra_len;
- pmt_t r, dump;
- if(pmt_dict_has_key(hdr, pmt_string_to_symbol("strt"))) {
- r = pmt_dict_ref(hdr, pmt_string_to_symbol("strt"), dump);
- seg_start = pmt_to_uint64(r);
- extra_len = seg_start - METADATA_HEADER_SIZE;
- }
-
- if(extra_len > 0) {
- size = 0;
- hdr_buffer = new char[extra_len];
- while(size < extra_len) {
- ret = fread(&hdr_buffer[size], sizeof(char), extra_len-size, fp);
- if(ret == 0) {
- delete [] hdr_buffer;
- if(feof(fp))
- return false;
- else {
- std::stringstream s;
- s << "file_meta_source: error occurred extracting extras: "
- << strerror(errno) << std::endl;
- throw std::runtime_error(s.str());
- }
- }
- size += ret;
- }
-
- str.clear();
- str.insert(0, hdr_buffer, extra_len);
- extras = pmt_deserialize_str(str);
- delete [] hdr_buffer;
- }
-
- return true;
-}
-
-void
-gr_file_meta_source::parse_header(pmt_t hdr, uint64_t offset,
- std::vector<gr_tag_t> &tags)
-{
- pmt_t r, key;
-
- // GET SAMPLE RATE
- key = pmt_string_to_symbol("rx_rate");
- if(pmt_dict_has_key(hdr, key)) {
- r = pmt_dict_ref(hdr, key, PMT_NIL);
- d_samp_rate = pmt_to_double(r);
-
- gr_tag_t t;
- t.offset = offset;
- t.key = key;
- t.value = r;
- t.srcid = alias_pmt();
- tags.push_back(t);
- }
- else {
- throw std::runtime_error("file_meta_source: Could not extract sample rate.\n");
- }
-
- // GET TIME STAMP
- key = pmt_string_to_symbol("rx_time");
- if(pmt_dict_has_key(hdr, key)) {
- d_time_stamp = pmt_dict_ref(hdr, key, PMT_NIL);
-
- gr_tag_t t;
- t.offset = offset;
- t.key = key;
- t.value = d_time_stamp;
- t.srcid = alias_pmt();
- tags.push_back(t);
- }
- else {
- throw std::runtime_error("file_meta_source: Could not extract time stamp.\n");
- }
-
- // GET ITEM SIZE OF DATA
- if(pmt_dict_has_key(hdr, pmt_string_to_symbol("size"))) {
- d_itemsize = pmt_to_long(pmt_dict_ref(hdr, pmt_string_to_symbol("size"), PMT_NIL));
- }
- else {
- throw std::runtime_error("file_meta_source: Could not extract item size.\n");
- }
-
- // GET SEGMENT SIZE
- if(pmt_dict_has_key(hdr, pmt_string_to_symbol("bytes"))) {
- d_seg_size = pmt_to_uint64(pmt_dict_ref(hdr, pmt_string_to_symbol("bytes"), PMT_NIL));
-
- // Convert from bytes to items
- d_seg_size /= d_itemsize;
- }
- else {
- throw std::runtime_error("file_meta_source: Could not extract segment size.\n");
- }
-}
-
-void
-gr_file_meta_source::parse_extras(pmt_t extras, uint64_t offset,
- std::vector<gr_tag_t> &tags)
-{
- pmt_t item, key, val;
-
- size_t nitems = pmt_length(extras);
- for(size_t i = 0; i < nitems; i++) {
- item = pmt_nth(i, extras);
- key = pmt_car(item);
- val = pmt_cdr(item);
-
- gr_tag_t t;
- t.offset = offset;
- t.key = key;
- t.value = val;
- t.srcid = alias_pmt();
- tags.push_back(t);
- }
-}
-
-bool
-gr_file_meta_source::open(const std::string &filename,
- const std::string &hdr_filename)
-{
- bool ret = true;
- if(d_state == STATE_DETACHED) {
- std::string s;
- if(hdr_filename == "")
- s = filename + ".hdr";
- else
- s = hdr_filename;
- ret = _open(&d_new_hdr_fp, s.c_str());
- }
-
- ret = ret && _open(&d_new_fp, filename.c_str());
- d_updated = true;
- return ret;
-}
-
-bool
-gr_file_meta_source::_open(FILE **fp, const char *filename)
-{
- gruel::scoped_lock guard(d_mutex); // hold mutex for duration of this function
-
- bool ret = true;
- int fd;
-
- if((fd = ::open(filename,
- O_RDONLY|OUR_O_LARGEFILE|OUR_O_BINARY)) < 0) {
- perror(filename);
- return false;
- }
-
- if(*fp) { // if we've already got a new one open, close it
- fclose(*fp);
- fp = 0;
- }
-
- if((*fp = fdopen(fd, "rb")) == NULL) {
- perror(filename);
- ::close(fd); // don't leak file descriptor if fdopen fails.
- }
-
- ret = fp != 0;
-
- return ret;
-}
-
-void
-gr_file_meta_source::close()
-{
- gruel::scoped_lock guard(d_mutex); // hold mutex for duration of this function
- if(d_state == STATE_DETACHED) {
- if(d_new_hdr_fp) {
- fclose(d_new_hdr_fp);
- d_new_hdr_fp = 0;
- }
- }
-
- if(d_new_fp) {
- fclose(d_new_fp);
- d_new_fp = 0;
- }
- d_updated = true;
-}
-
-void
-gr_file_meta_source::do_update()
-{
- if(d_updated) {
- gruel::scoped_lock guard(d_mutex); // hold mutex for duration of this block
- if(d_state == STATE_DETACHED) {
- if(d_hdr_fp)
- fclose(d_hdr_fp);
- d_hdr_fp = d_new_hdr_fp; // install new file pointer
- d_new_hdr_fp = 0;
- }
-
- if(d_fp)
- fclose(d_fp);
- d_fp = d_new_fp; // install new file pointer
- d_new_fp = 0;
-
- d_updated = false;
- }
-}
-
-int
-gr_file_meta_source::work(int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- // We've reached the end of a segment; parse the next header and get
- // the new tags to send and set the next segment size.
- if(d_seg_size == 0) {
- pmt_t hdr=PMT_NIL, extras=PMT_NIL;
- if(read_header(hdr, extras)) {
- parse_header(hdr, nitems_written(0), d_tags);
- parse_extras(extras, nitems_written(0), d_tags);
- }
- else {
- return -1;
- }
- }
-
- char *out = (char*)output_items[0];
- int i;
- int seg_size = std::min(noutput_items, (int)d_seg_size);
- int size = seg_size;
-
- do_update(); // update d_fp is reqd
- if(d_fp == NULL)
- throw std::runtime_error("work with file not open");
-
- // Push all tags onto the stream and remove them from the vector
- while(!d_tags.empty()) {
- add_item_tag(0, d_tags.back());
- d_tags.pop_back();
- }
-
- gruel::scoped_lock lock(d_mutex); // hold for the rest of this function
- while(size) {
- i = fread(out, d_itemsize, size, d_fp);
-
- size -= i;
- d_seg_size -= i;
- out += i * d_itemsize;
-
- if(size == 0) // done
- break;
-
- if(i > 0) // short read, try again
- continue;
-
- // We got a zero from fread. This is either EOF or error. In
- // any event, if we're in repeat mode, seek back to the beginning
- // of the file and try again, else break
-
- if(!d_repeat)
- break;
-
- if(fseek(d_fp, 0, SEEK_SET) == -1) {
- std::stringstream s;
- s << "[" << __FILE__ << "]" << " fseek failed" << std::endl;
- throw std::runtime_error(s.str());
- }
- }
-
- if(size > 0) { // EOF or error
- if(size == seg_size) // we didn't read anything; say we're done
- return -1;
- return seg_size - size; // else return partial result
- }
-
- return seg_size;
-}
diff --git a/gnuradio-core/src/lib/io/gr_file_meta_source.h b/gnuradio-core/src/lib/io/gr_file_meta_source.h
deleted file mode 100644
index 95e466936..000000000
--- a/gnuradio-core/src/lib/io/gr_file_meta_source.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2012 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- *
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU Radio; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifndef INCLUDED_GR_FILE_META_SOURCE_H
-#define INCLUDED_GR_FILE_META_SOURCE_H
-
-#include <gr_core_api.h>
-#include <gr_sync_block.h>
-#include <gr_tags.h>
-#include <gruel/pmt.h>
-#include <gruel/thread.h>
-#include <cstdio>
-
-#include <gr_file_meta_sink.h>
-
-class gr_file_meta_source;
-typedef boost::shared_ptr<gr_file_meta_source> gr_file_meta_source_sptr;
-
-GR_CORE_API gr_file_meta_source_sptr
-gr_make_file_meta_source(const std::string &filename,
- bool repeat=false,
- bool detached_header=false,
- const std::string &hdr_filename="");
-
-/*!
- * \brief Reads stream from file with meta-data headers. Headers are
- * parsed into tags.
- * \ingroup source_blk
- *
- * The information in the metadata headers includes:
- *
- * rx_rate (double): sample rate of data.
- * rx_time (uint64_t, double): time stamp of first sample in segment.
- * type (gr_file_types as int32_t): data type.
- * cplx (bool): Is data complex?
- * strt (uint64_t): Starting byte of data in this segment.
- * size (uint64_t): Size in bytes of data in this segment.
- *
- * Any item inside of the extra header dictionary is ready out and
- * made into a stream tag.
- */
-class GR_CORE_API gr_file_meta_source : public gr_sync_block
-{
- /*!
- * \brief Create a meta-data file source.
- *
- * \param filename (string): Name of file to write data to.
- * \param repeat (bool): Repeats file when EOF is found.
- * \param detached_header (bool): Set to true if header
- * info is stored in a separate file (usually named filename.hdr)
- * \param hdr_filename (string): Name of detached header file if used.
- * Defaults to 'filename.hdr' if detached_header is true but this
- * field is an empty string.
- */
- friend GR_CORE_API gr_file_meta_source_sptr
- gr_make_file_meta_source(const std::string &filename,
- bool repeat,
- bool detached_header,
- const std::string &hdr_filename);
-
- private:
- enum meta_state_t {
- STATE_INLINE=0,
- STATE_DETACHED
- };
-
- size_t d_itemsize;
- double d_samp_rate;
- pmt_t d_time_stamp;
- size_t d_seg_size;
- bool d_updated;
- bool d_repeat;
-
- gruel::mutex d_mutex;
- FILE *d_new_fp, *d_new_hdr_fp;
- FILE *d_fp, *d_hdr_fp;
- meta_state_t d_state;
-
- std::vector<gr_tag_t> d_tags;
-
- protected:
- gr_file_meta_source(const std::string &filename,
- bool repeat=false,
- bool detached_header=false,
- const std::string &hdr_filename="");
-
- bool _open(FILE **fp, const char *filename);
- bool read_header(pmt_t &hdr, pmt_t &extras);
- void parse_header(pmt_t hdr, uint64_t offset,
- std::vector<gr_tag_t> &tags);
- void parse_extras(pmt_t extras, uint64_t offset,
- std::vector<gr_tag_t> &tags);
-
- public:
- ~gr_file_meta_source();
-
- bool open(const std::string &filename,
- const std::string &hdr_filename="");
- void close();
- void do_update();
-
- int work(int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif /* INCLUDED_GR_FILE_META_SOURCE_H */
diff --git a/gnuradio-core/src/lib/io/gr_file_meta_source.i b/gnuradio-core/src/lib/io/gr_file_meta_source.i
deleted file mode 100644
index cb1281036..000000000
--- a/gnuradio-core/src/lib/io/gr_file_meta_source.i
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2012 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- *
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU Radio; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-GR_SWIG_BLOCK_MAGIC(gr,file_meta_source)
-
-gr_file_meta_source_sptr
-gr_make_file_meta_source(const std::string &filename,
- bool repeat=false,
- bool detached_header=false,
- const std::string &hdr_filename="");
-
-class gr_file_meta_source : public gr_sync_block
-{
- protected:
- gr_file_meta_source(const std::string &filename,
- bool repeat,
- bool detached_header,
- const std::string &hdr_filename);
-
- public:
- ~gr_file_meta_source();
-
- bool open(const std::string &filename,
- const std::string &hdr_filename="");
- void close();
-};
diff --git a/gnuradio-core/src/lib/io/io.i b/gnuradio-core/src/lib/io/io.i
index 5885214d8..e2de4eb97 100644
--- a/gnuradio-core/src/lib/io/io.i
+++ b/gnuradio-core/src/lib/io/io.i
@@ -27,9 +27,7 @@
#endif
#include <gr_file_sink.h>
-#include <gr_file_meta_sink.h>
#include <gr_file_source.h>
-#include <gr_file_meta_source.h>
#include <gr_file_descriptor_sink.h>
#include <gr_file_descriptor_source.h>
#include <gr_histo_sink_f.h>
@@ -57,9 +55,7 @@
%include "gr_file_sink_base.i"
%include "gr_file_sink.i"
-%include "gr_file_meta_sink.i"
%include "gr_file_source.i"
-%include "gr_file_meta_source.i"
%include "gr_file_descriptor_sink.i"
%include "gr_file_descriptor_source.i"
%include "gr_histo_sink.i"