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