sequencer
double_buffer.hpp
Go to the documentation of this file.
1 #pragma once
2 
4 
5 #include <algorithm>
6 #include <atomic>
7 #include <cstring>
8 
9 namespace sequencer::audio
10 {
12  {
13  public:
14  double_buffer_t() = default;
15  double_buffer_t( const double_buffer_t& ) = delete;
16  double_buffer_t& operator=( const double_buffer_t& ) = delete;
17 
18  void swap_read_buffer( sample_t& buffer ) noexcept
19  {
20  audio::swap( buffer, *read_buffer_ );
21  has_new_data_ = false;
22  }
23 
24  void swap_write_buffer( sample_t& buffer )
25  {
26  audio::swap( buffer, *write_buffer_ );
27  }
28 
29  void read_data() noexcept
30  {
31  has_new_data_ = false;
32  }
33 
34  bool has_new_data() const noexcept
35  {
36  return has_new_data_;
37  }
38 
39  void swap_buffers() noexcept
40  {
41  std::swap( read_buffer_, write_buffer_ );
42  has_new_data_ = true;
43  }
44 
45  private:
46  sample_t buffer_1_;
47  sample_t buffer_2_;
48  sample_t* read_buffer_{&buffer_1_};
49  sample_t* write_buffer_{&buffer_2_};
50  std::atomic_bool has_new_data_{false};
51  };
52 
54  {
55  protected:
57  };
58 
60  {
61  public:
64 
65  explicit double_buffer_reader_t( double_buffer_t& buffer ) noexcept
66  : sample_read_write_base_t{current_buffer_}, buffer_{buffer}
67  {
68  }
69 
70  void read( frame_rep* data, std::size_t frames_per_buffer )
71  {
72  if ( buffer_.has_new_data() && !has_frames_left() )
73  {
74  reset_frame_index();
75  buffer_.swap_read_buffer( current_buffer_ );
76  }
77 
78  const auto size = frames_to_copy( frames_per_buffer );
79  std::memcpy( data, current_frame(), size * frame_size_in_bytes() );
80  increase_frame_index( size );
81  }
82 
83  constexpr bool continue_reading() const noexcept
84  {
85  return continue_reading_ || has_frames_left();
86  }
87 
88  constexpr void set_continue_reading( bool continue_reading ) noexcept
89  {
90  continue_reading_ = continue_reading;
91  }
92 
93  private:
94  double_buffer_t& buffer_;
95  bool continue_reading_ = true;
96  };
97 } // namespace sequencer::audio
Definition: double_buffer.hpp:59
Definition: sample.hpp:28
double_buffer_t & operator=(const double_buffer_t &)=delete
constexpr void set_continue_reading(bool continue_reading) noexcept
Definition: double_buffer.hpp:88
void swap(sample_t &lhs, sample_t &rhs)
Definition: sample.hpp:65
void read_data() noexcept
Definition: double_buffer.hpp:29
void swap_buffers() noexcept
Definition: double_buffer.hpp:39
void read(frame_rep *data, std::size_t frames_per_buffer)
Definition: double_buffer.hpp:70
Definition: sample.hpp:74
Definition: delay.hpp:12
double_buffer_reader_t(double_buffer_t &buffer) noexcept
Definition: double_buffer.hpp:65
Definition: double_buffer.hpp:53
void swap_write_buffer(sample_t &buffer)
Definition: double_buffer.hpp:24
sample_t::size_type size_type
Definition: double_buffer.hpp:63
constexpr bool continue_reading() const noexcept
Definition: double_buffer.hpp:83
sample_t::frame_rep frame_rep
Definition: double_buffer.hpp:62
void swap_read_buffer(sample_t &buffer) noexcept
Definition: double_buffer.hpp:18
float frame_rep
Definition: sample.hpp:30
Definition: double_buffer.hpp:11
read_write_lockable< sample_t > current_buffer_
Definition: double_buffer.hpp:56
std::vector< frame_rep >::size_type size_type
Definition: sample.hpp:31
bool has_new_data() const noexcept
Definition: double_buffer.hpp:34