7#include <QtNetwork/QNetworkAccessManager>
8#include <QtNetwork/QNetworkReply>
9#include <QtNetwork/QNetworkRequest>
11#include <QtCore/QDebug>
12#include <QtCore/qloggingcategory.h>
68 , m_networkAccessManager(
nullptr)
71 , m_loadingRefCount(0)
78 if (!m_networkAccessManager)
80 return *m_networkAccessManager;
85 const std::lock_guard<QRecursiveMutex> locker(m_mutex);
87 m_loadingThread.
quit();
88 m_loadingThread.
wait();
96 const auto copyStaleSamples = m_staleSamples;
97 for (
QSample* sample : copyStaleSamples)
100 delete m_networkAccessManager;
103void QSampleCache::loadingRelease()
107 if (m_loadingRefCount == 0) {
109 if (m_networkAccessManager) {
111 m_networkAccessManager =
nullptr;
113 m_loadingThread.
exit();
125 const std::lock_guard<QRecursiveMutex> locker(m_mutex);
132 m_loadingMutex.
lock();
133 const bool needsThreadStart = m_loadingRefCount == 0;
137 qCDebug(qLcSampleCache) <<
"QSampleCache: request sample [" <<
url <<
"]";
138 std::unique_lock<QRecursiveMutex> locker(m_mutex);
141 if (
it == m_samples.
end()) {
142 if (needsThreadStart) {
144 m_loadingThread.
wait();
145 m_loadingThread.
start();
159 sample->loadIfNecessary();
165 const std::lock_guard<QRecursiveMutex> locker(m_mutex);
168 qCDebug(qLcSampleCache) <<
"QSampleCache: capacity changes from " << m_capacity <<
"to " <<
capacity;
169 if (m_capacity > 0 &&
capacity <= 0) {
172 if (sample->m_ref == 0) {
173 unloadSample(sample);
186void QSampleCache::unloadSample(
QSample *sample)
188 m_usage -= sample->m_soundData.
size();
189 m_staleSamples.
insert(sample);
194void QSampleCache::refresh(
qint64 usageChange)
196 const std::lock_guard<QRecursiveMutex> locker(m_mutex);
197 m_usage += usageChange;
198 if (m_capacity <= 0 || m_usage <= m_capacity)
206 if (sample->m_ref > 0) {
210 recoveredSize += sample->m_soundData.
size();
211 unloadSample(sample);
213 if (m_usage <= m_capacity)
217 qCDebug(qLcSampleCache) <<
"QSampleCache: refresh(" << usageChange
218 <<
") recovered size =" << recoveredSize
219 <<
"new usage =" << m_usage;
221 if (m_usage > m_capacity)
222 qWarning() <<
"QSampleCache: usage[" << m_usage <<
" out of limit[" << m_capacity <<
"]";
226void QSampleCache::removeUnreferencedSample(
QSample *sample)
228 const std::lock_guard<QRecursiveMutex> locker(m_mutex);
229 m_staleSamples.
remove(sample);
237 m_parent->removeUnreferencedSample(
this);
245void QSample::loadIfNecessary()
252 qobject_cast<QSampleCache*>(m_parent)->loadingRelease();
257bool QSampleCache::notifyUnreferencedSample(
QSample* sample)
260 m_loadingThread.
wait();
262 const std::lock_guard<QRecursiveMutex> locker(m_mutex);
266 m_samples.
remove(sample->m_url);
267 unloadSample(sample);
278 m_parent->notifyUnreferencedSample(
this);
284void QSample::cleanup()
286 qCDebug(qLcSampleCache) <<
"QSample: cleanup";
296 m_waveDecoder =
nullptr;
301void QSample::addRef()
307void QSample::readSample()
315 qint64(m_waveDecoder->
size() - m_sampleReadLength)));
316 qCDebug(qLcSampleCache) <<
"QSample: readSample" <<
read;
318 m_sampleReadLength +=
read;
319 if (m_sampleReadLength < m_waveDecoder->
size())
326void QSample::decoderReady()
332 qCDebug(qLcSampleCache) <<
"QSample: decoder ready";
333 m_parent->refresh(m_waveDecoder->
size());
336 m_sampleReadLength = 0;
340 m_sampleReadLength +=
read;
341 if (m_sampleReadLength >= m_waveDecoder->
size())
359 qCDebug(qLcSampleCache) <<
"QSample: load [" << m_url <<
"]";
376 qCDebug(qLcSampleCache) <<
"QSample: loading error" << errorCode;
379 qobject_cast<QSampleCache*>(m_parent)->loadingRelease();
384void QSample::decoderError()
390 qCDebug(qLcSampleCache) <<
"QSample: decoder error";
393 qobject_cast<QSampleCache*>(m_parent)->loadingRelease();
398void QSample::onReady()
404 qCDebug(qLcSampleCache) <<
"QSample: load ready format:" << m_audioFormat;
407 qobject_cast<QSampleCache*>(m_parent)->loadingRelease();
417 , m_sampleReadLength(0)
425#include "moc_qsamplecache_p.cpp"
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
void resize(qsizetype size)
Sets the size of the byte array to size bytes.
qint64 read(char *data, qint64 maxlen)
Reads at most maxSize bytes from the device into data, and returns the number of bytes read.
iterator insert(const Key &key, const T &value)
iterator erase(const_iterator it)
bool contains(const Key &key) const
const_iterator cend() const
size_type remove(const Key &key)
const_iterator cbegin() const
iterator find(const Key &key)
void unlock() noexcept
Unlocks this mutex locker.
void unlock() noexcept
Unlocks the mutex.
void lock() noexcept
Locks the mutex.
The QNetworkAccessManager class allows the application to send network requests and receive replies.
QNetworkReply * get(const QNetworkRequest &request)
Posts a request to obtain the contents of the target request and returns a new QNetworkReply object o...
NetworkError
Indicates all possible error conditions found during the processing of the request.
The QNetworkRequest class holds a request to be sent with QNetworkAccessManager.
void moveToThread(QThread *thread)
Changes the thread affinity for this object and its children.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
QString objectName
the name of this object
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
Q_WEAK_OVERLOAD void setObjectName(const QString &name)
Sets the object's name to name.
void deleteLater()
\threadsafe
QSample * requestSample(const QUrl &url)
QSampleCache(QObject *parent=nullptr)
void setCapacity(qint64 capacity)
bool isCached(const QUrl &url) const
QSample(const QUrl &url, QSampleCache *parent)
bool remove(const T &value)
iterator insert(const T &value)
void start(Priority=InheritPriority)
static QThread * currentThread()
bool wait(QDeadlineTimer deadline=QDeadlineTimer(QDeadlineTimer::Forever))
qint64 bytesAvailable() const override
Returns the number of bytes that are available for reading.
qint64 size() const override
For open random-access devices, this function returns the size of the device.
QAudioFormat audioFormat() const
bool open(QIODevice::OpenMode mode) override
QSet< QString >::iterator it
Combined button and popup list for selecting options.
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
constexpr const T & qMin(const T &a, const T &b)
GLenum GLuint GLintptr GLsizeiptr size
[1]
QLatin1StringView QLatin1String
ReturnedValue read(const char *data)
QUrl url("example.com")
[constructor-url-reference]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent