12 namespace underlying_t
31 using size_type = std::vector< frame_rep >::size_type;
36 : frames( number_of_frames *
channels( mode ), 0 ), mode( mode )
44 const auto last_non_zero = std::find_if_not(
45 rbegin( frames ), rend( frames ), [](
frame_rep value ) {
return value == 0.0f; } );
46 frames.resize(
size_type( std::distance( last_non_zero, rend( frames ) ) ) );
52 std::vector< frame_rep >( std::max( frames.size(), initial_size ),
frame_rep{0} );
57 return frames.size() /
channels( mode );
60 std::vector< frame_rep > frames{};
73 template <
class Type >
80 block_reading_ = lock;
85 block_writing_ = lock;
90 return block_reading_;
95 return block_writing_;
99 std::atomic_bool block_reading_{
false};
100 std::atomic_bool block_writing_{
false};
121 return frame_index_ < sample_.number_of_frames();
127 const auto frames_left = sample_.number_of_frames() - frame_index_;
128 return std::min( frames_left, frames_per_buffer );
133 frame_index_ += increment;
138 return &sample_.frames[ frame_index_ *
channels( sample_.mode ) ];
148 return sample_.reading_is_blocked();
153 return sample_.writing_is_blocked();
168 if ( writing_is_blocked() )
173 const auto size = frames_to_copy( frames_per_buffer );
174 if ( data !=
nullptr )
176 std::memcpy( current_frame(), data, size * frame_size_in_bytes() );
177 increase_frame_index( size );
189 if ( reading_is_blocked() )
194 const auto size = frames_to_copy( frames_per_buffer );
195 std::memcpy( data, current_frame(), size * frame_size_in_bytes() );
196 increase_frame_index( size );
201 return has_frames_left();
constexpr bool reading_is_blocked() const noexcept
Definition: sample.hpp:146
Definition: sample.hpp:28
sample_t::size_type size_type
Definition: sample.hpp:107
constexpr void increase_frame_index(unsigned long increment) noexcept
Definition: sample.hpp:131
bool has_frames_left() const noexcept
Definition: sample.hpp:119
constexpr bool writing_is_blocked() const noexcept
Definition: sample.hpp:93
bool continue_reading() const noexcept
Definition: sample.hpp:199
constexpr bool reading_is_blocked() const noexcept
Definition: sample.hpp:88
constexpr void block_reading(bool lock) noexcept
Definition: sample.hpp:78
size_type initial_size
Definition: sample.hpp:62
void clear()
Definition: sample.hpp:49
sample_read_write_base_t(read_write_lockable< sample_t > &sample) noexcept
Definition: sample.hpp:109
void swap(sample_t &lhs, sample_t &rhs)
Definition: sample.hpp:65
size_type frames_to_copy(size_type frames_per_buffer) const noexcept
Definition: sample.hpp:125
constexpr bool writing_is_blocked() const noexcept
Definition: sample.hpp:151
Definition: sample.hpp:74
void trim()
Definition: sample.hpp:40
constexpr size_type frame_size_in_bytes() const noexcept
Definition: sample.hpp:141
size_type number_of_frames() const noexcept
Definition: sample.hpp:55
mode_t mode
Definition: sample.hpp:61
constexpr underlying_t::mode_t channels(mode_t mode) noexcept
Definition: sample.hpp:23
mode_t
Definition: sample.hpp:17
void write(const frame_rep *data, std::size_t frames_per_buffer)
Definition: sample.hpp:166
void read(frame_rep *data, std::size_t frames_per_buffer)
Definition: sample.hpp:187
constexpr void reset_frame_index() noexcept
Definition: sample.hpp:114
frame_rep * current_frame()
Definition: sample.hpp:136
sample_t(size_type number_of_frames, mode_t mode=mode_t::stereo)
Definition: sample.hpp:35
Definition: sample.hpp:161
Definition: sample.hpp:103
constexpr void block_writing(bool lock) noexcept
Definition: sample.hpp:83
sample_t::frame_rep frame_rep
Definition: sample.hpp:106
std::uint8_t mode_t
Definition: sample.hpp:14
float frame_rep
Definition: sample.hpp:30
Definition: sample.hpp:182
std::vector< frame_rep >::size_type size_type
Definition: sample.hpp:31
std::vector< frame_rep > frames
Definition: sample.hpp:60