22 #include <QMutexLocker> 39 #define SCREEN_REFRESHES_PER_SECOND 10 45 :m_signal_manager(signal_manager), m_thread(this, QVariant()),
46 m_device(Q_NULLPTR), m_lock_device(), m_playback_params(),
47 m_lock_playback(), m_should_seek(false), m_seek_pos(0),
48 m_track_selection_changed(false),
49 m_reload_mode(false), m_loop_mode(false), m_paused(false),
50 m_playing(false), m_playback_position(0), m_playback_start(0),
51 m_playback_end(0), m_old_first(0), m_old_last(0),
52 m_playback_factories()
59 Qt::QueuedConnection);
179 qDebug(
"seekTo(%llu)", pos);
318 qWarning(
"PlaybackController::startDevicePlayBack(): " 319 "removing stale instance");
348 if ((pos < first) || (pos > last)) {
385 qDebug(
"PlaybackController::stopDevicePlayBack() - not running");
409 unsigned int tracks = all_tracks.count();
411 unsigned int audible_count = audible_tracks.count();
416 qDebug(
"PlaybackController::run(): no audible track(s) !");
438 unsigned int pos_countdown = 0;
444 if (pos > first) input.
skip(pos - first);
449 bool seek_again =
false;
450 bool seek_done =
false;
457 if (mixer)
delete mixer;
464 audible_count = audible_tracks.count();
482 if (seek_again) input.
seek(pos);
486 for (x = 0; x < audible_count; ++x) {
490 if (!stream)
continue;
492 if (!stream->
eof()) (*stream) >> in_samples[x];
497 for (y = 0; y < out_channels; ++y) {
499 for (x = 0; x < audible_count; ++x) {
500 sum +=
static_cast<double>(in[x]) * (*mixer)[x][y];
502 out_samples[y] =
static_cast<sample_t>(sum);
518 if (!pos_countdown) {
558 QList<Kwave::playback_method_t> all_methods;
565 if (methods.contains(method))
return;
569 if (!all_methods.contains(m))
570 all_methods.append(m);
577 if (m < best) best = m;
581 qDebug(
"playback method '%s' (%d) not supported " 582 "-> falling back to '%s' (%d)",
603 if (!factory)
return Q_NULLPTR;
624 if (!playback_params) {
633 if (!device)
return Q_NULLPTR;
636 if (tracks > 0) params.
channels = tracks;
640 QString result = device->
open(
647 if (result.length()) {
648 qWarning(
"PlayBackPlugin::openDevice(): opening the device failed.");
656 i18n(
"Unable to open '%1'",
657 params.
device.section(QLatin1Char(
'|'), 0, 0)));
QWidget * parentWidget() const
Kwave::SignalManager & m_signal_manager
virtual int write(const Kwave::SampleArray &samples)=0
void stopDevicePlayBack()
sample_index_t first() const
void seekTo(sample_index_t pos)
void unregisterPlaybackDeviceFactory(Kwave::PlaybackDeviceFactory *factory)
void setDefaultParams(const Kwave::PlayBackParam ¶ms)
bool m_track_selection_changed
void setEndPos(sample_index_t pos)
QList< Kwave::PlaybackDeviceFactory * > m_playback_factories
sample_index_t last() const
void sigPlaybackStarted()
unsigned int bits_per_sample
void updatePlaybackPos(sample_index_t pos)
Kwave::Selection & selection()
#define SCREEN_REFRESHES_PER_SECOND
sample_index_t startPos() const
void checkMethod(Kwave::playback_method_t &method)
sample_index_t m_old_last
void sigPlaybackStopped()
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
virtual void skip(sample_index_t count)
void seekDone(sample_index_t pos)
void sigPlaybackPos(sample_index_t pos)
virtual ~PlaybackController() Q_DECL_OVERRIDE
void sigDevicePlaybackDone()
static int error(QWidget *widget, QString message, QString caption=QString())
sample_index_t m_seek_pos
virtual QList< Kwave::playback_method_t > supportedMethods()=0
sample_index_t m_playback_start
void registerPlaybackDeviceFactory(Kwave::PlaybackDeviceFactory *factory)
void sigSeekDone(sample_index_t pos)
sample_index_t m_playback_end
sample_index_t endPos() const
const QList< unsigned int > allTracks()
void trackSelectionChanged()
PlaybackController(Kwave::SignalManager &signal_manager)
virtual Kwave::PlayBackDevice * createDevice(Kwave::playback_method_t method)=0
Kwave::PlayBackDevice * m_device
QString name(IDX type) const
Kwave::playback_method_t method
const QList< unsigned int > selectedTracks()
Kwave::PlayBackDevice * openDevice(int tracks, const Kwave::PlayBackParam *playback_params)
sample_index_t m_playback_position
virtual void seek(sample_index_t pos)
sample_index_t m_old_first
virtual Kwave::PlayBackDevice * createDevice(Kwave::playback_method_t method)
virtual QString open(const QString &device, double rate, unsigned int channels, unsigned int bits, unsigned int bufbase)=0
void setStartPos(sample_index_t pos)
void startDevicePlayBack()
IDX findFromData(const DATA &data) const
Kwave::PlayBackParam m_playback_params
virtual void run_wrapper(const QVariant ¶ms) Q_DECL_OVERRIDE
Kwave::WorkerThread m_thread
sample_index_t currentPos() const