OSDN Git Service

[Qt][OSD][SOUND_BUFFER] Re-implement more correctness inheriting from QIODevice.
[csp-qt/common_source_project-fm7.git] / source / src / qt / sound-drivers / sound_buffer_qt.h
1 #pragma once
2
3 #include <memory>
4 #include <QIODevice>
5 #include "../../fifo_templates.h"
6
7 QT_BEGIN_NAMESPACE
8
9
10 class DLL_PREFIX SOUND_BUFFER_QT : public QIODevice
11 {
12
13     Q_OBJECT
14 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
15         using QIODeviceBase::OpenMode;
16         using QIODeviceBase::OpenModeFlag;
17 #else
18         using QIODevice::OpenMode;
19         using QIODevice::OpenModeFlag;
20 #endif
21         using BUFFER_TYPE = FIFO_BASE::LOCKED_RINGBUFFER<uint8_t>;
22 protected:
23         std::shared_ptr<BUFFER_TYPE>m_buffer;
24 public:
25         SOUND_BUFFER_QT(uint64_t depth = 0, QObject *parent = nullptr);
26         ~SOUND_BUFFER_QT();
27
28         virtual bool isSequential() const override;
29         virtual bool open(OpenMode flags) override;
30         virtual void close() override;
31
32         virtual qint64 size() const override;
33
34         virtual qint64 bytesToWrite() const override;
35         virtual qint64 bytesAvailable() const override;
36
37         virtual qint64 pos() const override;
38         virtual bool seek(qint64 pos) override;
39
40         virtual bool   atEnd() const override;
41         virtual bool   reset() override;
42         // Internal Functions.
43 protected:
44         virtual qint64 readData(char *data, qint64 len) override;
45         virtual qint64 writeData(const char *data, qint64 len) override;
46
47         // For thread safing calling.
48         std::atomic<qint64> wroteFromBefore;
49         std::atomic<bool>   is_emitted;
50
51         // Unique functions
52 public:
53         virtual bool resize(qint64 sz);
54         virtual qint64 real_buffer_size();
55         virtual qint64 read_from_buffer(char *data, qint64 len);
56         virtual qint64 write_to_buffer(const char *data, qint64 len);
57 public slots:
58         void   _emit_for_write();
59 signals:
60         int   _signal_for_write();
61 };
62
63 QT_END_NAMESPACE