1 #pragma once
2 
3 #define OV_EXCLUDE_STATIC_CALLBACKS
4 #include <opus/opusfile.h>
5 
6 #include "sources/soundsourceprovider.h"
7 #include "util/samplebuffer.h"
8 
9 namespace mixxx {
10 
11 class SoundSourceOpus final : public SoundSource {
12   public:
13     explicit SoundSourceOpus(const QUrl& url);
14     ~SoundSourceOpus() override;
15 
16     std::pair<ImportResult, QDateTime> importTrackMetadataAndCoverImage(
17             TrackMetadata* pTrackMetadata,
18             QImage* pCoverArt) const override;
19 
20     void close() override;
21 
22   protected:
23     ReadableSampleFrames readSampleFramesClamped(
24             const WritableSampleFrames& sampleFrames) override;
25 
26   private:
27     OpenResult tryOpen(
28             OpenMode mode,
29             const OpenParams& params) override;
30 
31     OggOpusFile* m_pOggOpusFile;
32 
33     SampleBuffer m_prefetchSampleBuffer;
34 
35     SINT m_curFrameIndex;
36 };
37 
38 class SoundSourceProviderOpus : public SoundSourceProvider {
39   public:
40     static const QString kDisplayName;
41     static const QStringList kSupportedFileExtensions;
42 
getDisplayName()43     QString getDisplayName() const override {
44         return kDisplayName;
45     }
46 
getSupportedFileExtensions()47     QStringList getSupportedFileExtensions() const override {
48         return kSupportedFileExtensions;
49     }
50 
51     SoundSourceProviderPriority getPriorityHint(
52             const QString& supportedFileExtension) const override;
53 
newSoundSource(const QUrl & url)54     SoundSourcePointer newSoundSource(const QUrl& url) override {
55         return newSoundSourceFromUrl<SoundSourceOpus>(url);
56     }
57 };
58 
59 } // namespace mixxx
60