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);
61 QSampleCache *m_parent;
62 QByteArray m_soundData;
63 QAudioFormat m_audioFormat;
65 State m_state = State::Creating;
68 friend class QSampleCache;
80 enum class SampleSourceType
86 explicit QSampleCache(QObject *parent =
nullptr);
87 ~QSampleCache() override;
89 QFuture<SharedSamplePtr> requestSampleFuture(
const QUrl &);
91 bool isCached(
const QUrl& url)
const;
94 void setSampleSourceType(SampleSourceType sampleSourceType)
96 m_sampleSourceType = sampleSourceType;
100 std::unique_ptr<QIODevice> createStreamForSample(QSample &sample);
103 using SharedSamplePromise = std::shared_ptr<QPromise<SharedSamplePtr>>;
105 mutable QRecursiveMutex m_mutex;
107 std::map<QUrl, WeakSamplePtr> m_loadedSamples;
108 std::map<QUrl, std::pair<SharedSamplePtr, QList<SharedSamplePromise>>> m_pendingSamples;
110 void removeUnreferencedSample(
const QUrl &url);
112 using SampleLoadResult = std::optional<std::pair<QByteArray, QAudioFormat>>;
114 static SampleLoadResult loadSample(QByteArray);
117 static SampleLoadResult
118 loadSample(
const QUrl &, std::optional<SampleSourceType> forceSourceType = std::nullopt);
119 QThreadPool m_threadPool;
121 QFuture<SampleLoadResult> loadSampleAsync(
const QUrl &);
123 std::optional<SampleSourceType> m_sampleSourceType;