diff --git a/op25/gr-op25_repeater/lib/p25_frame_assembler_impl.cc b/op25/gr-op25_repeater/lib/p25_frame_assembler_impl.cc
index 7f64f39..7e5a00d 100644
--- a/op25/gr-op25_repeater/lib/p25_frame_assembler_impl.cc
+++ b/op25/gr-op25_repeater/lib/p25_frame_assembler_impl.cc
@@ -33,6 +33,7 @@
#include <errno.h>
#include <vector>
#include <sys/time.h>
+#include <cmath>
namespace gr {
namespace op25_repeater {
@@ -92,7 +93,8 @@ static const int MAX_IN = 1; // maximum number of input streams
d_do_phase2_tdma(do_phase2_tdma),
p2tdma(0, debug, output_queue),
d_do_msgq(do_msgq),
- d_msg_queue(queue)
+ d_msg_queue(queue),
+ d_input_rate(4800)
{
if (d_do_audio_output && !d_do_output)
fprintf(stderr, "p25_frame_assembler: error: do_output must be enabled if do_audio_output is enabled\n");
@@ -100,6 +102,26 @@ static const int MAX_IN = 1; // maximum number of input streams
fprintf(stderr, "p25_frame_assembler: error: do_imbe must be enabled if do_audio_output is enabled\n");
if (d_do_phase2_tdma && !d_do_audio_output)
fprintf(stderr, "p25_frame_assembler: error: do_audio_output must be enabled if do_phase2_tdma is enabled\n");
+
+ d_sps_port = pmt::mp("input_rate");
+ message_port_register_in(d_sps_port);
+ set_msg_handler(pmt::mp("input_rate"), boost::bind(&p25_frame_assembler_impl::set_input_rate, this, _1));
+}
+
+void
+p25_frame_assembler_impl::set_input_rate(pmt::pmt_t msg)
+{
+ //sps_multiplier
+ if (pmt::is_integer(msg)) {
+ //fprintf(stderr, "set_input_rate received: %d\n", pmt::to_long(msg));
+ if( pmt::to_long(msg) == 8 ) {
+ d_input_rate = 6000;
+ set_output_multiple(640);
+ } else {
+ d_input_rate = 4800;
+ set_output_multiple(864);
+ }
+ }
}
void
@@ -108,6 +130,8 @@ p25_frame_assembler_impl::forecast(int nof_output_items, gr_vector_int &nof_inpu
// for do_imbe=false: we output packed bytes (4:1 ratio)
// for do_imbe=true: input rate= 4800, output rate= 1600 = 32 * 50 (3:1)
// for do_audio_output: output rate=8000 (ratio 0.6:1)
- const size_t nof_inputs = nof_input_items_reqd.size();
- int nof_samples_reqd = 4.0 * nof_output_items;
- if (d_do_imbe)
- nof_samples_reqd = 3.0 * nof_output_items;
- nof_samples_reqd = nof_output_items;
- if (d_do_audio_output)
- nof_samples_reqd = 0.6 * nof_output_items;
- std::fill(&nof_input_items_reqd[0], &nof_input_items_reqd[nof_inputs], nof_samples_reqd);
+ const size_t nof_inputs = nof_input_items_reqd.size();
+ int nof_samples_reqd = (int)std::ceil(4.0 * float(nof_output_items));
+ if (d_do_output) {
+ if (!d_do_audio_output)
+ nof_samples_reqd = (int)std::ceil(3.0 * float(nof_output_items));
+ else {
+ //fprintf(stderr, "d_input_rate: %f\n", (double)(d_input_rate / 8000.f));
+ nof_samples_reqd = (int)std::ceil(float(d_input_rate / 8000) * float(nof_output_items));
+ }
+ }
+ std::fill(&nof_input_items_reqd[0], &nof_input_items_reqd[nof_inputs], nof_samples_reqd);
}