From 07553476d4f83f891ced085e260026e3cd922831 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Thu, 16 Jul 2020 00:59:46 +0200 Subject: [PATCH] Remove xine --- .circleci/config.yml | 1 - .github/workflows/ccpp.yml | 7 +- CMakeLists.txt | 9 +- README.md | 4 +- data/icons.qrc | 5 - data/icons/128x128/xine.png | Bin 8507 -> 0 bytes data/icons/22x22/xine.png | Bin 1334 -> 0 bytes data/icons/32x32/xine.png | Bin 2268 -> 0 bytes data/icons/48x48/xine.png | Bin 3545 -> 0 bytes data/icons/64x64/xine.png | Bin 5625 -> 0 bytes data/icons/full/xine.png | Bin 8507 -> 0 bytes debian/copyright | 15 - dist/macos/macdeploy.py | 15 - dist/unix/PKGBUILD.in | 1 - dist/unix/strawberry.spec.in | 1 - snap/snapcraft.yaml | 3 - src/CMakeLists.txt | 15 - src/analyzer/analyzercontainer.cpp | 2 +- src/config.h.in | 1 - src/core/iconmapper.h | 1 - src/core/mainwindow.cpp | 2 +- src/core/player.cpp | 9 - src/engine/enginetype.cpp | 3 - src/engine/xineengine.cpp | 1014 -------------------------- src/engine/xineengine.h | 154 ---- src/engine/xinescope.c | 173 ----- src/engine/xinescope.h | 45 -- src/settings/backendsettingspage.cpp | 3 - 28 files changed, 7 insertions(+), 1476 deletions(-) delete mode 100644 data/icons/128x128/xine.png delete mode 100644 data/icons/22x22/xine.png delete mode 100644 data/icons/32x32/xine.png delete mode 100644 data/icons/48x48/xine.png delete mode 100644 data/icons/64x64/xine.png delete mode 100644 data/icons/full/xine.png delete mode 100644 src/engine/xineengine.cpp delete mode 100644 src/engine/xineengine.h delete mode 100644 src/engine/xinescope.c delete mode 100644 src/engine/xinescope.h diff --git a/.circleci/config.yml b/.circleci/config.yml index e6bc9dc8..09957033 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -80,7 +80,6 @@ commands: libpulse-devel gstreamer-devel gstreamer-plugins-base-devel - libxine-devel vlc-devel libQt5Core-devel libQt5Gui-devel diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index df19adbb..507103c4 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -38,7 +38,6 @@ jobs: libpulse-devel gstreamer-devel gstreamer-plugins-base-devel - libxine-devel vlc-devel libQt5Core-devel libQt5Gui-devel @@ -109,7 +108,6 @@ jobs: libpulse-devel gstreamer-devel gstreamer-plugins-base-devel - libxine-devel vlc-devel libQt5Core-devel libQt5Gui-devel @@ -188,7 +186,6 @@ jobs: libpulse-devel gstreamer-devel gstreamer-plugins-base-devel - libxine-devel vlc-devel libQt5Core-devel libQt5Gui-devel @@ -269,7 +266,6 @@ jobs: libpulse-devel gstreamer-devel gstreamer-plugins-base-devel - libxine-devel vlc-devel libQt5Core-devel libQt5Gui-devel @@ -1036,7 +1032,6 @@ jobs: -DENABLE_LIBGPOD=OFF -DENABLE_IMOBILEDEVICE=OFF -DENABLE_LIBMTP=OFF - -DENABLE_XINE=OFF -DProtobuf_PROTOC_EXECUTABLE=/usr/src/strawberry-mxe/usr/x86_64-pc-linux-gnu/bin/protoc - name: Run Make @@ -1049,7 +1044,7 @@ jobs: - name: Create directories working-directory: build - run: mkdir -p gio-modules platforms sqldrivers imageformats styles gstreamer-plugins xine-plugins nsisplugins + run: mkdir -p gio-modules platforms sqldrivers imageformats styles gstreamer-plugins nsisplugins - name: Copy GIO modules working-directory: build diff --git a/CMakeLists.txt b/CMakeLists.txt index 15437f66..33a0b860 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -118,7 +118,6 @@ pkg_check_modules(GSTREAMER_AUDIO gstreamer-audio-1.0) pkg_check_modules(GSTREAMER_APP gstreamer-app-1.0) pkg_check_modules(GSTREAMER_TAG gstreamer-tag-1.0) pkg_check_modules(GSTREAMER_PBUTILS gstreamer-pbutils-1.0) -pkg_check_modules(LIBXINE libxine) pkg_check_modules(LIBVLC libvlc) pkg_check_modules(SQLITE REQUIRED sqlite3>=3.9) pkg_check_modules(LIBPULSE libpulse) @@ -258,10 +257,6 @@ optional_component(GSTREAMER ON "Engine: GStreamer backend" DEPENDS "gstreamer-pbutils-1.0" GSTREAMER_PBUTILS_FOUND ) -optional_component(XINE ON "Engine: Xine backend" - DEPENDS "libxine" LIBXINE_FOUND -) - optional_component(VLC ON "Engine: VLC backend" DEPENDS "libvlc" LIBVLC_FOUND ) @@ -401,8 +396,8 @@ add_custom_target(uninstall # Show a summary of what we have enabled summary_show() -if(NOT HAVE_GSTREAMER AND NOT HAVE_XINE AND NOT HAVE_VLC) - message(FATAL_ERROR "You need to have either GStreamer, Xine or VLC to compile!") +if(NOT HAVE_GSTREAMER AND NOT HAVE_VLC) + message(FATAL_ERROR "You need to have either GStreamer or VLC to compile!") elseif(NOT HAVE_GSTREAMER) message(WARNING "GStreamer is the only engine that is fully implemented. Using other engines is possible but not recommended.") endif() diff --git a/README.md b/README.md index f1197844..b46a6363 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ To build Strawberry from source you need the following installed on your system * [ALSA library (linux)](https://www.alsa-project.org/) * [DBus (linux)](https://www.freedesktop.org/wiki/Software/dbus/) * [PulseAudio (linux optional)](https://www.freedesktop.org/wiki/Software/PulseAudio/?) -* [GStreamer](https://gstreamer.freedesktop.org/), [Xine](https://www.xine-project.org) or [VLC](https://www.videolan.org) +* [GStreamer](https://gstreamer.freedesktop.org/) or [VLC](https://www.videolan.org) * [GnuTLS](https://www.gnutls.org/) Optional dependencies: @@ -81,7 +81,7 @@ Optional dependencies: * iPhone, iPod Touch, iPad and Apple TV devices: [libimobiledevice, libplist and libusbmuxd](https://www.libimobiledevice.org/) * Moodbar: [fftw3](http://www.fftw.org/) -Either GStreamer, Xine or VLC engine is required, but only GStreamer is fully implemented so far. +Either GStreamer or VLC engine is required, but only GStreamer is fully implemented so far. You should also install the gstreamer plugins base and good, and optionally bad and ugly. ### :wrench: Compiling from source diff --git a/data/icons.qrc b/data/icons.qrc index 89503e12..66af2cfb 100644 --- a/data/icons.qrc +++ b/data/icons.qrc @@ -81,7 +81,6 @@ icons/128x128/view-refresh.png icons/128x128/library-music.png icons/128x128/vlc.png - icons/128x128/xine.png icons/128x128/zoom-in.png icons/128x128/zoom-out.png icons/128x128/scrobble.png @@ -172,7 +171,6 @@ icons/64x64/view-refresh.png icons/64x64/library-music.png icons/64x64/vlc.png - icons/64x64/xine.png icons/64x64/zoom-in.png icons/64x64/zoom-out.png icons/64x64/scrobble.png @@ -267,7 +265,6 @@ icons/48x48/view-refresh.png icons/48x48/library-music.png icons/48x48/vlc.png - icons/48x48/xine.png icons/48x48/zoom-in.png icons/48x48/zoom-out.png icons/48x48/scrobble.png @@ -362,7 +359,6 @@ icons/32x32/view-refresh.png icons/32x32/library-music.png icons/32x32/vlc.png - icons/32x32/xine.png icons/32x32/zoom-in.png icons/32x32/zoom-out.png icons/32x32/scrobble.png @@ -457,7 +453,6 @@ icons/22x22/view-refresh.png icons/22x22/library-music.png icons/22x22/vlc.png - icons/22x22/xine.png icons/22x22/zoom-in.png icons/22x22/zoom-out.png icons/22x22/scrobble.png diff --git a/data/icons/128x128/xine.png b/data/icons/128x128/xine.png deleted file mode 100644 index 600a57e9f8ab3c8e45e199676ec43cc061506505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8507 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 diff --git a/data/icons/22x22/xine.png b/data/icons/22x22/xine.png deleted file mode 100644 index 150c72c1ee92763ef902d4b9c4ddfe9a952a38eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1334 zcmV-61Qq7`m(n3B%d?emU8CZkQAMa@!F6rWvK^<~7b|s85aDJnWi0F1+3ZbM*XI$(aa2-S z*}OL#4j-+k2zC>~-e_2~bVGIHTuFih85A;ci7YWF5*RlW8Bk>jUXMz=9uK@;5A&%W z2Al4mK0UPO?%m-BZ`>H#My5?`>Z+`)TCD3n%kS5NbxjMj%KCb!3gD3mJSsP*c~uEM zugdKqy5@tfY0yOF_W2+~Ha#B2)OAfcdbDd)F^n95iS3%kP6h(u4~f_Rd^VHiiDYht zgJcd@p!qz|bpd3$Un3kK;5lBi9Go+<`}+DWd=d(U7mbZ2J|aME7a;ems&cWS!v9j+ znrBwLzhf(@&^?d|z~_YnoxK>j^QTB04EV9(>9v?uTMa@8%zPf_FJ4AIoja~5$|1(w zhEu0{H!1)FKv&zgwK$bx58N4@z}d@xp<~lZNRkA`7}l>=u;=@6#1n&9+S-C8EepjO zr4(J=XE8n*1<5GYu_X2%I*!PA1hIGmsZ^$Y%a+%EsH&Q^(=f793GChh zoB@DE83((Lg`wdQyu0fwjK*?^#7($R5DtgL_wb~F9iM)UOZ}Jl1~J4E37$F@nV1;= zgZp|WlVJ*k24f8b{tt_0)AaX)wD2z z)cZT5Y*#3xJ(5lvPn5v;g8MT-4vECBE$rA9ZVg9KJ(9*$SyBL`bXX&s!_DYzn4_5v zesP;;&z|YwV~Ll*?#F<28c?@0N;ejuh1Auv=3@GsHryD=V5*p}8grVKVBq{uV9Z5P z^k6O*-*fF+q6zT6T^>aQ(EbJ-gECi)fygqN+S)OZasV5kQ5^V-B4W{e>+IDnz+y%-zp!{D{v!auQgf74^As#{P7 z?=3RSmjO5>up9&eGXSDXL`GxFlLA_pwPj||f96MC(*PI-eme{!H7PE(pyp*8A*)^h zl3rw}A#f=WV%xZ11*DLfO5$ASH_Xas3t;i4bLkium;l+CF`V4{9uy8Ek_MQNmrmGbn(&4^Vo5v0K25XOpA1TWvEb-m>dj#p)C* sb#45Ys6zp;Q=Gv$_ss;f_4vQ^4?lLPB#g*YhX4Qo07*qoM6N<$f@tk(KL7v# diff --git a/data/icons/32x32/xine.png b/data/icons/32x32/xine.png deleted file mode 100644 index 6339a25743c871167e774c76bfe0c9105d242c1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmV<22qX82P)BujT`#yo^qO~86wJ`9#=2)WE0lq{XcqgCh006~F z1SN-R^?f3w(@St&Pw1kO$-#58*|uKb_fu1QoLp{cODfg=g`U&SXq_`SWD^Q`T9hUF zO6gEY%LQaE1hfvL4wNE5DWy%rz%UGDni4Sr)76un>uuk*?O_K{*Is+uXLj%2m$ecJ z^Ojt$`_qrVQm{ssKZ2Ord2UW3Wu23`|pDn}*CK z%FTprH<^fHf`nyhzu}D)3Z>$$x87K+R;zYzZ|=trKKQtn3Jh%S>&su4N+oNlR6-|{ z2_uM!VGNNYRLLpp3%~h zO5T3^_jgH&`ZjlV&RLgCnp+YHt8UwNdnVI%b2^*Nv}7`}fZbdyX-A93<_U?yW>iAr z3=>Kvk*LwSI59E)m~2U1XbubvT(x1tPbMti_bHdF6SbPTQTD8mNYsXcz__NZXMU!8 zXc3m7F@;u06^>okAqYHtUlRx=;(Hnr29{yt5}*Pf0uNk;8~7@4{1cUmv*Eyj;puzs z`HsDP`->|?x6J}gz20b5O05$gRKV^nmn#XgCCe>0U!?}-bs)MZrBNsx*JIm`w-`RS zhpJb?H#MH2!BSju-h~Ve=20k60E**NC)l(10Djd;iy^OAwd(ZBmMvQ?*Y$JNYOQV& zLJw%oW3KA~3azWw^h}9AyuObOUs;d5NCd4lmtC}mUltrj55JD_4Cle1fWX zd}?xhgRD~p%v`SL>zg)ht{H?-1xWrHQd_{;u65u#jzgtZ$~4!rc^*YhOp%O=C4La3y*Ew_`NMBPE3zA8V#b_ zwgX=Tu7>n_AQ5&s&tvjLfqNf$l0vZ@E*=SVcVxKyqGhbTa4l!AUWrmF5|?*oczVa5 zIX-!uQn^gIQlV0=WF5!7rn|fAraSN4c%yiruhDRcJdg(-B7_-Ubf810OY3FVp8Y)X zyXU#>hO3b725102wR{09mgdn~;d;UB_V{dl{#6bh`T&AjvmqHKs;1{kKiDMIlRl7C z(!vd?@=l8;j)3!B2r9r_NZu_KXpj27=ehjsiES(#9AwSP<(!I{TAc{b?s$cVpLmK) z!lA39m2^5CCJ>a|u~KpRF2kTIKCrUcj&Dh_Q3X^HlFtG&P#l7!CkaG{Psm!W!jJBM zfV+S2L$aAHABSUO<2>-_Zy7!I99Ndx1+Y`8)s`;wK+FcORfIGmYof0g&IELx+zt zGJF)X=x1xy+I5Q;FLc+fyI%T$H$Mo1a^!)2;66ea;UzTOtOtCFT9`_v=wG;sW79Q0 z4!sMOk(<{`tvZF#ipi(ULpt(;vA)}+?bab>C(kCJh@BuWw2|*diLF%VcfesNz zhiAV~YtC8wC8}hpPSyE$IP-$b8U1h=ᕏ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 T`8aIq00000NkvXXu0mjfaUZtd diff --git a/data/icons/64x64/xine.png b/data/icons/64x64/xine.png deleted file mode 100644 index 2d409d08f6b13505b4a400f66263c16084d6f522..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5625 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 T!}hmh00000NkvXXu0mjfo)5|j diff --git a/data/icons/full/xine.png b/data/icons/full/xine.png deleted file mode 100644 index 600a57e9f8ab3c8e45e199676ec43cc061506505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8507 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 diff --git a/debian/copyright b/debian/copyright index b789bedf..f055cdfe 100644 --- a/debian/copyright +++ b/debian/copyright @@ -213,21 +213,6 @@ Copyright: 2017, 2018, Jonas Kvinge 2003-2005, Mark Kretschmann License: GPL-2+ -Files: src/engine/xineengine.cpp - src/engine/xineengine.h -Copyright: 2017, 2018, Jonas Kvinge - 2005, Ian Monroe - 2005, Christophe Thommeret - 2005, 2006, Mark Kretschmann - 2004, 2005, Max Howell - 2003, 2004, J. Kofler -License: GPL-2+ - -Files: src/engine/xinescope.c - src/engine/xinescope.h -Copyright: 2004, Max Howell -License: GPL-2+ - Files: src/widgets/fancytabwidget.cpp src/widgets/fancytabwidget.h Copyright: 2018, Vikram Ambrose diff --git a/dist/macos/macdeploy.py b/dist/macos/macdeploy.py index 20d29a98..1dc34626 100755 --- a/dist/macos/macdeploy.py +++ b/dist/macos/macdeploy.py @@ -154,12 +154,6 @@ class InstallNameToolError(Error): class CouldNotFindGstreamerPluginError(Error): pass -class CouldNotFindXinePluginError(Error): - pass - -class CouldNotFindVLCPluginError(Error): - pass - if len(sys.argv) < 2: print 'Usage: %s ' % sys.argv[0] @@ -433,15 +427,6 @@ def FixFrameworkInstallPath(library_path, library): FixInstallPath(library_path, library, new_path) -def FindXinePlugin(name): - for path in XINEPLUGIN_SEARCH_PATH: - if os.path.exists(path): - for dir, dirs, files in os.walk(path): - if name in files: - return os.path.join(dir, name) - raise CouldNotFindXinePluginError(name) - - def FindQtPlugin(name): for path in QT_PLUGINS_SEARCH_PATH: if os.path.exists(path): diff --git a/dist/unix/PKGBUILD.in b/dist/unix/PKGBUILD.in index 94f028be..538428f6 100644 --- a/dist/unix/PKGBUILD.in +++ b/dist/unix/PKGBUILD.in @@ -23,7 +23,6 @@ depends=( gstreamer gst-plugins-base gst-plugins-good - xine-lib vlc chromaprint libgpod diff --git a/dist/unix/strawberry.spec.in b/dist/unix/strawberry.spec.in index 09a7ef69..02b1abba 100644 --- a/dist/unix/strawberry.spec.in +++ b/dist/unix/strawberry.spec.in @@ -73,7 +73,6 @@ BuildRequires: pkgconfig(libmtp) BuildRequires: pkgconfig(libnotify) BuildRequires: pkgconfig(libudf) %if 0%{?suse_version} || 0%{?fedora_version} -BuildRequires: pkgconfig(libxine) BuildRequires: pkgconfig(libvlc) %endif diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 89a41f16..05f4d467 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -99,7 +99,6 @@ parts: - libqt5x11extras5-dev - libgstreamer1.0-dev - libgstreamer-plugins-base1.0-dev - - libxine2-dev - libvlc-dev - libcdio-dev - libgpod-dev @@ -135,7 +134,6 @@ parts: - libimobiledevice6 - libplist3 - libusbmuxd4 - - libxine2 - libvlc5 - libvlccore9 - libtag1v5 @@ -144,7 +142,6 @@ parts: - libx11-6 - libxcomposite1 - libxcursor1 - - libxinerama1 - libxrandr2 - libdb5.3 - libglu1 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bb4444e1..ce886673 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -533,12 +533,6 @@ optional_source(HAVE_GSTREAMER HEADERS engine/gststartup.h engine/gstengine.h engine/gstenginepipeline.h engine/gstelementdeleter.h ) -# Xine -optional_source(HAVE_XINE - SOURCES engine/xineengine.cpp engine/xinescope.c - HEADERS engine/xineengine.h -) - # VLC optional_source(HAVE_VLC SOURCES engine/vlcengine.cpp @@ -944,10 +938,6 @@ if(HAVE_GSTREAMER) ) endif(HAVE_GSTREAMER) -if(HAVE_XINE) - link_directories(${LIBXINE_LIBRARY_DIRS}) -endif() - if(HAVE_VLC) link_directories(${LIBVLC_LIBRARY_DIRS}) endif() @@ -1067,11 +1057,6 @@ if(HAVE_MOODBAR) target_link_libraries(strawberry_lib PRIVATE gstmoodbar) endif() -if(HAVE_XINE) - target_include_directories(strawberry_lib SYSTEM PRIVATE ${LIBXINE_INCLUDE_DIRS}) - target_link_libraries(strawberry_lib PRIVATE ${LIBXINE_LIBRARIES}) -endif() - if(HAVE_VLC) target_include_directories(strawberry_lib SYSTEM PRIVATE ${LIBVLC_INCLUDE_DIRS}) target_link_libraries(strawberry_lib PRIVATE ${LIBVLC_LIBRARIES}) diff --git a/src/analyzer/analyzercontainer.cpp b/src/analyzer/analyzercontainer.cpp index 6355712b..97f4479e 100644 --- a/src/analyzer/analyzercontainer.cpp +++ b/src/analyzer/analyzercontainer.cpp @@ -99,7 +99,7 @@ AnalyzerContainer::AnalyzerContainer(QWidget *parent) void AnalyzerContainer::mouseReleaseEvent(QMouseEvent *e) { - if (engine_->type() != Engine::EngineType::GStreamer && engine_->type() != Engine::EngineType::Xine) return; + if (engine_->type() != Engine::EngineType::GStreamer) return; if (e->button() == Qt::RightButton) { context_menu_->popup(e->globalPos()); diff --git a/src/config.h.in b/src/config.h.in index ff31cdb8..c57b5ad4 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -43,7 +43,6 @@ #cmakedefine HAVE_GSTREAMER #cmakedefine HAVE_VLC -#cmakedefine HAVE_XINE #cmakedefine HAVE_SUBSONIC #cmakedefine HAVE_TIDAL diff --git a/src/core/iconmapper.h b/src/core/iconmapper.h index 91e37db0..54ef6ce8 100644 --- a/src/core/iconmapper.h +++ b/src/core/iconmapper.h @@ -129,7 +129,6 @@ static const QMap iconmapper_ = { { "view-refresh", { {}} }, { "library-music", { {"vinyl"}} }, { "vlc", { {}} }, - { "xine", { {}} }, { "zoom-in", { {}} }, { "zoom-out", { {}, 0, 0 } } diff --git a/src/core/mainwindow.cpp b/src/core/mainwindow.cpp index 2f26aad5..ab54d3dc 100644 --- a/src/core/mainwindow.cpp +++ b/src/core/mainwindow.cpp @@ -1058,7 +1058,7 @@ void MainWindow::ExitFinished() { void MainWindow::EngineChanged(Engine::EngineType enginetype) { - ui_->action_equalizer->setEnabled(enginetype == Engine::EngineType::GStreamer || enginetype == Engine::EngineType::Xine); + ui_->action_equalizer->setEnabled(enginetype == Engine::EngineType::GStreamer); #ifdef Q_OS_WIN ui_->action_open_cd->setEnabled(false); ui_->action_open_cd->setVisible(false); diff --git a/src/core/player.cpp b/src/core/player.cpp index 258bbc8d..d5083bf5 100644 --- a/src/core/player.cpp +++ b/src/core/player.cpp @@ -51,9 +51,6 @@ # include "engine/gstengine.h" # include "engine/gststartup.h" #endif -#ifdef HAVE_XINE -# include "engine/xineengine.h" -#endif #ifdef HAVE_VLC # include "engine/vlcengine.h" #endif @@ -125,12 +122,6 @@ Engine::EngineType Player::CreateEngine(Engine::EngineType enginetype) { break; } #endif -#ifdef HAVE_XINE - case Engine::Xine: - use_enginetype=Engine::Xine; - engine_.reset(new XineEngine(app_->task_manager())); - break; -#endif #ifdef HAVE_VLC case Engine::VLC: use_enginetype=Engine::VLC; diff --git a/src/engine/enginetype.cpp b/src/engine/enginetype.cpp index 443c39c4..9d1c586c 100644 --- a/src/engine/enginetype.cpp +++ b/src/engine/enginetype.cpp @@ -28,7 +28,6 @@ namespace Engine { Engine::EngineType EngineTypeFromName(QString enginename) { QString lower = enginename.toLower(); if (lower == "gstreamer") return Engine::GStreamer; - else if (lower == "xine") return Engine::Xine; else if (lower == "vlc") return Engine::VLC; else return Engine::None; } @@ -36,7 +35,6 @@ Engine::EngineType EngineTypeFromName(QString enginename) { QString EngineName(Engine::EngineType enginetype) { switch (enginetype) { case Engine::GStreamer: return QString("gstreamer"); - case Engine::Xine: return QString("xine"); case Engine::VLC: return QString("vlc"); case Engine::None: default: return QString("None"); @@ -46,7 +44,6 @@ QString EngineName(Engine::EngineType enginetype) { QString EngineDescription(Engine::EngineType enginetype) { switch (enginetype) { case Engine::GStreamer: return QString("GStreamer"); - case Engine::Xine: return QString("Xine"); case Engine::VLC: return QString("VLC"); case Engine::None: default: return QString("None"); diff --git a/src/engine/xineengine.cpp b/src/engine/xineengine.cpp deleted file mode 100644 index 1e842b9e..00000000 --- a/src/engine/xineengine.cpp +++ /dev/null @@ -1,1014 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2017-2018 Jonas Kvinge * - * Copyright (C) 2005 Christophe Thommeret * - * (C) 2005 Ian Monroe * - * (C) 2005-2006 Mark Kretschmann * - * (C) 2004-2005 Max Howell * - * (C) 2003-2004 J. Kofler * - * * - * 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. * - * * - ***************************************************************************/ - -#include "config.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "core/logging.h" -#include -#include "engine_fwd.h" -#include "enginebase.h" -#include "enginetype.h" -#include "xineengine.h" -#include "xinescope.h" - -#ifndef LLONG_MAX -#define LLONG_MAX 9223372036854775807LL -#endif - -// Define this to use xine in a more standard way -//#define XINE_SAFE_MODE - -const char *XineEngine::kAutoOutput = "auto"; - -XineEngine::XineEngine(TaskManager *task_manager) - : EngineBase(), - xine_(nullptr), - audioport_(nullptr), - stream_(nullptr), - eventqueue_(nullptr), - post_(nullptr), - prune_(nullptr), - preamp_(1.0), - have_metadata_(false) { - - Q_UNUSED(task_manager); - - type_ = Engine::Xine; - ReloadSettings(); - -} - -XineEngine::~XineEngine() { - - Cleanup(); - -} - -bool XineEngine::Init() { - - Cleanup(); - SetEnvironment(); - - QMutexLocker locker(&init_mutex_); - xine_ = xine_new(); - if (!xine_) { - emit Error("Could not initialize xine."); - return false; - } - -#ifdef XINE_SAFE_MODE - xine_engine_set_param(xine_, XINE_ENGINE_PARAM_VERBOSITY, 99); -#endif - - xine_init(xine_); - -#if !defined(XINE_SAFE_MODE) - prune_.reset(new PruneScopeThread(this)); - prune_->start(); -#endif - - return true; - -} - -void XineEngine::SetDevice() { - - if (device_.isValid()) { - bool valid(false); - xine_cfg_entry_t entry; - switch (device_.type()) { - case QVariant::String: - if (device_.toString().isEmpty()) break; - valid = true; - xine_config_register_string(xine_, "audio.device.alsa_front_device", device_.toString().toUtf8().data(), "", "", 10, nullptr, nullptr); - break; - case QVariant::ByteArray: - valid = true; - xine_config_register_string(xine_, "audio.device.alsa_front_device", device_.toByteArray().data(), "", "", 10, nullptr, nullptr); - break; - default: - qLog(Error) << "Unknown device type" << device_; - break; - } - if (valid) { - xine_config_lookup_entry(xine_, "audio.device.alsa_front_device", &entry); - xine_config_update_entry(xine_, &entry); - } - } - current_device_ = device_; - -} - -bool XineEngine::OpenAudioDriver() { - - SetDevice(); - - if (!ValidOutput(output_)) { - qLog(Error) << "Invalid output detected:" << output_ << " - Resetting to default."; - output_ = DefaultOutput(); - } - - audioport_ = xine_open_audio_driver(xine_, (output_.isEmpty() || output_ == kAutoOutput ? nullptr : output_.toUtf8().constData()), nullptr); - if (!audioport_) { - emit StateChanged(Engine::Error); - emit FatalError(); - emit Error("Xine was unable to initialize any audio drivers."); - return false; - } - -#if !defined(XINE_SAFE_MODE) - post_ = scope_plugin_new(xine_, audioport_); - if (!post_) { - xine_close_audio_driver(xine_, audioport_); - audioport_ = nullptr; - emit StateChanged(Engine::Error); - emit FatalError(); - emit Error("Xine was unable to initialize any audio drivers."); - return false; - } -#endif - - return true; - -} - -void XineEngine::CloseAudioDriver() { - - if (post_) { - xine_post_dispose(xine_, post_); - post_ = nullptr; - } - - if (audioport_) { - xine_close_audio_driver(xine_, audioport_); - audioport_ = nullptr; - } - -} - -bool XineEngine::CreateStream() { - - stream_ = xine_stream_new(xine_, audioport_, nullptr); - if (!stream_) { - CloseAudioDriver(); - emit Error("Could not create a new Xine stream."); - return false; - } - - if (eventqueue_) xine_event_dispose_queue(eventqueue_); - eventqueue_ = xine_event_new_queue(stream_); - xine_event_create_listener_thread(eventqueue_, &XineEngine::XineEventListener, reinterpret_cast(this)); - -#ifndef XINE_SAFE_MODE - xine_set_param(stream_, XINE_PARAM_METRONOM_PREBUFFER, 6000); - xine_set_param(stream_, XINE_PARAM_IGNORE_VIDEO, 1); -#endif - -#ifdef XINE_PARAM_EARLY_FINISHED_EVENT - // Enable gapless playback - xine_set_param(stream_, XINE_PARAM_EARLY_FINISHED_EVENT, 1); - qLog(Debug) << "Gapless playback enabled."; -#endif - - return true; - -} - -void XineEngine::CloseStream() { - - if (stream_) - xine_close(stream_); - - if (eventqueue_) { - xine_event_dispose_queue(eventqueue_); - eventqueue_ = nullptr; - } - - if (stream_) { - xine_dispose(stream_); - stream_ = nullptr; - } - -} - -bool XineEngine::EnsureStream() { - - if (!audioport_) { - bool result = OpenAudioDriver(); - if (!result) return false; - } - if (!stream_) return CreateStream(); - return true; - -} - -void XineEngine::Cleanup() { - - // Wait until the prune scope thread is done - if (prune_) { - prune_->exit(); - prune_->wait(); - } - prune_.reset(); - - CloseStream(); - CloseAudioDriver(); - - if (xine_) xine_exit(xine_); - xine_ = nullptr; - - //qLog(Debug) << "xine closed"; - //qLog(Debug) << "Scope statistics:"; - //qLog(Debug) << "Average list size: " << log_buffer_count_ / log_scope_call_count_; - //qLog(Debug) << "Buffer failure: " << double(log_no_suitable_buffer_*100) / log_scope_call_count_ << "%"; - -} - -Engine::State XineEngine::state() const { - - if (!stream_) return Engine::Empty; - - switch(xine_get_status(stream_)) { - case XINE_STATUS_PLAY: - return xine_get_param(stream_, XINE_PARAM_SPEED) != XINE_SPEED_PAUSE ? Engine::Playing : Engine::Paused; - case XINE_STATUS_IDLE: - return Engine::Empty; - case XINE_STATUS_STOP: - default: - return stream_url_.isEmpty() ? Engine::Empty : Engine::Idle; - } - -} - -bool XineEngine::Load(const QUrl &stream_url, const QUrl &original_url, const Engine::TrackChangeFlags change, const bool force_stop_at_end, const quint64 beginning_nanosec, const qint64 end_nanosec) { - - if (!EnsureStream()) return false; - - have_metadata_ = false; - - Engine::Base::Load(stream_url, original_url, change, force_stop_at_end, beginning_nanosec, end_nanosec); - - xine_close(stream_); - - int result = xine_open(stream_, stream_url.toString().toUtf8()); - if (result) { - -#if !defined(XINE_SAFE_MODE) - xine_post_out_t *source = xine_get_audio_source(stream_); - xine_post_in_t *target = (xine_post_in_t*)xine_post_input(post_, const_cast("audio in")); - xine_post_wire(source, target); -#endif - - return true; - } - - DetermineAndShowErrorMessage(); - return false; - -} - -bool XineEngine::Play(const quint64 offset_nanosec) { - - if (!EnsureStream()) return false; - - int offset = (offset_nanosec / kNsecPerMsec); - const bool has_audio = xine_get_stream_info(stream_, XINE_STREAM_INFO_HAS_AUDIO); - const bool audio_handled = xine_get_stream_info(stream_, XINE_STREAM_INFO_AUDIO_HANDLED); - if (!has_audio || !audio_handled) return false; - - int result = xine_play(stream_, 0, offset); - if (result) { - emit StateChanged(Engine::Playing); - return true; - } - xine_close(stream_); - - DetermineAndShowErrorMessage(); - return false; - -} - -void XineEngine::Stop(const bool stop_after) { - - Q_UNUSED(stop_after); - - if (!stream_) return; - - xine_stop(stream_); - xine_close(stream_); - xine_set_param(stream_, XINE_PARAM_AUDIO_CLOSE_DEVICE, 1); - - CloseStream(); - CloseAudioDriver(); - - emit StateChanged(Engine::Empty); - -} - -void XineEngine::Pause() { - - if (!stream_) return; - - int result = xine_get_param(stream_, XINE_PARAM_SPEED); - if (result != XINE_SPEED_PAUSE) { - xine_set_param(stream_, XINE_PARAM_SPEED, XINE_SPEED_PAUSE); - xine_set_param(stream_, XINE_PARAM_AUDIO_CLOSE_DEVICE, 1); - emit StateChanged(Engine::Paused); - } - -} - -void XineEngine::Unpause() { - - if (!stream_) return; - - int result = xine_get_param(stream_, XINE_PARAM_SPEED); - if (result == XINE_SPEED_PAUSE) { - xine_set_param(stream_, XINE_PARAM_SPEED, XINE_SPEED_NORMAL); - emit StateChanged(Engine::Playing); - } - -} - -void XineEngine::Seek(const quint64 offset_nanosec) { - - if (!EnsureStream()) return; - - int offset = (offset_nanosec / kNsecPerMsec); - - int result = xine_get_param(stream_, XINE_PARAM_SPEED); - if (result == XINE_SPEED_PAUSE) { - xine_play(stream_, 0, offset); - xine_set_param(stream_, XINE_PARAM_SPEED, XINE_SPEED_PAUSE); - } - else xine_play(stream_, 0, offset); - -} - -void XineEngine::SetVolumeSW(const uint vol) { - - if (!stream_) return; - if (!volume_control_ && vol != 100) return; - xine_set_param(stream_, XINE_PARAM_AUDIO_AMP_LEVEL, static_cast(vol * preamp_)); - -} - -qint64 XineEngine::position_nanosec() const { - if (state() == Engine::Empty) return 0; - const qint64 result = (position() * kNsecPerMsec); - return qint64(qMax(0ll, result)); -} - -qint64 XineEngine::length_nanosec() const { - if (state() == Engine::Empty) return 0; - const qint64 result = end_nanosec_ - beginning_nanosec_; - - if (result > 0) { - return result; - } - else { - // Get the length from the pipeline if we don't know. - return (length() * kNsecPerMsec); - } -} - -EngineBase::OutputDetailsList XineEngine::GetOutputsList() const { - - OutputDetailsList ret; - - PluginDetailsList plugins = GetPluginList(); - for (const PluginDetails &plugin : plugins) { - OutputDetails output; - output.name = plugin.name; - output.description = plugin.description; - if (plugin.name == "auto") output.iconname = "soundcard"; - else if ((plugin.name == "alsa")||(plugin.name == "oss")) output.iconname = "alsa"; - else if (plugin.name== "jack") output.iconname = "jack"; - else if (plugin.name == "pulseaudio") output.iconname = "pulseaudio"; - else if (plugin.name == "bluetooth") output.iconname = "bluetooth"; - else if (plugin.name == "file") output.iconname = "document-new"; - else output.iconname = "soundcard"; - ret.append(output); - } - - return ret; -} - -bool XineEngine::ValidOutput(const QString &output) { - - PluginDetailsList plugins = GetPluginList(); - for (const PluginDetails &plugin : plugins) { - if (plugin.name == output) return(true); - } - return(false); - -} - -bool XineEngine::CustomDeviceSupport(const QString &output) { - return (output == "alsa" || output == "oss" || output == "jack" || output == "pulseaudio"); -} - -bool XineEngine::ALSADeviceSupport(const QString &output) { - return (output == "alsa"); -} - -void XineEngine::ReloadSettings() { - - Engine::Base::ReloadSettings(); - - if (output_.isEmpty()) output_ = DefaultOutput(); - -} - -void XineEngine::SetEnvironment() { - -#ifdef Q_OS_WIN - putenv(QString("XINE_PLUGIN_PATH=" + QCoreApplication::applicationDirPath() + "/xine-plugins").toLatin1().constData()); -#endif - -#ifdef Q_OS_MACOS - setenv("XINE_PLUGIN_PATH", QString(QCoreApplication::applicationDirPath() + "/../PlugIns/xine").toLatin1().constData(), 1); -#endif - -} - -uint XineEngine::length() const { - - if (!stream_) return 0; - - // Xine often delivers nonsense values for VBR files and such, so we only use the length for remote files - - if (stream_url_.isLocalFile()) return 0; - else { - int pos = 0, time = 0, length = 0; - - xine_get_pos_length(stream_, &pos, &time, &length); - if (length < 0) length=0; - - return length; - } - -} - -uint XineEngine::position() const { - - if (state() == Engine::Empty) return 0; - - int pos = 0, time = 0, length = 0; - - // Workaround for problems when you seek too quickly, see BUG 99808 - //int tmp = 0, i = 0; - //while (++i < 4) { - xine_get_pos_length(stream_, &pos, &time, &length); - //if (time > tmp) break; - //usleep(100000); - //} - - if (state() != Engine::Idle && state() != Engine::Empty && !have_metadata_ && time > 0) { - FetchMetaData(); - } - - return time; - -} - -bool XineEngine::CanDecode(const QUrl &url) { - - static QStringList list; - - if (list.isEmpty()) { - - QMutexLocker locker(&const_cast(this)->init_mutex_); - - if (list.isEmpty()) { - char *exts = xine_get_file_extensions(xine_); - list = QString(exts).split(' '); - free(exts); - exts = nullptr; - // Images - list.removeAll("png"); - list.removeAll("jpg"); - list.removeAll("jpeg"); - list.removeAll("gif"); - list.removeAll("ilbm"); - list.removeAll("iff"); - // Subtitles - list.removeAll("asc"); - list.removeAll("txt"); - list.removeAll("sub"); - list.removeAll("srt"); - list.removeAll("smi"); - list.removeAll("ssa"); - // HACK: we also check for m4a because xine plays them but for some reason doesn't return the extension - if (!list.contains("m4a")) - list << "m4a"; - } - } - - if (url.scheme() == "cdda") return true; - - QString path = url.path(); - - // Partial downloads from Konqi and other browsers tend to have a .part extension - if (path.endsWith(".part")) path = path.left(path.length() - 5); - - const QString ext = path.mid(path.lastIndexOf('.') + 1).toLower(); - - return list.contains(ext); - -} - -void XineEngine::SetEqualizerEnabled(const bool enabled) { - - if (!stream_) return; - - equalizer_enabled_ = enabled; - - if (!enabled) { - QList gains; - for (uint x = 0; x < 10; x++) - gains << -101; // sets eq gains to zero. - - SetEqualizerParameters(0, gains); - } - -} - -/* - Sets the eq params for xine engine - have to rescale eq params to fitting range (adapted from kaffeine and xfmedia) - - preamp: - pre: (-100..100) - post: (0.1..1.9) - this is not really a preamp but we use the xine preamp parameter for our normal volume. so we make a postamp. - - gains: - pre: (-100..100) - post: (1..200) - (1 = down, 100 = middle, 200 = up, 0 = off) -*/ -void XineEngine::SetEqualizerParameters(const int preamp, const QList &gains) { - - if (!stream_) return; - - equalizer_gains_ = gains; - int_preamp_ = preamp; - QList::ConstIterator it = gains.begin(); - - xine_set_param(stream_, XINE_PARAM_EQ_30HZ, int((*it)*0.995 + 100)); - xine_set_param(stream_, XINE_PARAM_EQ_60HZ, int((*++it)*0.995 + 100)); - xine_set_param(stream_, XINE_PARAM_EQ_125HZ, int((*++it)*0.995 + 100)); - xine_set_param(stream_, XINE_PARAM_EQ_250HZ, int((*++it)*0.995 + 100)); - xine_set_param(stream_, XINE_PARAM_EQ_500HZ, int((*++it)*0.995 + 100)); - xine_set_param(stream_, XINE_PARAM_EQ_1000HZ, int((*++it)*0.995 + 100)); - xine_set_param(stream_, XINE_PARAM_EQ_2000HZ, int((*++it)*0.995 + 100)); - xine_set_param(stream_, XINE_PARAM_EQ_4000HZ, int((*++it)*0.995 + 100)); - xine_set_param(stream_, XINE_PARAM_EQ_8000HZ, int((*++it)*0.995 + 100)); - xine_set_param(stream_, XINE_PARAM_EQ_16000HZ, int((*++it)*0.995 + 100)); - - preamp_ = (preamp - 0.1 * preamp + 100) / 100.0; - SetVolume(volume_); - -} - -void XineEngine::XineEventListener(void *p, const xine_event_t *event) { - - if (!p) return; - XineEngine *engine = reinterpret_cast(p); - - switch(event->type) { - case XINE_EVENT_UI_SET_TITLE: - qLog(Debug) << "XINE_EVENT_UI_SET_TITLE"; - engine->FetchMetaData(); - break; - - case XINE_EVENT_UI_PLAYBACK_FINISHED: - qLog(Debug) << "XINE_EVENT_UI_PLAYBACK_FINISHED"; - emit engine->TrackEnded(); - break; - - case XINE_EVENT_PROGRESS: - { - xine_progress_data_t *pd = reinterpret_cast(event->data); - QString msg = QString("%1 %2%").arg(QString::fromUtf8(pd->description)).arg(QString::number(pd->percent) + QLocale::system().percent()); - //qLog(Debug) << "Xine:" << msg; - } - break; - - case XINE_EVENT_MRL_REFERENCE_EXT: - { - // Xine has read the stream and found it actually links to something else so we need to play that instead - QString message = QString::fromUtf8(static_cast(event->data)->mrl); - //emit StatusText(QString("Redirecting to: ").arg(*message)); - engine->Load(QUrl(message), engine->original_url_, Engine::Auto, false, 0, 0); - engine->Play(0); - } - break; - - case XINE_EVENT_UI_MESSAGE: - { - qLog(Debug) << "XINE_EVENT_UI_MESSAGE"; - - xine_ui_message_data_t *data = reinterpret_cast(event->data); - QString message; - - switch (data->type) { - - case XINE_MSG_NO_ERROR: - { - // Series of \0 separated strings, terminated with a \0\0 - char str[2000]; - char *str_p = str; - for (char *msg = data->messages; !(*msg == '\0' && *(msg+1) == '\0'); ++msg, ++str_p) - *str_p = *msg == '\0' ? '\n' : *msg; - *str_p = '\0'; - qLog(Debug) << "Xine:" << str; - break; - } - - case XINE_MSG_ENCRYPTED_SOURCE: - message = "Source is encrypted."; - if (data->explanation) { - message += " : "; - message += QString::fromUtf8(reinterpret_cast(data) + data->parameters); - } - emit engine->StateChanged(Engine::Error); - emit engine->InvalidSongRequested(engine->stream_url_); - break; - case XINE_MSG_UNKNOWN_HOST: - message = "The host is unknown."; - if (data->explanation) { - message += " : "; - message += QString::fromUtf8(reinterpret_cast(data) + data->parameters); - } - emit engine->StateChanged(Engine::Error); - emit engine->InvalidSongRequested(engine->stream_url_); - break; - case XINE_MSG_UNKNOWN_DEVICE: - message = "The device name you specified seems invalid."; - if (data->explanation) { - message += " : "; - message += QString::fromUtf8(reinterpret_cast(data) + data->parameters); - } - emit engine->StateChanged(Engine::Error); - emit engine->InvalidSongRequested(engine->stream_url_); - break; - case XINE_MSG_NETWORK_UNREACHABLE: - message = "The network appears unreachable."; - if (data->explanation) { - message += " : "; - message += QString::fromUtf8(reinterpret_cast(data) + data->parameters); - } - emit engine->StateChanged(Engine::Error); - emit engine->InvalidSongRequested(engine->stream_url_); - break; - case XINE_MSG_AUDIO_OUT_UNAVAILABLE: - message = "Audio output unavailable; the device is busy."; - if (data->explanation) { - message += " : "; - message += QString::fromUtf8(reinterpret_cast(data) + data->parameters); - } - emit engine->StateChanged(Engine::Error); - emit engine->FatalError(); - break; - case XINE_MSG_CONNECTION_REFUSED: - message = "Connection refused."; - if (data->explanation) { - message += " : "; - message += QString::fromUtf8(reinterpret_cast(data) + data->parameters); - } - emit engine->StateChanged(Engine::Error); - emit engine->InvalidSongRequested(engine->stream_url_); - break; - case XINE_MSG_FILE_NOT_FOUND: - message = "File not found."; - if (data->explanation) { - message += " : "; - message += QString::fromUtf8(reinterpret_cast(data) + data->parameters); - } - emit engine->StateChanged(Engine::Error); - emit engine->InvalidSongRequested(engine->stream_url_); - break; - case XINE_MSG_PERMISSION_ERROR: - message = "Access denied."; - if (data->explanation) { - message += " : "; - message += QString::fromUtf8(reinterpret_cast(data) + data->parameters); - } - emit engine->StateChanged(Engine::Error); - emit engine->InvalidSongRequested(engine->stream_url_); - break; - case XINE_MSG_READ_ERROR: - message = "Read error."; - if (data->explanation) { - message += " : "; - message += QString::fromUtf8(reinterpret_cast(data) + data->parameters); - } - emit engine->StateChanged(Engine::Error); - emit engine->InvalidSongRequested(engine->stream_url_); - break; - case XINE_MSG_LIBRARY_LOAD_ERROR: - message = "A problem occurred while loading a library or decoder."; - if (data->explanation) { - message += " : "; - message += QString::fromUtf8(reinterpret_cast(data) + data->parameters); - } - emit engine->StateChanged(Engine::Error); - emit engine->FatalError(); - break; - case XINE_MSG_GENERAL_WARNING: - message = "General Warning"; - if (data->explanation) { - message += ": "; - message += QString::fromUtf8(reinterpret_cast(data) + data->explanation); - } - else message += "."; - break; - case XINE_MSG_SECURITY: - message = "Security Warning"; - if (data->explanation) { - message += ": "; - message += QString::fromUtf8(reinterpret_cast(data) + data->explanation); - } - else message += "."; - break; - default: - message = "Unknown Error"; - if (data->explanation) { - message += ": "; - message += QString::fromUtf8(reinterpret_cast(data) + data->explanation); - } - else message += "."; - break; - } - emit engine->Error(message); - } - } - -} - -Engine::SimpleMetaBundle XineEngine::FetchMetaData() const { - - Engine::SimpleMetaBundle bundle; - bundle.url = original_url_; - bundle.title = QString::fromUtf8(xine_get_meta_info(stream_, XINE_META_INFO_TITLE)); - bundle.artist = QString::fromUtf8(xine_get_meta_info(stream_, XINE_META_INFO_ARTIST)); - bundle.album = QString::fromUtf8(xine_get_meta_info(stream_, XINE_META_INFO_ALBUM)); - bundle.comment = QString::fromUtf8(xine_get_meta_info(stream_, XINE_META_INFO_COMMENT)); - bundle.genre = QString::fromUtf8(xine_get_meta_info(stream_, XINE_META_INFO_GENRE)); - bundle.length = 0; - - bundle.year = QString::fromUtf8(xine_get_meta_info(stream_, XINE_META_INFO_YEAR)).toInt(); - bundle.track = QString::fromUtf8(xine_get_meta_info(stream_, XINE_META_INFO_TRACK_NUMBER)).toInt(); - - bundle.samplerate = xine_get_stream_info(stream_, XINE_STREAM_INFO_AUDIO_SAMPLERATE); - bundle.bitdepth = xine_get_stream_info(stream_, XINE_STREAM_INFO_AUDIO_BITS); - bundle.bitrate = xine_get_stream_info(stream_, XINE_STREAM_INFO_AUDIO_BITRATE) / 1000; - - qLog(Debug) << "Metadata received" << bundle.title - << bundle.artist - << bundle.album - << bundle.comment - << bundle.genre - << bundle.length - << bundle.year - << bundle.track - << bundle.samplerate - << bundle.bitdepth - << bundle.bitrate; - - current_bundle_ = bundle; - XineEngine *engine = const_cast(this); - engine->have_metadata_ = true; - emit engine->MetaData(bundle); - - return bundle; - -} - -void XineEngine::DetermineAndShowErrorMessage() { - - int errno; - QString message; - - errno = xine_get_error(stream_); - switch (errno) { - - case XINE_ERROR_NO_INPUT_PLUGIN: - message = "No suitable input plugin. This often means that the url's protocol is not supported. Network failures are other possible causes."; - break; - - case XINE_ERROR_NO_DEMUX_PLUGIN: - message = "No suitable demux plugin. This often means that the file format is not supported."; - break; - - case XINE_ERROR_DEMUX_FAILED: - message = "Demuxing failed."; - break; - - case XINE_ERROR_INPUT_FAILED: - message = "Could not open file."; - break; - - case XINE_ERROR_MALFORMED_MRL: - message = "The location is malformed."; - break; - - case XINE_ERROR_NONE: - // Xine is thick. Xine doesn't think there is an error but there may be! We check for other errors below. - default: - emit FatalError(); - int result = xine_get_stream_info(stream_, XINE_STREAM_INFO_AUDIO_HANDLED); - if (!result) { - // xine can read the plugin but it didn't find any codec - // THUS xine=daft for telling us it could handle the format in canDecode! - message = "There is no available decoder."; - QString const ext = QFileInfo(stream_url_.path()).completeSuffix(); - break; - } - result = xine_get_stream_info(stream_, XINE_STREAM_INFO_HAS_AUDIO); - if (!result) { - message = "There is no audio channel!"; - break; - } - break; - } - - emit Error(message); - -} - -const Engine::Scope &XineEngine::scope(const int chunk_length) { - - Q_UNUSED(chunk_length); - - if (!post_ || !stream_ || xine_get_status(stream_) != XINE_STATUS_PLAY) - return scope_; - - MyNode *const myList = scope_plugin_list(post_); - const int myChannels = scope_plugin_channels(post_); - int scopeidx = 0; - - if (myChannels > 2) return scope_; - - for (int n, frame = 0; frame < 512;) { - - MyNode *best_node = 0; - - for (MyNode *node = myList->next; node != myList; node = node->next, log_buffer_count_++) - if (node->vpts <= current_vpts_ && (!best_node || node->vpts > best_node->vpts)) - best_node = node; - - if (!best_node || best_node->vpts_end < current_vpts_) { - log_no_suitable_buffer_++; - break; - } - - int64_t diff = current_vpts_; - diff -= best_node->vpts; - diff *= 1<<16; - diff /= 32768; - - const int16_t *data16 = best_node->mem; - data16 += diff; - - diff += diff % myChannels; // Important correction to ensure we don't overflow the buffer - diff /= myChannels; // Use units of frames, not samples - - // Calculate the number of available samples in this buffer - n = best_node->num_frames; - n -= diff; - n += frame; //clipping for # of frames we need - - if (n > 512) - n = 512; // We don't want more than 512 frames - - for (int c; frame < n; ++frame, data16 += myChannels) { - for (c = 0; c < myChannels; ++c) { - // We now give interleaved pcm to the scope - scope_[scopeidx++] = data16[c]; - if (myChannels == 1) // Duplicate mono samples - scope_[scopeidx++] = data16[c]; - } - } - - current_vpts_ = best_node->vpts_end; - current_vpts_++; // FIXME: Needs to be done for some reason, or you get situations where it uses same buffer again and again - } - - log_scope_call_count_++; - - return scope_; - -} - -void XineEngine::PruneScope() { - - if (!stream_) return; - - // Here we prune the buffer list regularly - - MyNode *myList = scope_plugin_list(post_); - - if (!myList) return; - - // We operate on a subset of the list for thread-safety - MyNode * const first_node = myList->next; - MyNode const * const list_end = myList; - - current_vpts_ = (xine_get_status(stream_) == XINE_STATUS_PLAY) ? xine_get_current_vpts(stream_) - : LLONG_MAX; //if state is not playing OR paused, empty the list - //: std::numeric_limits::max(); //TODO Don't support crappy gcc 2.95 - - for (MyNode *prev = first_node, *node = first_node->next; node != list_end; node = node->next) { - //we never delete first_node this maintains thread-safety - if (node->vpts_end < current_vpts_) { - prev->next = node->next; - - free(node->mem); - free(node); - - node = prev; - } - - prev = node; - } -} - -PruneScopeThread::PruneScopeThread(XineEngine *parent) : engine_(parent) {} - -void PruneScopeThread::run() { - - QTimer timer; - connect(&timer, SIGNAL(timeout()), engine_, SLOT(PruneScope()), Qt::DirectConnection); - timer.start(1000); - - exec(); - -} - -EngineBase::PluginDetailsList XineEngine::GetPluginList() const { - - PluginDetailsList ret; - const char *const *plugins = xine_list_audio_output_plugins(xine_); - - { - PluginDetails details; - details.name = "auto"; - details.description = "Automatically detected"; - ret << details; - } - - for (int i =0 ; plugins[i] ; ++i) { - PluginDetails details; - details.name = QString::fromUtf8(plugins[i]); - if (details.name == "alsa") details.description = "ALSA audio output"; - else if (details.name == "oss") details.description = "OSS audio output"; - else if (details.name == "pulseaudio") details.description = "PulseAudio audio output"; - else if (details.name == "file") details.description = "File audio output"; - else if (details.name == "none") details.description = "None"; - else details.description = QString::fromUtf8(plugins[i]); - ret << details; - } - - return ret; - -} - - diff --git a/src/engine/xineengine.h b/src/engine/xineengine.h deleted file mode 100644 index 75cb7a8c..00000000 --- a/src/engine/xineengine.h +++ /dev/null @@ -1,154 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2017-2018 Jonas Kvinge * - * Copyright (C) 2005 Christophe Thommeret * - * (C) 2005 Ian Monroe * - * (C) 2005-2006 Mark Kretschmann * - * (C) 2004-2005 Max Howell * - * (C) 2003-2004 J. Kofler * - * * - * 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 - -#include "config.h" - -#ifndef XINE_ENGINE_INTERNAL -# define XINE_ENGINE_INTERNAL -#endif - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "engine_fwd.h" -#include "enginebase.h" - -class TaskManager; -class PruneScopeThread; - -class XineEngine : public Engine::Base { - Q_OBJECT - - public: - explicit XineEngine(TaskManager *task_manager); - ~XineEngine() override; - - bool Init() override; - Engine::State state() const override; - bool Load(const QUrl &stream_url, const QUrl &original_url, Engine::TrackChangeFlags change, bool force_stop_at_end, quint64 beginning_nanosec, qint64 end_nanosec) override; - bool Play(quint64 offset_nanosec) override; - void Stop(bool stop_after = false) override; - void Pause() override; - void Unpause() override; - void Seek(quint64 offset_nanosec) override; - void SetVolumeSW(uint) override; - - qint64 position_nanosec() const override; - qint64 length_nanosec() const override; - - const Engine::Scope& scope(int chunk_length); - - OutputDetailsList GetOutputsList() const override; - bool ValidOutput(const QString &output) override; - QString DefaultOutput() override { return "auto"; } - bool CustomDeviceSupport(const QString &output) override; - bool ALSADeviceSupport(const QString &output) override; - - void ReloadSettings() override; - - bool CanDecode(const QUrl &); - - void SetEqualizerEnabled(bool enabled) override; - void SetEqualizerParameters(int preamp, const QList&) override; - - // Simple accessors - - xine_stream_t *stream() { return stream_; } - float preamp() { return preamp_; } - - private: - static const char *kAutoOutput; - - QString current_output_; - QVariant current_device_; - - xine_t *xine_; - xine_audio_port_t *audioport_; - xine_stream_t *stream_; - xine_event_queue_t *eventqueue_; - xine_post_t *post_; - std::unique_ptr prune_; - - float preamp_; - - QUrl stream_url_; - QUrl original_url_; - bool have_metadata_; - - uint log_buffer_count_ = 0; - uint log_scope_call_count_ = 1; // Prevent divideByZero - uint log_no_suitable_buffer_ = 0; - - int int_preamp_; - QMutex init_mutex_; - int64_t current_vpts_; - QList equalizer_gains_; - - mutable Engine::SimpleMetaBundle current_bundle_; - - void SetEnvironment(); - - void Cleanup(); - void SetDevice(); - bool OpenAudioDriver(); - void CloseAudioDriver(); - bool CreateStream(); - void CloseStream(); - bool EnsureStream(); - - uint length() const; - uint position() const; - - static void XineEventListener(void*, const xine_event_t*); - - void DetermineAndShowErrorMessage(); - Engine::SimpleMetaBundle FetchMetaData() const; - - PluginDetailsList GetPluginList() const; - - private slots: - void PruneScope(); - - signals: - void InfoMessage(const QString&); -}; - -class PruneScopeThread : public QThread { - public: - PruneScopeThread(XineEngine *parent); - - protected: - void run(); - - private: - XineEngine *engine_; - -}; - -#endif diff --git a/src/engine/xinescope.c b/src/engine/xinescope.c deleted file mode 100644 index 307c64dd..00000000 --- a/src/engine/xinescope.c +++ /dev/null @@ -1,173 +0,0 @@ -/* Author: Max Howell , (C) 2004 - Copyright: See COPYING file that comes with this distribution - - This has to be a c file or for some reason it won't link! (GCC 3.4.1) - -*/ - -/* need access to port_ticket */ -#ifndef XINE_ENGINE_INTERNAL -# define XINE_ENGINE_INTERNAL -#endif - -#include "config.h" - -#include "xinescope.h" -#include -#include - -typedef struct scope_plugin_s scope_plugin_t; - -struct scope_plugin_s { - post_plugin_t post; - - metronom_t metronom; - int channels; - MyNode *list; -}; - -/************************* - * post plugin functions * - *************************/ - -static int scope_port_open(xine_audio_port_t *port_gen, xine_stream_t *stream, uint32_t bits, uint32_t rate, int mode) { - - #define port ((post_audio_port_t*)port_gen) - #define this ((scope_plugin_t*)((post_audio_port_t*)port_gen)->post) - - _x_post_rewire((post_plugin_t*)port->post); - _x_post_inc_usage(port); - - port->stream = stream; - port->bits = bits; - port->rate = rate; - port->mode = mode; - - this->channels = _x_ao_mode2channels(mode); - - return port->original_port->open(port->original_port, stream, bits, rate, mode); -} - -static void scope_port_close(xine_audio_port_t *port_gen, xine_stream_t *stream) { - - MyNode *node; - - /* ensure the buffers are deleted during the next XineEngine::timerEvent() */ - for(node = this->list->next; node != this->list; node = node->next) - node->vpts = node->vpts_end = -1; - - port->stream = NULL; - port->original_port->close(port->original_port, stream); - - _x_post_dec_usage(port); -} - -static void scope_port_put_buffer(xine_audio_port_t *port_gen, audio_buffer_t *buf, xine_stream_t *stream) { -/* FIXME With 8-bit samples the scope won't work correctly. For a special 8-bit code path, the sample size could be checked like this: if(port->bits == 8) */ - - const int num_samples = buf->num_frames * this->channels; - metronom_t *myMetronom = &this->metronom; - MyNode *new_node; - - /* I keep my own metronom because xine wouldn't for some reason */ - memcpy(&this->metronom, stream->metronom, sizeof(metronom_t)); - - new_node = (MyNode *) malloc(sizeof(MyNode)); - new_node->vpts = myMetronom->got_audio_samples(myMetronom, buf->vpts, buf->num_frames); - new_node->num_frames = buf->num_frames; - new_node->mem = (int16_t *) malloc(num_samples * 2); - memcpy(new_node->mem, buf->mem, num_samples * 2); - - { - int64_t - K = 32768; /*smpls = 1<<16 samples*/ - K *= num_samples; - K /= (1<<16); - K += new_node->vpts; - - new_node->vpts_end = K; - } - - port->original_port->put_buffer(port->original_port, buf, stream); - - /* Finally we should append the current buffer to the list - * This is thread-safe due to the way we handle the list in the GUI thread */ - new_node->next = this->list->next; - this->list->next = new_node; - - #undef port - #undef this -} - -static void scope_dispose(post_plugin_t *post) { - - MyNode *list = ((scope_plugin_t*)post)->list; - MyNode *prev; - MyNode *node = list; - - /* Free all elements of the list (a ring buffer) */ - do { - prev = node->next; - - free(node->mem); - free(node); - - node = prev; - } - while(node != list); - - - free(post); -} - - -/************************ - * plugin init function * - ************************/ - -xine_post_t *scope_plugin_new(xine_t *xine, xine_audio_port_t *audio_target) { - - scope_plugin_t *scope_plugin = (scope_plugin_t *) calloc(1, sizeof(scope_plugin_t)); - post_plugin_t *post_plugin = (post_plugin_t *)scope_plugin; - - { - post_in_t *input; - post_out_t *output; - post_audio_port_t *port; - - _x_post_init(post_plugin, 1, 0); - - port = _x_post_intercept_audio_port(post_plugin, audio_target, &input, &output); - port->new_port.open = scope_port_open; - port->new_port.close = scope_port_close; - port->new_port.put_buffer = scope_port_put_buffer; - - post_plugin->xine_post.audio_input[0] = &port->new_port; - post_plugin->xine_post.type = PLUGIN_POST; - - post_plugin->dispose = scope_dispose; - } - - // code is straight from xine_init_post() can't use that function as it only dlopens the plugins and our plugin is statically linked in - - post_plugin->running_ticket = xine->port_ticket; - post_plugin->xine = xine; - - /* scope_plugin_t init */ - scope_plugin->list = (MyNode *) calloc(1, sizeof(MyNode)); - scope_plugin->list->next = scope_plugin->list; - - return &post_plugin->xine_post; -} - -MyNode *scope_plugin_list(void *post) { - return ((scope_plugin_t*)post)->list; -} - -int scope_plugin_channels(void *post) { - return ((scope_plugin_t*)post)->channels; -} - -metronom_t* scope_plugin_metronom(void *post) { - return &((scope_plugin_t*)post)->metronom; -} diff --git a/src/engine/xinescope.h b/src/engine/xinescope.h deleted file mode 100644 index 2f57d1c6..00000000 --- a/src/engine/xinescope.h +++ /dev/null @@ -1,45 +0,0 @@ -/* Author: Max Howell , (C) 2004 - Copyright: See COPYING file that comes with this distribution - - This has to be a c file or for some reason it won't link! (GCC 3.4.1) -*/ - -#ifndef XINESCOPE_H -#define XINESCOPE_H - -/* need access to some stuff for scope time stamping */ -#ifndef METRONOM_INTERNAL -# define METRONOM_INTERNAL -#endif - -#include "config.h" - -#include -#include - -typedef struct my_node_s MyNode; - -struct my_node_s { - MyNode *next; - int16_t *mem; - int num_frames; - int64_t vpts; - int64_t vpts_end; -}; - -#ifdef __cplusplus -extern "C" -{ -#endif - xine_post_t *scope_plugin_new( xine_t*, xine_audio_port_t* ); - - /* we sacrifice type-safety here because some GCCs appear broken and choke on redefining the xine_post_t typedef */ - - MyNode *scope_plugin_list(void*); - int scope_plugin_channels(void*); - metronom_t *scope_plugin_metronom(void*); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/settings/backendsettingspage.cpp b/src/settings/backendsettingspage.cpp index 1ce06305..d1c641d5 100644 --- a/src/settings/backendsettingspage.cpp +++ b/src/settings/backendsettingspage.cpp @@ -94,9 +94,6 @@ void BackendSettingsPage::Load() { #ifdef HAVE_GSTREAMER ui_->combobox_engine->addItem(IconLoader::Load("gstreamer"), EngineDescription(Engine::GStreamer), QVariant::fromValue(Engine::GStreamer)); #endif -#ifdef HAVE_XINE - ui_->combobox_engine->addItem(IconLoader::Load("xine"), EngineDescription(Engine::Xine), QVariant::fromValue(Engine::Xine)); -#endif #ifdef HAVE_VLC ui_->combobox_engine->addItem(IconLoader::Load("vlc"), EngineDescription(Engine::VLC), QVariant::fromValue(Engine::VLC)); #endif