Skip to content

Commit

Permalink
Add SampleSpec::use_defaults() and use in main()
Browse files Browse the repository at this point in the history
Simplify setting of missing fields to default values
and make main() code cleaner.
  • Loading branch information
gavv committed Apr 9, 2024
1 parent 5a839e1 commit ebd0c7a
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 33 deletions.
23 changes: 22 additions & 1 deletion src/internal_modules/roc_audio/sample_spec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
#include "roc_core/macro_helpers.h"
#include "roc_core/panic.h"
#include "roc_packet/units.h"
#include "sample_spec.h"

namespace roc {
namespace audio {
Expand Down Expand Up @@ -154,6 +153,25 @@ void SampleSpec::clear() {
channel_set_.clear();
}

void SampleSpec::use_defaults(PcmFormat default_pcm_fmt,
ChannelLayout default_channel_layout,
ChannelOrder default_channel_order,
ChannelMask default_channel_mask,
size_t default_sample_rate) {
if (sample_fmt_ == SampleFormat_Invalid && default_pcm_fmt != PcmFormat_Invalid) {
set_sample_format(SampleFormat_Pcm);
set_pcm_format(default_pcm_fmt);
}
if (!channel_set_.is_valid() && default_channel_layout != ChanLayout_None) {
channel_set_.set_layout(default_channel_layout);
channel_set_.set_order(default_channel_order);
channel_set_.set_mask(default_channel_mask);
}
if (sample_rate_ == 0 && default_sample_rate != 0) {
set_sample_rate(default_sample_rate);
}
}

SampleFormat SampleSpec::sample_format() const {
return sample_fmt_;
}
Expand All @@ -163,6 +181,9 @@ void SampleSpec::set_sample_format(SampleFormat sample_fmt) {
}

PcmFormat SampleSpec::pcm_format() const {
if (sample_fmt_ != SampleFormat_Pcm) {
return PcmFormat_Invalid;
}
return pcm_fmt_;
}

Expand Down
10 changes: 10 additions & 0 deletions src/internal_modules/roc_audio/sample_spec.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,16 @@ class SampleSpec {
//! Unset all fields.
void clear();

//! Set missing fields from provided defaults.
//! @remarks
//! Updates only those fields which don't have values,
//! with corresponding values provided as arguments.
void use_defaults(PcmFormat default_pcm_fmt,
ChannelLayout default_channel_layout,
ChannelOrder default_channel_order,
ChannelMask default_channel_mask,
size_t default_sample_rate);

//! Get sample rate.
//! @remarks
//! Defines sample frequency (number of samples per second).
Expand Down
7 changes: 7 additions & 0 deletions src/internal_modules/roc_packet/packet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,5 +186,12 @@ int Packet::compare(const Packet& other) const {
return 0;
}

size_t Packet::approx_size(size_t n_samples) {
const size_t approx_header_size = 64;
const size_t approx_sample_size = 64;

return approx_header_size + n_samples * approx_sample_size;
}

} // namespace packet
} // namespace roc
6 changes: 5 additions & 1 deletion src/internal_modules/roc_packet/packet.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ class Packet : public core::RefCounted<Packet, core::PoolAllocation>,
//! Set packet buffer.
void set_buffer(const core::Slice<uint8_t>& data);

//! Get protocol-dependant packet payload.
//! Get protocol-dependent packet payload.
//! @remarks
//! Returns sub-slice with inner-most packet data.
//! E.g. for RTP nested into FECFRAME, returns payload
Expand Down Expand Up @@ -153,6 +153,10 @@ class Packet : public core::RefCounted<Packet, core::PoolAllocation>,
return ROC_CONTAINER_OF(udp, Packet, udp_);
}

//! Estimate number of bytes per packet for given number of samples.
//! This is only an approximation, don't rely on it.
static size_t approx_size(size_t n_samples);

private:
unsigned flags_;

Expand Down
25 changes: 7 additions & 18 deletions src/tools/roc_recv/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,6 @@ int main(int argc, char** argv) {
pipeline::ReceiverSourceConfig receiver_config;

sndio::Config io_config;
io_config.sample_spec.set_sample_format(
receiver_config.common.output_sample_spec.sample_format());
io_config.sample_spec.set_pcm_format(
receiver_config.common.output_sample_spec.pcm_format());
io_config.sample_spec.set_channel_set(
receiver_config.common.output_sample_spec.channel_set());

if (args.frame_len_given) {
if (!core::parse_duration(args.frame_len_arg, io_config.frame_length)) {
Expand All @@ -96,6 +90,7 @@ int main(int argc, char** argv) {
}
}

// TODO(gh-608): replace --rate with --io-encoding
if (args.rate_given) {
if (args.rate_arg <= 0) {
roc_log(LogError, "invalid --rate: should be > 0");
Expand All @@ -104,6 +99,7 @@ int main(int argc, char** argv) {
io_config.sample_spec.set_sample_rate((size_t)args.rate_arg);
}

// TODO(gh-568): remove set_frame_size() after removing sox
sndio::BackendMap::instance().set_frame_size(
io_config.frame_length, receiver_config.common.output_sample_spec);

Expand Down Expand Up @@ -264,14 +260,8 @@ int main(int argc, char** argv) {
}
} else {
audio::SampleSpec spec = io_config.sample_spec;
if (spec.sample_rate() == 0) {
spec.set_sample_rate(48000);
}
if (spec.num_channels() == 0) {
spec.set_channel_set(audio::ChannelSet(audio::ChanLayout_Surround,
audio::ChanOrder_Smpte,
audio::ChanMask_Surround_7_1_4));
}
spec.use_defaults(audio::Sample_RawFormat, audio::ChanLayout_Surround,
audio::ChanOrder_Smpte, audio::ChanMask_Surround_7_1_4, 48000);
context_config.max_frame_size =
spec.ns_2_samples_overall(io_config.frame_length) * sizeof(audio::sample_t);
}
Expand Down Expand Up @@ -333,12 +323,11 @@ int main(int argc, char** argv) {
}

receiver_config.common.enable_timing = !output_sink->has_clock();
receiver_config.common.output_sample_spec.set_sample_rate(
output_sink->sample_spec().sample_rate());
receiver_config.common.output_sample_spec = output_sink->sample_spec();

if (receiver_config.common.output_sample_spec.sample_rate() == 0) {
if (!receiver_config.common.output_sample_spec.is_valid()) {
roc_log(LogError,
"can't detect output sample rate, try to set it "
"can't detect output encoding, try to set it "
"explicitly with --rate option");
return 1;
}
Expand Down
28 changes: 15 additions & 13 deletions src/tools/roc_send/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,6 @@ int main(int argc, char** argv) {
pipeline::SenderSinkConfig sender_config;

sndio::Config io_config;
io_config.sample_spec.set_sample_format(
sender_config.input_sample_spec.sample_format());
io_config.sample_spec.set_pcm_format(sender_config.input_sample_spec.pcm_format());
io_config.sample_spec.set_channel_set(sender_config.input_sample_spec.channel_set());

if (args.frame_len_given) {
if (!core::parse_duration(args.frame_len_arg, io_config.frame_length)) {
Expand All @@ -93,6 +89,7 @@ int main(int argc, char** argv) {
}
}

// TODO(gh-608): replace --rate with --io-encoding
if (args.rate_given) {
if (args.rate_arg <= 0) {
roc_log(LogError, "invalid --rate: should be > 0");
Expand All @@ -101,6 +98,7 @@ int main(int argc, char** argv) {
io_config.sample_spec.set_sample_rate((size_t)args.rate_arg);
}

// TODO(gh-568): remove set_frame_size() after removing sox
sndio::BackendMap::instance().set_frame_size(io_config.frame_length,
sender_config.input_sample_spec);

Expand Down Expand Up @@ -258,13 +256,11 @@ int main(int argc, char** argv) {
return 1;
}
} else {
const size_t extra_space = 64;
// TODO(gh-608): take size from --packet-encoding instead of assuming
// 2 bytes per sample
context_config.max_packet_size = 2
* sender_config.input_sample_spec.ns_2_samples_overall(
sender_config.packet_length)
+ extra_space;
audio::SampleSpec spec = io_config.sample_spec;
spec.use_defaults(audio::Sample_RawFormat, audio::ChanLayout_Surround,
audio::ChanOrder_Smpte, audio::ChanMask_Surround_7_1_4, 48000);
context_config.max_packet_size = packet::Packet::approx_size(
spec.ns_2_samples_overall(io_config.frame_length));
}

if (args.max_frame_size_given) {
Expand Down Expand Up @@ -334,8 +330,14 @@ int main(int argc, char** argv) {
}

sender_config.enable_timing = !input_source->has_clock();
sender_config.input_sample_spec.set_sample_rate(
input_source->sample_spec().sample_rate());
sender_config.input_sample_spec = input_source->sample_spec();

if (!sender_config.input_sample_spec.is_valid()) {
roc_log(LogError,
"can't detect input encoding, try to set it "
"explicitly with --rate option");
return 1;
}

node::Sender sender(context, sender_config);
if (!sender.is_valid()) {
Expand Down

0 comments on commit ebd0c7a

Please sign in to comment.