aboutsummaryrefslogtreecommitdiffstats
path: root/host/include
diff options
context:
space:
mode:
Diffstat (limited to 'host/include')
-rw-r--r--host/include/uhd/rfnoc/replay_block_control.hpp88
1 files changed, 73 insertions, 15 deletions
diff --git a/host/include/uhd/rfnoc/replay_block_control.hpp b/host/include/uhd/rfnoc/replay_block_control.hpp
index 1afd8b4de..a921d1bca 100644
--- a/host/include/uhd/rfnoc/replay_block_control.hpp
+++ b/host/include/uhd/rfnoc/replay_block_control.hpp
@@ -11,6 +11,8 @@
namespace uhd { namespace rfnoc {
+// doxygen tables need long long lines
+// clang-format off
/*! Replay Block Control CLass
*
* \ingroup rfnoc_blocks
@@ -59,7 +61,42 @@ namespace uhd { namespace rfnoc {
* |------:|-------------------------------------------------------------------
* | type | Data type. On the input, it set by the upstream block (see get_record_type()). For output, it should be provided by set_play_type().
*
+ * \section rfnoc_block_replay_record Recording Data
+ *
+ * Before streaming data to the replay block, it must be configured to record
+ * by calling record(), which will also configure the size of the record buffer
+ * for the indicated input port. After calling this method, the block will accept
+ * incoming data until its record buffer is full (use the get_record_fullness()
+ * method to query the fullness). Unlike the radio, the replay block does not
+ * care about end-of-burst flags, and will not report underruns if subsequent
+ * packets are not streamed to this block back-to-back.
+ *
+ * Once the record buffer is full, the block will no longer accept incoming data
+ * and will back-pressure. If, for example, the radio block is connected to the replay
+ * block, the radio could overrun in this scenario. By calling record() again,
+ * the write-pointer of the block is reset, and it will accept new data. To
+ * reset the write-pointer and buffer size to the same values as before, it is
+ * sufficient to call record_restart().
+ *
+ * \section rfnoc_block_replay_playback Playing back Data
+ *
+ * To playback data from a given port, there are two options with basically the
+ * same functionality: Either call config_play() to configure the playback
+ * region on memory, and then call issue_stream_cmd() to start streaming.
+ *
+ * A shorthand version of this is to call play(), which is equivalent to
+ * calling config_play() and issue_stream_cmd() together.
+ *
+ * In either case, the replay block will start streaming the requested number of
+ * samples, or until it is stopped. If a specific number of samples is requested,
+ * then it will tag the last outgoing packet with an end-of-burst flag. If more
+ * samples were requested than stored in the playback buffer, it will wrap
+ * around.
+ *
+ * To stop a continuous playback, either call stop(), or issue a stream command
+ * with uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS.
*/
+// clang-format on
class UHD_API replay_block_control : public noc_block_base
{
public:
@@ -113,37 +150,57 @@ public:
* memory word and get_item_size() to get the item size. A value of 0 means
* to use all available space.
* \param port Which input port of the replay block to use
+ * \throws uhd::value_error if offset+size exceeds the available memory.
*/
virtual void record(
const uint64_t offset, const uint64_t size, const size_t port = 0) = 0;
/*! Restarts recording from the record offset
*
+ * This is a shortcut for calling record() again with the same arguments.
+ *
* \param port Which input port of the replay block to use
*/
virtual void record_restart(const size_t port = 0) = 0;
- /*! Play
+ /*! Play back data.
*
- * Play back data. The offset and size define what data is played back on an output
- * port. The data can be played once or repeated continuously until a stop command is
- * issued. If a time_spec is supplied, it will be placed in the header of the first
- * packet. Typically, this is used to tell a downstream Radio block when to start
- * transmitting the data. If the data type on the output port is not defined, this
- * function will throw an error.
+ * The offset and size define what data is played back on an output port.
+ * It will stream out \p size bytes of data, starting at memory offset
+ * \p offset.
+ *
+ * The data can be played once or repeated continuously until a stop
+ * command is issued. If a time_spec is supplied, it will be placed in the
+ * header of the first packet. Typically, this is used to tell a downstream
+ * Radio block when to start transmitting the data.
+ *
+ * If the data type on the output port is not defined, this function will
+ * throw an error.
+ *
+ * This is equivalent to calling config_play() with the same arguments for
+ * \p offset, \p size, and \p port, and then calling issue_stream_cmd() with
+ * the same time spec, and either continuous streaming (if \p repeat is true)
+ * or STREAM_MODE_START_NUM_SAMPS_AND_DONE if it is not.
*
* \param offset Memory offset of the data to be played. This value must be
- * aligned to the size of the word in memory. Use get_word_size() to get the
- * memory word size.
+ * aligned to the size of the word in memory. Use get_word_size()
+ * to get the memory word size.
* \param size Size of data to play back. This value must be aligned to the
- * size of the memory word and item size. Use get_word_size() to get the
- * memory word size and get_output_item_size() to get the item size.
+ * size of the memory word and item size. Use get_word_size() to
+ * get the memory word size and get_output_item_size() to get
+ * the item size. This value will be used for the num_samps
+ * component of the underlying stream command.
* \param port Which output port of the replay block to use
- * \param time_spec Set the time for the first item. Any non-zero value is used to
- * set the time in the header of the first packet. Most commonly, this is used to
- * set the start time of a transmission.
+ * \param time_spec Set the time for the first item. Any non-zero value is
+ * used to set the time in the header of the first packet.
+ * Most commonly, this is used to set the start time of a
+ * transmission. Note that this block will not wait for a
+ * time to occur, rather, it will tag the first outgoing
+ * packet with this time stamp.
* \param repeat Determines whether the data should be played repeatedly or
- * just once. If set to true, stop() must be called to stop the play back.
+ * just once. If set to true, stop() must be called to stop
+ * the play back.
+ * \throws uhd::value_error if offset+size exceeds the available memory.
*/
virtual void play(const uint64_t offset,
const uint64_t size,
@@ -290,6 +347,7 @@ public:
* size of the memory word and item size. Use get_word_size() to get the
* memory word size and get_output_item_size() to get the item size.
* \param port Which output port of the replay block to use
+ * \throws uhd::value_error if offset+size exceeds the available memory.
*/
virtual void config_play(
const uint64_t offset, const uint64_t size, const size_t port = 0) = 0;