From 1e9ab4a54fe53bc09416b90b777abcb998954ab1 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Fri, 30 Oct 2009 14:22:52 +0100 Subject: Tabbed UI: Automatically downloads playlists in background Downloads cover art and has "now playing" tab No search at the moment Buggy currently. --- coverdatabase.cpp | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 coverdatabase.cpp (limited to 'coverdatabase.cpp') diff --git a/coverdatabase.cpp b/coverdatabase.cpp new file mode 100644 index 0000000..89a1d60 --- /dev/null +++ b/coverdatabase.cpp @@ -0,0 +1,112 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/* + Logic paraphrased from Andreas Kling's repository at + + http://qt.gitorious.org/~andreaskling/qt-labs/andreasklings-qtspotify +*/ + +#include "coverdatabase.h" +#include "despotify_cpp.h" + +#include +#include +#include +#include + +CoverDatabase::CoverDatabase(despotify_session *session, QObject *parent) + : QObject(parent), m_session(session) +{ +} + +CoverDatabase::~CoverDatabase() +{ +} + +void CoverDatabase::loadCover(const QByteArray &coverId) +{ + Q_ASSERT(m_session != 0); + + m_currentCoverId = coverId; + if (m_pendingCovers.contains(coverId)) + return; + + { + QMutexLocker locker(&m_coverCacheLock); + QImage img = m_coverCache.value(coverId); + + if (!img.isNull()) { + emit coverLoaded(QPixmap::fromImage(img)); + return; + } + } + + QFuture imageDataFetcher = QtConcurrent::run(this, &CoverDatabase::fetchImageData, + coverId); + QFutureWatcher *imageDataFetcherWatcher = new QFutureWatcher(this); + connect(imageDataFetcherWatcher, SIGNAL(finished()), this, SLOT(imageDataFetched())); + imageDataFetcherWatcher->setFuture(imageDataFetcher); +} + +QByteArray CoverDatabase::fetchImageData(const QByteArray &coverId) +{ + Q_ASSERT(m_session != 0); + + void *data; + int len; + + { + /* despotify doesn't like having multiple get_image calls running */ + static QMutex despotify_get_image_mutex; + QMutexLocker locker(&despotify_get_image_mutex); + data = despotify_get_image(m_session, const_cast(coverId.data()), &len); + } + + free(data); + + QImage img = data != 0 ? QImage::fromData(static_cast(data), len, "JPEG") : QImage(); + { + QMutexLocker locker(&m_coverCacheLock); + m_coverCache.insert(coverId, img); + } + + return coverId; +} + +void CoverDatabase::imageDataFetched() +{ + QFutureWatcher *watcher = static_cast *>(sender()); + Q_ASSERT(watcher != 0); + + QByteArray coverId = watcher->result(); + m_pendingCovers.remove(coverId); + { + QMutexLocker locker(&m_coverCacheLock); + if (coverId == m_currentCoverId) + emit coverLoaded(QPixmap::fromImage(m_coverCache.value(m_currentCoverId))); + } + +} -- cgit v1.2.3