Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qsamplecache_p.h
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QSAMPLECACHE_P_H
5#define QSAMPLECACHE_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/qmutex.h>
19#include <QtCore/qobject.h>
20#include <QtCore/qpointer.h>
21#include <QtCore/qset.h>
22#include <QtCore/qthread.h>
23#include <QtCore/qfuture.h>
24#include <QtCore/qurl.h>
25#include <QtCore/private/qglobal_p.h>
26#include <QtCore/private/qexpected_p.h>
27#include <QtMultimedia/qaudioformat.h>
28
29#include <memory>
30#include <optional>
31
32QT_BEGIN_NAMESPACE
33
34class QSampleCache;
35
36class Q_MULTIMEDIA_EXPORT QSample
37{
38public:
39 friend class QSampleCache;
40 enum State : uint8_t {
41 Creating,
42 Error,
43 Ready,
44 };
45 using SharedSamplePromise = QSharedPointer<QPromise<q23::expected<QSample *, QSample::State>>>;
46 ~QSample();
47
48 State state() const;
49 const QByteArray& data() const { Q_ASSERT(state() == Ready); return m_soundData; }
50 const QAudioFormat& format() const { Q_ASSERT(state() == Ready); return m_audioFormat; }
51
52 void setError();
53 void setData(QByteArray, QAudioFormat);
54
55 QSample(QUrl url, QSampleCache *parent);
56
57 // For testing only
58 QSample(QByteArray data, QAudioFormat format)
59 : m_parent(nullptr), m_soundData(std::move(data)), m_audioFormat(format), m_url(), m_state(Ready) {}
60
61private:
62 QSample();
63
64 // clang-format off
65 QSampleCache *m_parent;
66 QByteArray m_soundData;
67 QAudioFormat m_audioFormat;
68 const QUrl m_url;
69 State m_state = State::Creating;
70 // clang-format on
71
72 friend class QSampleCache;
73 void clearParent();
74};
75
76using SharedSamplePtr = std::shared_ptr<QSample>;
77using WeakSamplePtr = std::weak_ptr<QSample>;
78
79class Q_MULTIMEDIA_EXPORT QSampleCache : public QObject
80{
81public:
82 friend class QSample;
83
84 enum class SampleSourceType
85 {
86 File,
87 NetworkManager,
88 };
89
90 explicit QSampleCache(QObject *parent = nullptr);
91 ~QSampleCache() override;
92
93 QFuture<SharedSamplePtr> requestSampleFuture(const QUrl &);
94
95 bool isCached(const QUrl& url) const;
96
97 // For tests only
98 void setSampleSourceType(SampleSourceType sampleSourceType)
99 {
100 m_sampleSourceType = sampleSourceType;
101 }
102
103private:
104 std::unique_ptr<QIODevice> createStreamForSample(QSample &sample);
105
106private:
107 using SharedSamplePromise = std::shared_ptr<QPromise<SharedSamplePtr>>;
108
109 mutable QRecursiveMutex m_mutex;
110
111 std::map<QUrl, WeakSamplePtr> m_loadedSamples;
112 std::map<QUrl, std::pair<SharedSamplePtr, QList<SharedSamplePromise>>> m_pendingSamples;
113
114 void removeUnreferencedSample(const QUrl &url);
115
116 using SampleLoadResult = std::optional<std::pair<QByteArray, QAudioFormat>>;
117
118 static SampleLoadResult loadSample(QByteArray);
119
120#if QT_CONFIG(thread)
121 static SampleLoadResult
122 loadSample(const QUrl &, std::optional<SampleSourceType> forceSourceType = std::nullopt);
123 QThreadPool m_threadPool;
124#endif
125 QFuture<SampleLoadResult> loadSampleAsync(const QUrl &);
126
127 std::optional<SampleSourceType> m_sampleSourceType;
128};
129
130QT_END_NAMESPACE
131
132#endif // QSAMPLECACHE_P_H
QT_BEGIN_NAMESPACE Q_STATIC_LOGGING_CATEGORY(lcSynthesizedIterableAccess, "qt.iterable.synthesized", QtWarningMsg)