39 friend class QSampleCache;
40 enum State : uint8_t {
45 using SharedSamplePromise = QSharedPointer<QPromise<q23::expected<QSample *, QSample::State>>>;
49 const QByteArray& data()
const { Q_ASSERT(state() == Ready);
return m_soundData; }
50 const QAudioFormat& format()
const { Q_ASSERT(state() == Ready);
return m_audioFormat; }
53 void setData(QByteArray, QAudioFormat);
55 QSample(QUrl url, QSampleCache *parent);
58 QSample(QByteArray data, QAudioFormat format)
59 : m_parent(
nullptr), m_soundData(std::move(data)), m_audioFormat(format), m_url(), m_state(Ready) {}
65 QSampleCache *m_parent;
66 QByteArray m_soundData;
67 QAudioFormat m_audioFormat;
69 State m_state = State::Creating;
72 friend class QSampleCache;
84 enum class SampleSourceType
90 static QSampleCache *instance();
92 explicit QSampleCache(QObject *parent =
nullptr);
93 ~QSampleCache() override;
95 QFuture<SharedSamplePtr> requestSampleFuture(
const QUrl &);
97 bool isCached(
const QUrl& url)
const;
100 void setSampleSourceType(SampleSourceType sampleSourceType)
102 m_sampleSourceType = sampleSourceType;
106 std::unique_ptr<QIODevice> createStreamForSample(QSample &sample);
108 QThreadPool *threadPool();
112 using SharedSamplePromise = std::shared_ptr<QPromise<SharedSamplePtr>>;
114 mutable QRecursiveMutex m_mutex;
116 std::map<QUrl, WeakSamplePtr> m_loadedSamples;
117 std::map<QUrl, std::pair<SharedSamplePtr, QList<SharedSamplePromise>>> m_pendingSamples;
119 void removeUnreferencedSample(
const QUrl &url);
121 using SampleLoadResult = std::optional<std::pair<QByteArray, QAudioFormat>>;
123 static SampleLoadResult loadSample(QSpan<
const char>);
126 static SampleLoadResult
127 loadSample(
const QUrl &, std::optional<SampleSourceType> forceSourceType = std::nullopt);
129 QThreadPool m_threadPool{
this };
132 QFuture<SampleLoadResult> loadSampleAsync(
const QUrl &);
134 std::optional<SampleSourceType> m_sampleSourceType;