mirror of
https://github.com/saymrwulf/uhd.git
synced 2026-05-16 21:10:10 +00:00
multi_usrp_rfnoc: Manually pass sample rate to ddc/duc
This adds (and calls) methods to manually pass radio block sample rate to the input/output properties of the ddc/duc during creation of the multi_usrp_rfnoc object. The ddc/duc require this information in order to return valid, possible output/input sample rates in get_rx_rates()/get_tx_rates(). Before, the ddc/duc wouldn't have this rate until the rfnoc_graph had been connected and committed, which happens in get_rx_stream()/get_tx_stream(). Thus, this fixes an issue where a user was unable to query possible sample rates prior to specifying a sample rate and creating a stream.
This commit is contained in:
parent
26ff293489
commit
b6ff5fd283
5 changed files with 38 additions and 0 deletions
|
|
@ -89,6 +89,13 @@ public:
|
|||
*/
|
||||
virtual double get_input_rate(const size_t chan) const = 0;
|
||||
|
||||
/*! Manually set the sampling rate at this block's input
|
||||
*
|
||||
* \param rate The requested rate
|
||||
* \param chan The channel for which the rate is being set
|
||||
*/
|
||||
virtual void set_input_rate(const double rate, const size_t chan) = 0;
|
||||
|
||||
/*! Return the sampling rate at this block's output
|
||||
*
|
||||
* This is equivalent to calling get_input_rate() divided by the decimation.
|
||||
|
|
|
|||
|
|
@ -97,6 +97,13 @@ public:
|
|||
*/
|
||||
virtual double get_output_rate(const size_t chan) const = 0;
|
||||
|
||||
/*! Manually set the sampling rate at this block's output
|
||||
*
|
||||
* \param rate The requested rate
|
||||
* \param chan The channel for which the rate is being set
|
||||
*/
|
||||
virtual void set_output_rate(const double rate, const size_t chan) = 0;
|
||||
|
||||
/*! Return a range of valid input rates, based on the current output rate
|
||||
*
|
||||
* Note the return value is only valid as long as the output rate does not
|
||||
|
|
|
|||
|
|
@ -136,6 +136,11 @@ public:
|
|||
return _samp_rate_in.at(chan).is_valid() ? _samp_rate_in.at(chan).get() : 1.0;
|
||||
}
|
||||
|
||||
void set_input_rate(const double rate, const size_t chan)
|
||||
{
|
||||
set_property<double>("samp_rate", rate, {res_source_info::INPUT_EDGE, chan});
|
||||
}
|
||||
|
||||
double get_output_rate(const size_t chan) const
|
||||
{
|
||||
return _samp_rate_out.at(chan).is_valid() ? _samp_rate_out.at(chan).get() : 1.0;
|
||||
|
|
|
|||
|
|
@ -138,6 +138,11 @@ public:
|
|||
return _samp_rate_out.at(chan).is_valid() ? _samp_rate_out.at(chan).get() : 1.0;
|
||||
}
|
||||
|
||||
void set_output_rate(const double rate, const size_t chan)
|
||||
{
|
||||
set_property<double>("samp_rate", rate, {res_source_info::OUTPUT_EDGE, chan});
|
||||
}
|
||||
|
||||
uhd::meta_range_t get_input_rates(const size_t chan) const
|
||||
{
|
||||
uhd::meta_range_t result;
|
||||
|
|
|
|||
|
|
@ -214,6 +214,20 @@ public:
|
|||
}
|
||||
}
|
||||
}
|
||||
// Manually propagate radio block sample rates to DDC/DUC blocks in order to allow
|
||||
// DDC/DUC blocks to have valid internal state before graph is (later) connected
|
||||
for (size_t rx_chan = 0; rx_chan < get_rx_num_channels(); ++rx_chan) {
|
||||
auto& rx_chain = _get_rx_chan(rx_chan);
|
||||
if (rx_chain.ddc) {
|
||||
rx_chain.ddc->set_input_rate(rx_chain.radio->get_rate(), rx_chain.block_chan);
|
||||
}
|
||||
}
|
||||
for (size_t tx_chan = 0; tx_chan < get_tx_num_channels(); ++tx_chan) {
|
||||
auto& tx_chain = _get_tx_chan(tx_chan);
|
||||
if (tx_chain.duc) {
|
||||
tx_chain.duc->set_output_rate(tx_chain.radio->get_rate(), tx_chain.block_chan);
|
||||
}
|
||||
}
|
||||
_graph->commit();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue