strawberry-audio-player-win.../src/engine/xineengine.h

185 lines
4.6 KiB
C
Raw Normal View History

2018-02-27 18:06:05 +01:00
/***************************************************************************
* Copyright (C) 2017-2018 Jonas Kvinge <jonas@jkvinge.net> *
* Copyright (C) 2005 Christophe Thommeret <hftom@free.fr> *
* (C) 2005 Ian Monroe <ian@monroe.nu> *
* (C) 2005-2006 Mark Kretschmann <markey@web.de> *
* (C) 2004-2005 Max Howell <max.howell@methylblue.com> *
* (C) 2003-2004 J. Kofler <kaffeine@gmx.net> *
2018-02-27 18:06:05 +01:00
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef XINEENGINE_H
#define XINEENGINE_H
2018-02-27 18:06:05 +01:00
#include "config.h"
#include <memory>
#include <stdbool.h>
#include <stdint.h>
#include <sys/types.h>
#include <xine.h>
#include <QtGlobal>
#include <QObject>
#include <QMutex>
2018-02-27 18:06:05 +01:00
#include <QThread>
#include <QEvent>
#include <QList>
#include <QString>
#include <QUrl>
2018-02-27 18:06:05 +01:00
#include "engine_fwd.h"
#include "enginebase.h"
using std::shared_ptr;
2018-02-27 18:06:05 +01:00
class TaskManager;
class PruneScopeThread;
class XineFader;
class XineOutFader;
2018-02-27 18:06:05 +01:00
class XineEvent : public QEvent {
public:
enum EventType {
PlaybackFinished,
2018-02-27 18:06:05 +01:00
InfoMessage,
StatusMessage,
MetaInfoChanged,
Redirecting,
LastFMTrackChanged,
};
XineEvent(EventType type, void* data = nullptr) : QEvent(QEvent::Type(type)), data_(data) {}
2018-02-27 18:06:05 +01:00
void setData(void *data) { data_ = data; }
void *data() const { return data_; }
2018-02-27 18:06:05 +01:00
private:
void *data_;
2018-02-27 18:06:05 +01:00
};
class XineEngine : public Engine::Base {
Q_OBJECT
public:
XineEngine(TaskManager *task_manager);
~XineEngine();
2018-02-27 18:06:05 +01:00
bool Init();
Engine::State state() const;
bool Load(const QUrl &url, Engine::TrackChangeFlags change, bool force_stop_at_end, quint64 beginning_nanosec, qint64 end_nanosec);
bool Play(quint64 offset_nanosec);
void Stop(bool stop_after = false);
void Pause();
void Unpause();
void Seek(quint64 offset_nanosec);
void SetVolumeSW(uint );
2018-02-27 18:06:05 +01:00
qint64 position_nanosec() const;
qint64 length_nanosec() const;
2018-02-27 18:06:05 +01:00
const Engine::Scope& scope(int chunk_length);
2018-02-27 18:06:05 +01:00
QString DefaultOutput() { return "auto"; }
OutputDetailsList GetOutputsList() const;
bool CustomDeviceSupport(const QString &name);
2018-02-27 18:06:05 +01:00
void ReloadSettings();
2018-02-27 18:06:05 +01:00
void SetEnvironment();
2018-02-27 18:06:05 +01:00
uint length() const;
uint position() const;
2018-02-27 18:06:05 +01:00
bool CanDecode(const QUrl &);
2018-02-27 18:06:05 +01:00
bool MetaDataForUrl(const QUrl &url, Engine::SimpleMetaBundle &b);
bool GetAudioCDContents(const QString &device, QList<QUrl> &urls);
bool FlushBuffer();
2018-02-27 18:06:05 +01:00
void SetEqualizerEnabled(bool enabled);
void SetEqualizerParameters(int preamp, const QList<int>&);
2018-02-27 18:06:05 +01:00
void FadeOut(uint fadeLength, bool* terminate, bool exiting = false);
2018-02-27 18:06:05 +01:00
static void XineEventListener(void*, const xine_event_t*);
bool event(QEvent*);
2018-02-27 18:06:05 +01:00
Engine::SimpleMetaBundle fetchMetaData() const;
2018-02-27 18:06:05 +01:00
bool MakeNewStream();
bool EnsureStream();
2018-02-27 18:06:05 +01:00
void DetermineAndShowErrorMessage(); //call after failure to load/play
2018-02-27 18:06:05 +01:00
// Simple accessors
2018-02-27 18:06:05 +01:00
xine_stream_t *stream() { return stream_; }
float preamp() { return preamp_; }
bool stop_fader() { return stop_fader_; }
void set_stop_fader(bool stop_fader) { stop_fader_ = stop_fader; }
2018-02-27 18:06:05 +01:00
private:
static const char *kAutoOutput;
2018-02-27 18:06:05 +01:00
xine_t *xine_;
xine_stream_t *stream_;
xine_audio_port_t *audioport_;
xine_event_queue_t *eventqueue_;
xine_post_t *post_;
float preamp_;
bool stop_fader_;
bool fadeout_running_;
std::unique_ptr<PruneScopeThread> prune_;
2018-02-27 18:06:05 +01:00
QUrl url_;
2018-02-27 18:06:05 +01:00
static int last_error_;
static time_t last_error_time_;
2018-02-27 18:06:05 +01:00
uint log_buffer_count_ = 0;
uint log_scope_call_count_ = 1; // Prevent divideByZero
uint log_no_suitable_buffer_ = 0;
2018-02-27 18:06:05 +01:00
std::unique_ptr<XineFader> s_fader_;
std::unique_ptr<XineOutFader> s_outfader_;
2018-02-27 18:06:05 +01:00
int int_preamp_;
QMutex init_mutex_;
int64_t current_vpts_;
QList<int> equalizer_gains_;
int fade_length_;
bool fade_next_track_;
2018-02-27 18:06:05 +01:00
mutable Engine::SimpleMetaBundle current_bundle_;
2018-02-27 18:06:05 +01:00
PluginDetailsList GetPluginList() const;
2018-02-27 18:06:05 +01:00
private slots:
void PruneScope();
2018-02-27 18:06:05 +01:00
signals:
void InfoMessage(const QString&);
2018-02-27 18:06:05 +01:00
};
class PruneScopeThread : public QThread {
public:
PruneScopeThread(XineEngine *parent);
protected:
void run();
2018-02-27 18:06:05 +01:00
private:
XineEngine *engine_;
2018-02-27 18:06:05 +01:00
};
#endif