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 explicit QSampleCache(QObject *parent =
nullptr);
91 ~QSampleCache() override;
93 QFuture<SharedSamplePtr> requestSampleFuture(
const QUrl &);
95 bool isCached(
const QUrl& url)
const;
98 void setSampleSourceType(SampleSourceType sampleSourceType)
100 m_sampleSourceType = sampleSourceType;
104 std::unique_ptr<QIODevice> createStreamForSample(QSample &sample);
107 using SharedSamplePromise = std::shared_ptr<QPromise<SharedSamplePtr>>;
109 mutable QRecursiveMutex m_mutex;
111 std::map<QUrl, WeakSamplePtr> m_loadedSamples;
112 std::map<QUrl, std::pair<SharedSamplePtr, QList<SharedSamplePromise>>> m_pendingSamples;
114 void removeUnreferencedSample(
const QUrl &url);
116 using SampleLoadResult = std::optional<std::pair<QByteArray, QAudioFormat>>;
118 static SampleLoadResult loadSample(QByteArray);
121 static SampleLoadResult
122 loadSample(
const QUrl &, std::optional<SampleSourceType> forceSourceType = std::nullopt);
123 QThreadPool m_threadPool;
125 QFuture<SampleLoadResult> loadSampleAsync(
const QUrl &);
127 std::optional<SampleSourceType> m_sampleSourceType;