Always use the gstreamer engine, remove xine, vlc and phonon engines.

This commit is contained in:
David Sansome 2010-12-26 13:01:35 +00:00
parent 41c42fe3a2
commit 6737b8a5c2
70 changed files with 184 additions and 2984 deletions

View File

@ -13,7 +13,7 @@ if(UNIX AND NOT APPLE)
endif(UNIX AND NOT APPLE)
if(NOT APPLE)
find_package(Qt4 COMPONENTS Phonon QtWebKit)
find_package(Qt4 COMPONENTS QtWebKit)
endif(NOT APPLE)
# Find Qt's lconvert binary. Try qt's binary dir first, fall back to looking in PATH
@ -34,8 +34,6 @@ find_package(PkgConfig REQUIRED)
pkg_check_modules(TAGLIB REQUIRED taglib>=1.6)
pkg_check_modules(GSTREAMER gstreamer-0.10)
pkg_check_modules(GSTREAMER_BASE gstreamer-base-0.10)
pkg_check_modules(LIBVLC libvlc)
pkg_check_modules(LIBXINE libxine)
pkg_check_modules(GLIB glib-2.0)
pkg_check_modules(LIBXML libxml-2.0)
pkg_check_modules(GOBJECT gobject-2.0)
@ -86,11 +84,7 @@ add_definitions(${QT_DEFINITIONS})
link_directories(${TAGLIB_LIBRARY_DIRS})
link_directories(${GSTREAMER_LIBRARY_DIRS})
# Don't try to use Phonon or webkit if their include directories couldn't be found.
if (NOT QT_PHONON_INCLUDE_DIR)
set (QT_USE_PHONON 0)
endif (NOT QT_PHONON_INCLUDE_DIR)
# Don't try to use webkit if their include directories couldn't be found.
if (NOT QT_QTWEBKIT_INCLUDE_DIR)
set (QT_USE_QTWEBKIT 0)
endif (NOT QT_QTWEBKIT_INCLUDE_DIR)

View File

@ -1,79 +0,0 @@
# add an engine
macro(add_engine engine lib_list src_list moc_list supported)
# recreate list
set(lib_list ${lib_list})
list(GET lib_list 0 name)
# add a user selectable build option, supported engines enabled by default
option(ENGINE_${name}_ENABLED "enable engine ${engine}" ${supported})
# check for all needed libraries
foreach(lib ${lib_list})
if(${lib}_NOTFOUND)
set(ENGINE_${name}_LIB_MISSING TRUE)
endif(${lib}_NOTFOUND)
endforeach(lib ${lib_list})
# check if engine is enabled and needed librares are available
if(ENGINE_${name}_ENABLED AND NOT ENGINE_${name}_LIB_MISSING)
# add to list of unsupported engines
set(supported ${supported})
if(NOT supported)
set(ENGINES_UNSUPPORTED "${ENGINES_UNSUPPORTED} ${engine}")
endif(NOT supported)
# add define -DHAVE_<engine> so we can clutter the code with #ifdefs
set("HAVE_${name}" 1 CACHE INTERNAL ${name})
# add sources and MOC headers
list(APPEND SOURCES ${src_list})
list(APPEND HEADERS ${moc_list})
# add libraries to link against
foreach(lib ${lib_list})
set(ENGINE_LIBRARIES ${ENGINE_LIBRARIES} ${${lib}_LIBRARIES} CACHE INTERNAL libraries)
endforeach(lib ${lib_list})
# add to list of enabled engines
set(ENGINES_ENABLED "${ENGINES_ENABLED} ${engine}")
else(ENGINE_${name}_ENABLED AND NOT ENGINE_${name}_LIB_MISSING)
# add to list of disabled engines
set(ENGINES_DISABLED "${ENGINES_DISABLED} ${engine}")
set("HAVE_${name}" 0 CACHE INTERNAL ${name})
endif(ENGINE_${name}_ENABLED AND NOT ENGINE_${name}_LIB_MISSING)
endmacro(add_engine engine lib_list src_list moc_list supported)
# print engines to be built
macro(print_engines)
# show big warning if building unsupported engines
if(ENGINES_UNSUPPORTED)
message("")
message(" *********************************")
message(" ************ WARNING ************")
message(" *********************************")
message("")
message(" The following engines are NOT supported by clementine developers:")
message(" ${ENGINES_UNSUPPORTED}")
message("")
message(" Don't post any bugs if you use them, fix them yourself!")
message("")
pig()
message("")
endif(ENGINES_UNSUPPORTED)
# need at least 1 engine
if(NOT ENGINES_ENABLED)
message(FATAL_ERROR "no engine enabled!")
endif(NOT ENGINES_ENABLED)
endmacro(print_engines)
# print the pig :)
macro(pig)
file(READ ${CMAKE_SOURCE_DIR}/pig.txt pig)
message(${pig})
endmacro(pig)

26
pig.txt
View File

@ -1,26 +0,0 @@
___
,---. /""`_,'
| `\``""-; /
\ /`\\ ';'
.') | __ \
/ (` / /(O\. _|
.-`| `"` ` .-\_
.-' \ ` ;=-.
.' . ._, / o o\
.-'` . '-._;_._.J
.-'` `.-'`
_.-` ' .'
.' '- ._.-'
/` /
/ You have been warned! |
._ ; | |
)).-| | | /
(/`.-| \ \ / .;
( (_)| | \ ; .' |
'--'; | `\ / / |
\ | `\ /.' /
\ / ; |`\ |
'. .' _.-| | | |
'-. .-';_"---'`.__| | | \
`'-._ ``'-. | \ \__\\
`''--.___\\ \__\\

View File

@ -28,7 +28,6 @@ if(HAVE_LIBLASTFM)
endif(HAVE_LIBLASTFM)
cmake_policy(SET CMP0011 NEW)
include(../cmake/AddEngine.cmake)
include(../cmake/ParseArguments.cmake)
include(../cmake/Translations.cmake)
@ -82,6 +81,9 @@ set(SOURCES
devices/filesystemdevice.cpp
engines/enginebase.cpp
engines/gstengine.cpp
engines/gstenginepipeline.cpp
engines/gstelementdeleter.cpp
library/groupbydialog.cpp
library/library.cpp
@ -171,6 +173,9 @@ set(SOURCES
songinfo/ultimatelyricsprovider.cpp
songinfo/ultimatelyricsreader.cpp
transcoder/transcodedialog.cpp
transcoder/transcoder.cpp
ui/about.cpp
ui/addstreamdialog.cpp
ui/edittagdialog.cpp
@ -251,6 +256,9 @@ set(HEADERS
devices/filesystemdevice.h
engines/enginebase.h
engines/gstengine.h
engines/gstenginepipeline.h
engines/gstelementdeleter.h
library/groupbydialog.h
library/library.h
@ -329,6 +337,9 @@ set(HEADERS
songinfo/ultimatelyricsprovider.h
songinfo/ultimatelyricsreader.h
transcoder/transcodedialog.h
transcoder/transcoder.h
ui/about.h
ui/addstreamdialog.h
ui/edittagdialog.h
@ -395,6 +406,9 @@ set(UI
songinfo/lyricsettings.ui
transcoder/transcodedialog.ui
transcoder/transcodelogdialog.ui
ui/about.ui
ui/addstreamdialog.ui
ui/edittagdialog.ui
@ -436,27 +450,6 @@ else (LINGUAS STREQUAL "All")
endif (NOT LINGUAS OR LINGUAS STREQUAL "None")
endif (LINGUAS STREQUAL "All")
# Engines
set(GST_ENGINE_SRC
engines/gstengine.cpp
engines/gstenginepipeline.cpp
engines/gstelementdeleter.cpp
)
set(GST_ENGINE_MOC
engines/gstengine.h
engines/gstenginepipeline.h
engines/gstelementdeleter.h
)
set(GST_ENGINE_LIB GSTREAMER GSTREAMER_BASE)
set(XINE_ENGINE_SRC engines/xine-engine.cpp engines/xine-scope.c)
set(XINE_ENGINE_MOC engines/xine-engine.h)
add_engine(gst "${GST_ENGINE_LIB}" "${GST_ENGINE_SRC}" "${GST_ENGINE_MOC}" ON)
add_engine(vlc LIBVLC engines/vlcengine.cpp engines/vlcengine.h OFF)
add_engine(xine LIBXINE "${XINE_ENGINE_SRC}" "${XINE_ENGINE_MOC}" OFF)
add_engine(qt-phonon QT_PHONON engines/phononengine.cpp engines/phononengine.h OFF)
print_engines()
# Visualisations
if(ENABLE_VISUALISATIONS)
option(VISUALISATIONS_USE_INSTALL_PREFIX "Look for visualisations in CMAKE_INSTALL_PREFIX" ON)
@ -518,24 +511,6 @@ if(HAVE_LIBLASTFM)
)
endif(HAVE_LIBLASTFM)
# Transcoder
if(HAVE_GSTREAMER)
list(APPEND SOURCES
transcoder/transcodedialog.cpp
transcoder/transcoder.cpp
)
list(APPEND HEADERS
transcoder/transcodedialog.h
transcoder/transcoder.h
)
list(APPEND UI
transcoder/transcodedialog.ui
transcoder/transcodelogdialog.ui
)
endif(HAVE_GSTREAMER)
# OSDs
if(APPLE)
list(APPEND SOURCES widgets/osd_mac.mm)
@ -782,7 +757,8 @@ target_link_libraries(clementine_lib
${GLIB_LIBRARIES}
${TAGLIB_LIBRARIES}
${QT_LIBRARIES}
${ENGINE_LIBRARIES}
${GSTREAMER_BASE_LIBRARIES}
${GSTREAMER_LIBRARIES}
${QTSINGLEAPPLICATION_LIBRARIES}
${QTSINGLECOREAPPLICATION_LIBRARIES}
${QTIOCOMPRESSOR_LIBRARIES}

View File

@ -33,12 +33,6 @@
#cmakedefine SNOW_LEOPARD
#cmakedefine LEOPARD
#cmakedefine HAVE_SPARKLE
#cmakedefine HAVE_GSTREAMER
#cmakedefine HAVE_LIBVLC
#cmakedefine HAVE_LIBXINE
#cmakedefine HAVE_QT_PHONON
#cmakedefine HAVE_STATIC_SQLITE
#cmakedefine HAVE_LIBGPOD

View File

@ -48,8 +48,7 @@ const char* CommandlineOptions::kHelpText =
"\n"
"%20:\n"
" -o, --show-osd %21\n"
" -e, --engine %22\n"
" -g, --language <lang> %23\n";
" -g, --language <lang> %22\n";
CommandlineOptions::CommandlineOptions(int argc, char** argv)
@ -62,16 +61,7 @@ CommandlineOptions::CommandlineOptions(int argc, char** argv)
seek_to_(-1),
seek_by_(0),
play_track_at_(-1),
show_osd_(false),
#ifdef HAVE_GSTREAMER
engine_(Engine::Type_GStreamer)
#elif defined(HAVE_LIBVLC)
engine_(Engine::Type_VLC)
#elif defined(HAVE_LIBXINE)
engine_(Engine::Type_Xine)
#elif defined(HAVE_QT_PHONON)
engine_(Engine::Type_QtPhonon)
#endif
show_osd_(false)
{
#ifdef Q_OS_DARWIN
// Remove -psn_xxx option that Mac passes when opened from Finder.
@ -116,7 +106,6 @@ bool CommandlineOptions::Parse() {
{"play-track", required_argument, 0, 'k'},
{"show-osd", no_argument, 0, 'o'},
{"engine", required_argument, 0, 'e'},
{"language", required_argument, 0, 'g'},
{0, 0, 0, 0}
@ -125,7 +114,7 @@ bool CommandlineOptions::Parse() {
// Parse the arguments
bool ok = false;
forever {
int c = getopt_long(argc_, argv_, "hptusrfv:alk:oe:g:", kOptions, NULL);
int c = getopt_long(argc_, argv_, "hptusrfv:alk:og:", kOptions, NULL);
// End of the options
if (c == -1)
@ -152,7 +141,6 @@ bool CommandlineOptions::Parse() {
tr("Play the <n>th track in the playlist"),
tr("Other options"),
tr("Display the on-screen-display"),
tr("Select engine"),
tr("Change the language"));
std::cout << translated_help_text.toLocal8Bit().constData();
@ -192,39 +180,6 @@ bool CommandlineOptions::Parse() {
if (!ok) play_track_at_ = -1;
break;
case 'e':
{
ok = true;
QString engine = optarg;
if(engine == "gst")
engine_ = Engine::Type_GStreamer;
else if(engine == "vlc")
engine_ = Engine::Type_VLC;
else if(engine == "xine")
engine_ = Engine::Type_Xine;
else if(engine == "qt-phonon")
engine_ = Engine::Type_QtPhonon;
else
{
qFatal("%s%s",
tr("Unknown audio engine \"%1\". Choices are:").arg(engine).toAscii().data(),
#ifdef HAVE_GSTREAMER
" gst"
#endif
#ifdef HAVE_LIBVLC
" vlc"
#endif
#ifdef HAVE_LIBXINE
" xine"
#endif
#ifdef HAVE_QT_PHONON
" qt-phonon"
#endif
);
}
}
break;
case '?':
default:
return false;

View File

@ -22,8 +22,6 @@
#include <QUrl>
#include <QDataStream>
#include "engines/engine_fwd.h"
class CommandlineOptions {
friend QDataStream& operator<<(QDataStream& s, const CommandlineOptions& a);
friend QDataStream& operator>>(QDataStream& s, CommandlineOptions& a);
@ -62,7 +60,6 @@ class CommandlineOptions {
int play_track_at() const { return play_track_at_; }
bool show_osd() const { return show_osd_; }
QList<QUrl> urls() const { return urls_; }
Engine::Type engine() const { return engine_; }
QString language() const { return language_; }
QByteArray Serialize() const;
@ -95,7 +92,6 @@ class CommandlineOptions {
int seek_by_;
int play_track_at_;
bool show_osd_;
Engine::Type engine_;
QString language_;
QList<QUrl> urls_;

View File

@ -18,24 +18,13 @@
#include "config.h"
#include "player.h"
#include "engines/enginebase.h"
#include "engines/gstengine.h"
#include "library/librarybackend.h"
#include "playlist/playlist.h"
#include "playlist/playlistitem.h"
#include "playlist/playlistmanager.h"
#include "mpris_common.h"
#ifdef HAVE_GSTREAMER
# include "engines/gstengine.h"
#endif
#ifdef HAVE_LIBVLC
# include "engines/vlcengine.h"
#endif
#ifdef HAVE_LIBXINE
# include "engines/xine-engine.h"
#endif
#ifdef HAVE_QT_PHONON
# include "engines/phononengine.h"
#endif
#ifdef HAVE_LIBLASTFM
# include "radio/lastfmservice.h"
#endif
@ -59,7 +48,7 @@ Player::Player(MainWindow* main_window, PlaylistManager* playlists,
#ifdef HAVE_LIBLASTFM
LastFMService* lastfm,
#endif
Engine::Type engine, QObject* parent)
QObject* parent)
: QObject(parent),
art_loader_(new mpris::ArtLoader(this)),
mpris1_(NULL),
@ -68,7 +57,7 @@ Player::Player(MainWindow* main_window, PlaylistManager* playlists,
#ifdef HAVE_LIBLASTFM
lastfm_(lastfm),
#endif
engine_(CreateEngine(engine)),
engine_(new GstEngine),
stream_change_type_(Engine::First),
last_state_(Engine::Empty),
volume_before_mute_(50)
@ -101,36 +90,6 @@ Player::Player(MainWindow* main_window, PlaylistManager* playlists,
Player::~Player() {
}
EngineBase* Player::CreateEngine(Engine::Type engine) {
switch(engine) {
#ifdef HAVE_GSTREAMER
case Engine::Type_GStreamer:
return new GstEngine();
break;
#endif
#ifdef HAVE_LIBVLC
case Engine::Type_VLC:
return new VlcEngine();
break;
#endif
#ifdef HAVE_LIBXINE
case Engine::Type_Xine:
return new XineEngine();
break;
#endif
#ifdef HAVE_QT_PHONON
case Engine::Type_QtPhonon:
return new PhononEngine();
break;
#endif
default:
qFatal("Selected engine not compiled in");
break;
}
/* NOT REACHED */
return NULL;
}
void Player::Init() {
if (!engine_->Init())
qFatal("Error initialising audio engine");

View File

@ -56,10 +56,9 @@ class Player : public QObject {
#ifdef HAVE_LIBLASTFM
LastFMService* lastfm,
#endif
Engine::Type engine, QObject* parent = 0);
QObject* parent = 0);
~Player();
EngineBase* CreateEngine(Engine::Type engine);
void Init();
EngineBase* engine() const { return engine_.get(); }

View File

@ -52,18 +52,14 @@ SongLoader::SongLoader(LibraryBackendInterface* library, QObject *parent)
timeout_timer_->setSingleShot(true);
#ifdef HAVE_GSTREAMER
connect(timeout_timer_, SIGNAL(timeout()), SLOT(Timeout()));
#endif
}
SongLoader::~SongLoader() {
#ifdef HAVE_GSTREAMER
if (pipeline_) {
state_ = Finished;
gst_element_set_state(pipeline_.get(), GST_STATE_NULL);
}
#endif // HAVE_GSTREAMER
}
SongLoader::Result SongLoader::Load(const QUrl& url) {
@ -80,15 +76,8 @@ SongLoader::Result SongLoader::Load(const QUrl& url) {
return Success;
}
#ifdef HAVE_GSTREAMER
timeout_timer_->start(timeout_);
return LoadRemote();
#else
// If we don't have GStreamer we can't check the type of remote playlists,
// so just assume it's a raw stream and get on with our lives.
AddAsRawStream();
return Success;
#endif
}
SongLoader::Result SongLoader::LoadLocal(const QString& filename, bool block,
@ -212,7 +201,6 @@ void SongLoader::Timeout() {
}
void SongLoader::StopTypefind() {
#ifdef HAVE_GSTREAMER
// Destroy the pipeline
if (pipeline_) {
gst_element_set_state(pipeline_.get(), GST_STATE_NULL);
@ -233,12 +221,10 @@ void SongLoader::StopTypefind() {
// It wasn't a playlist - just put the URL in as a stream
AddAsRawStream();
}
#endif // HAVE_GSTREAMER
emit LoadFinished(success_);
}
#ifdef HAVE_GSTREAMER
SongLoader::Result SongLoader::LoadRemote() {
qDebug() << "Loading remote file" << url_;
@ -439,4 +425,3 @@ void SongLoader::StopTypefindAsync(bool success) {
metaObject()->invokeMethod(this, "StopTypefind", Qt::QueuedConnection);
}
#endif // HAVE_GSTREAMER

View File

@ -21,14 +21,11 @@
#include <QObject>
#include <QUrl>
#include "config.h"
#include "song.h"
#include <boost/shared_ptr.hpp>
#ifdef HAVE_GSTREAMER
# include <gst/gst.h>
#endif
#include <gst/gst.h>
class LibraryBackendInterface;
class ParserBase;
@ -79,7 +76,6 @@ private:
void AddAsRawStream();
#ifdef HAVE_GSTREAMER
Result LoadRemote();
// GStreamer callbacks
@ -92,7 +88,6 @@ private:
void ErrorMessageReceived(GstMessage* msg);
void EndOfStreamReached();
void MagicReady();
#endif // HAVE_GSTREAMER
private:
static QSet<QString> sRawUriSchemes;
@ -112,9 +107,7 @@ private:
QByteArray buffer_;
LibraryBackendInterface* library_;
#ifdef HAVE_GSTREAMER
boost::shared_ptr<GstElement> pipeline_;
#endif
};
#endif // SONGLOADER_H

View File

@ -10,13 +10,6 @@ namespace Engine
struct SimpleMetaBundle;
class Base;
enum Type {
Type_GStreamer,
Type_VLC,
Type_Xine,
Type_QtPhonon,
};
/**
* You should return:
* Playing when playing,

View File

@ -1,129 +0,0 @@
/* This file is part of Clementine.
Copyright 2010, David Sansome <me@davidsansome.com>
Clementine 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 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#include "phononengine.h"
#include <QTimer>
PhononEngine::PhononEngine()
: media_object_(new Phonon::MediaObject(this)),
audio_output_(new Phonon::AudioOutput(Phonon::MusicCategory, this)),
state_timer_(new QTimer(this)),
seek_offset_(-1)
{
Phonon::createPath(media_object_, audio_output_);
connect(media_object_, SIGNAL(finished()), SLOT(PhononFinished()));
connect(media_object_, SIGNAL(stateChanged(Phonon::State,Phonon::State)), SLOT(PhononStateChanged(Phonon::State)));
state_timer_->setSingleShot(true);
connect(state_timer_, SIGNAL(timeout()), SLOT(StateTimeoutExpired()));
}
PhononEngine::~PhononEngine() {
delete media_object_;
delete audio_output_;
}
bool PhononEngine::Init() {
return true;
}
bool PhononEngine::CanDecode(const QUrl &url) {
// TODO
return true;
}
bool PhononEngine::Load(const QUrl &url, Engine::TrackChangeType change ) {
media_object_->setCurrentSource(Phonon::MediaSource(url));
return true;
}
bool PhononEngine::Play(uint offset) {
// The seek happens in PhononStateChanged - phonon doesn't seem to change
// currentTime() if we seek before we start playing :S
seek_offset_ = offset;
media_object_->play();
return true;
}
void PhononEngine::Stop() {
media_object_->stop();
}
void PhononEngine::Pause() {
media_object_->pause();
}
void PhononEngine::Unpause() {
media_object_->play();
}
Engine::State PhononEngine::state() const {
switch (media_object_->state()) {
case Phonon::LoadingState:
case Phonon::PlayingState:
case Phonon::BufferingState:
return Engine::Playing;
case Phonon::PausedState:
return Engine::Paused;
case Phonon::StoppedState:
case Phonon::ErrorState:
default:
return Engine::Empty;
}
}
uint PhononEngine::position() const {
return media_object_->currentTime();
}
uint PhononEngine::length() const {
return media_object_->totalTime();
}
void PhononEngine::Seek(uint ms) {
media_object_->seek(ms);
}
void PhononEngine::SetVolumeSW(uint volume) {
audio_output_->setVolume(volume);
}
void PhononEngine::PhononFinished() {
emit TrackEnded();
}
void PhononEngine::PhononStateChanged(Phonon::State new_state) {
if (new_state == Phonon::ErrorState) {
emit Error(media_object_->errorString());
}
if (new_state == Phonon::PlayingState && seek_offset_ != -1) {
media_object_->seek(seek_offset_);
seek_offset_ = -1;
}
// Don't emit the state change straight away
state_timer_->start(100);
}
void PhononEngine::StateTimeoutExpired() {
emit StateChanged(state());
}

View File

@ -1,68 +0,0 @@
/* This file is part of Clementine.
Copyright 2010, David Sansome <me@davidsansome.com>
Clementine 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 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PHONONENGINE_H
#define PHONONENGINE_H
#include "enginebase.h"
#include <phonon/mediaobject.h>
#include <phonon/audiooutput.h>
class QTimer;
class PhononEngine : public Engine::Base {
Q_OBJECT
public:
PhononEngine();
~PhononEngine();
bool Init();
bool CanDecode( const QUrl &url );
bool Load( const QUrl &url, Engine::TrackChangeType change );
bool Play( uint offset = 0 );
void Stop();
void Pause();
void Unpause();
Engine::State state() const;
uint position() const;
uint length() const;
void Seek( uint ms );
protected:
void SetVolumeSW( uint percent );
private slots:
void PhononFinished();
void PhononStateChanged(Phonon::State new_state);
void StateTimeoutExpired();
private:
Phonon::MediaObject* media_object_;
Phonon::AudioOutput* audio_output_;
QTimer* state_timer_;
qint64 seek_offset_;
};
#endif // PHONONENGINE_H

View File

@ -1,252 +0,0 @@
/* This file is part of Clementine.
Copyright 2010, David Sansome <me@davidsansome.com>
Clementine 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 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#include "vlcengine.h"
#include "vlcscopedref.h"
#include <QTimer>
#include <QtDebug>
#include <QMutexLocker>
#include <QTime>
#include <boost/bind.hpp>
VlcEngine* VlcEngine::sInstance = NULL;
VlcEngine::VlcEngine()
: instance_(NULL),
player_(NULL),
scope_data_(4096),
state_(Engine::Empty)
{
static const char * const args[] = {
"-I", "dummy", // Don't use any interface
"--ignore-config", // Don't use VLC's config
"--extraintf=logger", // log anything
"--verbose=2", // be much more verbose then normal for debugging purpose
// Our scope plugin
"--audio-filter=clementine_scope",
"--no-plugins-cache",
// Try to stop audio stuttering
"--file-caching=500", // msec
"--http-caching=500",
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
"--aout=alsa", // The default, pulseaudio, is buggy
#endif
};
// Create the VLC instance
libvlc_exception_init(&exception_);
instance_ = libvlc_new(sizeof(args) / sizeof(args[0]), args, &exception_);
HandleErrors();
// Create the media player
player_ = libvlc_media_player_new(instance_, &exception_);
HandleErrors();
// Add event handlers
libvlc_event_manager_t* player_em =
libvlc_media_player_event_manager(player_, &exception_);
HandleErrors();
AttachCallback(player_em, libvlc_MediaPlayerEncounteredError, StateChangedCallback);
AttachCallback(player_em, libvlc_MediaPlayerNothingSpecial, StateChangedCallback);
AttachCallback(player_em, libvlc_MediaPlayerOpening, StateChangedCallback);
AttachCallback(player_em, libvlc_MediaPlayerBuffering, StateChangedCallback);
AttachCallback(player_em, libvlc_MediaPlayerPlaying, StateChangedCallback);
AttachCallback(player_em, libvlc_MediaPlayerPaused, StateChangedCallback);
AttachCallback(player_em, libvlc_MediaPlayerStopped, StateChangedCallback);
AttachCallback(player_em, libvlc_MediaPlayerEndReached, StateChangedCallback);
HandleErrors();
sInstance = this;
}
VlcEngine::~VlcEngine() {
libvlc_media_player_stop(player_, &exception_);
libvlc_media_player_release(player_);
libvlc_release(instance_);
HandleErrors();
}
void VlcEngine::AttachCallback(libvlc_event_manager_t* em, libvlc_event_type_t type,
libvlc_callback_t callback) {
libvlc_event_attach(em, type, callback, this, &exception_);
HandleErrors();
}
void VlcEngine::StateChangedCallback(const libvlc_event_t* e, void* data) {
VlcEngine* engine = reinterpret_cast<VlcEngine*>(data);
switch (e->type) {
case libvlc_MediaPlayerNothingSpecial:
case libvlc_MediaPlayerStopped:
case libvlc_MediaPlayerEncounteredError:
engine->state_ = Engine::Empty;
break;
case libvlc_MediaPlayerOpening:
case libvlc_MediaPlayerBuffering:
case libvlc_MediaPlayerPlaying:
engine->state_ = Engine::Playing;
break;
case libvlc_MediaPlayerPaused:
engine->state_ = Engine::Paused;
break;
case libvlc_MediaPlayerEndReached:
engine->state_ = Engine::Idle;
emit engine->TrackEnded();
return; // Don't emit state changed here
}
emit engine->StateChanged(engine->state_);
}
bool VlcEngine::Init() {
return true;
}
bool VlcEngine::CanDecode(const QUrl &url) {
// TODO
return true;
}
bool VlcEngine::Load(const QUrl &url, Engine::TrackChangeType change) {
// Create the media object
VlcScopedRef<libvlc_media_t> media(
libvlc_media_new(instance_, url.toEncoded().constData(), &exception_));
if (libvlc_exception_raised(&exception_))
return false;
libvlc_media_player_set_media(player_, media, &exception_);
if (libvlc_exception_raised(&exception_))
return false;
return true;
}
bool VlcEngine::Play(uint offset) {
libvlc_media_player_play(player_, &exception_);
if (libvlc_exception_raised(&exception_))
return false;
Seek(offset);
return true;
}
void VlcEngine::Stop() {
libvlc_media_player_stop(player_, &exception_);
HandleErrors();
}
void VlcEngine::Pause() {
libvlc_media_player_pause(player_, &exception_);
HandleErrors();
}
void VlcEngine::Unpause() {
libvlc_media_player_play(player_, &exception_);
HandleErrors();
}
uint VlcEngine::position() const {
bool is_playing = libvlc_media_player_is_playing(
player_, const_cast<libvlc_exception_t*>(&exception_));
HandleErrors();
if (!is_playing)
return 0;
float pos = libvlc_media_player_get_position(
player_, const_cast<libvlc_exception_t*>(&exception_));
HandleErrors();
return pos * length();
}
uint VlcEngine::length() const {
bool is_playing = libvlc_media_player_is_playing(
player_, const_cast<libvlc_exception_t*>(&exception_));
HandleErrors();
if (!is_playing)
return 0;
libvlc_time_t len = libvlc_media_player_get_length(
player_, const_cast<libvlc_exception_t*>(&exception_));
HandleErrors();
return len;
}
void VlcEngine::Seek(uint ms) {
uint len = length();
if (len == 0)
return;
float pos = float(ms) / len;
libvlc_media_player_set_position(player_, pos, &exception_);
HandleErrors();
}
void VlcEngine::SetVolumeSW(uint volume) {
libvlc_audio_set_volume(instance_, volume, &exception_);
HandleErrors();
}
void VlcEngine::HandleErrors() const {
if (libvlc_exception_raised(&exception_)) {
qFatal("libvlc error: %s", libvlc_exception_get_message(&exception_));
}
}
void VlcEngine::SetScopeData(float* data, int size) {
if (!sInstance)
return;
QMutexLocker l(&sInstance->scope_mutex_);
// This gets called by our VLC plugin. Just push the data on to the end of
// the circular buffer and let it get consumed by scope()
for (int i=0 ; i<size ; ++i) {
sInstance->scope_data_.push_back(data[i]);
}
}
const Engine::Scope& VlcEngine::Scope() {
QMutexLocker l(&scope_mutex_);
// Leave the scope unchanged if there's not enough data
if (scope_data_.size() < uint(kScopeSize))
return scope_;
// Take the samples off the front of the circular buffer
for (uint i=0 ; i<uint(kScopeSize) ; ++i)
scope_[i] = scope_data_[i] * (1 << 15);
// Remove the samples from the buffer. Unfortunately I think this is O(n) :(
scope_data_.rresize(qMax(0, int(scope_data_.size()) - kScopeSize*2));
return scope_;
}

View File

@ -1,81 +0,0 @@
/* This file is part of Clementine.
Copyright 2010, David Sansome <me@davidsansome.com>
Clementine 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 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef VLCENGINE_H
#define VLCENGINE_H
#include "enginebase.h"
#include <vlc/vlc.h>
#include <boost/circular_buffer.hpp>
#include <QMutex>
class QTimer;
class VlcEngine : public Engine::Base {
Q_OBJECT
public:
VlcEngine();
~VlcEngine();
bool Init();
bool CanDecode( const QUrl &url );
bool Load( const QUrl &url, Engine::TrackChangeType change );
bool Play( uint offset = 0 );
void Stop();
void Pause();
void Unpause();
Engine::State state() const { return state_; }
uint position() const;
uint length() const;
void Seek( uint ms );
static void SetScopeData(float* data, int size);
const Engine::Scope& Scope();
protected:
void SetVolumeSW( uint percent );
private:
void HandleErrors() const;
void AttachCallback(libvlc_event_manager_t* em, libvlc_event_type_t type,
libvlc_callback_t callback);
static void StateChangedCallback(const libvlc_event_t* e, void* data);
private:
// The callbacks need access to this
static VlcEngine* sInstance;
// VLC bits and pieces
libvlc_exception_t exception_;
libvlc_instance_t* instance_;
libvlc_media_player_t* player_;
// Our clementine_scope VLC plugin puts data in here
QMutex scope_mutex_;
boost::circular_buffer<float> scope_data_;
Engine::State state_;
};
#endif // VLCENGINE_H

View File

@ -1,66 +0,0 @@
/* This file is part of Clementine.
Copyright 2010, David Sansome <me@davidsansome.com>
Clementine 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 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef VLCSCOPEDREF_H
#define VLCSCOPEDREF_H
#include <vlc/vlc.h>
template <typename T>
class VlcScopedRef {
public:
VlcScopedRef(T* ptr);
~VlcScopedRef();
operator T* () const { return ptr_; }
operator bool () const { return ptr_; }
T* operator ->() const { return ptr_; }
private:
VlcScopedRef(VlcScopedRef&) {}
VlcScopedRef& operator =(const VlcScopedRef&) { return *this; }
T* ptr_;
};
#define VLCSCOPEDREF_DEFINE2(type, dtor) \
template <> void VlcScopedRef_Release<libvlc_##type##_t>(libvlc_##type##_t* ptr) { \
dtor(ptr); \
}
#define VLCSCOPEDREF_DEFINE(type) VLCSCOPEDREF_DEFINE2(type, libvlc_##type##_release)
template <typename T>
void VlcScopedRef_Release(T* ptr);
VLCSCOPEDREF_DEFINE2(instance, libvlc_release);
VLCSCOPEDREF_DEFINE(media_player);
VLCSCOPEDREF_DEFINE(media);
template <> void VlcScopedRef_Release<char>(char* ptr) { free(ptr); }
template <typename T>
VlcScopedRef<T>::VlcScopedRef(T* ptr)
: ptr_(ptr) {
}
template <typename T>
VlcScopedRef<T>::~VlcScopedRef() {
VlcScopedRef_Release(ptr_);
}
#endif // VLCSCOPEDREF_H

File diff suppressed because it is too large Load Diff

View File

@ -1,191 +0,0 @@
/***************************************************************************
* Copyright (C) 2004,5 Max Howell <max.howell@methylblue.com> *
* *
* 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 XINE_ENGINE_H
#define XINE_ENGINE_H
#include "enginebase.h"
#include <QThread>
#include <QEvent>
#include <QSettings>
#include <QMutex>
extern "C"
{
#include <sys/types.h>
#include <xine.h>
}
class XineConfigDialog;
class XineEvent : public QEvent {
public:
enum EventType {
PlaybackFinished = QEvent::User + 1,
InfoMessage,
StatusMessage,
MetaInfoChanged,
Redirecting,
LastFMTrackChanged,
};
XineEvent(EventType type, void* data = NULL) : QEvent(QEvent::Type(type)), data_(data) {}
void setData(void* data) { data_ = data; }
void* data() const { return data_; }
private:
void* data_;
};
class PruneScopeThread;
class XineEngine : public Engine::Base
{
Q_OBJECT
friend class Fader;
friend class OutFader;
friend class PruneScopeThread;
~XineEngine();
virtual bool Init();
virtual bool CanDecode( const QUrl& );
virtual bool Load( const QUrl &url, Engine::TrackChangeType change );
virtual bool Play( uint = 0 );
virtual void Stop();
virtual void Pause();
virtual void Unpause();
virtual uint position() const;
virtual uint length() const;
virtual void Seek( uint );
virtual bool metaDataForUrl(const QUrl &url, Engine::SimpleMetaBundle &b);
virtual bool getAudioCDContents(const QString &device, QList<QUrl> &urls);
virtual bool flushBuffer();
virtual Engine::State state() const;
virtual const Engine::Scope &scope();
virtual void setEqualizerEnabled( bool );
virtual void setEqualizerParameters( int preamp, const QList<int>& );
virtual void SetVolumeSW( uint );
virtual void fadeOut( uint fadeLength, bool* terminate, bool exiting = false );
static void XineEventListener( void*, const xine_event_t* );
virtual bool event( QEvent* );
virtual void playlistChanged();
virtual void reloadSettings();
Engine::SimpleMetaBundle fetchMetaData() const;
virtual bool lastFmProxyRequired();
bool makeNewStream();
bool ensureStream();
void determineAndShowErrorMessage(); //call after failure to load/play
xine_t *xine_;
xine_stream_t *stream_;
xine_audio_port_t *audioPort_;
xine_event_queue_t *eventQueue_;
xine_post_t *post_;
int64_t currentVpts_;
float preamp_;
bool stopFader_;
bool fadeOutRunning_;
QString currentAudioPlugin_; //to see if audio plugin has been changed
//need to save these for when the audio plugin is changed and xine reloaded
bool equalizerEnabled_;
int intPreamp_;
QList<int> equalizerGains_;
QMutex initMutex_;
QSettings settings_;
bool fadeoutOnExit_;
bool fadeoutEnabled_;
bool crossfadeEnabled_;
int fadeoutDuration_;
int xfadeLength_;
bool xfadeNextTrack_;
QUrl url_;
PruneScopeThread* prune_;
mutable Engine::SimpleMetaBundle currentBundle_;
public:
XineEngine();
private slots:
void PruneScope();
signals:
void resetConfig(xine_t *xine);
void InfoMessage(const QString&);
void LastFmTrackChange();
};
class Fader : public QThread
{
XineEngine *engine_;
xine_t *xine_;
xine_stream_t *decrease_;
xine_stream_t *increase_;
xine_audio_port_t *port_;
xine_post_t *post_;
uint fadeLength_;
bool paused_;
bool terminated_;
virtual void run();
public:
Fader( XineEngine *, uint fadeLengthMs );
~Fader();
void pause();
void resume();
void finish();
};
class OutFader : public QThread
{
XineEngine *engine_;
bool terminated_;
uint fadeLength_;
virtual void run();
public:
OutFader( XineEngine *, uint fadeLengthMs );
~OutFader();
void finish();
};
class PruneScopeThread : public QThread {
public:
PruneScopeThread(XineEngine* parent);
protected:
virtual void run();
private:
XineEngine* engine_;
};
#endif

View File

@ -1,186 +0,0 @@
/* Author: Max Howell <max.howell@methylblue.com>, (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)
*/
/* gcc doesn't like inline for me */
#define inline
/* need access to port_ticket */
#define XINE_ENGINE_INTERNAL
#include "xine-scope.h"
#include <xine/post.h>
#include <xine/xine_internal.h>
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 = 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 = malloc( num_samples * 2 );
memcpy( new_node->mem, buf->mem, num_samples * 2 );
{
int64_t
K = myMetronom->pts_per_smpls; /*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 *this )
{
MyNode *list = ((scope_plugin_t*)this)->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( this );
}
/************************
* plugin init function *
************************/
xine_post_t*
scope_plugin_new( xine_t *xine, xine_audio_port_t *audio_target )
{
scope_plugin_t *scope_plugin = 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 = 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;
}

View File

@ -1,50 +0,0 @@
/* Author: Max Howell <max.howell@methylblue.com>, (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 */
#define METRONOM_INTERNAL
#include <sys/types.h>
#include <xine/metronom.h>
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

View File

@ -53,6 +53,7 @@
#include <glib-object.h>
#include <glib/gutils.h>
#include <gst/gst.h>
#include <echonest/Config.h>
@ -61,15 +62,11 @@
#include <sys/sysctl.h>
#endif
#ifdef HAVE_LIBLASTFM
#include "radio/lastfmservice.h"
#endif
#ifdef HAVE_GSTREAMER
# include <gst/gst.h>
class GstEnginePipeline;
#endif
class GstEnginePipeline;
// Load sqlite plugin on windows and mac.
#ifdef HAVE_STATIC_SQLITE
@ -174,11 +171,9 @@ int main(int argc, char *argv[]) {
qRegisterMetaType<ColumnAlignmentMap>("ColumnAlignmentMap");
qRegisterMetaTypeStreamOperators<QMap<int, int> >("ColumnAlignmentMap");
#ifdef HAVE_GSTREAMER
qRegisterMetaType<GstBuffer*>("GstBuffer*");
qRegisterMetaType<GstElement*>("GstElement*");
qRegisterMetaType<GstEnginePipeline*>("GstEnginePipeline*");
#endif
#ifdef HAVE_LIBLASTFM
lastfm::ws::ApiKey = LastFMService::kApiKey;
@ -263,7 +258,7 @@ int main(int argc, char *argv[]) {
srand(time(NULL));
// Window
MainWindow w(options.engine());
MainWindow w;
QObject::connect(&a, SIGNAL(messageReceived(QByteArray)), &w, SLOT(CommandlineOptionsReceived(QByteArray)));
w.CommandlineOptionsReceived(options);

View File

@ -1930,9 +1930,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr "اختر المحرك"
msgid "Select visualizations"
msgstr ""
@ -2280,10 +2277,6 @@ msgstr ""
msgid "Unknown"
msgstr "مجهول"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "محرك الصوت \"%1\" غير معروف. الخيارات هي:"
msgid "Unknown error"
msgstr "خطأ مجهول"
@ -2555,6 +2548,12 @@ msgstr ""
msgid "track %1"
msgstr ""
#~ msgid "Select engine"
#~ msgstr "اختر المحرك"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "محرك الصوت \"%1\" غير معروف. الخيارات هي:"
#~ msgid "Options"
#~ msgstr "خيارات"

View File

@ -1944,9 +1944,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2294,10 +2291,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""

View File

@ -1934,9 +1934,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2284,10 +2281,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""

View File

@ -1930,9 +1930,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2280,10 +2277,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""

View File

@ -1968,9 +1968,6 @@ msgstr "Seleccionar-ho tot"
msgid "Select None"
msgstr "No selecciones res"
msgid "Select engine"
msgstr "Seleccionar motor"
msgid "Select visualizations"
msgstr "Seleccioneu visualitzacions"
@ -2328,10 +2325,6 @@ msgstr "No es pot descarregar %1 (%2)"
msgid "Unknown"
msgstr "Desconegut"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Motor d'àudio \"%1\" desconegut. Les opcions són:"
msgid "Unknown error"
msgstr "Error desconegut"
@ -2609,6 +2602,12 @@ msgstr "atura"
msgid "track %1"
msgstr "peça %1"
#~ msgid "Select engine"
#~ msgstr "Seleccionar motor"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Motor d'àudio \"%1\" desconegut. Les opcions són:"
#~ msgid "Editing %n tracks"
#~ msgstr "Editant %n pistes"

View File

@ -1969,9 +1969,6 @@ msgstr "Vybrat vše"
msgid "Select None"
msgstr "Nevybrat žádnou skladbu"
msgid "Select engine"
msgstr "Vybrat stroj"
msgid "Select visualizations"
msgstr "Vybrat znázornění"
@ -2332,10 +2329,6 @@ msgstr "Nepodařilo se stáhnout %1 (%2)"
msgid "Unknown"
msgstr "Neznámý"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Neznámý zvukový stroj \"%1\". Možnostmi na výběr jsou:"
msgid "Unknown error"
msgstr "Neznámá chyba"
@ -2618,6 +2611,12 @@ msgstr "Zastavit"
msgid "track %1"
msgstr "Skladba %1"
#~ msgid "Select engine"
#~ msgstr "Vybrat stroj"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Neznámý zvukový stroj \"%1\". Možnostmi na výběr jsou:"
#~ msgid "Editing %n tracks"
#~ msgstr "Úprava %n skladeb"

View File

@ -1930,9 +1930,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2280,10 +2277,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""

View File

@ -1937,9 +1937,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr "Vælg motor"
msgid "Select visualizations"
msgstr ""
@ -2287,10 +2284,6 @@ msgstr ""
msgid "Unknown"
msgstr "Ukendt"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Ukendt lydmotor \"%1\". Valgmulighederne er:"
msgid "Unknown error"
msgstr "Ukendt fejl"
@ -2562,6 +2555,12 @@ msgstr ""
msgid "track %1"
msgstr "spor %1"
#~ msgid "Select engine"
#~ msgstr "Vælg motor"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Ukendt lydmotor \"%1\". Valgmulighederne er:"
#~ msgid "Editing %n tracks"
#~ msgstr "Redigerer %n spor"

View File

@ -1972,9 +1972,6 @@ msgstr "Alle auswählen"
msgid "Select None"
msgstr "Auswahl aufheben"
msgid "Select engine"
msgstr "Engine:"
msgid "Select visualizations"
msgstr "Visualisierungen auswählen"
@ -2337,10 +2334,6 @@ msgstr "Konnte %1 nicht herunterladen (%2)"
msgid "Unknown"
msgstr "Unbekannt"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Ubekannte Engine \"%1\". Wahlmöglichkeiten:"
msgid "Unknown error"
msgstr "Unbekannter Fehler"
@ -2626,6 +2619,12 @@ msgstr "Anhalten"
msgid "track %1"
msgstr "Stück %1"
#~ msgid "Select engine"
#~ msgstr "Engine:"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Ubekannte Engine \"%1\". Wahlmöglichkeiten:"
#~ msgid "Editing %n tracks"
#~ msgstr "%n Stücke bearbeiten"

View File

@ -1979,9 +1979,6 @@ msgstr "Επιλογή όλων"
msgid "Select None"
msgstr "Επιλογή κανενός"
msgid "Select engine"
msgstr "Επιλογή μηχανής"
msgid "Select visualizations"
msgstr "Επιλογή οπτικών εφέ"
@ -2346,10 +2343,6 @@ msgstr "Αδυναμία \"κατεβάσματος\" του %1 (%2)"
msgid "Unknown"
msgstr "Άγνωστο"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Άγνωστη μηχανή \"%1\". ΟΙ επιλογές είναι:"
msgid "Unknown error"
msgstr "Άγνωστο σφάλμα"
@ -2635,6 +2628,12 @@ msgstr "διακοπή"
msgid "track %1"
msgstr "κομμάτι %1"
#~ msgid "Select engine"
#~ msgstr "Επιλογή μηχανής"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Άγνωστη μηχανή \"%1\". ΟΙ επιλογές είναι:"
#~ msgid "Editing %n tracks"
#~ msgstr "Τροποποίηση %n κομματιών"

View File

@ -1919,9 +1919,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2269,10 +2266,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""

View File

@ -1935,9 +1935,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr "Select engine"
msgid "Select visualizations"
msgstr "Select visualisations"
@ -2285,10 +2282,6 @@ msgstr ""
msgid "Unknown"
msgstr "Unknown"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Unknown audio engine \"%1\". Choices are:"
msgid "Unknown error"
msgstr "Unknown error"
@ -2560,6 +2553,12 @@ msgstr ""
msgid "track %1"
msgstr "track %1"
#~ msgid "Select engine"
#~ msgstr "Select engine"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Unknown audio engine \"%1\". Choices are:"
#~ msgid "Editing %n tracks"
#~ msgstr "Editing %n tracks"

View File

@ -1932,9 +1932,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr "Select engine"
msgid "Select visualizations"
msgstr "Select visualisations"
@ -2282,10 +2279,6 @@ msgstr ""
msgid "Unknown"
msgstr "Unknown"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Unknown audio engine \"%1\". Choices are:"
msgid "Unknown error"
msgstr "Unknown error"
@ -2557,6 +2550,12 @@ msgstr ""
msgid "track %1"
msgstr "track %1"
#~ msgid "Select engine"
#~ msgstr "Select engine"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Unknown audio engine \"%1\". Choices are:"
#~ msgid "Editing %n tracks"
#~ msgstr "Editing %n tracks"

View File

@ -1930,9 +1930,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2280,10 +2277,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""

View File

@ -1980,9 +1980,6 @@ msgstr "Seleccionar Todo"
msgid "Select None"
msgstr "No seleccionar nada"
msgid "Select engine"
msgstr "Seleccione motor de audio"
msgid "Select visualizations"
msgstr "Seleccionar visualizaciones"
@ -2342,10 +2339,6 @@ msgstr "Imposible descargar %1 (%2)"
msgid "Unknown"
msgstr "Desconocido"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Motor de audio \"%1\" desconocido. Las opciones son:"
msgid "Unknown error"
msgstr "Error desconocido"
@ -2630,6 +2623,12 @@ msgstr "detener"
msgid "track %1"
msgstr "Pista %1"
#~ msgid "Select engine"
#~ msgstr "Seleccione motor de audio"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Motor de audio \"%1\" desconocido. Las opciones son:"
#~ msgid "Editing %n tracks"
#~ msgstr "Editando %n pistas"

View File

@ -1932,9 +1932,6 @@ msgstr "Vali kõik"
msgid "Select None"
msgstr "Tühista valik."
msgid "Select engine"
msgstr "Vali mootor"
msgid "Select visualizations"
msgstr ""
@ -2282,10 +2279,6 @@ msgstr ""
msgid "Unknown"
msgstr "Tundmatu"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr "Tundmatu viga"
@ -2557,6 +2550,9 @@ msgstr "peata"
msgid "track %1"
msgstr ""
#~ msgid "Select engine"
#~ msgstr "Vali mootor"
#~ msgid "[click to edit]"
#~ msgstr "[Muutmiseks kliki]"

View File

@ -1930,9 +1930,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2280,10 +2277,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""

View File

@ -1932,9 +1932,6 @@ msgstr "Valitse kaikki"
msgid "Select None"
msgstr "Poista valinnat"
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2282,10 +2279,6 @@ msgstr ""
msgid "Unknown"
msgstr "Tuntematon"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr "Tuntematon virhe"

View File

@ -1985,9 +1985,6 @@ msgstr "Tout sélectionner"
msgid "Select None"
msgstr "Ne rien sélectionner"
msgid "Select engine"
msgstr "Sélectionner un moteur"
msgid "Select visualizations"
msgstr "Sélectionner visualisation"
@ -2353,10 +2350,6 @@ msgstr "Impossible de télécharger %1 (%2)"
msgid "Unknown"
msgstr "Inconnu"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Moteur audio inconnu « %1 ». Les choix sont :"
msgid "Unknown error"
msgstr "Erreur de type inconnu"
@ -2642,6 +2635,12 @@ msgstr "stop"
msgid "track %1"
msgstr "piste %1"
#~ msgid "Select engine"
#~ msgstr "Sélectionner un moteur"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Moteur audio inconnu « %1 ». Les choix sont :"
#~ msgid "Editing %n tracks"
#~ msgstr "Éditer %n pistes"

View File

@ -1936,9 +1936,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2286,10 +2283,6 @@ msgstr ""
msgid "Unknown"
msgstr "Descoñecido"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr "Erro descoñecido"

View File

@ -1938,9 +1938,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2288,10 +2285,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""

View File

@ -1930,9 +1930,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2280,10 +2277,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""

View File

@ -1936,9 +1936,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2286,10 +2283,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""

View File

@ -1968,9 +1968,6 @@ msgstr "Összes kiválasztása"
msgid "Select None"
msgstr "Kiválasztás megszüntetése"
msgid "Select engine"
msgstr "Meghajtó kiválasztása"
msgid "Select visualizations"
msgstr "Megjelenítések kiválasztása"
@ -2332,10 +2329,6 @@ msgstr "%1 (%2) nem letölthető"
msgid "Unknown"
msgstr "Ismeretlen"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Ismeretlen audio motor: %1. A lehetőségek:"
msgid "Unknown error"
msgstr "Ismeretlen hiba"
@ -2618,6 +2611,12 @@ msgstr "leállítás"
msgid "track %1"
msgstr "%1. szám"
#~ msgid "Select engine"
#~ msgstr "Meghajtó kiválasztása"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Ismeretlen audio motor: %1. A lehetőségek:"
#~ msgid "Editing %n tracks"
#~ msgstr "%n szám szerkesztése"

View File

@ -1976,9 +1976,6 @@ msgstr "Seleziona tutto"
msgid "Select None"
msgstr "Selezione nulla"
msgid "Select engine"
msgstr "Seleziona motore"
msgid "Select visualizations"
msgstr "Seleziona visualizzazioni"
@ -2345,10 +2342,6 @@ msgstr "Impossibile scaricare %1 (%2)"
msgid "Unknown"
msgstr "Sconosciuto"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Motore audio \"%1\" sconosciuto. Puoi scegliere tra:"
msgid "Unknown error"
msgstr "Errore sconosciuto"
@ -2632,6 +2625,12 @@ msgstr "ferma"
msgid "track %1"
msgstr "traccia %1"
#~ msgid "Select engine"
#~ msgstr "Seleziona motore"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Motore audio \"%1\" sconosciuto. Puoi scegliere tra:"
#~ msgid "Editing %n tracks"
#~ msgstr "Modifica di %n tracce"

View File

@ -1958,9 +1958,6 @@ msgstr "すべて選択"
msgid "Select None"
msgstr "選択しない"
msgid "Select engine"
msgstr "エンジンの選択"
msgid "Select visualizations"
msgstr "視覚化の選択"
@ -2316,10 +2313,6 @@ msgstr "%1 をダウンロードすることができません (%2)"
msgid "Unknown"
msgstr "不明"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "不明なオーディオ エンジン \"%1\" です。選択肢:"
msgid "Unknown error"
msgstr "不明なエラー"
@ -2601,6 +2594,12 @@ msgstr "停止"
msgid "track %1"
msgstr "トラック %1"
#~ msgid "Select engine"
#~ msgstr "エンジンの選択"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "不明なオーディオ エンジン \"%1\" です。選択肢:"
#~ msgid "Editing %n tracks"
#~ msgstr "%n 個のトラックを編集しています"

View File

@ -1932,9 +1932,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2282,10 +2279,6 @@ msgstr ""
msgid "Unknown"
msgstr "Белгісіз"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr "Белгісіз қате"

View File

@ -1930,9 +1930,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2280,10 +2277,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""

View File

@ -1944,9 +1944,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2295,10 +2292,6 @@ msgstr ""
msgid "Unknown"
msgstr "Ukjent"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr "Ukjent feil"

View File

@ -1963,9 +1963,6 @@ msgstr "Alles selecteren"
msgid "Select None"
msgstr "Niets selecteren"
msgid "Select engine"
msgstr "Engine kiezen"
msgid "Select visualizations"
msgstr "Visualisaties kiezen"
@ -2331,10 +2328,6 @@ msgstr "Kon %1 niet downloaden (%2)"
msgid "Unknown"
msgstr "Onbekend"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Onbekende audioengine \"%1\". U kunt kiezen uit:"
msgid "Unknown error"
msgstr "Onbekende fout"
@ -2618,6 +2611,12 @@ msgstr "stoppen"
msgid "track %1"
msgstr "track %1"
#~ msgid "Select engine"
#~ msgstr "Engine kiezen"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Onbekende audioengine \"%1\". U kunt kiezen uit:"
#~ msgid "Editing %n tracks"
#~ msgstr "%n tracks bewerken"

View File

@ -1930,9 +1930,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2280,10 +2277,6 @@ msgstr ""
msgid "Unknown"
msgstr "Desconegut"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr "Error desconeguda"

View File

@ -1963,9 +1963,6 @@ msgstr "Zaznacz wszystko"
msgid "Select None"
msgstr "Odznacz wszystkie"
msgid "Select engine"
msgstr "Wybierz silnik odtwarzania"
msgid "Select visualizations"
msgstr "Wybierz wizualizacje"
@ -2325,10 +2322,6 @@ msgstr "Niemożliwe ściągnięcie %1 (%2)"
msgid "Unknown"
msgstr "nieznany"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Nie znany silnik audio \"%1\". Do wyboru są:"
msgid "Unknown error"
msgstr "Nieznany błąd"
@ -2608,6 +2601,12 @@ msgstr "zatrzymaj"
msgid "track %1"
msgstr "utwór %1"
#~ msgid "Select engine"
#~ msgstr "Wybierz silnik odtwarzania"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Nie znany silnik audio \"%1\". Do wyboru są:"
#~ msgid "Editing %n tracks"
#~ msgstr "Edytowanie %n ścieżek"

View File

@ -1973,9 +1973,6 @@ msgstr "Todas"
msgid "Select None"
msgstr "Nenhuma"
msgid "Select engine"
msgstr "Selecione o sistema"
msgid "Select visualizations"
msgstr "Selecione as visualizações"
@ -2338,10 +2335,6 @@ msgstr "Incapaz de transferir %1 (%2)"
msgid "Unknown"
msgstr "Desconhecido"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Sistema de áudio desconhecido \"%1\". As possibilidades são:"
msgid "Unknown error"
msgstr "Erro desconhecido"
@ -2626,6 +2619,12 @@ msgstr "parar"
msgid "track %1"
msgstr "faixa %1"
#~ msgid "Select engine"
#~ msgstr "Selecione o sistema"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Sistema de áudio desconhecido \"%1\". As possibilidades são:"
#~ msgid "Editing %n tracks"
#~ msgstr "Editando %n faixas"

View File

@ -1969,9 +1969,6 @@ msgstr "Selecionar Todos"
msgid "Select None"
msgstr "Desmarcar Tudo"
msgid "Select engine"
msgstr "Selecionar mecanismo"
msgid "Select visualizations"
msgstr "Selecionar visualizações"
@ -2320,10 +2317,6 @@ msgstr "Não foi poddível baixar %1 (%2)"
msgid "Unknown"
msgstr "Desconhecido"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Mecanismo de áudio \"%1\" desconhecido. Escolha:"
msgid "Unknown error"
msgstr "Erro desconhecido"
@ -2602,6 +2595,12 @@ msgstr ""
msgid "track %1"
msgstr "faixa %1"
#~ msgid "Select engine"
#~ msgstr "Selecionar mecanismo"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Mecanismo de áudio \"%1\" desconhecido. Escolha:"
#~ msgid "Editing %n tracks"
#~ msgstr "Editando %n faixas"

View File

@ -1931,9 +1931,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2281,10 +2278,6 @@ msgstr ""
msgid "Unknown"
msgstr "Necunoscut"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr "Eroare necunoscută"

View File

@ -1963,9 +1963,6 @@ msgstr "Выбрать все"
msgid "Select None"
msgstr "Отменить выбор"
msgid "Select engine"
msgstr "Укажите движок"
msgid "Select visualizations"
msgstr "Выбрать визуализации"
@ -2326,10 +2323,6 @@ msgstr "Невозможно загрузить %1 (%2)"
msgid "Unknown"
msgstr "Неизвестный"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Неизвестный аудио движок \"%1\". Варианты:"
msgid "Unknown error"
msgstr "Неизвестная ошибка"
@ -2612,6 +2605,12 @@ msgstr "Остановить"
msgid "track %1"
msgstr "композиция %1"
#~ msgid "Select engine"
#~ msgstr "Укажите движок"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Неизвестный аудио движок \"%1\". Варианты:"
#~ msgid "Editing %n tracks"
#~ msgstr "Редактирую %n треков"

View File

@ -1959,9 +1959,6 @@ msgstr "Vybrať všetky"
msgid "Select None"
msgstr "Nevybrať nič"
msgid "Select engine"
msgstr "Vybrať engine"
msgid "Select visualizations"
msgstr "Vybrať vizualizácie"
@ -2323,10 +2320,6 @@ msgstr "Nedá sa stiahnuť %1 (%2)"
msgid "Unknown"
msgstr "neznámy"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Neznámy audio engine \"%1\". Na výber sú:"
msgid "Unknown error"
msgstr "Neznáma chyba"
@ -2608,6 +2601,12 @@ msgstr "zastaviť"
msgid "track %1"
msgstr "skladba %1"
#~ msgid "Select engine"
#~ msgstr "Vybrať engine"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Neznámy audio engine \"%1\". Na výber sú:"
#~ msgid "Editing %n tracks"
#~ msgstr "Upravovanie %n skladieb"

View File

@ -1962,9 +1962,6 @@ msgstr "Izberi vse"
msgid "Select None"
msgstr "Odstrani izbor"
msgid "Select engine"
msgstr "Izberi pogon"
msgid "Select visualizations"
msgstr "Izberi predočenja"
@ -2324,10 +2321,6 @@ msgstr "Ni bilo mogoče prenesti %1 (%2)"
msgid "Unknown"
msgstr "Neznano"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Neznan glasbeni pogon \"%1\". Na voljo so:"
msgid "Unknown error"
msgstr "Neznana napaka"
@ -2610,6 +2603,12 @@ msgstr "zaustavi"
msgid "track %1"
msgstr "skladba %1"
#~ msgid "Select engine"
#~ msgstr "Izberi pogon"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Neznan glasbeni pogon \"%1\". Na voljo so:"
#~ msgid "Editing %n tracks"
#~ msgstr "Urejanje %n skladb"

View File

@ -1935,9 +1935,6 @@ msgstr "Изабери све"
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr "Одабери мотор"
msgid "Select visualizations"
msgstr "Одабери визуелизације"
@ -2285,10 +2282,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr "Непозната грешка"
@ -2562,6 +2555,9 @@ msgstr "Заустави"
msgid "track %1"
msgstr "нумера %1"
#~ msgid "Select engine"
#~ msgstr "Одабери мотор"
#~ msgid "Editing %n tracks"
#~ msgstr "Уређивање %n нумера"

View File

@ -1964,9 +1964,6 @@ msgstr "Välj alla"
msgid "Select None"
msgstr "Välj ingen"
msgid "Select engine"
msgstr "Välj motor"
msgid "Select visualizations"
msgstr "Välj visualiseringar"
@ -2327,10 +2324,6 @@ msgstr "Det går inte att hämta %1 (%2)"
msgid "Unknown"
msgstr "Okänt"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Okänd audiomotor \"%1\". Följande val finns:"
msgid "Unknown error"
msgstr "Okänt fel"
@ -2612,6 +2605,12 @@ msgstr "stoppa"
msgid "track %1"
msgstr "spår %1"
#~ msgid "Select engine"
#~ msgstr "Välj motor"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Okänd audiomotor \"%1\". Följande val finns:"
#~ msgid "Editing %n tracks"
#~ msgstr "Redigerar %n spår"

View File

@ -1962,9 +1962,6 @@ msgstr "Tümünü Seç"
msgid "Select None"
msgstr "Hiçbirini Seçme"
msgid "Select engine"
msgstr "Çalma motorunu seç"
msgid "Select visualizations"
msgstr "Görsel seç"
@ -2316,10 +2313,6 @@ msgstr "%1 indirilemedi (%2)"
msgid "Unknown"
msgstr "Bilinmeyen"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Bilinmeyen çalma motoru \"%1\". Seçenekler:"
msgid "Unknown error"
msgstr "Bilinmeyen hata"
@ -2602,6 +2595,12 @@ msgstr "durdur"
msgid "track %1"
msgstr "parça %1"
#~ msgid "Select engine"
#~ msgstr "Çalma motorunu seç"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Bilinmeyen çalma motoru \"%1\". Seçenekler:"
#~ msgid "Editing %n tracks"
#~ msgstr "%n parça düzenleniyor"

View File

@ -1920,9 +1920,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr ""
@ -2270,10 +2267,6 @@ msgstr ""
msgid "Unknown"
msgstr ""
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""

View File

@ -1964,9 +1964,6 @@ msgstr "Вибрати все"
msgid "Select None"
msgstr "Скасувати вибір"
msgid "Select engine"
msgstr "Вибрати рушій"
msgid "Select visualizations"
msgstr "Вибрати візуалізації"
@ -2321,10 +2318,6 @@ msgstr "Не вдалось завантажити %1 (%2)"
msgid "Unknown"
msgstr "Невідомо"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr "Невідомий аудіо рушій \"%1\". Варіанти:"
msgid "Unknown error"
msgstr "Невідома помилка"
@ -2607,6 +2600,12 @@ msgstr "зупинити"
msgid "track %1"
msgstr "доріжка %1"
#~ msgid "Select engine"
#~ msgstr "Вибрати рушій"
#~ msgid "Unknown audio engine \"%1\". Choices are:"
#~ msgstr "Невідомий аудіо рушій \"%1\". Варіанти:"
#~ msgid "Editing %n tracks"
#~ msgstr "Редагування %n доріжок"

View File

@ -1934,9 +1934,6 @@ msgstr ""
msgid "Select None"
msgstr ""
msgid "Select engine"
msgstr "选择引擎"
msgid "Select visualizations"
msgstr ""
@ -2284,10 +2281,6 @@ msgstr ""
msgid "Unknown"
msgstr "未知"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr ""
@ -2559,6 +2552,9 @@ msgstr "停止"
msgid "track %1"
msgstr ""
#~ msgid "Select engine"
#~ msgstr "选择引擎"
#~ msgid "Editing %n tracks"
#~ msgstr "编辑 %n 歌曲"

View File

@ -1935,9 +1935,6 @@ msgstr "選擇全部"
msgid "Select None"
msgstr "不選取"
msgid "Select engine"
msgstr ""
msgid "Select visualizations"
msgstr "選取視覺化"
@ -2285,10 +2282,6 @@ msgstr ""
msgid "Unknown"
msgstr "未知的"
#, qt-format
msgid "Unknown audio engine \"%1\". Choices are:"
msgstr ""
msgid "Unknown error"
msgstr "不明的錯誤"

View File

@ -34,6 +34,7 @@
#include "devices/devicestatefiltermodel.h"
#include "devices/deviceview.h"
#include "engines/enginebase.h"
#include "engines/gstengine.h"
#include "library/groupbydialog.h"
#include "library/library.h"
#include "library/librarybackend.h"
@ -90,10 +91,6 @@
# include "wiimotedev/shortcuts.h"
#endif
#ifdef HAVE_GSTREAMER
# include "engines/gstengine.h"
#endif
#ifdef ENABLE_VISUALISATIONS
# include "visualisations/visualisationcontainer.h"
#endif
@ -131,7 +128,7 @@ const char* MainWindow::kMusicFilterSpec =
const char* MainWindow::kAllFilesFilterSpec =
QT_TR_NOOP("All Files (*)");
MainWindow::MainWindow(Engine::Type engine, QWidget *parent)
MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent),
ui_(new Ui_MainWindow),
tray_icon_(SystemTrayIcon::CreateSystemTrayIcon(this)),
@ -184,7 +181,7 @@ MainWindow::MainWindow(Engine::Type engine, QWidget *parent)
#ifdef HAVE_LIBLASTFM
radio_model_->GetLastFMService(),
#endif
engine, this);
this);
library_ = new Library(database_, task_manager_, this);
devices_ = new DeviceManager(database_, task_manager_, this);
@ -219,15 +216,6 @@ MainWindow::MainWindow(Engine::Type engine, QWidget *parent)
background_streams_ = new BackgroundStreams(player_->engine(), this);
background_streams_->LoadStreams();
#ifdef HAVE_GSTREAMER
if (qobject_cast<GstEngine*>(player_->engine()) == NULL) {
ui_->action_transcode->setEnabled(false);
}
#else // HAVE_GSTREAMER
ui_->action_transcode->setEnabled(false);
#endif // HAVE_GSTREAMER
// Models
library_sort_model_->setSourceModel(library_->model());
library_sort_model_->setSortRole(LibraryModel::Role_SortText);
@ -1646,11 +1634,7 @@ void MainWindow::EnsureSettingsDialogCreated() {
settings_dialog_.reset(new SettingsDialog(background_streams_));
settings_dialog_->SetLibraryDirectoryModel(library_->model()->directory_model());
#ifdef HAVE_GSTREAMER
if (GstEngine* engine = qobject_cast<GstEngine*>(player_->engine())) {
settings_dialog_->SetGstEngine(engine);
}
#endif
settings_dialog_->SetGstEngine(qobject_cast<GstEngine*>(player_->engine()));
settings_dialog_->SetGlobalShortcutManager(global_shortcuts_);
settings_dialog_->SetSongInfoView(song_info_view_);
@ -1698,12 +1682,10 @@ void MainWindow::ShowAboutDialog() {
}
void MainWindow::ShowTranscodeDialog() {
#ifdef HAVE_GSTREAMER
if (!transcode_dialog_) {
transcode_dialog_.reset(new TranscodeDialog);
}
transcode_dialog_->show();
#endif
}
void MainWindow::ShowErrorDialog(const QString& message) {
@ -1732,10 +1714,7 @@ void MainWindow::ShowVisualisations() {
connect(player_, SIGNAL(ForceShowOSD(Song)), visualisation_.get(), SLOT(SongMetadataChanged(Song)));
connect(playlists_, SIGNAL(CurrentSongChanged(Song)), visualisation_.get(), SLOT(SongMetadataChanged(Song)));
#ifdef HAVE_GSTREAMER
if (GstEngine* engine = qobject_cast<GstEngine*>(player_->engine()))
visualisation_->SetEngine(engine);
#endif
visualisation_->SetEngine(qobject_cast<GstEngine*>(player_->engine()));
}
visualisation_->show();

View File

@ -77,7 +77,7 @@ class MainWindow : public QMainWindow, public PlatformInterface {
Q_OBJECT
public:
MainWindow(Engine::Type engine, QWidget *parent = 0);
MainWindow(QWidget *parent = 0);
~MainWindow();
static const char* kSettingsGroup;

View File

@ -22,6 +22,7 @@
#include "mainwindow.h"
#include "settingsdialog.h"
#include "engines/enginebase.h"
#include "engines/gstengine.h"
#include "playlist/playlistview.h"
#include "songinfo/songinfofetcher.h"
#include "songinfo/songinfotextview.h"
@ -40,10 +41,6 @@
# include "wiimotedev/shortcuts.h"
#endif
#ifdef HAVE_GSTREAMER
# include "engines/gstengine.h"
#endif
#include <QColorDialog>
#include <QDir>
#include <QFontDialog>
@ -150,9 +147,7 @@ SettingsDialog::SettingsDialog(BackgroundStreams* streams, QWidget* parent)
connect(ui_->fading_cross, SIGNAL(toggled(bool)), SLOT(FadingOptionsChanged()));
connect(ui_->fading_out, SIGNAL(toggled(bool)), SLOT(FadingOptionsChanged()));
connect(ui_->fading_auto, SIGNAL(toggled(bool)), SLOT(FadingOptionsChanged()));
#ifdef HAVE_GSTREAMER
connect(ui_->gst_plugin, SIGNAL(currentIndexChanged(int)), SLOT(GstPluginChanged(int)));
#endif
connect(ui_->replaygain_preamp, SIGNAL(valueChanged(int)), SLOT(RgPreampChanged(int)));
ui_->replaygain_preamp_label->setMinimumWidth(
@ -303,7 +298,6 @@ void SettingsDialog::accept() {
s.setValue("AutoCrossfadeEnabled", ui_->fading_auto->isChecked());
s.endGroup();
#ifdef HAVE_GSTREAMER
s.beginGroup(GstEngine::kSettingsGroup);
s.setValue("sink", ui_->gst_plugin->itemData(ui_->gst_plugin->currentIndex()).toString());
s.setValue("device", ui_->gst_device->text());
@ -313,7 +307,6 @@ void SettingsDialog::accept() {
s.setValue("rgcompression", ui_->replaygain_compression->isChecked());
s.setValue("bufferduration", ui_->buffer_duration->value());
s.endGroup();
#endif
// Song info
s.beginGroup(SongInfoTextView::kSettingsGroup);
@ -395,7 +388,6 @@ void SettingsDialog::showEvent(QShowEvent*) {
QSettings s;
loading_settings_ = true;
#ifdef HAVE_GSTREAMER
if (ui_->gst_plugin->count() <= 1 && gst_engine_) {
GstEngine::PluginDetailsList list = gst_engine_->GetOutputsList();
@ -409,7 +401,6 @@ void SettingsDialog::showEvent(QShowEvent*) {
ui_->gst_group->setEnabled(true);
ui_->replaygain_group->setEnabled(true);
}
#endif // HAVE_GSTREAMER
// Behaviour
s.beginGroup(MainWindow::kSettingsGroup);
@ -467,7 +458,6 @@ void SettingsDialog::showEvent(QShowEvent*) {
ui_->fading_duration->setValue(s.value("FadeoutDuration", 2000).toInt());
s.endGroup();
#ifdef HAVE_GSTREAMER
s.beginGroup(GstEngine::kSettingsGroup);
QString sink = s.value("sink", GstEngine::kAutoSink).toString();
ui_->gst_plugin->setCurrentIndex(0);
@ -484,7 +474,6 @@ void SettingsDialog::showEvent(QShowEvent*) {
ui_->replaygain_compression->setChecked(s.value("rgcompression", true).toBool());
ui_->buffer_duration->setValue(s.value("bufferduration", 1000).toInt());
s.endGroup();
#endif
// Notifications
s.beginGroup(OSD::kSettingsGroup);
@ -632,14 +621,12 @@ void SettingsDialog::ShowTrayIconToggled(bool on) {
}
void SettingsDialog::GstPluginChanged(int index) {
#ifdef HAVE_GSTREAMER
QString name = ui_->gst_plugin->itemData(index).toString();
bool enabled = GstEngine::DoesThisSinkSupportChangingTheOutputDeviceToAUserEditableString(name);
ui_->gst_device->setEnabled(enabled);
ui_->gst_device_label->setEnabled(enabled);
#endif // HAVE_GSTREAMER
}
void SettingsDialog::RgPreampChanged(int value) {