[UI] Restored audio encoding setting

This commit is contained in:
emeric
2016-01-16 19:04:46 +01:00
parent 027e9d9bf7
commit 5151d779ae
5 changed files with 44 additions and 7 deletions
+2
View File
@@ -91,6 +91,8 @@ class Transcoder
void process(std::vector<unsigned char>& output, std::size_t maxSize); void process(std::vector<unsigned char>& output, std::size_t maxSize);
bool isComplete(void) { return _isComplete; } bool isComplete(void) { return _isComplete; }
const TranscodeParameters& getParameters() const { return _parameters; }
private: private:
Transcoder(); Transcoder();
+32 -1
View File
@@ -33,9 +33,19 @@
namespace UserInterface { namespace UserInterface {
Av::Encoding
AudioPlayer::getBestEncoding() const
{
// TODO get the supported formats of the player and pick one
return Av::Encoding::MP3;
}
bool bool
AudioPlayer::loadTrack(Database::Track::id_type trackId) AudioPlayer::loadTrack(Database::Track::id_type trackId)
{ {
// TODO reduce this scope
Wt::Dbo::Transaction transaction(DboSession()); Wt::Dbo::Transaction transaction(DboSession());
Database::Track::pointer track = Database::Track::getById(DboSession(), trackId); Database::Track::pointer track = Database::Track::getById(DboSession(), trackId);
@@ -45,6 +55,25 @@ AudioPlayer::loadTrack(Database::Track::id_type trackId)
return false; 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("track", Wt::WString::fromUTF8(track->getName()));
bindString("artist", Wt::WString::fromUTF8(track->getArtist()->getName())); bindString("artist", Wt::WString::fromUTF8(track->getArtist()->getName()));
_cover->setImageLink(SessionCoverResource()->getTrackUrl(trackId, 64)); _cover->setImageLink(SessionCoverResource()->getTrackUrl(trackId, 64));
@@ -75,11 +104,13 @@ AudioPlayer::loadTrack(Database::Track::id_type trackId)
document.lms.audio.curTime = 0;\ 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? //TODO, try to load everything in JS in order to prevent the WriteError bug?
_audio->pause(); _audio->pause();
_audio->clearSources(); _audio->clearSources();
//TODO, encoding //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->setPreloadMode(Wt::WAudio::PreloadAuto);
_audio->play(); _audio->play();
+2
View File
@@ -24,6 +24,7 @@
#include "common/InputRange.hpp" #include "common/InputRange.hpp"
#include "database/Types.hpp" #include "database/Types.hpp"
#include "av/AvTranscoder.hpp"
namespace UserInterface { namespace UserInterface {
@@ -33,6 +34,7 @@ class AudioPlayer : public Wt::WTemplate
AudioPlayer(Wt::WContainerWidget *parent = 0); AudioPlayer(Wt::WContainerWidget *parent = 0);
Av::Encoding getBestEncoding() const;
bool loadTrack(Database::Track::id_type trackId); bool loadTrack(Database::Track::id_type trackId);
// Signals // Signals
+7 -5
View File
@@ -130,14 +130,17 @@ TranscodeResource::handleRequest(const Wt::Http::Request& request,
transcoder = std::make_shared<Av::Transcoder>(track->getPath(), parameters); transcoder = std::make_shared<Av::Transcoder>(track->getPath(), parameters);
} }
LMS_LOG(UI, DEBUG) << "Mime type set to '" << Av::encoding_to_mimetype(Av::Encoding::MP3); std::string mimeType = Av::encoding_to_mimetype(transcoder->getParameters().getEncoding());
response.setMimeType( Av::encoding_to_mimetype(Av::Encoding::MP3) );
LMS_LOG(UI, DEBUG) << "Mime type set to '" << mimeType << "'";
response.setMimeType(mimeType);
if (!transcoder->start()) if (!transcoder->start())
{ {
LMS_LOG(UI, ERROR) << "Cannot start transcoder"; LMS_LOG(UI, ERROR) << "Cannot start transcoder";
return; return;
} }
LMS_LOG(UI, DEBUG) << "Transcoder started"; LMS_LOG(UI, DEBUG) << "Transcoder started";
} }
@@ -146,21 +149,20 @@ TranscodeResource::handleRequest(const Wt::Http::Request& request,
std::vector<unsigned char> data; std::vector<unsigned char> data;
data.reserve(_bufferSize); data.reserve(_bufferSize);
LMS_LOG(UI, DEBUG) << "Reading data from transcoder";
transcoder->process(data, _bufferSize); transcoder->process(data, _bufferSize);
response.out().write(reinterpret_cast<char*>(&data[0]), data.size()); response.out().write(reinterpret_cast<char*>(&data[0]), data.size());
LMS_LOG(UI, DEBUG) << "Written " << data.size() << " bytes! complete = " << std::boolalpha << transcoder->isComplete(); LMS_LOG(UI, DEBUG) << "Written " << data.size() << " bytes! complete = " << std::boolalpha << transcoder->isComplete();
if (!response.out()) if (!response.out())
{
LMS_LOG(UI, ERROR) << "Write failed!"; LMS_LOG(UI, ERROR) << "Write failed!";
}
} }
if (!transcoder->isComplete() && response.out()) { if (!transcoder->isComplete() && response.out()) {
continuation = response.createContinuation(); continuation = response.createContinuation();
continuation->setData(transcoder); continuation->setData(transcoder);
LMS_LOG(UI, DEBUG) << "Continuation set to " << continuation;
} }
else else
LMS_LOG(UI, DEBUG) << "No more data!"; LMS_LOG(UI, DEBUG) << "No more data!";
+1 -1
View File
@@ -64,7 +64,7 @@ class AudioFormModel : public Wt::WFormModel
initializeModels(); initializeModels();
addField(BitrateField); addField(BitrateField);
addField(EncodingField, "Session must be reloaded to apply this setting"); addField(EncodingField);
setValidator(BitrateField, new Wt::WValidator(true)); // mandatory setValidator(BitrateField, new Wt::WValidator(true)); // mandatory
setValidator(EncodingField, new Wt::WValidator(true)); // mandatory setValidator(EncodingField, new Wt::WValidator(true)); // mandatory