2#include <Media/AudioDecoder.hpp>
3#include <Media/SndfileDecoder.hpp>
5#include <score/tools/std/StringHash.hpp>
7#include <ossia/audio/drwav_handle.hpp>
8#include <ossia/detail/hash_map.hpp>
9#include <ossia/detail/nullable_variant.hpp>
10#include <ossia/detail/small_vector.hpp>
14#include <nano_signal_slot.hpp>
15#include <score_plugin_media_export.h>
25struct DocumentContext;
36static constexpr inline int64_t abs_max(int64_t f1, int64_t f2)
noexcept
38 return f2 >= 0 ? f1 < f2 ? f2 : f1 : f1 < -f2 ? f2 : f1;
41static constexpr inline float abs_max(
float f1,
float f2)
noexcept
43 const int mul = (f2 >= 0.f) ? 1 : -1;
50static constexpr inline float abs_max(
float f1,
float f2)
noexcept
52 return f2 >= 0.f ? f1 < f2 ? f2 : f1 : f1 < -f2 ? f2 : f1;
56enum class DecodingMethod
68 QString absoluteFilePath;
69 DecodingMethod method{};
73struct SCORE_PLUGIN_MEDIA_EXPORT
AudioFile final :
public QObject
76 static bool isSupported(
const QFile& f);
77 static bool isSupportedVideo(
const QFile& f);
88 QString
fileName()
const {
return m_fileName; }
93 int sampleRate()
const {
return m_sampleRate; }
95 int64_t decodedSamples()
const;
98 int64_t samples()
const;
99 int64_t channels()
const;
101 bool empty()
const {
return channels() == 0 || samples() == 0; }
102 bool finishedDecoding() const noexcept {
return m_fullyDecoded; }
104 const RMSData& rms()
const;
107 ossia::audio_array getAudioArray()
const;
109 Nano::Signal<void()> on_mediaChanged;
110 Nano::Signal<void()> on_newData;
111 Nano::Signal<void()> on_finishedDecoding;
115 std::shared_ptr<QFile> file;
117 ossia::drwav_handle wav;
122 ossia::audio_handle handle;
123 ossia::small_vector<ossia::audio_sample*, 8> data;
146 using libav_ptr = std::shared_ptr<LibavReader>;
151 = ossia::nullable_variant<mmap_ptr, libav_ptr, sndfile_ptr, libav_stream_ptr>;
156 ossia::drwav_handle wav;
161 std::shared_ptr<ossia::libav_handle> handle;
166 ossia::small_vector<audio_sample*, 8> data;
171 using impl_t::impl_t;
173 : impl_t{std::move(ptr)}
177 : impl_t{std::move(ptr)}
181 : impl_t{std::move(ptr)}
185 : impl_t{std::move(ptr)}
190 ((impl_t&)*
this) = std::move(ptr);
193 Handle& operator=(libav_ptr&& ptr)
195 ((impl_t&)*
this) = std::move(ptr);
200 ((impl_t&)*
this) = std::move(ptr);
205 ((impl_t&)*
this) = std::move(ptr);
210 using view_impl_t = ossia::nullable_variant<MmapView, RAMView, StreamView>;
213 using view_impl_t::view_impl_t;
216 void frame(int64_t start_frame, ossia::small_vector<float, 8>& out)
noexcept;
218 int64_t start_frame, int64_t end_frame,
219 ossia::small_vector<float, 8>& out)
noexcept;
221 int64_t start_frame, int64_t end_frame,
222 ossia::small_vector<FloatPair, 8>& out)
noexcept;
226 ViewHandle handle() const noexcept {
return m_impl; }
228 const Handle& unsafe_handle() const noexcept {
return m_impl; }
230 std::optional<double> knownTempo() const noexcept;
233 void load_libav(
int rate);
234 void load_libav_stream();
238 friend class SoundComponentSetup;
240 QString m_originalFile;
247 bool m_fullyDecoded{};
259 std::shared_ptr<AudioFile>
262 std::shared_ptr<AudioFile> get(
const QString& absolutePath,
int stream);
269 std::size_t operator()(
const StreamInfo& f)
const noexcept
271 constexpr const QtPrivate::QHashCombine combine{
272#if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
277 h = combine(h, f.file);
278 h = combine(h, f.stream);
282 bool operator==(
const StreamInfo& other)
const noexcept
284 return file == other.file && stream == other.stream;
289 ossia::hash_map<StreamInfo, std::shared_ptr<AudioFile>, StreamInfo::hash> m_handles;
295SCORE_PLUGIN_MEDIA_EXPORT
296void writeAudioArrayToFile(
const QString& path,
const ossia::audio_array& arr,
int fs);
298std::optional<double> estimateTempo(
const AudioFile& file);
299std::optional<double> estimateTempo(
const QString& filePath);
301std::optional<AudioInfo> probe(
const QString& path);
305Q_DECLARE_METATYPE(std::shared_ptr<Media::AudioFile>)
306W_REGISTER_ARGTYPE(std::shared_ptr<Media::AudioFile>)
Base toolkit upon which the software is built.
Definition Application.cpp:113
Definition DocumentContext.hpp:18