diff --git a/README b/README index 2fc49224a..d7ff20666 100644 --- a/README +++ b/README @@ -2,7 +2,7 @@ Strawberry Music Player ======================= README -Strawberry is a audio player and music collection organiser. It was forked from Clementine in 2013 with a diffrent goal. +Strawberry is a audio player and music collection organizer. It was forked from Clementine in 2013 with a diffrent goal. It's written in C++ and Qt 5 and runs on Linux. The name is inspired by the band Strawbs. Features: diff --git a/src/dialogs/about.cpp b/src/dialogs/about.cpp index 8613434f4..528dc7923 100644 --- a/src/dialogs/about.cpp +++ b/src/dialogs/about.cpp @@ -79,7 +79,7 @@ QString About::MakeHtml() const { ret += tr("

"); - ret += tr("Strawberry is a audio player and music collection organiser.
"); + ret += tr("Strawberry is a audio player and music collection organizer.
"); ret += tr("It is a fork of Clementine. The name is inspired by the band Strawbs."); ret += tr("

"); diff --git a/src/engine/gstengine.cpp b/src/engine/gstengine.cpp index 266ba9280..a4889184e 100644 --- a/src/engine/gstengine.cpp +++ b/src/engine/gstengine.cpp @@ -86,10 +86,6 @@ const char *GstEngine::kPulseSink = "pulsesink"; const char *GstEngine::kA2DPSink = "a2dpsink"; const char *GstEngine::kAVDTPSink = "avdtpsink"; -const char *GstEngine::kEnterprisePipeline = - "audiotestsrc wave=5 ! " - "audiocheblimit mode=0 cutoff=120"; - GstEngine::GstEngine(TaskManager *task_manager) : Engine::Base(), task_manager_(task_manager), @@ -716,19 +712,20 @@ void GstEngine::HandlePipelineError(int pipeline_id, const QString &message, int // unable to play media stream with this url emit InvalidSongRequested(url_); +#if 0 // TODO: the types of errors listed below won't be shown to user // they will get logged and the current song will be skipped; instead of maintaining the list we should probably: // - don't report any engine's errors to user (always just log and skip) - // - come up with a less intrusive error box (not a dialog but a notification - // popup of some kind) and then report all errors + // - come up with a less intrusive error box (not a dialog but a notification popup of some kind) and then report all errors if (!(domain == GST_RESOURCE_ERROR && error_code == GST_RESOURCE_ERROR_NOT_FOUND) && !(domain == GST_STREAM_ERROR && error_code == GST_STREAM_ERROR_TYPE_NOT_FOUND) && !(domain == GST_RESOURCE_ERROR && error_code == GST_RESOURCE_ERROR_OPEN_READ)) { +#endif emit Error(message); - } + //} } void GstEngine::EndOfStreamReached(int pipeline_id, bool has_next_track) { @@ -751,7 +748,7 @@ void GstEngine::NewMetaData(int pipeline_id, const Engine::SimpleMetaBundle &bun emit MetaData(bundle); } -GstElement *GstEngine::CreateElement(const QString &factoryName, GstElement *bin, bool showerror) { +GstElement *GstEngine::CreateElement(const QString &factoryName, GstElement *bin, bool fatal, bool showerror) { // Make a unique name QString name = factoryName + "-" + QString::number(next_element_id_++); @@ -759,8 +756,9 @@ GstElement *GstEngine::CreateElement(const QString &factoryName, GstElement *bin GstElement *element = gst_element_factory_make(factoryName.toUtf8().constData(), name.toUtf8().constData()); if (!element) { - if (showerror) emit Error(QString("GStreamer could not create the element: %1. Please make sure that you have installed all necessary GStreamer plugins").arg(factoryName)); - gst_object_unref(GST_OBJECT(bin)); + if (showerror) + emit Error(QString("GStreamer could not create the element: %1. Please make sure that you have installed all necessary GStreamer plugins").arg(factoryName)); + if (fatal) gst_object_unref(GST_OBJECT(bin)); return nullptr; } @@ -824,11 +822,6 @@ shared_ptr GstEngine::CreatePipeline(const QUrl &url, qint64 shared_ptr ret = CreatePipeline(); - if (url.scheme() == "enterprise") { - ret->InitFromString(kEnterprisePipeline); - return ret; - } - if (!ret->InitFromUrl(url.toEncoded(), end_nanosec)) ret.reset(); return ret; @@ -888,29 +881,19 @@ EngineBase::OutputDetailsList GstEngine::GetOutputsList() const { EngineBase::OutputDetailsList ret; PluginDetailsList plugins = GetPluginList("Sink/Audio"); - //if (plugins.count() > 0) { - for (const PluginDetails &plugin : plugins) { - OutputDetails output; - output.name = plugin.name; - output.description = plugin.description; - if (plugin.name == kAutoSink) output.iconname = "soundcard"; - else if ((plugin.name == kALSASink) || (plugin.name == kOSS4Sink) || (plugin.name == kOSS4Sink)) output.iconname = "alsa"; - else if (plugin.name== kJackAudioSink) output.iconname = "jack"; - else if (plugin.name == kPulseSink) output.iconname = "pulseaudio"; - else if ((plugin.name == kA2DPSink) || (plugin.name == kAVDTPSink)) output.iconname = "bluetooth"; - else output.iconname = "soundcard"; - ret.append(output); - } -#if 0 - } - else { + + for (const PluginDetails &plugin : plugins) { OutputDetails output; - output.name = kAutoSink; - output.description = "Auto"; - output.iconname = "soundcard"; + output.name = plugin.name; + output.description = plugin.description; + if (plugin.name == kAutoSink) output.iconname = "soundcard"; + else if ((plugin.name == kALSASink) || (plugin.name == kOSS4Sink) || (plugin.name == kOSS4Sink)) output.iconname = "alsa"; + else if (plugin.name== kJackAudioSink) output.iconname = "jack"; + else if (plugin.name == kPulseSink) output.iconname = "pulseaudio"; + else if ((plugin.name == kA2DPSink) || (plugin.name == kAVDTPSink)) output.iconname = "bluetooth"; + else output.iconname = "soundcard"; ret.append(output); } -#endif return ret; diff --git a/src/engine/gstengine.h b/src/engine/gstengine.h index d1c2e0f4c..17fc221f2 100644 --- a/src/engine/gstengine.h +++ b/src/engine/gstengine.h @@ -85,7 +85,7 @@ class GstEngine : public Engine::Base, public BufferConsumer { static bool ALSADeviceSupport(const QString &name); - GstElement *CreateElement(const QString &factoryName, GstElement *bin = 0, bool showerror = true); + GstElement *CreateElement(const QString &factoryName, GstElement *bin = 0, bool fatal = true, bool showerror = true); // BufferConsumer void ConsumeBuffer(GstBuffer *buffer, int pipeline_id); @@ -159,8 +159,6 @@ class GstEngine : public Engine::Base, public BufferConsumer { static const qint64 kPreloadGapNanosec = 3000 *kNsecPerMsec; // 3s static const qint64 kSeekDelayNanosec = 100 *kNsecPerMsec; // 100msec - static const char *kEnterprisePipeline; - TaskManager *task_manager_; int buffering_task_id_; diff --git a/src/engine/gstenginepipeline.cpp b/src/engine/gstenginepipeline.cpp index 56170a397..6bcf04e06 100644 --- a/src/engine/gstenginepipeline.cpp +++ b/src/engine/gstenginepipeline.cpp @@ -91,11 +91,11 @@ GstEnginePipeline::GstEnginePipeline(GstEngine *engine) rglimiter_(nullptr), audioconvert2_(nullptr), equalizer_(nullptr), - stereo_panorama_(nullptr), + audio_panorama_(nullptr), volume_(nullptr), audioscale_(nullptr), audiosink_(nullptr) { - + if (!sElementDeleter) { sElementDeleter = new GstElementDeleter; } @@ -228,9 +228,9 @@ bool GstEnginePipeline::InitAudioBin() { probe_sink = engine_->CreateElement("fakesink", audiobin_); audio_queue = engine_->CreateElement("queue", audiobin_); - equalizer_preamp_ = engine_->CreateElement("volume", audiobin_); - equalizer_ = engine_->CreateElement("equalizer-nbands", audiobin_); - stereo_panorama_ = engine_->CreateElement("audiopanorama", audiobin_, false); + equalizer_preamp_ = engine_->CreateElement("volume", audiobin_, false, true); + equalizer_ = engine_->CreateElement("equalizer-nbands", audiobin_, false, true); + audio_panorama_ = engine_->CreateElement("audiopanorama", audiobin_, false, false); volume_ = engine_->CreateElement("volume", audiobin_); audioscale_ = engine_->CreateElement("audioresample", audiobin_); convert = engine_->CreateElement("audioconvert", audiobin_); @@ -307,7 +307,7 @@ bool GstEnginePipeline::InitAudioBin() { } // Set the stereo balance. - if (stereo_panorama_) g_object_set(G_OBJECT(stereo_panorama_), "panorama", stereo_balance_, nullptr); + if (audio_panorama_) g_object_set(G_OBJECT(audio_panorama_), "panorama", stereo_balance_, nullptr); // Set the buffer duration. We set this on this queue instead of the decode bin (in ReplaceDecodeBin()) because setting it on the decode bin only affects network sources. // Disable the default buffer and byte limits, so we only buffer based on time. @@ -341,7 +341,7 @@ bool GstEnginePipeline::InitAudioBin() { // Don't force 16 bit. gst_element_link(probe_queue, probe_converter); - if (engine_->IsEqualizerEnabled() && equalizer_ && equalizer_preamp_ && stereo_panorama_) gst_element_link_many(audio_queue, equalizer_preamp_, equalizer_, stereo_panorama_, volume_, audioscale_, convert, nullptr); + if (engine_->IsEqualizerEnabled() && equalizer_ && equalizer_preamp_ && audio_panorama_) gst_element_link_many(audio_queue, equalizer_preamp_, equalizer_, audio_panorama_, volume_, audioscale_, convert, nullptr); else gst_element_link_many(audio_queue, volume_, audioscale_, convert, nullptr); // Let the audio output of the tee autonegotiate the bit depth and format. @@ -957,8 +957,8 @@ void GstEnginePipeline::UpdateEqualizer() { } void GstEnginePipeline::UpdateStereoBalance() { - if (stereo_panorama_) { - g_object_set(G_OBJECT(stereo_panorama_), "panorama", stereo_balance_, nullptr); + if (audio_panorama_) { + g_object_set(G_OBJECT(audio_panorama_), "panorama", stereo_balance_, nullptr); } } diff --git a/src/engine/gstenginepipeline.h b/src/engine/gstenginepipeline.h index be802d764..4f6c3ab35 100644 --- a/src/engine/gstenginepipeline.h +++ b/src/engine/gstenginepipeline.h @@ -260,7 +260,7 @@ signals: GstElement *audioconvert2_; GstElement *equalizer_preamp_; GstElement *equalizer_; - GstElement *stereo_panorama_; + GstElement *audio_panorama_; GstElement *volume_; GstElement *audioscale_; GstElement *audiosink_; diff --git a/src/engine/pulsedevicefinder.cpp b/src/engine/pulsedevicefinder.cpp index 8579c9526..a5c09c2c3 100644 --- a/src/engine/pulsedevicefinder.cpp +++ b/src/engine/pulsedevicefinder.cpp @@ -29,7 +29,7 @@ #include "core/logging.h" #include "engine/pulsedevicefinder.h" -PulseDeviceFinder::PulseDeviceFinder() : DeviceFinder("pulsesink"), mainloop_(nullptr), context_(nullptr) { +PulseDeviceFinder::PulseDeviceFinder() : DeviceFinder("pulseaudio"), mainloop_(nullptr), context_(nullptr) { } bool PulseDeviceFinder::Initialise() {