kwave  18.07.70
Kwave::Writer Class Referenceabstract

#include <Writer.h>

Inheritance diagram for Kwave::Writer:
Inheritance graph
Collaboration diagram for Kwave::Writer:
Collaboration graph

Public Slots

void input (Kwave::SampleArray data)
 

Signals

void sigSamplesWritten (sample_index_t)
 
void proceeded ()
 
- Signals inherited from Kwave::StreamObject
void attributeChanged (const QVariant value)
 

Public Member Functions

 Writer ()
 
 Writer (Kwave::InsertMode mode, sample_index_t left=0, sample_index_t right=0)
 
virtual ~Writer () Q_DECL_OVERRIDE
 
virtual Writeroperator<< (const Kwave::SampleArray &samples)
 
virtual Writeroperator<< (const sample_t &sample)
 
Writeroperator<< (Writer &(*modifier)(Writer &))
 
Writeroperator<< (Kwave::SampleReader &reader)
 
virtual bool write (const Kwave::SampleArray &buffer, unsigned int &count)=0
 
bool flush ()
 
virtual bool eof () const
 
virtual bool done () const Q_DECL_OVERRIDE
 
sample_index_t first () const
 
sample_index_t last () const
 
sample_index_t position () const
 
Kwave::InsertMode mode () const
 
- Public Member Functions inherited from Kwave::SampleSink
 SampleSink (QObject *parent=Q_NULLPTR)
 
virtual ~SampleSink ()
 
- Public Member Functions inherited from Kwave::StreamObject
 StreamObject (QObject *parent=Q_NULLPTR)
 
virtual ~StreamObject ()
 
virtual unsigned int tracks () const
 
virtual Kwave::StreamObjectoperator[] (unsigned int track)
 
virtual unsigned int tracksOfPort (const char *port) const
 
virtual Kwave::StreamObjectport (const char *port, unsigned int track)
 
virtual unsigned int blockSize () const
 
void setAttribute (const char *attribute, const QVariant &value)
 

Protected Attributes

sample_index_t m_first
 
sample_index_t m_last
 
Kwave::InsertMode m_mode
 
sample_index_t m_position
 
Kwave::SampleArray m_buffer
 
unsigned int m_buffer_size
 
unsigned int m_buffer_used
 

Additional Inherited Members

- Static Public Member Functions inherited from Kwave::StreamObject
static void setInteractive (bool interactive)
 

Detailed Description

Definition at line 35 of file Writer.h.

Constructor & Destructor Documentation

◆ Writer() [1/2]

Kwave::Writer::Writer ( )

default constructor

Definition at line 35 of file Writer.cpp.

36  :Kwave::SampleSink(Q_NULLPTR),
39 {
40 }
Kwave::SampleArray m_buffer
Definition: Writer.h:161
sample_index_t m_first
Definition: Writer.h:149
unsigned int m_buffer_used
Definition: Writer.h:167
sample_index_t m_last
Definition: Writer.h:152
sample_index_t m_position
Definition: Writer.h:158
#define BUFFER_SIZE
Definition: Writer.cpp:29
unsigned int m_buffer_size
Definition: Writer.h:164
Kwave::InsertMode m_mode
Definition: Writer.h:155

◆ Writer() [2/2]

Kwave::Writer::Writer ( Kwave::InsertMode  mode,
sample_index_t  left = 0,
sample_index_t  right = 0 
)
explicit

Constructor. Creates an input stream for writing.

Parameters
modespecifies where and how to insert
leftstart of the input (only useful in insert and overwrite mode)
rightend of the input (only useful with overwrite mode)
See also
InsertMode

Definition at line 43 of file Writer.cpp.

45  :Kwave::SampleSink(Q_NULLPTR),
46  m_first(left), m_last(right), m_mode(mode), m_position(left),
48 {
49 }
Kwave::SampleArray m_buffer
Definition: Writer.h:161
sample_index_t m_first
Definition: Writer.h:149
unsigned int m_buffer_used
Definition: Writer.h:167
sample_index_t m_last
Definition: Writer.h:152
sample_index_t m_position
Definition: Writer.h:158
#define BUFFER_SIZE
Definition: Writer.cpp:29
unsigned int m_buffer_size
Definition: Writer.h:164
Kwave::InsertMode mode() const
Definition: Writer.h:125
Kwave::InsertMode m_mode
Definition: Writer.h:155

◆ ~Writer()

Kwave::Writer::~Writer ( )
virtual

Destructor

Definition at line 52 of file Writer.cpp.

References m_buffer_used, m_first, m_last, m_mode, m_position, Kwave::Overwrite, and sigSamplesWritten().

53 {
54  // If this assert gets hit, you deleted a writer without calling
55  // flush() before. Flushing in the destructor is problematic and
56  // might be too late when the derived classes' destructor was
57  // already done and signal/slot connections were already released!
58  Q_ASSERT(!m_buffer_used);
59  if (m_buffer_used) qWarning("Writer was not flushed!?");
60 
61  Q_ASSERT((m_mode != Kwave::Overwrite) || (m_position <= m_last + 1));
62 
63  // inform others that we proceeded
65 }
void sigSamplesWritten(sample_index_t)
sample_index_t m_first
Definition: Writer.h:149
unsigned int m_buffer_used
Definition: Writer.h:167
sample_index_t m_last
Definition: Writer.h:152
sample_index_t m_position
Definition: Writer.h:158
Kwave::InsertMode m_mode
Definition: Writer.h:155

Member Function Documentation

◆ done()

virtual bool Kwave::Writer::done ( ) const
inlinevirtual

the same as eof(), needed for the Kwave::SampleSink interface

Reimplemented from Kwave::SampleSink.

Definition at line 105 of file Writer.h.

105 { return eof(); }
virtual bool eof() const
Definition: Writer.cpp:139

◆ eof()

bool Kwave::Writer::eof ( ) const
virtual

Returns true if the end of the writeable area has been reached if the writer has been opened in "overwrite" mode. Note that this does not make sense in append or insert mode, so in these cases the return value will always be false.

Definition at line 139 of file Writer.cpp.

References m_last, m_mode, m_position, and Kwave::Overwrite.

Referenced by operator<<().

140 {
141  return (m_mode == Kwave::Overwrite) ? (m_position > m_last) : false;
142 }
sample_index_t m_last
Definition: Writer.h:152
sample_index_t m_position
Definition: Writer.h:158
Kwave::InsertMode m_mode
Definition: Writer.h:155
Here is the caller graph for this function:

◆ first()

sample_index_t Kwave::Writer::first ( ) const
inline

Returns the index of the first sample of the range.

Definition at line 108 of file Writer.h.

Referenced by Kwave::MultiTrackWriter::init(), and Kwave::MultiWriter::proceeded().

108 { return m_first; }
sample_index_t m_first
Definition: Writer.h:149
Here is the caller graph for this function:

◆ flush()

bool Kwave::Writer::flush ( )
inline

Shortcut for flush(m_buffer, m_buffer_used)

Definition at line 94 of file Writer.h.

Referenced by Kwave::MultiWriter::flush(), flush(), operator<<(), Kwave::ReversePlugin::reverseSlice(), and Kwave::TrackWriter::~TrackWriter().

94 { return write(m_buffer, m_buffer_used); }
virtual bool write(const Kwave::SampleArray &buffer, unsigned int &count)=0
Kwave::SampleArray m_buffer
Definition: Writer.h:161
unsigned int m_buffer_used
Definition: Writer.h:167
Here is the caller graph for this function:

◆ input

void Kwave::Writer::input ( Kwave::SampleArray  data)
slot

Interface for the signal/slot based streaming API.

Parameters
datasample data to write

Definition at line 152 of file Writer.cpp.

References Kwave::SampleArray::size().

153 {
154  if (data.size()) (*this) << data;
155 }
unsigned int size() const
Here is the call graph for this function:

◆ last()

sample_index_t Kwave::Writer::last ( ) const
inline

Returns the current index of the last sample in range or the index of the last written sample when in insert/append mode.

Definition at line 114 of file Writer.h.

References Kwave::Append.

Referenced by Kwave::MultiTrackWriter::init(), Kwave::MultiWriter::last(), and Kwave::MultiWriter::proceeded().

114  {
115  return ((m_mode == Kwave::Append) ?
116  (m_last + m_buffer_used) : m_last);
117  }
unsigned int m_buffer_used
Definition: Writer.h:167
sample_index_t m_last
Definition: Writer.h:152
Kwave::InsertMode m_mode
Definition: Writer.h:155
Here is the caller graph for this function:

◆ mode()

Kwave::InsertMode Kwave::Writer::mode ( ) const
inline

Returns the insert mode

Definition at line 125 of file Writer.h.

Referenced by Kwave::MultiWriter::proceeded().

125 { return m_mode; }
Kwave::InsertMode m_mode
Definition: Writer.h:155
Here is the caller graph for this function:

◆ operator<<() [1/4]

Kwave::Writer & Kwave::Writer::operator<< ( const Kwave::SampleArray samples)
virtual

operator for inserting an array of samples

Definition at line 68 of file Writer.cpp.

References flush(), m_buffer, m_buffer_size, m_buffer_used, MEMCPY, MIN_DIRECT_IO_BLOCK_SIZE, Kwave::SampleArray::size(), and write().

69 {
70  unsigned int count = samples.size();
71 
72  if ( (m_buffer_used || (count < MIN_DIRECT_IO_BLOCK_SIZE)) &&
73  (m_buffer_used + count <= m_buffer_size) )
74  {
75  // append to the internal buffer if it is already in use
76  // and if there is still some room,
77  // or if the buffer so small that it would make too much overhead
78  // to process it by block operation
79  MEMCPY(&(m_buffer[m_buffer_used]), &(samples[0]),
80  count * sizeof(sample_t));
81  m_buffer_used += count;
82  if (m_buffer_used >= m_buffer_size) flush();
83  } else {
84  // first flush the single-sample buffer before doing block operation
85  if (m_buffer_used) flush();
86 
87  // now flush the block that we received as parameter (pass-through)
88  write(samples, count);
89  Q_ASSERT(!count);
90  }
91 
92  return *this;
93 }
#define MIN_DIRECT_IO_BLOCK_SIZE
Definition: Writer.cpp:32
virtual bool write(const Kwave::SampleArray &buffer, unsigned int &count)=0
bool flush()
Definition: Writer.h:94
Kwave::SampleArray m_buffer
Definition: Writer.h:161
unsigned int m_buffer_used
Definition: Writer.h:167
#define MEMCPY
Definition: memcpy.h:37
unsigned int size() const
unsigned int m_buffer_size
Definition: Writer.h:164
qint32 sample_t
Definition: Sample.h:37
Here is the call graph for this function:

◆ operator<<() [2/4]

Kwave::Writer & Kwave::Writer::operator<< ( const sample_t sample)
virtual

operator for inserting a single sample

Definition at line 96 of file Writer.cpp.

References flush(), m_buffer, m_buffer_size, and m_buffer_used.

97 {
98  m_buffer[m_buffer_used++] = sample;
100  return *this;
101 }
bool flush()
Definition: Writer.h:94
Kwave::SampleArray m_buffer
Definition: Writer.h:161
unsigned int m_buffer_used
Definition: Writer.h:167
unsigned int m_buffer_size
Definition: Writer.h:164
Here is the call graph for this function:

◆ operator<<() [3/4]

Writer& Kwave::Writer::operator<< ( Writer &(*)(Writer &)  modifier)
inline

operator for simple modifiers like flush()

Definition at line 65 of file Writer.h.

66  {
67  return modifier(*this);
68  }

◆ operator<<() [4/4]

Kwave::Writer & Kwave::Writer::operator<< ( Kwave::SampleReader reader)

Fill the Writer with data from a SampleReader. If the reader reaches EOF the writer will be filled up with zeroes.

Definition at line 104 of file Writer.cpp.

References Kwave::SampleReader::eof(), eof(), flush(), m_buffer, m_buffer_size, m_buffer_used, m_last, m_mode, m_position, Kwave::Overwrite, Kwave::SampleReader::read(), and Kwave::toUint().

105 {
106  if (m_buffer_used) flush();
107 
108  // transfer data, using our internal buffer
109  unsigned int buflen = m_buffer_size;
110  while (!reader.eof() && !eof()) {
111 
112  // overwrite mode -> clip at right border
113  if (m_mode == Kwave::Overwrite) {
114  if (m_position + buflen - 1 > m_last)
115  buflen = Kwave::toUint(m_last - m_position + 1);
116  }
117 
118  m_buffer_used = reader.read(m_buffer, 0, buflen);
119  Q_ASSERT(m_buffer_used);
120  if (!m_buffer_used) break;
121 
122  if (!flush()) return *this; // out of memory
123  }
124 
125  // pad the rest with zeroes
126  if (m_mode == Kwave::Overwrite) {
127  Q_ASSERT(m_position <= m_last + 1);
128  while (m_buffer_used + m_position <= m_last) {
129  *this << static_cast<sample_t>(0);
130  m_position++;
131  }
132  Q_ASSERT(m_position <= m_last + 1);
133  }
134 
135  return *this;
136 }
virtual bool eof() const
Definition: Writer.cpp:139
bool flush()
Definition: Writer.h:94
Kwave::SampleArray m_buffer
Definition: Writer.h:161
bool eof() const
Definition: SampleReader.h:66
unsigned int m_buffer_used
Definition: Writer.h:167
sample_index_t m_last
Definition: Writer.h:152
sample_index_t m_position
Definition: Writer.h:158
unsigned int read(Kwave::SampleArray &buffer, unsigned int dstoff, unsigned int length)
unsigned int toUint(T x)
Definition: Utils.h:109
unsigned int m_buffer_size
Definition: Writer.h:164
Kwave::InsertMode m_mode
Definition: Writer.h:155
Here is the call graph for this function:

◆ position()

sample_index_t Kwave::Writer::position ( ) const
inline

Returns the current position

Definition at line 122 of file Writer.h.

Referenced by Kwave::MultiWriter::proceeded().

122 { return m_position; }
sample_index_t m_position
Definition: Writer.h:158
Here is the caller graph for this function:

◆ proceeded

void Kwave::Writer::proceeded ( )
signal

Emitted when the internal buffer is flushed or the writer is closed

Referenced by Kwave::TrackWriter::write().

Here is the caller graph for this function:

◆ sigSamplesWritten

void Kwave::Writer::sigSamplesWritten ( sample_index_t  )
signal

Is emitted once immediately before the writer gets closed and tells the receiver the total number of written samples.

Referenced by ~Writer().

Here is the caller graph for this function:

◆ write()

virtual bool Kwave::Writer::write ( const Kwave::SampleArray buffer,
unsigned int &  count 
)
pure virtual

Flush the content of a buffer. Normally the buffer is the internal intermediate buffer used for single-sample writes. When using block transfers, the internal buffer is bypassed and the written block is passed instead.

Parameters
bufferreference to the buffer to be flushed
countnumber of samples in the buffer to be flushed, will be internally set to zero if successful
Returns
true if successful, false if failed (e.g. out of memory)

Implemented in Kwave::TrackWriter, and Kwave::StreamWriter.

Referenced by Kwave::RecordPlugin::flushPrerecordingQueue(), and operator<<().

Here is the caller graph for this function:

Member Data Documentation

◆ m_buffer

Kwave::SampleArray Kwave::Writer::m_buffer
protected

intermediate buffer for the input data

Definition at line 161 of file Writer.h.

Referenced by operator<<().

◆ m_buffer_size

unsigned int Kwave::Writer::m_buffer_size
protected

for speedup: cached buffer size

Definition at line 164 of file Writer.h.

Referenced by operator<<().

◆ m_buffer_used

unsigned int Kwave::Writer::m_buffer_used
protected

number of used elements in the buffer

Definition at line 167 of file Writer.h.

Referenced by operator<<(), Kwave::StreamWriter::~StreamWriter(), and ~Writer().

◆ m_first

sample_index_t Kwave::Writer::m_first
protected

first sample

Definition at line 149 of file Writer.h.

Referenced by ~Writer().

◆ m_last

sample_index_t Kwave::Writer::m_last
protected

last sample

Definition at line 152 of file Writer.h.

Referenced by eof(), operator<<(), Kwave::TrackWriter::write(), and ~Writer().

◆ m_mode

Kwave::InsertMode Kwave::Writer::m_mode
protected

mode for input (insert, overwrite, ...)

Definition at line 155 of file Writer.h.

Referenced by eof(), operator<<(), Kwave::TrackWriter::write(), and ~Writer().

◆ m_position

sample_index_t Kwave::Writer::m_position
protected

current position within the track

Definition at line 158 of file Writer.h.

Referenced by eof(), operator<<(), Kwave::TrackWriter::write(), and ~Writer().


The documentation for this class was generated from the following files: