kwave  18.07.70
Kwave::MultiPlaybackSink Class Reference

#include <MultiPlaybackSink.h>

Inheritance diagram for Kwave::MultiPlaybackSink:
Inheritance graph
Collaboration diagram for Kwave::MultiPlaybackSink:
Collaboration graph

Public Member Functions

 MultiPlaybackSink (unsigned int tracks, Kwave::PlayBackDevice *device)
 
virtual ~MultiPlaybackSink ()
 
- Public Member Functions inherited from Kwave::MultiTrackSink< Kwave::PlaybackSink, false >
 MultiTrackSink (unsigned int tracks, QObject *parent=Q_NULLPTR)
 
virtual ~MultiTrackSink () Q_DECL_OVERRIDE
 
virtual bool done () const Q_DECL_OVERRIDE
 
virtual unsigned int tracks () const Q_DECL_OVERRIDE
 
virtual Kwave::PlaybackSinkat (unsigned int track) const
 
virtual Kwave::PlaybackSinkoperator[] (unsigned int track) Q_DECL_OVERRIDE
 
virtual bool insert (unsigned int track, Kwave::PlaybackSink *sink)
 
virtual void clear ()
 
- 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 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)
 

Private Slots

void input (unsigned int track, Kwave::SampleArray data)
 

Private Attributes

unsigned int m_tracks
 
Kwave::PlayBackDevicem_device
 
QVector< Kwave::SampleArraym_in_buffer
 
QBitArray m_in_buffer_filled
 
Kwave::SampleArray m_out_buffer
 
QMutex m_lock
 

Additional Inherited Members

- Signals inherited from Kwave::StreamObject
void attributeChanged (const QVariant value)
 
- Static Public Member Functions inherited from Kwave::StreamObject
static void setInteractive (bool interactive)
 

Detailed Description

Definition at line 36 of file MultiPlaybackSink.h.

Constructor & Destructor Documentation

◆ MultiPlaybackSink()

Kwave::MultiPlaybackSink::MultiPlaybackSink ( unsigned int  tracks,
Kwave::PlayBackDevice device 
)

Constructor

Parameters
tracksnumber of tracks for playback
devicea PlayBackDevice

Definition at line 31 of file MultiPlaybackSink.cpp.

References Kwave::connect(), input(), Kwave::MultiTrackSink< Kwave::PlaybackSink, false >::insert(), m_in_buffer, m_in_buffer_filled, and m_tracks.

37 {
39  m_in_buffer_filled.fill(false);
40 
41  for (unsigned int track = 0; track < m_tracks; track++) {
42  // allocate a sink
43  Kwave::PlaybackSink *sink =
44  new(std::nothrow) Kwave::PlaybackSink(track);
45  insert(track, sink);
46  connect(sink, SIGNAL(output(uint,Kwave::SampleArray)),
47  this, SLOT(input(uint,Kwave::SampleArray)),
48  Qt::DirectConnection);
49  }
50 }
virtual unsigned int tracks() const Q_DECL_OVERRIDE
Kwave::SampleArray m_out_buffer
QVector< Kwave::SampleArray > m_in_buffer
void input(unsigned int track, Kwave::SampleArray data)
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
Definition: Connect.cpp:48
virtual bool insert(unsigned int track, Kwave::PlaybackSink *sink)
Kwave::PlayBackDevice * m_device
Here is the call graph for this function:

◆ ~MultiPlaybackSink()

Kwave::MultiPlaybackSink::~MultiPlaybackSink ( )
virtual

Destructor

Definition at line 53 of file MultiPlaybackSink.cpp.

References Kwave::MultiTrackSink< Kwave::PlaybackSink, false >::clear(), Kwave::PlayBackDevice::close(), m_device, and m_in_buffer.

54 {
55  // close all stream objects
56  clear();
57 
58  // close the device
59  if (m_device) {
60  m_device->close();
61  delete m_device;
62  }
63  m_device = Q_NULLPTR;
64 
65  // discard the buffers
66  while (!m_in_buffer.isEmpty())
67  m_in_buffer.erase(m_in_buffer.end() - 1);
68  m_in_buffer.clear();
69 }
QVector< Kwave::SampleArray > m_in_buffer
Kwave::PlayBackDevice * m_device
virtual int close()=0
Here is the call graph for this function:

Member Function Documentation

◆ input

void Kwave::MultiPlaybackSink::input ( unsigned int  track,
Kwave::SampleArray  data 
)
privateslot

receives data from one of the tracks

Parameters
trackindex of the track [0...tracks-1]
datasample data for the given track

Definition at line 72 of file MultiPlaybackSink.cpp.

References m_device, m_in_buffer, m_in_buffer_filled, m_lock, m_out_buffer, m_tracks, Kwave::SampleArray::size(), and Kwave::PlayBackDevice::write().

Referenced by MultiPlaybackSink().

74 {
75  QMutexLocker lock(&m_lock);
76 
77  Q_ASSERT(m_device);
78  Q_ASSERT(m_tracks);
79  if (!m_device || !m_tracks) return;
80 
81  Q_ASSERT(!m_in_buffer_filled[track]);
82  m_in_buffer_filled[track] = true;
83 
84  // copy the input data to the buffer
85  unsigned int samples = data.size();
86  m_in_buffer[track] = data;
87 
88  // check if all buffers are filled
89  for (unsigned int t = 0; t < m_tracks; t++)
90  if (!m_in_buffer_filled[t]) return;
91 
92  // all tracks have left their data, now we are ready
93  // to convert the buffers into a big combined one
94  Q_ASSERT(m_out_buffer.size() >= m_tracks);
95  for (unsigned int sample = 0; sample < samples; sample++) {
96  for (unsigned int t = 0; t < m_tracks; t++) {
97  const Kwave::SampleArray &in = m_in_buffer[t];
98  m_out_buffer[t] = in[sample];
99  }
100 
101  // play the output buffer
103  }
104 
105  m_in_buffer_filled.fill(false);
106 }
virtual int write(const Kwave::SampleArray &samples)=0
Kwave::SampleArray m_out_buffer
QVector< Kwave::SampleArray > m_in_buffer
Kwave::PlayBackDevice * m_device
unsigned int size() const
Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ m_device

Kwave::PlayBackDevice* Kwave::MultiPlaybackSink::m_device
private

device used for playback

Definition at line 66 of file MultiPlaybackSink.h.

Referenced by input(), and ~MultiPlaybackSink().

◆ m_in_buffer

QVector< Kwave::SampleArray > Kwave::MultiPlaybackSink::m_in_buffer
private

list of input buffers

Definition at line 69 of file MultiPlaybackSink.h.

Referenced by input(), MultiPlaybackSink(), and ~MultiPlaybackSink().

◆ m_in_buffer_filled

QBitArray Kwave::MultiPlaybackSink::m_in_buffer_filled
private

"filled"-flags for input buffers

Definition at line 72 of file MultiPlaybackSink.h.

Referenced by input(), and MultiPlaybackSink().

◆ m_lock

QMutex Kwave::MultiPlaybackSink::m_lock
private

mutex for locking against reentrance

Definition at line 78 of file MultiPlaybackSink.h.

Referenced by input().

◆ m_out_buffer

Kwave::SampleArray Kwave::MultiPlaybackSink::m_out_buffer
private

output buffer for all samples

Definition at line 75 of file MultiPlaybackSink.h.

Referenced by input().

◆ m_tracks

unsigned int Kwave::MultiPlaybackSink::m_tracks
private

number of tracks

Definition at line 63 of file MultiPlaybackSink.h.

Referenced by input(), and MultiPlaybackSink().


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