diff --git a/src/internal_modules/roc_audio/channel_mapper.cpp b/src/internal_modules/roc_audio/channel_mapper.cpp index 18d4d76f6..efb616198 100644 --- a/src/internal_modules/roc_audio/channel_mapper.cpp +++ b/src/internal_modules/roc_audio/channel_mapper.cpp @@ -88,8 +88,8 @@ void ChannelMapper::map_surround_surround_(const sample_t* in_samples, out_s += in_samples[in_ch] * map_matrix_.coeff(out_ch, in_ch); } - out_s = std::min(out_s, SampleMax); - out_s = std::max(out_s, SampleMin); + out_s = std::min(out_s, Sample_Max); + out_s = std::max(out_s, Sample_Min); *out_samples++ = out_s; } diff --git a/src/internal_modules/roc_audio/mixer.cpp b/src/internal_modules/roc_audio/mixer.cpp index 17d0c3cfa..777a87b88 100644 --- a/src/internal_modules/roc_audio/mixer.cpp +++ b/src/internal_modules/roc_audio/mixer.cpp @@ -117,8 +117,8 @@ void Mixer::read_(sample_t* out_data, out_data[n] += temp_data[n]; // Saturate on overflow. - out_data[n] = std::min(out_data[n], SampleMax); - out_data[n] = std::max(out_data[n], SampleMin); + out_data[n] = std::min(out_data[n], Sample_Max); + out_data[n] = std::max(out_data[n], Sample_Min); } // Accumulate flags from all mixed frames. diff --git a/src/internal_modules/roc_audio/pcm_decoder.cpp b/src/internal_modules/roc_audio/pcm_decoder.cpp index 6d2b4a26e..cd9e70445 100644 --- a/src/internal_modules/roc_audio/pcm_decoder.cpp +++ b/src/internal_modules/roc_audio/pcm_decoder.cpp @@ -7,6 +7,7 @@ */ #include "roc_audio/pcm_decoder.h" +#include "roc_audio/sample.h" #include "roc_core/panic.h" namespace roc { @@ -19,7 +20,7 @@ IFrameDecoder* PcmDecoder::construct(core::IArena& arena, } PcmDecoder::PcmDecoder(PcmFormat pcm_format, const SampleSpec& sample_spec) - : pcm_mapper_(pcm_format, SampleFmt) + : pcm_mapper_(pcm_format, Sample_RawFormat) , n_chans_(sample_spec.num_channels()) , stream_pos_(0) , stream_avail_(0) diff --git a/src/internal_modules/roc_audio/pcm_encoder.cpp b/src/internal_modules/roc_audio/pcm_encoder.cpp index 880d38834..cba298bed 100644 --- a/src/internal_modules/roc_audio/pcm_encoder.cpp +++ b/src/internal_modules/roc_audio/pcm_encoder.cpp @@ -19,7 +19,7 @@ IFrameEncoder* PcmEncoder::construct(core::IArena& arena, } PcmEncoder::PcmEncoder(PcmFormat pcm_format, const SampleSpec& sample_spec) - : pcm_mapper_(SampleFmt, pcm_format) + : pcm_mapper_(Sample_RawFormat, pcm_format) , n_chans_(sample_spec.num_channels()) , frame_data_(NULL) , frame_byte_size_(0) diff --git a/src/internal_modules/roc_audio/pcm_format.cpp b/src/internal_modules/roc_audio/pcm_format.cpp index caa653223..070952304 100644 --- a/src/internal_modules/roc_audio/pcm_format.cpp +++ b/src/internal_modules/roc_audio/pcm_format.cpp @@ -14079,7 +14079,7 @@ PcmTraits pcm_format_traits(PcmFormat format) { #else traits.is_little = true; #endif - traits.bit_depth = 32; + traits.bit_depth = 25; traits.bit_width = 32; break; @@ -14088,7 +14088,7 @@ PcmTraits pcm_format_traits(PcmFormat format) { traits.is_integer = false; traits.is_signed = true; traits.is_little = false; - traits.bit_depth = 32; + traits.bit_depth = 25; traits.bit_width = 32; break; @@ -14097,7 +14097,7 @@ PcmTraits pcm_format_traits(PcmFormat format) { traits.is_integer = false; traits.is_signed = true; traits.is_little = true; - traits.bit_depth = 32; + traits.bit_depth = 25; traits.bit_width = 32; break; @@ -14110,7 +14110,7 @@ PcmTraits pcm_format_traits(PcmFormat format) { #else traits.is_little = true; #endif - traits.bit_depth = 64; + traits.bit_depth = 53; traits.bit_width = 64; break; @@ -14119,7 +14119,7 @@ PcmTraits pcm_format_traits(PcmFormat format) { traits.is_integer = false; traits.is_signed = true; traits.is_little = false; - traits.bit_depth = 64; + traits.bit_depth = 53; traits.bit_width = 64; break; @@ -14128,7 +14128,7 @@ PcmTraits pcm_format_traits(PcmFormat format) { traits.is_integer = false; traits.is_signed = true; traits.is_little = true; - traits.bit_depth = 64; + traits.bit_depth = 53; traits.bit_width = 64; break; @@ -14364,7 +14364,6 @@ PcmFormat pcm_format_from_str(const char* str) { if (strcmp(str, "s18_le") == 0) { return PcmFormat_SInt18_Le; } - return PcmFormat_Invalid; if (strcmp(str, "s18_3") == 0) { return PcmFormat_SInt18_3; } @@ -14374,7 +14373,6 @@ PcmFormat pcm_format_from_str(const char* str) { if (strcmp(str, "s18_3le") == 0) { return PcmFormat_SInt18_3_Le; } - return PcmFormat_Invalid; if (strcmp(str, "s18_4") == 0) { return PcmFormat_SInt18_4; } @@ -14399,7 +14397,6 @@ PcmFormat pcm_format_from_str(const char* str) { if (strcmp(str, "s20_le") == 0) { return PcmFormat_SInt20_Le; } - return PcmFormat_Invalid; if (strcmp(str, "s20_3") == 0) { return PcmFormat_SInt20_3; } @@ -14409,7 +14406,6 @@ PcmFormat pcm_format_from_str(const char* str) { if (strcmp(str, "s20_3le") == 0) { return PcmFormat_SInt20_3_Le; } - return PcmFormat_Invalid; if (strcmp(str, "s20_4") == 0) { return PcmFormat_SInt20_4; } @@ -14431,7 +14427,6 @@ PcmFormat pcm_format_from_str(const char* str) { if (strcmp(str, "s24_le") == 0) { return PcmFormat_SInt24_Le; } - return PcmFormat_Invalid; if (strcmp(str, "s24_4") == 0) { return PcmFormat_SInt24_4; } @@ -14513,7 +14508,6 @@ PcmFormat pcm_format_from_str(const char* str) { if (strcmp(str, "u18_le") == 0) { return PcmFormat_UInt18_Le; } - return PcmFormat_Invalid; if (strcmp(str, "u18_3") == 0) { return PcmFormat_UInt18_3; } @@ -14523,7 +14517,6 @@ PcmFormat pcm_format_from_str(const char* str) { if (strcmp(str, "u18_3le") == 0) { return PcmFormat_UInt18_3_Le; } - return PcmFormat_Invalid; if (strcmp(str, "u18_4") == 0) { return PcmFormat_UInt18_4; } @@ -14548,7 +14541,6 @@ PcmFormat pcm_format_from_str(const char* str) { if (strcmp(str, "u20_le") == 0) { return PcmFormat_UInt20_Le; } - return PcmFormat_Invalid; if (strcmp(str, "u20_3") == 0) { return PcmFormat_UInt20_3; } @@ -14558,7 +14550,6 @@ PcmFormat pcm_format_from_str(const char* str) { if (strcmp(str, "u20_3le") == 0) { return PcmFormat_UInt20_3_Le; } - return PcmFormat_Invalid; if (strcmp(str, "u20_4") == 0) { return PcmFormat_UInt20_4; } @@ -14580,7 +14571,6 @@ PcmFormat pcm_format_from_str(const char* str) { if (strcmp(str, "u24_le") == 0) { return PcmFormat_UInt24_Le; } - return PcmFormat_Invalid; if (strcmp(str, "u24_4") == 0) { return PcmFormat_UInt24_4; } diff --git a/src/internal_modules/roc_audio/pcm_format.h b/src/internal_modules/roc_audio/pcm_format.h index eaacf63d1..c5c0e8e9c 100644 --- a/src/internal_modules/roc_audio/pcm_format.h +++ b/src/internal_modules/roc_audio/pcm_format.h @@ -214,7 +214,7 @@ struct PcmTraits { //! Number of significant bits per sample. size_t bit_depth; - //! Number of total bits per sample in packed form. + //! Number of stored bits per sample in packed form. size_t bit_width; PcmTraits() diff --git a/src/internal_modules/roc_audio/pcm_format_gen.py b/src/internal_modules/roc_audio/pcm_format_gen.py index afecfc5ad..ac144d033 100755 --- a/src/internal_modules/roc_audio/pcm_format_gen.py +++ b/src/internal_modules/roc_audio/pcm_format_gen.py @@ -146,6 +146,7 @@ def nth_chars(codes, prefix=()): 'short_name': 's8', 'is_integer': True, 'is_signed': True, + 'depth': 8, 'width': 8, 'packed_width': 8, 'unpacked_width': 8, @@ -159,6 +160,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'u8', 'is_integer': True, 'is_signed': False, + 'depth': 8, 'width': 8, 'packed_width': 8, 'unpacked_width': 8, @@ -172,6 +174,7 @@ def nth_chars(codes, prefix=()): 'short_name': 's16', 'is_integer': True, 'is_signed': True, + 'depth': 16, 'width': 16, 'packed_width': 16, 'unpacked_width': 16, @@ -185,6 +188,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'u16', 'is_integer': True, 'is_signed': False, + 'depth': 16, 'width': 16, 'packed_width': 16, 'unpacked_width': 16, @@ -198,6 +202,7 @@ def nth_chars(codes, prefix=()): 'short_name': 's18', 'is_integer': True, 'is_signed': True, + 'depth': 18, 'width': 18, 'packed_width': 18, 'unpacked_width': 32, @@ -211,6 +216,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'u18', 'is_integer': True, 'is_signed': False, + 'depth': 18, 'width': 18, 'packed_width': 18, 'unpacked_width': 32, @@ -224,6 +230,7 @@ def nth_chars(codes, prefix=()): 'short_name': 's18_3', 'is_integer': True, 'is_signed': True, + 'depth': 18, 'width': 18, 'packed_width': 24, 'unpacked_width': 32, @@ -237,6 +244,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'u18_3', 'is_integer': True, 'is_signed': False, + 'depth': 18, 'width': 18, 'packed_width': 24, 'unpacked_width': 32, @@ -250,6 +258,7 @@ def nth_chars(codes, prefix=()): 'short_name': 's18_4', 'is_integer': True, 'is_signed': True, + 'depth': 18, 'width': 18, 'packed_width': 32, 'unpacked_width': 32, @@ -263,6 +272,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'u18_4', 'is_integer': True, 'is_signed': False, + 'depth': 18, 'width': 18, 'packed_width': 32, 'unpacked_width': 32, @@ -276,6 +286,7 @@ def nth_chars(codes, prefix=()): 'short_name': 's20', 'is_integer': True, 'is_signed': True, + 'depth': 20, 'width': 20, 'packed_width': 20, 'unpacked_width': 32, @@ -289,6 +300,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'u20', 'is_integer': True, 'is_signed': False, + 'depth': 20, 'width': 20, 'packed_width': 20, 'unpacked_width': 32, @@ -302,6 +314,7 @@ def nth_chars(codes, prefix=()): 'short_name': 's20_3', 'is_integer': True, 'is_signed': True, + 'depth': 20, 'width': 20, 'packed_width': 24, 'unpacked_width': 32, @@ -315,6 +328,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'u20_3', 'is_integer': True, 'is_signed': False, + 'depth': 20, 'width': 20, 'packed_width': 24, 'unpacked_width': 32, @@ -328,6 +342,7 @@ def nth_chars(codes, prefix=()): 'short_name': 's20_4', 'is_integer': True, 'is_signed': True, + 'depth': 20, 'width': 20, 'packed_width': 32, 'unpacked_width': 32, @@ -341,6 +356,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'u20_4', 'is_integer': True, 'is_signed': False, + 'depth': 20, 'width': 20, 'packed_width': 32, 'unpacked_width': 32, @@ -354,6 +370,7 @@ def nth_chars(codes, prefix=()): 'short_name': 's24', 'is_integer': True, 'is_signed': True, + 'depth': 24, 'width': 24, 'packed_width': 24, 'unpacked_width': 32, @@ -367,6 +384,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'u24', 'is_integer': True, 'is_signed': False, + 'depth': 24, 'width': 24, 'packed_width': 24, 'unpacked_width': 32, @@ -380,6 +398,7 @@ def nth_chars(codes, prefix=()): 'short_name': 's24_4', 'is_integer': True, 'is_signed': True, + 'depth': 24, 'width': 24, 'packed_width': 32, 'unpacked_width': 32, @@ -393,6 +412,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'u24_4', 'is_integer': True, 'is_signed': False, + 'depth': 24, 'width': 24, 'packed_width': 32, 'unpacked_width': 32, @@ -406,6 +426,7 @@ def nth_chars(codes, prefix=()): 'short_name': 's32', 'is_integer': True, 'is_signed': True, + 'depth': 32, 'width': 32, 'packed_width': 32, 'unpacked_width': 32, @@ -419,6 +440,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'u32', 'is_integer': True, 'is_signed': False, + 'depth': 32, 'width': 32, 'packed_width': 32, 'unpacked_width': 32, @@ -432,6 +454,7 @@ def nth_chars(codes, prefix=()): 'short_name': 's64', 'is_integer': True, 'is_signed': True, + 'depth': 64, 'width': 64, 'packed_width': 64, 'unpacked_width': 64, @@ -445,6 +468,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'u64', 'is_integer': True, 'is_signed': False, + 'depth': 64, 'width': 64, 'packed_width': 64, 'unpacked_width': 64, @@ -457,6 +481,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'f32', 'is_integer': False, 'is_signed': True, + 'depth': 25, 'width': 32, 'packed_width': 32, 'unpacked_width': 32, @@ -469,6 +494,7 @@ def nth_chars(codes, prefix=()): 'short_name': 'f64', 'is_integer': False, 'is_signed': True, + 'depth': 53, 'width': 64, 'packed_width': 64, 'unpacked_width': 64, @@ -918,7 +944,7 @@ def nth_chars(codes, prefix=()): {% else %} traits.is_little = {{ str(endian == 'Little').lower() }}; {% endif %} - traits.bit_depth = {{ code.width }}; + traits.bit_depth = {{ code.depth }}; traits.bit_width = {{ code.packed_width }}; break; @@ -962,9 +988,9 @@ def nth_chars(codes, prefix=()): return {{ make_enum_name(code, endian) }}; } {% endfor %} - return PcmFormat_Invalid; {% endif %} {% endfor %} + return PcmFormat_Invalid; } {% endfor %} {% for code in CODES %} diff --git a/src/internal_modules/roc_audio/sample.cpp b/src/internal_modules/roc_audio/sample.cpp index 95f336033..bec67f725 100644 --- a/src/internal_modules/roc_audio/sample.cpp +++ b/src/internal_modules/roc_audio/sample.cpp @@ -8,7 +8,7 @@ #include "roc_audio/sample.h" -const roc::audio::PcmFormat roc::audio::SampleFmt = roc::audio::PcmFormat_Float32; +const roc::audio::PcmFormat roc::audio::Sample_RawFormat = roc::audio::PcmFormat_Float32; -const roc::audio::sample_t roc::audio::SampleMin = -1; -const roc::audio::sample_t roc::audio::SampleMax = 1; +const roc::audio::sample_t roc::audio::Sample_Min = -1; +const roc::audio::sample_t roc::audio::Sample_Max = 1; diff --git a/src/internal_modules/roc_audio/sample.h b/src/internal_modules/roc_audio/sample.h index 45374fd63..14fc41031 100644 --- a/src/internal_modules/roc_audio/sample.h +++ b/src/internal_modules/roc_audio/sample.h @@ -22,13 +22,13 @@ namespace audio { typedef float sample_t; //! Format description for raw audio samples. -extern const PcmFormat SampleFmt; +extern const PcmFormat Sample_RawFormat; //! Minimum possible value of a raw sample. -extern const sample_t SampleMin; +extern const sample_t Sample_Min; //! Maximum possible value of a raw sample. -extern const sample_t SampleMax; +extern const sample_t Sample_Max; } // namespace audio } // namespace roc diff --git a/src/internal_modules/roc_audio/sample_format.cpp b/src/internal_modules/roc_audio/sample_format.cpp new file mode 100644 index 000000000..992213b61 --- /dev/null +++ b/src/internal_modules/roc_audio/sample_format.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2023 Roc Streaming authors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "roc_audio/sample_format.h" + +namespace roc { +namespace audio { + +const char* sample_format_to_str(SampleFormat format) { + switch (format) { + case SampleFormat_Pcm: + return "pcm"; + + case SampleFormat_Invalid: + break; + } + + return "invalid"; +} + +} // namespace audio +} // namespace roc diff --git a/src/internal_modules/roc_audio/sample_format.h b/src/internal_modules/roc_audio/sample_format.h index c7bcd54c1..b449588b0 100644 --- a/src/internal_modules/roc_audio/sample_format.h +++ b/src/internal_modules/roc_audio/sample_format.h @@ -30,6 +30,9 @@ enum SampleFormat { SampleFormat_Pcm, }; +//! Get string name of sample format. +const char* sample_format_to_str(SampleFormat format); + } // namespace audio } // namespace roc diff --git a/src/internal_modules/roc_audio/sample_spec.cpp b/src/internal_modules/roc_audio/sample_spec.cpp index 78799bf76..a1ab49c4c 100644 --- a/src/internal_modules/roc_audio/sample_spec.cpp +++ b/src/internal_modules/roc_audio/sample_spec.cpp @@ -7,6 +7,8 @@ */ #include "roc_audio/sample_spec.h" +#include "roc_audio/pcm_format.h" +#include "roc_audio/sample_format.h" #include "roc_audio/sample_spec_to_str.h" #include "roc_core/macro_helpers.h" #include "roc_core/panic.h" @@ -63,30 +65,41 @@ core::nanoseconds_t nsamples_2_ns(const float n_samples, const size_t sample_rat } // namespace SampleSpec::SampleSpec() - : sample_rate_(0) { + : sample_rate_(0) + , sample_fmt_(SampleFormat_Invalid) + , pcm_fmt_(PcmFormat_Invalid) { } -SampleSpec::SampleSpec(const size_t sample_rate, const ChannelSet& channel_set) +SampleSpec::SampleSpec(const size_t sample_rate, + const PcmFormat pcm_fmt, + const ChannelSet& channel_set) : sample_rate_(sample_rate) + , sample_fmt_(SampleFormat_Pcm) + , pcm_fmt_(pcm_fmt) , channel_set_(channel_set) { roc_panic_if_msg(sample_rate_ == 0, "sample spec: invalid sample rate"); - roc_panic_if_msg(channel_set_.layout() == ChanLayout_None, - "sample spec: invalid channel layout"); - roc_panic_if_msg(channel_set_.num_channels() == 0, - "sample spec: invalid channel count"); + roc_panic_if_msg(pcm_fmt_ == PcmFormat_Invalid, "sample spec: invalid pcm format"); + roc_panic_if_msg(!channel_set_.is_valid(), "sample spec: invalid channel set"); } SampleSpec::SampleSpec(const size_t sample_rate, + const PcmFormat pcm_fmt, const ChannelLayout channel_layout, ChannelOrder channel_order, const ChannelMask channel_mask) : sample_rate_(sample_rate) + , sample_fmt_(SampleFormat_Pcm) + , pcm_fmt_(pcm_fmt) , channel_set_(channel_layout, channel_order, channel_mask) { roc_panic_if_msg(sample_rate_ == 0, "sample spec: invalid sample rate"); + roc_panic_if_msg(pcm_fmt_ == PcmFormat_Invalid, "sample spec: invalid pcm format"); + roc_panic_if_msg(!channel_set_.is_valid(), "sample spec: invalid channel set"); } bool SampleSpec::operator==(const SampleSpec& other) const { - return sample_rate_ == other.sample_rate_ && channel_set_ == other.channel_set_; + return sample_fmt_ == other.sample_fmt_ + && (pcm_fmt_ == other.pcm_fmt_ || sample_fmt_ != SampleFormat_Pcm) + && sample_rate_ == other.sample_rate_ && channel_set_ == other.channel_set_; } bool SampleSpec::operator!=(const SampleSpec& other) const { @@ -94,14 +107,34 @@ bool SampleSpec::operator!=(const SampleSpec& other) const { } bool SampleSpec::is_valid() const { - return sample_rate_ != 0 && channel_set_.is_valid(); + return sample_fmt_ != SampleFormat_Invalid + && ((sample_fmt_ == SampleFormat_Pcm) == (pcm_fmt_ != PcmFormat_Invalid)) + && sample_rate_ != 0 && channel_set_.is_valid(); } void SampleSpec::clear() { + sample_fmt_ = SampleFormat_Invalid; + pcm_fmt_ = PcmFormat_Invalid; sample_rate_ = 0; channel_set_.clear(); } +SampleFormat SampleSpec::sample_format() const { + return sample_fmt_; +} + +void SampleSpec::set_sample_format(SampleFormat sample_fmt) { + sample_fmt_ = sample_fmt; +} + +PcmFormat SampleSpec::pcm_format() const { + return pcm_fmt_; +} + +void SampleSpec::set_pcm_format(PcmFormat pcm_fmt) { + pcm_fmt_ = pcm_fmt; +} + size_t SampleSpec::sample_rate() const { return sample_rate_; } diff --git a/src/internal_modules/roc_audio/sample_spec.h b/src/internal_modules/roc_audio/sample_spec.h index e962c32d6..6976c2e40 100644 --- a/src/internal_modules/roc_audio/sample_spec.h +++ b/src/internal_modules/roc_audio/sample_spec.h @@ -13,7 +13,9 @@ #define ROC_AUDIO_SAMPLE_SPEC_H_ #include "roc_audio/channel_set.h" +#include "roc_audio/pcm_format.h" #include "roc_audio/sample.h" +#include "roc_audio/sample_format.h" #include "roc_core/stddefs.h" #include "roc_core/string_builder.h" #include "roc_core/time.h" @@ -30,13 +32,18 @@ class SampleSpec { SampleSpec(); //! Construct specification with parameters. - SampleSpec(size_t sample_rate, const ChannelSet& channel_set); + //! @note + //! This constructor sets sample_format() to SampleFormat_Pcm. + SampleSpec(size_t sample_rate, PcmFormat pcm_fmt, const ChannelSet& channel_set); //! Construct specification with parameters. //! @remarks //! This is a convenient overload for the case when 32-bit mask is enough to //! describe channels. Otherwise, use overload that accepts ChannelSet. + //! @note + //! This constructor sets sample_format() to SampleFormat_Pcm. SampleSpec(size_t sample_rate, + PcmFormat pcm_fmt, ChannelLayout channel_layout, ChannelOrder channel_order, ChannelMask channel_mask); @@ -69,6 +76,25 @@ class SampleSpec { //! Set sample rate. void set_sample_rate(size_t sample_rate); + //! Get sample format. + //! @remarks + //! Defines how samples are represented in memory. + //! When set to SampleFormat_Pcm, pcm_format() defines what exact PCM coding + //! and endian are used. + SampleFormat sample_format() const; + + //! Set sample format. + void set_sample_format(SampleFormat sample_fmt); + + //! Get PCM format. + //! @remarks + //! When sample_format() is set to SampleFormat_Pcm, defines what exact PCM coding + //! and endian are used. + PcmFormat pcm_format() const; + + //! Set PCM format. + void set_pcm_format(PcmFormat pcm_fmt); + //! Get channel set. //! @remarks //! Defines sample channels (layout and numbers). @@ -149,6 +175,8 @@ class SampleSpec { private: size_t sample_rate_; + SampleFormat sample_fmt_; + PcmFormat pcm_fmt_; ChannelSet channel_set_; }; diff --git a/src/internal_modules/roc_audio/sample_spec_format.cpp b/src/internal_modules/roc_audio/sample_spec_format.cpp index a08271faf..76e018c0c 100644 --- a/src/internal_modules/roc_audio/sample_spec_format.cpp +++ b/src/internal_modules/roc_audio/sample_spec_format.cpp @@ -14,6 +14,14 @@ namespace audio { void format_sample_spec(const SampleSpec& sample_spec, core::StringBuilder& bld) { bld.append_str(""); bld.append_str(" chset="); format_channel_set(sample_spec.channel_set(), bld); bld.append_str(">"); diff --git a/src/internal_modules/roc_audio/sample_spec_parse.rl b/src/internal_modules/roc_audio/sample_spec_parse.rl index ce7ddfc70..6948cf847 100644 --- a/src/internal_modules/roc_audio/sample_spec_parse.rl +++ b/src/internal_modules/roc_audio/sample_spec_parse.rl @@ -208,6 +208,18 @@ bool parse_sample_spec_imp(const char* str, SampleSpec& sample_spec) { sample_spec.channel_set().set_order(ChanOrder_None); } + action set_format { + char str[16] = {}; + strncat(str, start_p, p - start_p); + PcmFormat pcm_fmt = pcm_format_from_str(str); + if (pcm_fmt == PcmFormat_Invalid) { + roc_log(LogError, "parse sample spec: invalid sample format"); + return false; + } + sample_spec.set_sample_format(SampleFormat_Pcm); + sample_spec.set_pcm_format(pcm_fmt); + } + action set_rate { size_t rate = 0; if (!parse_sample_rate(start_p, p - start_p, rate)) { @@ -235,7 +247,7 @@ bool parse_sample_spec_imp(const char* str, SampleSpec& sample_spec) { mtr = (mtr_mask | mtr_list) %set_mtr; - format = [a-z0-9_]+; + format = [a-z0-9_]+ >start_token %set_format; rate = [0-9]+ >start_token %set_rate; channels = surround | mtr; diff --git a/src/internal_modules/roc_pipeline/config.h b/src/internal_modules/roc_pipeline/config.h index b09481f9c..465f5581e 100644 --- a/src/internal_modules/roc_pipeline/config.h +++ b/src/internal_modules/roc_pipeline/config.h @@ -38,6 +38,7 @@ const size_t DefaultSampleRate = 44100; //! Default sample specification. static const audio::SampleSpec DefaultSampleSpec(DefaultSampleRate, + audio::Sample_RawFormat, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, audio::ChanMask_Surround_Stereo); diff --git a/src/internal_modules/roc_pipeline/receiver_session.cpp b/src/internal_modules/roc_pipeline/receiver_session.cpp index 73de14794..8fb474a89 100644 --- a/src/internal_modules/roc_pipeline/receiver_session.cpp +++ b/src/internal_modules/roc_pipeline/receiver_session.cpp @@ -155,6 +155,7 @@ ReceiverSession::ReceiverSession( new (channel_mapper_reader_) audio::ChannelMapperReader( *areader, sample_buffer_factory, encoding->sample_spec, audio::SampleSpec(encoding->sample_spec.sample_rate(), + common_config.output_sample_spec.pcm_format(), common_config.output_sample_spec.channel_set()))); if (!channel_mapper_reader_ || !channel_mapper_reader_->is_valid()) { return; @@ -176,6 +177,7 @@ ReceiverSession::ReceiverSession( session_config.resampler_backend, arena, sample_buffer_factory, session_config.resampler_profile, audio::SampleSpec(encoding->sample_spec.sample_rate(), + common_config.output_sample_spec.pcm_format(), common_config.output_sample_spec.channel_set()), common_config.output_sample_spec)); @@ -186,6 +188,7 @@ ReceiverSession::ReceiverSession( resampler_reader_.reset(new (resampler_reader_) audio::ResamplerReader( *areader, *resampler_, audio::SampleSpec(encoding->sample_spec.sample_rate(), + common_config.output_sample_spec.pcm_format(), common_config.output_sample_spec.channel_set()), common_config.output_sample_spec)); diff --git a/src/internal_modules/roc_pipeline/sender_session.cpp b/src/internal_modules/roc_pipeline/sender_session.cpp index 7b5b34e3e..04f11c2c1 100644 --- a/src/internal_modules/roc_pipeline/sender_session.cpp +++ b/src/internal_modules/roc_pipeline/sender_session.cpp @@ -121,6 +121,7 @@ bool SenderSession::create_transport_pipeline(SenderEndpoint* source_endpoint, new (channel_mapper_writer_) audio::ChannelMapperWriter( *awriter, sample_buffer_factory_, audio::SampleSpec(encoding->sample_spec.sample_rate(), + config_.input_sample_spec.pcm_format(), config_.input_sample_spec.channel_set()), encoding->sample_spec)); if (!channel_mapper_writer_ || !channel_mapper_writer_->is_valid()) { @@ -134,6 +135,7 @@ bool SenderSession::create_transport_pipeline(SenderEndpoint* source_endpoint, config_.resampler_backend, arena_, sample_buffer_factory_, config_.resampler_profile, config_.input_sample_spec, audio::SampleSpec(encoding->sample_spec.sample_rate(), + config_.input_sample_spec.pcm_format(), config_.input_sample_spec.channel_set()))); if (!resampler_) { @@ -143,6 +145,7 @@ bool SenderSession::create_transport_pipeline(SenderEndpoint* source_endpoint, resampler_writer_.reset(new (resampler_writer_) audio::ResamplerWriter( *awriter, *resampler_, sample_buffer_factory_, config_.input_sample_spec, audio::SampleSpec(encoding->sample_spec.sample_rate(), + config_.input_sample_spec.pcm_format(), config_.input_sample_spec.channel_set()))); if (!resampler_writer_ || !resampler_writer_->is_valid()) { diff --git a/src/internal_modules/roc_pipeline/transcoder_sink.cpp b/src/internal_modules/roc_pipeline/transcoder_sink.cpp index 5b038f8e1..011786603 100644 --- a/src/internal_modules/roc_pipeline/transcoder_sink.cpp +++ b/src/internal_modules/roc_pipeline/transcoder_sink.cpp @@ -31,6 +31,7 @@ TranscoderSink::TranscoderSink(const TranscoderConfig& config, new (channel_mapper_writer_) audio::ChannelMapperWriter( *awriter, buffer_factory, audio::SampleSpec(config.output_sample_spec.sample_rate(), + config.input_sample_spec.pcm_format(), config.input_sample_spec.channel_set()), config.output_sample_spec)); if (!channel_mapper_writer_ || !channel_mapper_writer_->is_valid()) { @@ -52,6 +53,7 @@ TranscoderSink::TranscoderSink(const TranscoderConfig& config, resampler_writer_.reset(new (resampler_writer_) audio::ResamplerWriter( *awriter, *resampler_, buffer_factory, config.input_sample_spec, audio::SampleSpec(config.output_sample_spec.sample_rate(), + config.input_sample_spec.pcm_format(), config.input_sample_spec.channel_set()))); if (!resampler_writer_ || !resampler_writer_->is_valid()) { diff --git a/src/internal_modules/roc_pipeline/transcoder_source.cpp b/src/internal_modules/roc_pipeline/transcoder_source.cpp index 9cd0abb48..f92ecc38f 100644 --- a/src/internal_modules/roc_pipeline/transcoder_source.cpp +++ b/src/internal_modules/roc_pipeline/transcoder_source.cpp @@ -29,6 +29,7 @@ TranscoderSource::TranscoderSource(const TranscoderConfig& config, new (channel_mapper_reader_) audio::ChannelMapperReader( *areader, buffer_factory, config.input_sample_spec, audio::SampleSpec(config.input_sample_spec.sample_rate(), + config.output_sample_spec.pcm_format(), config.output_sample_spec.channel_set()))); if (!channel_mapper_reader_ || !channel_mapper_reader_->is_valid()) { return; @@ -48,6 +49,7 @@ TranscoderSource::TranscoderSource(const TranscoderConfig& config, resampler_.reset(audio::ResamplerMap::instance().new_resampler( config.resampler_backend, arena, buffer_factory, config.resampler_profile, audio::SampleSpec(config.input_sample_spec.sample_rate(), + config.output_sample_spec.pcm_format(), config.output_sample_spec.channel_set()), config.output_sample_spec)); @@ -58,6 +60,7 @@ TranscoderSource::TranscoderSource(const TranscoderConfig& config, resampler_reader_.reset(new (resampler_reader_) audio::ResamplerReader( *areader, *resampler_, audio::SampleSpec(config.input_sample_spec.sample_rate(), + config.output_sample_spec.pcm_format(), config.output_sample_spec.channel_set()), config.output_sample_spec)); diff --git a/src/internal_modules/roc_rtp/encoding_map.cpp b/src/internal_modules/roc_rtp/encoding_map.cpp index be8bd5d5f..fa89017f1 100644 --- a/src/internal_modules/roc_rtp/encoding_map.cpp +++ b/src/internal_modules/roc_rtp/encoding_map.cpp @@ -21,9 +21,9 @@ EncodingMap::EncodingMap(core::IArena& arena) Encoding enc; enc.payload_type = PayloadType_L16_Mono; enc.pcm_format = audio::PcmFormat_SInt16_Be; - enc.sample_spec = - audio::SampleSpec(44100, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, - audio::ChanMask_Surround_Mono); + enc.sample_spec = audio::SampleSpec( + 44100, audio::PcmFormat_SInt16_Be, audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, audio::ChanMask_Surround_Mono); enc.packet_flags = packet::Packet::FlagAudio; enc.new_encoder = &audio::PcmEncoder::construct; enc.new_decoder = &audio::PcmDecoder::construct; @@ -34,9 +34,9 @@ EncodingMap::EncodingMap(core::IArena& arena) Encoding enc; enc.payload_type = PayloadType_L16_Stereo; enc.pcm_format = audio::PcmFormat_SInt16_Be; - enc.sample_spec = - audio::SampleSpec(44100, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, - audio::ChanMask_Surround_Stereo); + enc.sample_spec = audio::SampleSpec( + 44100, audio::PcmFormat_SInt16_Be, audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, audio::ChanMask_Surround_Stereo); enc.packet_flags = packet::Packet::FlagAudio; enc.new_encoder = &audio::PcmEncoder::construct; enc.new_decoder = &audio::PcmDecoder::construct; diff --git a/src/internal_modules/roc_sndio/target_sox/roc_sndio/sox_sink.cpp b/src/internal_modules/roc_sndio/target_sox/roc_sndio/sox_sink.cpp index e81fd1137..f93ee2e0b 100644 --- a/src/internal_modules/roc_sndio/target_sox/roc_sndio/sox_sink.cpp +++ b/src/internal_modules/roc_sndio/target_sox/roc_sndio/sox_sink.cpp @@ -104,13 +104,15 @@ audio::SampleSpec SoxSink::sample_spec() const { } if (output_->signal.channels == 1) { - return audio::SampleSpec(size_t(output_->signal.rate), audio::ChanLayout_Surround, - audio::ChanOrder_Smpte, audio::ChanMask_Surround_Mono); + return audio::SampleSpec(size_t(output_->signal.rate), audio::Sample_RawFormat, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, + audio::ChanMask_Surround_Mono); } if (output_->signal.channels == 2) { - return audio::SampleSpec(size_t(output_->signal.rate), audio::ChanLayout_Surround, - audio::ChanOrder_Smpte, audio::ChanMask_Surround_Stereo); + return audio::SampleSpec(size_t(output_->signal.rate), audio::Sample_RawFormat, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, + audio::ChanMask_Surround_Stereo); } roc_panic("sox sink: unsupported channel count"); diff --git a/src/internal_modules/roc_sndio/target_sox/roc_sndio/sox_source.cpp b/src/internal_modules/roc_sndio/target_sox/roc_sndio/sox_source.cpp index 06ab43bf2..fe9b84e0b 100644 --- a/src/internal_modules/roc_sndio/target_sox/roc_sndio/sox_source.cpp +++ b/src/internal_modules/roc_sndio/target_sox/roc_sndio/sox_source.cpp @@ -180,13 +180,15 @@ audio::SampleSpec SoxSource::sample_spec() const { } if (input_->signal.channels == 1) { - return audio::SampleSpec(size_t(input_->signal.rate), audio::ChanLayout_Surround, - audio::ChanOrder_Smpte, audio::ChanMask_Surround_Mono); + return audio::SampleSpec(size_t(input_->signal.rate), audio::Sample_RawFormat, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, + audio::ChanMask_Surround_Mono); } if (input_->signal.channels == 2) { - return audio::SampleSpec(size_t(input_->signal.rate), audio::ChanLayout_Surround, - audio::ChanOrder_Smpte, audio::ChanMask_Surround_Stereo); + return audio::SampleSpec(size_t(input_->signal.rate), audio::Sample_RawFormat, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, + audio::ChanMask_Surround_Stereo); } roc_panic("sox source: unsupported channel count"); diff --git a/src/public_api/src/adapters.cpp b/src/public_api/src/adapters.cpp index 297c28108..dab9146ef 100644 --- a/src/public_api/src/adapters.cpp +++ b/src/public_api/src/adapters.cpp @@ -11,6 +11,7 @@ #include "roc_address/interface.h" #include "roc_audio/channel_defs.h" #include "roc_audio/freq_estimator.h" +#include "roc_audio/pcm_format.h" #include "roc_audio/resampler_backend.h" #include "roc_audio/resampler_profile.h" #include "roc_core/attributes.h" @@ -303,7 +304,7 @@ bool sample_spec_from_user(audio::SampleSpec& out, const roc_media_encoding& in) return false; } - if (in.format != ROC_FORMAT_PCM_FLOAT32) { + if (!sample_format_from_user(out, in.format)) { roc_log(LogError, "bad configuration: invalid roc_media_encoding.format:" " should be valid enum value"); @@ -351,6 +352,18 @@ bool sample_spec_from_user(audio::SampleSpec& out, const roc_media_encoding& in) return true; } +ROC_ATTR_NO_SANITIZE_UB +bool sample_format_from_user(audio::SampleSpec& out, roc_format in) { + switch (enum_from_user(in)) { + case ROC_FORMAT_PCM_FLOAT32: + out.set_sample_format(audio::SampleFormat_Pcm); + out.set_pcm_format(audio::PcmFormat_Float32); + return true; + } + + return false; +} + ROC_ATTR_NO_SANITIZE_UB bool channel_set_from_user(audio::ChannelSet& out, roc_channel_layout in, diff --git a/src/public_api/src/adapters.h b/src/public_api/src/adapters.h index c717cdf5b..fc514f0f0 100644 --- a/src/public_api/src/adapters.h +++ b/src/public_api/src/adapters.h @@ -38,6 +38,8 @@ bool receiver_interface_config_from_user(netio::UdpReceiverConfig& out, bool sample_spec_from_user(audio::SampleSpec& out, const roc_media_encoding& in); +bool sample_format_from_user(audio::SampleSpec& out, roc_format in); + bool channel_set_from_user(audio::ChannelSet& out, roc_channel_layout in, unsigned int in_tracks); diff --git a/src/tests/public_api/test_context.cpp b/src/tests/public_api/test_context.cpp index 85a332ed4..284cd3955 100644 --- a/src/tests/public_api/test_context.cpp +++ b/src/tests/public_api/test_context.cpp @@ -58,6 +58,7 @@ TEST(context, reference_counting) { sender_config.frame_encoding.rate = 44100; sender_config.frame_encoding.format = ROC_FORMAT_PCM_FLOAT32; sender_config.frame_encoding.channels = ROC_CHANNEL_LAYOUT_STEREO; + sender_config.packet_encoding = ROC_PACKET_ENCODING_AVP_L16_STEREO; roc_sender* sender = NULL; CHECK(roc_sender_open(context, &sender_config, &sender) == 0); diff --git a/src/tests/public_api/test_sender.cpp b/src/tests/public_api/test_sender.cpp index 7369773b1..444466726 100644 --- a/src/tests/public_api/test_sender.cpp +++ b/src/tests/public_api/test_sender.cpp @@ -33,6 +33,7 @@ TEST_GROUP(sender) { sender_config.frame_encoding.rate = 44100; sender_config.frame_encoding.format = ROC_FORMAT_PCM_FLOAT32; sender_config.frame_encoding.channels = ROC_CHANNEL_LAYOUT_STEREO; + sender_config.packet_encoding = ROC_PACKET_ENCODING_AVP_L16_STEREO; sender_config.fec_encoding = ROC_FEC_ENCODING_DISABLE; } diff --git a/src/tests/public_api/test_sender_encoder.cpp b/src/tests/public_api/test_sender_encoder.cpp index 448a434d9..cf02fbc63 100644 --- a/src/tests/public_api/test_sender_encoder.cpp +++ b/src/tests/public_api/test_sender_encoder.cpp @@ -33,6 +33,7 @@ TEST_GROUP(sender_encoder) { sender_config.frame_encoding.rate = 44100; sender_config.frame_encoding.format = ROC_FORMAT_PCM_FLOAT32; sender_config.frame_encoding.channels = ROC_CHANNEL_LAYOUT_STEREO; + sender_config.packet_encoding = ROC_PACKET_ENCODING_AVP_L16_STEREO; sender_config.fec_encoding = ROC_FEC_ENCODING_DISABLE; } diff --git a/src/tests/roc_audio/test_channel_mapper_reader.cpp b/src/tests/roc_audio/test_channel_mapper_reader.cpp index 9f050f4e9..3a2e52a52 100644 --- a/src/tests/roc_audio/test_channel_mapper_reader.cpp +++ b/src/tests/roc_audio/test_channel_mapper_reader.cpp @@ -78,10 +78,10 @@ TEST_GROUP(channel_mapper_reader) {}; TEST(channel_mapper_reader, small_frame_upmix) { enum { FrameSz = MaxSz / 2 }; - const SampleSpec in_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); - const SampleSpec out_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo); + const SampleSpec in_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); + const SampleSpec out_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo); const core::nanoseconds_t start_ts = 1000000; @@ -110,10 +110,10 @@ TEST(channel_mapper_reader, small_frame_upmix) { TEST(channel_mapper_reader, small_frame_downmix) { enum { FrameSz = MaxSz / 2 }; - const SampleSpec in_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo); - const SampleSpec out_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec in_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo); + const SampleSpec out_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); const core::nanoseconds_t start_ts = 1000000; @@ -142,10 +142,10 @@ TEST(channel_mapper_reader, small_frame_downmix) { TEST(channel_mapper_reader, small_frame_nocts) { enum { FrameSz = MaxSz / 2 }; - const SampleSpec in_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo); - const SampleSpec out_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec in_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo); + const SampleSpec out_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); test::MockReader mock_reader; ChannelMapperReader mapper_reader(mock_reader, buffer_factory, in_spec, out_spec); @@ -171,10 +171,10 @@ TEST(channel_mapper_reader, small_frame_nocts) { TEST(channel_mapper_reader, large_frame_upmix) { enum { FrameSz = MaxSz * 4 }; - const SampleSpec in_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); - const SampleSpec out_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo); + const SampleSpec in_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); + const SampleSpec out_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo); const core::nanoseconds_t start_ts = 1000000; @@ -205,10 +205,10 @@ TEST(channel_mapper_reader, large_frame_upmix) { TEST(channel_mapper_reader, large_frame_downmix) { enum { FrameSz = MaxSz }; - const SampleSpec in_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo); - const SampleSpec out_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec in_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo); + const SampleSpec out_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); const core::nanoseconds_t start_ts = 1000000; @@ -239,10 +239,10 @@ TEST(channel_mapper_reader, large_frame_downmix) { TEST(channel_mapper_reader, large_frame_nocts) { enum { FrameSz = MaxSz }; - const SampleSpec in_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo); - const SampleSpec out_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec in_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo); + const SampleSpec out_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); test::MockReader mock_reader; ChannelMapperReader mapper_reader(mock_reader, buffer_factory, in_spec, out_spec); diff --git a/src/tests/roc_audio/test_channel_mapper_writer.cpp b/src/tests/roc_audio/test_channel_mapper_writer.cpp index f8a1f9312..3c17dabae 100644 --- a/src/tests/roc_audio/test_channel_mapper_writer.cpp +++ b/src/tests/roc_audio/test_channel_mapper_writer.cpp @@ -76,10 +76,10 @@ TEST_GROUP(channel_mapper_writer) {}; TEST(channel_mapper_writer, small_frame_upmix) { enum { FrameSz = MaxSz / 2 }; - const SampleSpec in_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); - const SampleSpec out_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo); + const SampleSpec in_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); + const SampleSpec out_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo); test::MockWriter mock_writer; ChannelMapperWriter mapper_writer(mock_writer, buffer_factory, in_spec, out_spec); @@ -109,10 +109,10 @@ TEST(channel_mapper_writer, small_frame_upmix) { TEST(channel_mapper_writer, small_frame_downmix) { enum { FrameSz = MaxSz / 2 }; - const SampleSpec in_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo); - const SampleSpec out_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec in_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo); + const SampleSpec out_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); test::MockWriter mock_writer; ChannelMapperWriter mapper_writer(mock_writer, buffer_factory, in_spec, out_spec); @@ -142,10 +142,10 @@ TEST(channel_mapper_writer, small_frame_downmix) { TEST(channel_mapper_writer, small_frame_nocts) { enum { FrameSz = MaxSz / 2 }; - const SampleSpec in_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo); - const SampleSpec out_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec in_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo); + const SampleSpec out_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); test::MockWriter mock_writer; ChannelMapperWriter mapper_writer(mock_writer, buffer_factory, in_spec, out_spec); @@ -174,10 +174,10 @@ TEST(channel_mapper_writer, small_frame_nocts) { TEST(channel_mapper_writer, large_frame_upmix) { enum { FrameSz = MaxSz * 3 }; - const SampleSpec in_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); - const SampleSpec out_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo); + const SampleSpec in_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); + const SampleSpec out_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo); test::MockWriter mock_writer; ChannelMapperWriter mapper_writer(mock_writer, buffer_factory, in_spec, out_spec); @@ -210,10 +210,10 @@ TEST(channel_mapper_writer, large_frame_upmix) { TEST(channel_mapper_writer, large_frame_downmix) { enum { FrameSz = MaxSz * 4 }; - const SampleSpec in_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo); - const SampleSpec out_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec in_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo); + const SampleSpec out_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); test::MockWriter mock_writer; ChannelMapperWriter mapper_writer(mock_writer, buffer_factory, in_spec, out_spec); @@ -246,10 +246,10 @@ TEST(channel_mapper_writer, large_frame_downmix) { TEST(channel_mapper_writer, large_frame_nocts) { enum { FrameSz = MaxSz * 4 }; - const SampleSpec in_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo); - const SampleSpec out_spec(MaxSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec in_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo); + const SampleSpec out_spec(MaxSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); test::MockWriter mock_writer; ChannelMapperWriter mapper_writer(mock_writer, buffer_factory, in_spec, out_spec); diff --git a/src/tests/roc_audio/test_depacketizer.cpp b/src/tests/roc_audio/test_depacketizer.cpp index d8be2b00a..03c479636 100644 --- a/src/tests/roc_audio/test_depacketizer.cpp +++ b/src/tests/roc_audio/test_depacketizer.cpp @@ -37,7 +37,8 @@ enum { SamplesSize = SamplesPerPacket * NumCh }; -const SampleSpec SampleSpecs(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, ChMask); +const SampleSpec SampleSpecs( + SampleRate, Sample_RawFormat, ChanLayout_Surround, ChanOrder_Smpte, ChMask); const PcmFormat PcmFmt = PcmFormat_SInt16_Be; const core::nanoseconds_t NsPerPacket = SampleSpecs.samples_overall_2_ns(SamplesSize); const core::nanoseconds_t Now = 1691499037871419405; diff --git a/src/tests/roc_audio/test_frame_encoder_decoder.cpp b/src/tests/roc_audio/test_frame_encoder_decoder.cpp index b2ce6b0f2..09f354a9f 100644 --- a/src/tests/roc_audio/test_frame_encoder_decoder.cpp +++ b/src/tests/roc_audio/test_frame_encoder_decoder.cpp @@ -51,26 +51,26 @@ IFrameEncoder* new_encoder(size_t id) { case Codec_PCM_SInt16_1ch: return new (arena) PcmEncoder(PcmFormat_SInt16_Be, - SampleSpec(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono)); + SampleSpec(SampleRate, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono)); case Codec_PCM_SInt16_2ch: return new (arena) PcmEncoder(PcmFormat_SInt16_Be, - SampleSpec(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo)); + SampleSpec(SampleRate, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo)); case Codec_PCM_SInt24_1ch: return new (arena) PcmEncoder(PcmFormat_SInt16_Be, - SampleSpec(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono)); + SampleSpec(SampleRate, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono)); case Codec_PCM_SInt24_2ch: return new (arena) PcmEncoder(PcmFormat_SInt16_Be, - SampleSpec(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo)); + SampleSpec(SampleRate, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo)); default: FAIL("bad codec id"); @@ -84,26 +84,26 @@ IFrameDecoder* new_decoder(size_t id) { case Codec_PCM_SInt16_1ch: return new (arena) PcmDecoder(PcmFormat_SInt16_Be, - SampleSpec(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono)); + SampleSpec(SampleRate, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono)); case Codec_PCM_SInt16_2ch: return new (arena) PcmDecoder(PcmFormat_SInt16_Be, - SampleSpec(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo)); + SampleSpec(SampleRate, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo)); case Codec_PCM_SInt24_1ch: return new (arena) PcmDecoder(PcmFormat_SInt16_Be, - SampleSpec(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono)); + SampleSpec(SampleRate, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono)); case Codec_PCM_SInt24_2ch: return new (arena) PcmDecoder(PcmFormat_SInt16_Be, - SampleSpec(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Stereo)); + SampleSpec(SampleRate, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Stereo)); default: FAIL("bad codec id"); diff --git a/src/tests/roc_audio/test_mixer.cpp b/src/tests/roc_audio/test_mixer.cpp index 4fcfd13b4..37da7a642 100644 --- a/src/tests/roc_audio/test_mixer.cpp +++ b/src/tests/roc_audio/test_mixer.cpp @@ -205,8 +205,8 @@ TEST(mixer, flags) { TEST(mixer, timestamps_one_reader) { // BufSz samples per second - const SampleSpec sample_spec(BufSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec sample_spec(BufSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); const core::nanoseconds_t start_ts = 1000000000000; test::MockReader reader; @@ -232,8 +232,8 @@ TEST(mixer, timestamps_one_reader) { TEST(mixer, timestamps_two_readers) { // BufSz samples per second - const SampleSpec sample_spec(BufSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec sample_spec(BufSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); const core::nanoseconds_t start_ts1 = 2000000000000; const core::nanoseconds_t start_ts2 = 1000000000000; @@ -269,8 +269,8 @@ TEST(mixer, timestamps_two_readers) { TEST(mixer, timestamps_partial) { // BufSz samples per second - const SampleSpec sample_spec(BufSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec sample_spec(BufSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); const core::nanoseconds_t start_ts1 = 2000000000000; const core::nanoseconds_t start_ts2 = 1000000000000; @@ -313,8 +313,8 @@ TEST(mixer, timestamps_partial) { TEST(mixer, timestamps_no_overflow) { // BufSz samples per second - const SampleSpec sample_spec(BufSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec sample_spec(BufSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); const core::nanoseconds_t start_ts1 = 9000000000000000000ll; const core::nanoseconds_t start_ts2 = 9100000000000000000ll; @@ -354,8 +354,8 @@ TEST(mixer, timestamps_no_overflow) { } TEST(mixer, timestamps_disabled) { - const SampleSpec sample_spec(BufSz, ChanLayout_Surround, ChanOrder_Smpte, - ChanMask_Surround_Mono); + const SampleSpec sample_spec(BufSz, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChanMask_Surround_Mono); const core::nanoseconds_t start_ts = 1000000000000; test::MockReader reader1; diff --git a/src/tests/roc_audio/test_packetizer.cpp b/src/tests/roc_audio/test_packetizer.cpp index 371a9cfb6..aa7e315ce 100644 --- a/src/tests/roc_audio/test_packetizer.cpp +++ b/src/tests/roc_audio/test_packetizer.cpp @@ -43,7 +43,8 @@ enum { const core::nanoseconds_t PacketDuration = SamplesPerPacket * core::Second / SampleRate; const core::nanoseconds_t Now = 1691499037871419405; -const SampleSpec SampleSpecs(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, ChMask); +const SampleSpec SampleSpecs( + SampleRate, Sample_RawFormat, ChanLayout_Surround, ChanOrder_Smpte, ChMask); const PcmFormat PcmFmt = PcmFormat_SInt16_Be; core::HeapArena arena; diff --git a/src/tests/roc_audio/test_profiler.cpp b/src/tests/roc_audio/test_profiler.cpp index 3cc4f045d..27609647c 100644 --- a/src/tests/roc_audio/test_profiler.cpp +++ b/src/tests/roc_audio/test_profiler.cpp @@ -27,8 +27,8 @@ struct TestFrame { const int SampleRate = 5000; // 50 samples / chunk const int ChannelMask = 1; -const SampleSpec - SampleSpecs(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, ChannelMask); +const SampleSpec SampleSpecs( + SampleRate, Sample_RawFormat, ChanLayout_Surround, ChanOrder_Smpte, ChannelMask); const double EpsilionThreshold = 0.001; core::HeapArena arena; ProfilerConfig profiler_config(50 * core::Millisecond, 10 * core::Millisecond); diff --git a/src/tests/roc_audio/test_resampler.cpp b/src/tests/roc_audio/test_resampler.cpp index 339c80c17..ad3da14c3 100644 --- a/src/tests/roc_audio/test_resampler.cpp +++ b/src/tests/roc_audio/test_resampler.cpp @@ -325,11 +325,11 @@ TEST(resampler, supported_scalings) { ResamplerMap::instance().nth_backend(n_back); const SampleSpec in_spec = - SampleSpec(supported_rates[n_irate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_irate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); const SampleSpec out_spec = - SampleSpec(supported_rates[n_orate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_orate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); core::SharedPtr resampler = ResamplerMap::instance().new_resampler( @@ -383,11 +383,11 @@ TEST(resampler, invalid_scalings) { ResamplerMap::instance().nth_backend(n_back); const SampleSpec in_spec = - SampleSpec(supported_rates[n_irate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_irate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); const SampleSpec out_spec = - SampleSpec(supported_rates[n_orate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_orate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); core::SharedPtr resampler = ResamplerMap::instance().new_resampler( @@ -434,11 +434,11 @@ TEST(resampler, scaling_trend) { ResamplerMap::instance().nth_backend(n_back); const SampleSpec in_spec = - SampleSpec(supported_rates[n_irate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_irate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); const SampleSpec out_spec = - SampleSpec(supported_rates[n_orate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_orate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); const float scaling = supported_scalings[n_scale]; @@ -513,8 +513,8 @@ TEST(resampler, upscale_downscale_mono) { const ResamplerBackend backend = ResamplerMap::instance().nth_backend(n_back); const ResamplerProfile profile = ResamplerProfile_High; - const SampleSpec sample_spec(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, - ChMask); + const SampleSpec sample_spec(SampleRate, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChMask); for (size_t n_dir = 0; n_dir < ROC_ARRAY_SIZE(supported_dirs); n_dir++) { const Direction dir = supported_dirs[n_dir]; @@ -581,8 +581,8 @@ TEST(resampler, upscale_downscale_stereo) { const ResamplerBackend backend = ResamplerMap::instance().nth_backend(n_back); const ResamplerProfile profile = ResamplerProfile_High; - const SampleSpec sample_spec(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, - ChMask); + const SampleSpec sample_spec(SampleRate, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChMask); for (size_t n_dir = 0; n_dir < ROC_ARRAY_SIZE(supported_dirs); n_dir++) { const Direction dir = supported_dirs[n_dir]; @@ -660,11 +660,11 @@ TEST(resampler, reader_timestamp_passthrough) { ResamplerMap::instance().nth_backend(n_back); const SampleSpec in_spec = - SampleSpec(supported_rates[n_irate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_irate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); const SampleSpec out_spec = - SampleSpec(supported_rates[n_orate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_orate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); core::SharedPtr resampler = ResamplerMap::instance().new_resampler( @@ -781,11 +781,11 @@ TEST(resampler, writer_timestamp_passthrough) { ResamplerMap::instance().nth_backend(n_back); const SampleSpec in_spec = - SampleSpec(supported_rates[n_irate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_irate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); const SampleSpec out_spec = - SampleSpec(supported_rates[n_orate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_orate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); core::SharedPtr resampler = ResamplerMap::instance().new_resampler( @@ -901,11 +901,11 @@ TEST(resampler, reader_timestamp_zero_or_small) { ResamplerMap::instance().nth_backend(n_back); const SampleSpec in_spec = - SampleSpec(supported_rates[n_irate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_irate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); const SampleSpec out_spec = - SampleSpec(supported_rates[n_orate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_orate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); core::SharedPtr resampler = ResamplerMap::instance().new_resampler( @@ -984,11 +984,11 @@ TEST(resampler, writer_timestamp_zero_or_small) { ResamplerMap::instance().nth_backend(n_back); const SampleSpec in_spec = - SampleSpec(supported_rates[n_irate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_irate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); const SampleSpec out_spec = - SampleSpec(supported_rates[n_orate], ChanLayout_Surround, - ChanOrder_Smpte, ChMask); + SampleSpec(supported_rates[n_orate], Sample_RawFormat, + ChanLayout_Surround, ChanOrder_Smpte, ChMask); core::SharedPtr resampler = ResamplerMap::instance().new_resampler( diff --git a/src/tests/roc_audio/test_sample_spec.cpp b/src/tests/roc_audio/test_sample_spec.cpp index 47fdb4812..32eda3cd0 100644 --- a/src/tests/roc_audio/test_sample_spec.cpp +++ b/src/tests/roc_audio/test_sample_spec.cpp @@ -10,6 +10,9 @@ #include #include "roc_audio/channel_defs.h" +#include "roc_audio/pcm_format.h" +#include "roc_audio/sample.h" +#include "roc_audio/sample_format.h" #include "roc_audio/sample_spec.cpp" #include "roc_core/cpu_traits.h" #include "roc_core/macro_helpers.h" @@ -26,8 +29,8 @@ TEST(sample_spec, ns_2_nsamples) { for (size_t numChans = 1; numChans < ChanPos_Max; ++numChans) { const SampleSpec sample_spec = - SampleSpec((size_t)SampleRate, ChanLayout_Surround, ChanOrder_Smpte, - ChannelMask(((uint64_t)1 << numChans) - 1)); + SampleSpec((size_t)SampleRate, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChannelMask(((uint64_t)1 << numChans) - 1)); // num_channels CHECK_EQUAL(numChans, sample_spec.channel_set().num_channels()); @@ -74,8 +77,8 @@ TEST(sample_spec, nsamples_2_ns) { for (size_t numChans = 1; numChans < ChanPos_Max; ++numChans) { const SampleSpec sample_spec = - SampleSpec((size_t)SampleRate, ChanLayout_Surround, ChanOrder_Smpte, - ChannelMask(((uint64_t)1 << numChans) - 1)); + SampleSpec((size_t)SampleRate, Sample_RawFormat, ChanLayout_Surround, + ChanOrder_Smpte, ChannelMask(((uint64_t)1 << numChans) - 1)); const core::nanoseconds_t sampling_period = core::nanoseconds_t(1 / SampleRate * core::Second); @@ -117,8 +120,9 @@ TEST(sample_spec, nsamples_2_ns) { TEST(sample_spec, saturation) { #if ROC_CPU_BITS == 32 { - const SampleSpec sample_spec = SampleSpec( - 1000000000, ChanLayout_Surround, ChanOrder_Smpte, ChanMask_Surround_Stereo); + const SampleSpec sample_spec = + SampleSpec(1000000000, Sample_RawFormat, ChanLayout_Surround, ChanOrder_Smpte, + ChanMask_Surround_Stereo); // ns_2_samples_per_chan CHECK_EQUAL(ROC_MAX_OF(size_t), @@ -126,8 +130,9 @@ TEST(sample_spec, saturation) { } #endif { - const SampleSpec sample_spec = SampleSpec( - 1000000000, ChanLayout_Surround, ChanOrder_Smpte, ChanMask_Surround_Stereo); + const SampleSpec sample_spec = + SampleSpec(1000000000, Sample_RawFormat, ChanLayout_Surround, ChanOrder_Smpte, + ChanMask_Surround_Stereo); // ns_2_samples_overall // (-1 because result is always multiple of channel count) @@ -137,7 +142,8 @@ TEST(sample_spec, saturation) { #if ROC_CPU_BITS == 64 { const SampleSpec sample_spec = - SampleSpec(1, ChanLayout_Surround, ChanOrder_Smpte, ChanMask_Surround_Stereo); + SampleSpec(1, Sample_RawFormat, ChanLayout_Surround, ChanOrder_Smpte, + ChanMask_Surround_Stereo); // samples_per_chan_2_ns CHECK_EQUAL(ROC_MAX_OF(core::nanoseconds_t), @@ -159,7 +165,8 @@ TEST(sample_spec, saturation) { #endif { const SampleSpec sample_spec = - SampleSpec(1, ChanLayout_Surround, ChanOrder_Smpte, ChanMask_Surround_Stereo); + SampleSpec(1, Sample_RawFormat, ChanLayout_Surround, ChanOrder_Smpte, + ChanMask_Surround_Stereo); // ns_2_stream_timestamp_delta CHECK_EQUAL( @@ -178,12 +185,16 @@ TEST(sample_spec, clear) { // sample spec is invalid CHECK(!sample_spec.is_valid()); CHECK_EQUAL(0, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Invalid, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_Invalid, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_None, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_None, sample_spec.channel_set().order()); CHECK_EQUAL(0, sample_spec.channel_set().num_channels()); // set all fields sample_spec.set_sample_rate(44100); + sample_spec.set_sample_format(SampleFormat_Pcm); + sample_spec.set_pcm_format(PcmFormat_Float32); sample_spec.channel_set().set_layout(ChanLayout_Surround); sample_spec.channel_set().set_order(ChanOrder_Smpte); sample_spec.channel_set().set_channel_mask(ChanMask_Surround_Stereo); @@ -191,6 +202,8 @@ TEST(sample_spec, clear) { // sample spec is valid CHECK(sample_spec.is_valid()); CHECK_EQUAL(44100, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_Float32, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Surround, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_Smpte, sample_spec.channel_set().order()); CHECK(sample_spec.channel_set().is_equal(ChanMask_Surround_Stereo)); @@ -201,6 +214,8 @@ TEST(sample_spec, clear) { // sample spec is invalid CHECK(!sample_spec.is_valid()); CHECK_EQUAL(0, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Invalid, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_Invalid, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_None, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_None, sample_spec.channel_set().order()); CHECK_EQUAL(0, sample_spec.channel_set().num_channels()); @@ -214,6 +229,8 @@ TEST(sample_spec, parse_rate) { CHECK(sample_spec.is_valid()); CHECK_EQUAL(44100, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Surround, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_Smpte, sample_spec.channel_set().order()); CHECK(sample_spec.channel_set().is_equal(ChanMask_Surround_Stereo)); @@ -225,6 +242,50 @@ TEST(sample_spec, parse_rate) { CHECK(sample_spec.is_valid()); CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); + CHECK_EQUAL(ChanLayout_Surround, sample_spec.channel_set().layout()); + CHECK_EQUAL(ChanOrder_Smpte, sample_spec.channel_set().order()); + CHECK(sample_spec.channel_set().is_equal(ChanMask_Surround_Stereo)); + } +} + +TEST(sample_spec, parse_format) { + { // uint8 + SampleSpec sample_spec; + CHECK(parse_sample_spec("u8/44100/stereo", sample_spec)); + + CHECK(sample_spec.is_valid()); + + CHECK_EQUAL(44100, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_UInt8, sample_spec.pcm_format()); + CHECK_EQUAL(ChanLayout_Surround, sample_spec.channel_set().layout()); + CHECK_EQUAL(ChanOrder_Smpte, sample_spec.channel_set().order()); + CHECK(sample_spec.channel_set().is_equal(ChanMask_Surround_Stereo)); + } + { // sint18_4_le + SampleSpec sample_spec; + CHECK(parse_sample_spec("s18_4le/48000/stereo", sample_spec)); + + CHECK(sample_spec.is_valid()); + + CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt18_4_Le, sample_spec.pcm_format()); + CHECK_EQUAL(ChanLayout_Surround, sample_spec.channel_set().layout()); + CHECK_EQUAL(ChanOrder_Smpte, sample_spec.channel_set().order()); + CHECK(sample_spec.channel_set().is_equal(ChanMask_Surround_Stereo)); + } + { // float32 + SampleSpec sample_spec; + CHECK(parse_sample_spec("f32/48000/stereo", sample_spec)); + + CHECK(sample_spec.is_valid()); + + CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_Float32, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Surround, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_Smpte, sample_spec.channel_set().order()); CHECK(sample_spec.channel_set().is_equal(ChanMask_Surround_Stereo)); @@ -239,6 +300,8 @@ TEST(sample_spec, parse_channels) { CHECK(sample_spec.is_valid()); CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Surround, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_Smpte, sample_spec.channel_set().order()); CHECK(sample_spec.channel_set().is_equal(ChanMask_Surround_Stereo)); @@ -250,6 +313,8 @@ TEST(sample_spec, parse_channels) { CHECK(sample_spec.is_valid()); CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Surround, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_Smpte, sample_spec.channel_set().order()); CHECK(sample_spec.channel_set().is_equal(ChanMask_Surround_5_1_2)); @@ -261,6 +326,8 @@ TEST(sample_spec, parse_channels) { CHECK(sample_spec.is_valid()); CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Surround, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_Smpte, sample_spec.channel_set().order()); @@ -276,6 +343,8 @@ TEST(sample_spec, parse_channels) { CHECK(sample_spec.is_valid()); CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Multitrack, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_None, sample_spec.channel_set().order()); @@ -291,6 +360,8 @@ TEST(sample_spec, parse_channels) { CHECK(sample_spec.is_valid()); CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Multitrack, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_None, sample_spec.channel_set().order()); @@ -306,6 +377,8 @@ TEST(sample_spec, parse_channels) { CHECK(sample_spec.is_valid()); CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Multitrack, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_None, sample_spec.channel_set().order()); @@ -323,6 +396,8 @@ TEST(sample_spec, parse_channels) { CHECK(!sample_spec.is_valid()); CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Multitrack, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_None, sample_spec.channel_set().order()); CHECK_EQUAL(0, sample_spec.num_channels()); @@ -335,6 +410,8 @@ TEST(sample_spec, parse_channels) { CHECK(sample_spec.is_valid()); CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Multitrack, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_None, sample_spec.channel_set().order()); @@ -352,6 +429,8 @@ TEST(sample_spec, parse_channels) { CHECK(sample_spec.is_valid()); CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Multitrack, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_None, sample_spec.channel_set().order()); @@ -368,10 +447,11 @@ TEST(sample_spec, parse_defaults) { SampleSpec sample_spec; CHECK(parse_sample_spec("-/44100/stereo", sample_spec)); - // TODO(gh-547): should be invalid - CHECK(sample_spec.is_valid()); + CHECK(!sample_spec.is_valid()); CHECK_EQUAL(44100, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Invalid, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_Invalid, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Surround, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_Smpte, sample_spec.channel_set().order()); CHECK(sample_spec.channel_set().is_equal(ChanMask_Surround_Stereo)); @@ -383,6 +463,8 @@ TEST(sample_spec, parse_defaults) { CHECK(!sample_spec.is_valid()); CHECK_EQUAL(0, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_Surround, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_Smpte, sample_spec.channel_set().order()); CHECK(sample_spec.channel_set().is_equal(ChanMask_Surround_Stereo)); @@ -394,6 +476,8 @@ TEST(sample_spec, parse_defaults) { CHECK(!sample_spec.is_valid()); CHECK_EQUAL(48000, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Pcm, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_SInt16, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_None, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_None, sample_spec.channel_set().order()); CHECK_EQUAL(0, sample_spec.channel_set().num_channels()); @@ -405,6 +489,8 @@ TEST(sample_spec, parse_defaults) { CHECK(!sample_spec.is_valid()); CHECK_EQUAL(0, sample_spec.sample_rate()); + CHECK_EQUAL(SampleFormat_Invalid, sample_spec.sample_format()); + CHECK_EQUAL(PcmFormat_Invalid, sample_spec.pcm_format()); CHECK_EQUAL(ChanLayout_None, sample_spec.channel_set().layout()); CHECK_EQUAL(ChanOrder_None, sample_spec.channel_set().order()); CHECK_EQUAL(0, sample_spec.channel_set().num_channels()); @@ -430,6 +516,10 @@ TEST(sample_spec, parse_errors) { CHECK(!parse_sample_spec("s16/-1/stereo", sample_spec)); CHECK(!parse_sample_spec("s16/bad/stereo", sample_spec)); } + { // bad format + CHECK(!parse_sample_spec("s77/44100/stereo", sample_spec)); + CHECK(!parse_sample_spec("xxx/44100/stereo", sample_spec)); + } { // bad surround CHECK(!parse_sample_spec("s16/44100/bad", sample_spec)); CHECK(!parse_sample_spec("s16/44100/BAD,BAD", sample_spec)); diff --git a/src/tests/roc_audio/test_watchdog.cpp b/src/tests/roc_audio/test_watchdog.cpp index f566a3c99..3637da69b 100644 --- a/src/tests/roc_audio/test_watchdog.cpp +++ b/src/tests/roc_audio/test_watchdog.cpp @@ -32,7 +32,8 @@ enum { BreakageWindow = SamplesPerFrame, BreakageWindowsPerTimeout = BrokenPlaybackTimeout / BreakageWindow }; -const SampleSpec SampleSpecs(SampleRate, ChanLayout_Surround, ChanOrder_Smpte, ChMask); +const SampleSpec SampleSpecs( + SampleRate, Sample_RawFormat, ChanLayout_Surround, ChanOrder_Smpte, ChMask); core::HeapArena arena; core::BufferFactory sample_buffer_factory(arena, MaxBufSize); diff --git a/src/tests/roc_packet/test_delayed_reader.cpp b/src/tests/roc_packet/test_delayed_reader.cpp index 9ef6a6520..0871527bb 100644 --- a/src/tests/roc_packet/test_delayed_reader.cpp +++ b/src/tests/roc_packet/test_delayed_reader.cpp @@ -25,6 +25,7 @@ enum { SampleRate = 1000, NumSamples = 100, NumPackets = 30 }; const core::nanoseconds_t NsPerSample = core::Second / SampleRate; const audio::SampleSpec SampleSpecs(SampleRate, + audio::Sample_RawFormat, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, audio::ChanMask_Surround_Stereo); diff --git a/src/tests/roc_pipeline/bench_pipeline_loop_contention.cpp b/src/tests/roc_pipeline/bench_pipeline_loop_contention.cpp index 77c63fa97..176bf425c 100644 --- a/src/tests/roc_pipeline/bench_pipeline_loop_contention.cpp +++ b/src/tests/roc_pipeline/bench_pipeline_loop_contention.cpp @@ -48,11 +48,13 @@ class NoopPipeline : public PipelineLoop, }; NoopPipeline(const TaskConfig& config, ctl::ControlTaskQueue& control_queue) - : PipelineLoop( - *this, - config, - audio::SampleSpec( - SampleRate, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, Chans)) + : PipelineLoop(*this, + config, + audio::SampleSpec(SampleRate, + audio::Sample_RawFormat, + audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, + Chans)) , control_queue_(control_queue) , control_task_(*this) { } diff --git a/src/tests/roc_pipeline/bench_pipeline_loop_peak_load.cpp b/src/tests/roc_pipeline/bench_pipeline_loop_peak_load.cpp index 0584af300..337c4f57a 100644 --- a/src/tests/roc_pipeline/bench_pipeline_loop_peak_load.cpp +++ b/src/tests/roc_pipeline/bench_pipeline_loop_peak_load.cpp @@ -270,11 +270,13 @@ class TestPipeline : public PipelineLoop, TestPipeline(const TaskConfig& config, ctl::ControlTaskQueue& control_queue, DelayStats& stats) - : PipelineLoop( - *this, - config, - audio::SampleSpec( - SampleRate, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, Chans)) + : PipelineLoop(*this, + config, + audio::SampleSpec(SampleRate, + audio::Sample_RawFormat, + audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, + Chans)) , stats_(stats) , control_queue_(control_queue) , control_task_(*this) { diff --git a/src/tests/roc_pipeline/test_loopback_sink_2_source.cpp b/src/tests/roc_pipeline/test_loopback_sink_2_source.cpp index ea61f55ad..f7dbd79e5 100644 --- a/src/tests/roc_pipeline/test_loopback_sink_2_source.cpp +++ b/src/tests/roc_pipeline/test_loopback_sink_2_source.cpp @@ -114,7 +114,8 @@ SenderConfig make_sender_config(int flags, SenderConfig config; config.input_sample_spec.set_sample_rate(SampleRate); - config.input_sample_spec.channel_set().clear(); + config.input_sample_spec.set_sample_format(audio::SampleFormat_Pcm); + config.input_sample_spec.set_pcm_format(audio::Sample_RawFormat); config.input_sample_spec.channel_set().set_layout(audio::ChanLayout_Surround); config.input_sample_spec.channel_set().set_order(audio::ChanOrder_Smpte); config.input_sample_spec.channel_set().set_channel_mask(frame_channels); @@ -153,7 +154,8 @@ ReceiverConfig make_receiver_config(audio::ChannelMask frame_channels, ReceiverConfig config; config.common.output_sample_spec.set_sample_rate(SampleRate); - config.common.output_sample_spec.channel_set().clear(); + config.common.output_sample_spec.set_sample_format(audio::SampleFormat_Pcm); + config.common.output_sample_spec.set_pcm_format(audio::Sample_RawFormat); config.common.output_sample_spec.channel_set().set_layout(audio::ChanLayout_Surround); config.common.output_sample_spec.channel_set().set_order(audio::ChanOrder_Smpte); config.common.output_sample_spec.channel_set().set_channel_mask(frame_channels); diff --git a/src/tests/roc_pipeline/test_pipeline_loop.cpp b/src/tests/roc_pipeline/test_pipeline_loop.cpp index 595e3858a..2a7dbb14e 100644 --- a/src/tests/roc_pipeline/test_pipeline_loop.cpp +++ b/src/tests/roc_pipeline/test_pipeline_loop.cpp @@ -41,8 +41,11 @@ const uint64_t DefaultThread = 1, ProcessingThread = 2, BackgroundThread = 3; const float Epsilon = 1e6f; -const audio::SampleSpec - SampleSpecs(SampleRate, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, Chans); +const audio::SampleSpec SampleSpecs(SampleRate, + audio::Sample_RawFormat, + audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, + Chans); class TestPipeline : public PipelineLoop, private IPipelineTaskScheduler { public: diff --git a/src/tests/roc_pipeline/test_receiver_source.cpp b/src/tests/roc_pipeline/test_receiver_source.cpp index 47c494df7..9fd98c5a8 100644 --- a/src/tests/roc_pipeline/test_receiver_source.cpp +++ b/src/tests/roc_pipeline/test_receiver_source.cpp @@ -131,11 +131,15 @@ TEST_GROUP(receiver_source) { void init(int output_sample_rate, audio::ChannelMask output_channels, int packet_sample_rate, audio::ChannelMask packet_channels) { output_sample_spec.set_sample_rate((size_t)output_sample_rate); + output_sample_spec.set_sample_format(audio::SampleFormat_Pcm); + output_sample_spec.set_pcm_format(audio::Sample_RawFormat); output_sample_spec.channel_set().set_layout(audio::ChanLayout_Surround); output_sample_spec.channel_set().set_order(audio::ChanOrder_Smpte); output_sample_spec.channel_set().set_channel_mask(output_channels); packet_sample_spec.set_sample_rate((size_t)packet_sample_rate); + packet_sample_spec.set_sample_format(audio::SampleFormat_Pcm); + packet_sample_spec.set_pcm_format(audio::PcmFormat_SInt16_Be); packet_sample_spec.channel_set().set_layout(audio::ChanLayout_Surround); packet_sample_spec.channel_set().set_order(audio::ChanOrder_Smpte); packet_sample_spec.channel_set().set_channel_mask(packet_channels); diff --git a/src/tests/roc_pipeline/test_sender_sink.cpp b/src/tests/roc_pipeline/test_sender_sink.cpp index 315f303a9..30edd92e1 100644 --- a/src/tests/roc_pipeline/test_sender_sink.cpp +++ b/src/tests/roc_pipeline/test_sender_sink.cpp @@ -103,11 +103,15 @@ TEST_GROUP(sender_sink) { void init(int input_sample_rate, audio::ChannelMask input_channels, int packet_sample_rate, audio::ChannelMask packet_channels) { input_sample_spec.set_sample_rate((size_t)input_sample_rate); + input_sample_spec.set_sample_format(audio::SampleFormat_Pcm); + input_sample_spec.set_pcm_format(audio::Sample_RawFormat); input_sample_spec.channel_set().set_layout(audio::ChanLayout_Surround); input_sample_spec.channel_set().set_order(audio::ChanOrder_Smpte); input_sample_spec.channel_set().set_channel_mask(input_channels); packet_sample_spec.set_sample_rate((size_t)packet_sample_rate); + packet_sample_spec.set_sample_format(audio::SampleFormat_Pcm); + packet_sample_spec.set_pcm_format(audio::PcmFormat_SInt16_Be); packet_sample_spec.channel_set().set_layout(audio::ChanLayout_Surround); packet_sample_spec.channel_set().set_order(audio::ChanOrder_Smpte); packet_sample_spec.channel_set().set_channel_mask(packet_channels); diff --git a/src/tests/roc_pipeline/test_transcoder_sink.cpp b/src/tests/roc_pipeline/test_transcoder_sink.cpp index 05cd6fea8..a8b14bc03 100644 --- a/src/tests/roc_pipeline/test_transcoder_sink.cpp +++ b/src/tests/roc_pipeline/test_transcoder_sink.cpp @@ -55,11 +55,15 @@ TEST_GROUP(transcoder_sink) { void init(int input_sample_rate, audio::ChannelMask input_channels, int output_sample_rate, audio::ChannelMask output_channels) { input_sample_spec.set_sample_rate((size_t)input_sample_rate); + input_sample_spec.set_sample_format(audio::SampleFormat_Pcm); + input_sample_spec.set_pcm_format(audio::Sample_RawFormat); input_sample_spec.channel_set().set_layout(audio::ChanLayout_Surround); input_sample_spec.channel_set().set_order(audio::ChanOrder_Smpte); input_sample_spec.channel_set().set_channel_mask(input_channels); output_sample_spec.set_sample_rate((size_t)output_sample_rate); + output_sample_spec.set_sample_format(audio::SampleFormat_Pcm); + output_sample_spec.set_pcm_format(audio::Sample_RawFormat); output_sample_spec.channel_set().set_layout(audio::ChanLayout_Surround); output_sample_spec.channel_set().set_order(audio::ChanOrder_Smpte); output_sample_spec.channel_set().set_channel_mask(output_channels); diff --git a/src/tests/roc_pipeline/test_transcoder_source.cpp b/src/tests/roc_pipeline/test_transcoder_source.cpp index efef5fd6f..cac0ea133 100644 --- a/src/tests/roc_pipeline/test_transcoder_source.cpp +++ b/src/tests/roc_pipeline/test_transcoder_source.cpp @@ -54,11 +54,15 @@ TEST_GROUP(transcoder_source) { void init(audio::ChannelMask input_channels, audio::ChannelMask output_channels) { input_sample_spec.set_sample_rate(SampleRate); + input_sample_spec.set_sample_format(audio::SampleFormat_Pcm); + input_sample_spec.set_pcm_format(audio::Sample_RawFormat); input_sample_spec.channel_set().set_layout(audio::ChanLayout_Surround); input_sample_spec.channel_set().set_order(audio::ChanOrder_Smpte); input_sample_spec.channel_set().set_channel_mask(input_channels); output_sample_spec.set_sample_rate(SampleRate); + output_sample_spec.set_sample_format(audio::SampleFormat_Pcm); + output_sample_spec.set_pcm_format(audio::Sample_RawFormat); output_sample_spec.channel_set().set_layout(audio::ChanLayout_Surround); output_sample_spec.channel_set().set_order(audio::ChanOrder_Smpte); output_sample_spec.channel_set().set_channel_mask(output_channels); diff --git a/src/tests/roc_rtp/test_encoding_map.cpp b/src/tests/roc_rtp/test_encoding_map.cpp index fd4a0ab73..dff12deef 100644 --- a/src/tests/roc_rtp/test_encoding_map.cpp +++ b/src/tests/roc_rtp/test_encoding_map.cpp @@ -39,8 +39,8 @@ TEST(encoding_map, find_by_pt) { CHECK(enc->sample_spec.is_valid()); CHECK(enc->sample_spec - == audio::SampleSpec(44100, audio::ChanLayout_Surround, - audio::ChanOrder_Smpte, + == audio::SampleSpec(44100, audio::PcmFormat_SInt16_Be, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, audio::ChanMask_Surround_Mono)); CHECK(enc->packet_flags & packet::Packet::FlagAudio); @@ -59,8 +59,8 @@ TEST(encoding_map, find_by_pt) { CHECK(enc->sample_spec.is_valid()); CHECK(enc->sample_spec - == audio::SampleSpec(44100, audio::ChanLayout_Surround, - audio::ChanOrder_Smpte, + == audio::SampleSpec(44100, audio::PcmFormat_SInt16_Be, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, audio::ChanMask_Surround_Stereo)); CHECK(enc->packet_flags & packet::Packet::FlagAudio); @@ -74,17 +74,17 @@ TEST(encoding_map, find_by_spec) { EncodingMap enc_map(arena); { - const Encoding* enc = enc_map.find_by_spec( - audio::SampleSpec(48000, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, - audio::ChanMask_Surround_Mono)); + const Encoding* enc = enc_map.find_by_spec(audio::SampleSpec( + 48000, audio::PcmFormat_SInt16_Be, audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, audio::ChanMask_Surround_Mono)); CHECK(!enc); } { - const Encoding* enc = enc_map.find_by_spec( - audio::SampleSpec(44100, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, - audio::ChanMask_Surround_Mono)); + const Encoding* enc = enc_map.find_by_spec(audio::SampleSpec( + 44100, audio::PcmFormat_SInt16_Be, audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, audio::ChanMask_Surround_Mono)); CHECK(enc); @@ -92,9 +92,9 @@ TEST(encoding_map, find_by_spec) { } { - const Encoding* enc = enc_map.find_by_spec( - audio::SampleSpec(44100, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, - audio::ChanMask_Surround_Stereo)); + const Encoding* enc = enc_map.find_by_spec(audio::SampleSpec( + 44100, audio::PcmFormat_SInt16_Be, audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, audio::ChanMask_Surround_Stereo)); CHECK(enc); @@ -109,10 +109,10 @@ TEST(encoding_map, add_encoding) { Encoding enc; enc.payload_type = (PayloadType)100; enc.packet_flags = packet::Packet::FlagAudio; - enc.pcm_format = audio::PcmFormat_Float32; + enc.pcm_format = audio::PcmFormat_SInt32; enc.sample_spec = - audio::SampleSpec(48000, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, - audio::ChanMask_Surround_Stereo); + audio::SampleSpec(48000, audio::PcmFormat_SInt32, audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, audio::ChanMask_Surround_Stereo); enc.new_encoder = &audio::PcmEncoder::construct; enc.new_decoder = &audio::PcmDecoder::construct; @@ -125,11 +125,11 @@ TEST(encoding_map, add_encoding) { LONGS_EQUAL(100, enc->payload_type); - CHECK(enc->pcm_format == audio::PcmFormat_Float32); + CHECK(enc->pcm_format == audio::PcmFormat_SInt32); CHECK(enc->sample_spec - == audio::SampleSpec(48000, audio::ChanLayout_Surround, - audio::ChanOrder_Smpte, + == audio::SampleSpec(48000, audio::PcmFormat_SInt32, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, audio::ChanMask_Surround_Stereo)); CHECK(enc->packet_flags == packet::Packet::FlagAudio); @@ -140,17 +140,17 @@ TEST(encoding_map, add_encoding) { { const Encoding* enc = enc_map.find_by_spec( - audio::SampleSpec(48000, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, - audio::ChanMask_Surround_Stereo)); + audio::SampleSpec(48000, audio::PcmFormat_SInt32, audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, audio::ChanMask_Surround_Stereo)); CHECK(enc); LONGS_EQUAL(100, enc->payload_type); - CHECK(enc->pcm_format == audio::PcmFormat_Float32); + CHECK(enc->pcm_format == audio::PcmFormat_SInt32); CHECK(enc->sample_spec - == audio::SampleSpec(48000, audio::ChanLayout_Surround, - audio::ChanOrder_Smpte, + == audio::SampleSpec(48000, audio::PcmFormat_SInt32, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, audio::ChanMask_Surround_Stereo)); CHECK(enc->packet_flags == packet::Packet::FlagAudio); diff --git a/src/tests/roc_rtp/test_populator.cpp b/src/tests/roc_rtp/test_populator.cpp index abeaf71bd..450a069b0 100644 --- a/src/tests/roc_rtp/test_populator.cpp +++ b/src/tests/roc_rtp/test_populator.cpp @@ -27,8 +27,11 @@ namespace { enum { ChMask = 3, PacketSz = 128, SampleRate = 10000 }; -const audio::SampleSpec SampleSpec = audio::SampleSpec( - SampleRate, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); +const audio::SampleSpec SampleSpec = audio::SampleSpec(SampleRate, + audio::Sample_RawFormat, + audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, + ChMask); const audio::PcmFormat PcmFmt = audio::PcmFormat_SInt16_Be; diff --git a/src/tests/roc_rtp/test_timestamp_extractor.cpp b/src/tests/roc_rtp/test_timestamp_extractor.cpp index 81c15eca0..3dbadd2c7 100644 --- a/src/tests/roc_rtp/test_timestamp_extractor.cpp +++ b/src/tests/roc_rtp/test_timestamp_extractor.cpp @@ -63,7 +63,8 @@ TEST_GROUP(timestamp_extractor) {}; TEST(timestamp_extractor, single_write) { // 1 second = 1000 samples const audio::SampleSpec sample_spec = - audio::SampleSpec(1000, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, 0x1); + audio::SampleSpec(1000, audio::Sample_RawFormat, audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, 0x1); const core::nanoseconds_t cts = 1691499037871419405; const packet::stream_timestamp_t rts = 2222; @@ -100,7 +101,8 @@ TEST(timestamp_extractor, single_write) { TEST(timestamp_extractor, failed_to_write_packet) { // 1 second = 1000 samples const audio::SampleSpec sample_spec = - audio::SampleSpec(1000, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, 0x1); + audio::SampleSpec(1000, audio::Sample_RawFormat, audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, 0x1); const status::StatusCode codes[] = { status::StatusUnknown, diff --git a/src/tests/roc_rtp/test_timestamp_injector.cpp b/src/tests/roc_rtp/test_timestamp_injector.cpp index a06c26676..61e705325 100644 --- a/src/tests/roc_rtp/test_timestamp_injector.cpp +++ b/src/tests/roc_rtp/test_timestamp_injector.cpp @@ -52,8 +52,9 @@ TEST(timestamp_injector, failed_to_read_packet) { SampleRate = 10000, }; - const audio::SampleSpec sample_spec = audio::SampleSpec( - SampleRate, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); + const audio::SampleSpec sample_spec = + audio::SampleSpec(SampleRate, audio::Sample_RawFormat, audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, ChMask); const status::StatusCode codes[] = { status::StatusUnknown, @@ -79,8 +80,9 @@ TEST(timestamp_injector, negative_and_positive_dn) { }; const float sample_rate = 48000.; - const audio::SampleSpec sample_spec = audio::SampleSpec( - (size_t)sample_rate, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); + const audio::SampleSpec sample_spec = + audio::SampleSpec((size_t)sample_rate, audio::Sample_RawFormat, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); packet::stream_timestamp_t rtp_ts = 2222; packet::stream_timestamp_t packet_rtp_ts = (packet::stream_timestamp_t)-4444; diff --git a/src/tests/roc_rtp/test_validator.cpp b/src/tests/roc_rtp/test_validator.cpp index 4303561f1..1d616a5b4 100644 --- a/src/tests/roc_rtp/test_validator.cpp +++ b/src/tests/roc_rtp/test_validator.cpp @@ -30,6 +30,7 @@ const PayloadType Pt2 = PayloadType_L16_Mono; enum { Src1 = 55, Src2 = 77, SampleRate = 10000, MaxSnJump = 100, MaxTsJump = 1000 }; const audio::SampleSpec SampleSpecs(SampleRate, + audio::Sample_RawFormat, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, audio::ChanMask_Surround_Stereo); diff --git a/src/tests/roc_sndio/target_sox/test_pump.cpp b/src/tests/roc_sndio/target_sox/test_pump.cpp index b00c5df35..01c3710c9 100644 --- a/src/tests/roc_sndio/target_sox/test_pump.cpp +++ b/src/tests/roc_sndio/target_sox/test_pump.cpp @@ -26,8 +26,11 @@ namespace { enum { BufSize = 512, SampleRate = 44100, ChMask = 0x3 }; -const audio::SampleSpec - SampleSpecs(SampleRate, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); +const audio::SampleSpec SampleSpecs(SampleRate, + audio::Sample_RawFormat, + audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, + ChMask); const core::nanoseconds_t BufDuration = BufSize * core::Second / core::nanoseconds_t(SampleSpecs.sample_rate() * SampleSpecs.num_channels()); @@ -41,8 +44,9 @@ TEST_GROUP(pump) { Config config; void setup() { - config.sample_spec = audio::SampleSpec(SampleRate, audio::ChanLayout_Surround, - audio::ChanOrder_Smpte, ChMask); + config.sample_spec = + audio::SampleSpec(SampleRate, audio::Sample_RawFormat, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); config.frame_length = BufDuration; } }; diff --git a/src/tests/roc_sndio/target_sox/test_sox_sink.cpp b/src/tests/roc_sndio/target_sox/test_sox_sink.cpp index ef17fbc3a..db03ec349 100644 --- a/src/tests/roc_sndio/target_sox/test_sox_sink.cpp +++ b/src/tests/roc_sndio/target_sox/test_sox_sink.cpp @@ -27,8 +27,9 @@ TEST_GROUP(sox_sink) { Config sink_config; void setup() { - sink_config.sample_spec = audio::SampleSpec( - SampleRate, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); + sink_config.sample_spec = + audio::SampleSpec(SampleRate, audio::Sample_RawFormat, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); sink_config.frame_length = FrameSize * core::Second / core::nanoseconds_t(sink_config.sample_spec.sample_rate() diff --git a/src/tests/roc_sndio/target_sox/test_sox_source.cpp b/src/tests/roc_sndio/target_sox/test_sox_source.cpp index 0da5210ca..9248ce138 100644 --- a/src/tests/roc_sndio/target_sox/test_sox_source.cpp +++ b/src/tests/roc_sndio/target_sox/test_sox_source.cpp @@ -31,8 +31,11 @@ enum { NumChans = 2 }; -const audio::SampleSpec - SampleSpecs(SampleRate, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); +const audio::SampleSpec SampleSpecs(SampleRate, + audio::Sample_RawFormat, + audio::ChanLayout_Surround, + audio::ChanOrder_Smpte, + ChMask); const core::nanoseconds_t FrameDuration = FrameSize * core::Second / core::nanoseconds_t(SampleSpecs.sample_rate() * SampleSpecs.num_channels()); @@ -47,12 +50,14 @@ TEST_GROUP(sox_source) { Config source_config; void setup() { - sink_config.sample_spec = audio::SampleSpec( - SampleRate, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); + sink_config.sample_spec = + audio::SampleSpec(SampleRate, audio::Sample_RawFormat, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); sink_config.frame_length = FrameDuration; - source_config.sample_spec = audio::SampleSpec( - SampleRate, audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); + source_config.sample_spec = + audio::SampleSpec(SampleRate, audio::Sample_RawFormat, + audio::ChanLayout_Surround, audio::ChanOrder_Smpte, ChMask); source_config.frame_length = FrameDuration; } }; diff --git a/src/tools/roc_recv/main.cpp b/src/tools/roc_recv/main.cpp index b00a5af3a..4796e2dbc 100644 --- a/src/tools/roc_recv/main.cpp +++ b/src/tools/roc_recv/main.cpp @@ -69,6 +69,10 @@ int main(int argc, char** argv) { pipeline::ReceiverConfig 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()); @@ -359,9 +363,11 @@ int main(int argc, char** argv) { transcoder_config.input_sample_spec = audio::SampleSpec(backup_source->sample_spec().sample_rate(), + receiver_config.common.output_sample_spec.pcm_format(), receiver_config.common.output_sample_spec.channel_set()); transcoder_config.output_sample_spec = audio::SampleSpec(receiver_config.common.output_sample_spec.sample_rate(), + receiver_config.common.output_sample_spec.pcm_format(), receiver_config.common.output_sample_spec.channel_set()); backup_pipeline.reset(new (context.arena()) pipeline::TranscoderSource( diff --git a/src/tools/roc_send/main.cpp b/src/tools/roc_send/main.cpp index 8e1a60fbe..b11c38c7c 100644 --- a/src/tools/roc_send/main.cpp +++ b/src/tools/roc_send/main.cpp @@ -68,6 +68,9 @@ int main(int argc, char** argv) { pipeline::SenderConfig 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) {