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);
109 using SharedSamplePromise = std::shared_ptr<QPromise<SharedSamplePtr>>;
111 mutable QRecursiveMutex m_mutex;
113 std::map<QUrl, WeakSamplePtr> m_loadedSamples;
114 std::map<QUrl, std::pair<SharedSamplePtr, QList<SharedSamplePromise>>> m_pendingSamples;
116 void removeUnreferencedSample(
const QUrl &url);
118 using SampleLoadResult = std::optional<std::pair<QByteArray, QAudioFormat>>;
120 static SampleLoadResult loadSample(QByteArray);
123 static SampleLoadResult
124 loadSample(
const QUrl &, std::optional<SampleSourceType> forceSourceType = std::nullopt);
125 QThreadPool m_threadPool;
127 QFuture<SampleLoadResult> loadSampleAsync(
const QUrl &);
129 std::optional<SampleSourceType> m_sampleSourceType;