From 5151d779ae6067abbf2e6eafde5cb8946fd42bf8 Mon Sep 17 00:00:00 2001 From: emeric Date: Sat, 16 Jan 2016 19:04:46 +0100 Subject: [PATCH] [UI] Restored audio encoding setting --- src/av/AvTranscoder.hpp | 2 ++ src/ui/audio/AudioPlayer.cpp | 33 ++++++++++++++++++++++- src/ui/audio/AudioPlayer.hpp | 2 ++ src/ui/resource/TranscodeResource.cpp | 12 +++++---- src/ui/settings/SettingsAudioFormView.cpp | 2 +- 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/av/AvTranscoder.hpp b/src/av/AvTranscoder.hpp index 5706ea94..7e671fb8 100644 --- a/src/av/AvTranscoder.hpp +++ b/src/av/AvTranscoder.hpp @@ -91,6 +91,8 @@ class Transcoder void process(std::vector& output, std::size_t maxSize); bool isComplete(void) { return _isComplete; } + const TranscodeParameters& getParameters() const { return _parameters; } + private: Transcoder(); diff --git a/src/ui/audio/AudioPlayer.cpp b/src/ui/audio/AudioPlayer.cpp index b8498493..7df769c1 100644 --- a/src/ui/audio/AudioPlayer.cpp +++ b/src/ui/audio/AudioPlayer.cpp @@ -33,9 +33,19 @@ namespace UserInterface { + +Av::Encoding +AudioPlayer::getBestEncoding() const +{ + // TODO get the supported formats of the player and pick one + return Av::Encoding::MP3; +} + + bool AudioPlayer::loadTrack(Database::Track::id_type trackId) { + // TODO reduce this scope Wt::Dbo::Transaction transaction(DboSession()); Database::Track::pointer track = Database::Track::getById(DboSession(), trackId); @@ -45,6 +55,25 @@ AudioPlayer::loadTrack(Database::Track::id_type trackId) return false; } + Database::User::pointer user = CurrentUser(); + if (!user) + { + LMS_LOG(UI, ERROR) << "No user found!"; + return false; + } + + Av::Encoding encoding; + switch (user->getAudioEncoding()) + { + case Database::AudioEncoding::MP3: encoding = Av::Encoding::MP3; break; + case Database::AudioEncoding::OGA: encoding = Av::Encoding::OGA; break; + case Database::AudioEncoding::WEBMA: encoding = Av::Encoding::WEBMA; break; + case Database::AudioEncoding::AUTO: + default: + encoding = getBestEncoding(); + break; + } + bindString("track", Wt::WString::fromUTF8(track->getName())); bindString("artist", Wt::WString::fromUTF8(track->getArtist()->getName())); _cover->setImageLink(SessionCoverResource()->getTrackUrl(trackId, 64)); @@ -75,11 +104,13 @@ AudioPlayer::loadTrack(Database::Track::id_type trackId) document.lms.audio.curTime = 0;\ "); + LMS_LOG(UI, DEBUG) << "Loading, URL = '" << SessionTranscodeResource()->getUrl(trackId, encoding, 0, streams) << "'"; + //TODO, try to load everything in JS in order to prevent the WriteError bug? _audio->pause(); _audio->clearSources(); //TODO, encoding - _audio->addSource(SessionTranscodeResource()->getUrl(trackId, Av::Encoding::MP3, 0, streams)); + _audio->addSource(SessionTranscodeResource()->getUrl(trackId, encoding, 0, streams)); _audio->setPreloadMode(Wt::WAudio::PreloadAuto); _audio->play(); diff --git a/src/ui/audio/AudioPlayer.hpp b/src/ui/audio/AudioPlayer.hpp index c2fd80c9..0527f2fa 100644 --- a/src/ui/audio/AudioPlayer.hpp +++ b/src/ui/audio/AudioPlayer.hpp @@ -24,6 +24,7 @@ #include "common/InputRange.hpp" #include "database/Types.hpp" +#include "av/AvTranscoder.hpp" namespace UserInterface { @@ -33,6 +34,7 @@ class AudioPlayer : public Wt::WTemplate AudioPlayer(Wt::WContainerWidget *parent = 0); + Av::Encoding getBestEncoding() const; bool loadTrack(Database::Track::id_type trackId); // Signals diff --git a/src/ui/resource/TranscodeResource.cpp b/src/ui/resource/TranscodeResource.cpp index b0a31482..882e1171 100644 --- a/src/ui/resource/TranscodeResource.cpp +++ b/src/ui/resource/TranscodeResource.cpp @@ -130,14 +130,17 @@ TranscodeResource::handleRequest(const Wt::Http::Request& request, transcoder = std::make_shared(track->getPath(), parameters); } - LMS_LOG(UI, DEBUG) << "Mime type set to '" << Av::encoding_to_mimetype(Av::Encoding::MP3); - response.setMimeType( Av::encoding_to_mimetype(Av::Encoding::MP3) ); + std::string mimeType = Av::encoding_to_mimetype(transcoder->getParameters().getEncoding()); + + LMS_LOG(UI, DEBUG) << "Mime type set to '" << mimeType << "'"; + response.setMimeType(mimeType); if (!transcoder->start()) { LMS_LOG(UI, ERROR) << "Cannot start transcoder"; return; } + LMS_LOG(UI, DEBUG) << "Transcoder started"; } @@ -146,21 +149,20 @@ TranscodeResource::handleRequest(const Wt::Http::Request& request, std::vector data; data.reserve(_bufferSize); - LMS_LOG(UI, DEBUG) << "Reading data from transcoder"; transcoder->process(data, _bufferSize); response.out().write(reinterpret_cast(&data[0]), data.size()); - LMS_LOG(UI, DEBUG) << "Written " << data.size() << " bytes! complete = " << std::boolalpha << transcoder->isComplete(); if (!response.out()) + { LMS_LOG(UI, ERROR) << "Write failed!"; + } } if (!transcoder->isComplete() && response.out()) { continuation = response.createContinuation(); continuation->setData(transcoder); - LMS_LOG(UI, DEBUG) << "Continuation set to " << continuation; } else LMS_LOG(UI, DEBUG) << "No more data!"; diff --git a/src/ui/settings/SettingsAudioFormView.cpp b/src/ui/settings/SettingsAudioFormView.cpp index 1af1fc18..93475c48 100644 --- a/src/ui/settings/SettingsAudioFormView.cpp +++ b/src/ui/settings/SettingsAudioFormView.cpp @@ -64,7 +64,7 @@ class AudioFormModel : public Wt::WFormModel initializeModels(); addField(BitrateField); - addField(EncodingField, "Session must be reloaded to apply this setting"); + addField(EncodingField); setValidator(BitrateField, new Wt::WValidator(true)); // mandatory setValidator(EncodingField, new Wt::WValidator(true)); // mandatory