PonyPlayer
audioformat.hpp
浏览该文件的文档.
1//
2// Created by ColorsWind on 2022/5/15.
3//
4#pragma once
5
6#include <QtCore>
7#include <utility>
8#include "portaudio.h"
9
10INCLUDE_FFMPEG_BEGIN
11#include "libavutil/samplefmt.h"
13
14
15
17 qint32 origLength;
20};
21
23private:
24 using TransformFunc = std::function<void(std::byte *, qreal, unsigned long)>;
25
26 int m_index;
27 PaSampleFormat m_paSampleFormat;
28 AVSampleFormat m_ffmpegSampleFormat;
29 int m_bytesPerSample;
30 std::function<void(std::byte *, qreal, unsigned long)> m_transform;
31
32
34 int mIndex,
35 PaSampleFormat paSampleFormat,
36 AVSampleFormat ffmpegSampleFormat,
37 int bytesPerSample,
38 TransformFunc transformFunc
39 ) : m_index(mIndex),
40 m_paSampleFormat(paSampleFormat),
41 m_ffmpegSampleFormat(ffmpegSampleFormat),
42 m_bytesPerSample(bytesPerSample),
43 m_transform(std::move(transformFunc)) {}
44
45public:
46 template<class T>
47 static PonySampleFormat of(PaSampleFormat paSample, AVSampleFormat ffmpegSample) noexcept {
48 static int id = 0;
49 TransformFunc transform;
50 size_t size;
51 if constexpr(std::is_same<T, void>()) {
52 transform = [](std::byte *src_, qreal factor, unsigned long samples) {
53 throw std::runtime_error("Unsupported samples format.");
54 };
55 size = 0xABCDEF;
56 } else {
57 transform = [](std::byte *src_, qreal factor, unsigned long samples) {
58 T *src = static_cast<T *>(static_cast<void *>(src_));
59 for (size_t sampleOffset = 0; sampleOffset < samples; sampleOffset++) {
60 src[sampleOffset] = static_cast<T>(src[sampleOffset] * factor);
61 }
62 };
63 size = sizeof(T);
64 }
65 return {id, paSample, ffmpegSample, static_cast<int>(size), transform};
66 }
67
68
69 void transformSampleVolume(std::byte *src, qreal factor, unsigned long samples) const {
70 m_transform(src, factor, samples);
71 }
72
73 bool operator==(const PonySampleFormat &rhs) const {
74 return this->m_index == rhs.m_index;
75 }
76
77 bool operator!=(const PonySampleFormat &rhs) const {
78 return !(rhs == *this);
79 }
80
81 [[nodiscard]] PaSampleFormat getPaSampleFormat() const {
82 return m_paSampleFormat;
83 }
84
85 [[nodiscard]] AVSampleFormat getFFmpegSampleFormat() const {
86 return m_ffmpegSampleFormat;
87 }
88
89 [[nodiscard]] int getBytesPerSample() const {
90 return m_bytesPerSample;
91 }
92
93};
94
95
96
98private:
99 PonySampleFormat m_sampleFormat;
100 int m_sampleRate;
101 int m_channelCount;
102
103public:
104
106 PonySampleFormat sampleFormat,
107 int sampleRate,
108 int channelCount
109 ) noexcept: m_sampleFormat(std::move(sampleFormat)), m_sampleRate(sampleRate), m_channelCount(channelCount) {}
110
111
112 [[nodiscard]] const PonySampleFormat &getSampleFormat() const { return m_sampleFormat; }
113
114 [[nodiscard]] PaSampleFormat getSampleFormatForPA() const {
115 return m_sampleFormat.getPaSampleFormat();
116 }
117
118 [[nodiscard]] AVSampleFormat getSampleFormatForFFmpeg() const {
119 return m_sampleFormat.getFFmpegSampleFormat();
120 }
121
122 [[nodiscard]] qreal durationOfBytes(int64_t bytes) const {
123 return static_cast<qreal>(bytes) / (m_sampleRate * m_channelCount * getBytesPerSample());
124 }
125
126 [[nodiscard]] int64_t bytesOfDuration(qreal duration) const {
127 return static_cast<int64_t>(duration * m_sampleRate * m_channelCount * getBytesPerSample());
128 }
129
130 [[nodiscard]] int getBytesPerSample() const {
131 return m_sampleFormat.getBytesPerSample();
132 }
133
134 [[nodiscard]] int getBytesPerSampleChannels() const {
135 return m_sampleFormat.getBytesPerSample() * m_channelCount;
136 }
137
138 [[nodiscard]] int getSampleRate() const {
139 return m_sampleRate;
140 }
141
142 [[nodiscard]] int getChannelCount() const {
143 return m_channelCount;
144 }
145
146 [[nodiscard]] int64_t suggestedRingBuffer(qreal speedFactor) const {
147 return qBound<int64_t>(
148 static_cast<int64_t>(2 * 1024 * m_channelCount * m_sampleFormat.getBytesPerSample()),
149 bytesOfDuration(0.2 * speedFactor),
150 256 << 20
151 );
152 }
153};
154
155namespace PonyPlayer {
156#pragma GCC diagnostic push
157#pragma GCC diagnostic ignored "-Wold-style-cast"
158 const PonySampleFormat Unknown = PonySampleFormat::of<void>(paNonInterleaved, AV_SAMPLE_FMT_NONE);
159 const PonySampleFormat UInt8 = PonySampleFormat::of<uint8_t>(paUInt8, AV_SAMPLE_FMT_U8);
160 const PonySampleFormat Int16 = PonySampleFormat::of<int16_t>(paInt16, AV_SAMPLE_FMT_S16);
161 const PonySampleFormat Int32 = PonySampleFormat::of<int32_t>(paInt32, AV_SAMPLE_FMT_S32);
162 const PonySampleFormat Float = PonySampleFormat::of<float_t>(paFloat32, AV_SAMPLE_FMT_FLT);
163#pragma GCC diagnostic pop
165
166 static PonySampleFormat valueOf(AVSampleFormat ffmpegFormat) {
167 switch (ffmpegFormat) {
168 case AV_SAMPLE_FMT_U8:
169 case AV_SAMPLE_FMT_U8P:
170 return UInt8;
171 case AV_SAMPLE_FMT_S16:
172 case AV_SAMPLE_FMT_S16P:
173 return Int16;
174 case AV_SAMPLE_FMT_S32:
175 case AV_SAMPLE_FMT_S32P:
176 return Int32;
177 case AV_SAMPLE_FMT_FLT:
178 case AV_SAMPLE_FMT_FLTP:
179 return Float;
180 default:
181 return Unknown;
182 }
183 }
184
185#pragma GCC diagnostic push
186#pragma GCC diagnostic ignored "-Wold-style-cast"
187 static PonySampleFormat valueOf(PaSampleFormat paSampleFormat) {
188 switch (paSampleFormat) {
189 case paUInt8:
190 return UInt8;
191 case paInt16:
192 return Int16;
193 case paInt32:
194 return Int32;
195 case paFloat32:
196 return Float;
197 default:
198 return Unknown;
199 }
200
201 }
202#pragma GCC diagnostic pop
203}
Definition: audioformat.hpp:97
int getBytesPerSample() const
Definition: audioformat.hpp:130
int getChannelCount() const
Definition: audioformat.hpp:142
AVSampleFormat getSampleFormatForFFmpeg() const
Definition: audioformat.hpp:118
int getBytesPerSampleChannels() const
Definition: audioformat.hpp:134
int64_t suggestedRingBuffer(qreal speedFactor) const
Definition: audioformat.hpp:146
const PonySampleFormat & getSampleFormat() const
Definition: audioformat.hpp:112
int getSampleRate() const
Definition: audioformat.hpp:138
int64_t bytesOfDuration(qreal duration) const
Definition: audioformat.hpp:126
PonyAudioFormat(PonySampleFormat sampleFormat, int sampleRate, int channelCount) noexcept
Definition: audioformat.hpp:105
qreal durationOfBytes(int64_t bytes) const
Definition: audioformat.hpp:122
PaSampleFormat getSampleFormatForPA() const
Definition: audioformat.hpp:114
Definition: audioformat.hpp:155
const PonySampleFormat UInt8
Definition: audioformat.hpp:159
const PonySampleFormat Float
Definition: audioformat.hpp:162
const PonySampleFormat Int16
Definition: audioformat.hpp:160
const PonyAudioFormat DEFAULT_AUDIO_FORMAT
Definition: audioformat.hpp:164
const PonySampleFormat Unknown
Definition: audioformat.hpp:158
const PonySampleFormat Int32
Definition: audioformat.hpp:161
#define INCLUDE_FFMPEG_END
Definition: ponyplayer.h:26
Definition: audioformat.hpp:16
qint32 processedLength
Definition: audioformat.hpp:18
qint32 origLength
Definition: audioformat.hpp:17
qreal speedUpRate
Definition: audioformat.hpp:19
Definition: audioformat.hpp:22
void transformSampleVolume(std::byte *src, qreal factor, unsigned long samples) const
Definition: audioformat.hpp:69
int getBytesPerSample() const
Definition: audioformat.hpp:89
bool operator!=(const PonySampleFormat &rhs) const
Definition: audioformat.hpp:77
PaSampleFormat getPaSampleFormat() const
Definition: audioformat.hpp:81
static PonySampleFormat of(PaSampleFormat paSample, AVSampleFormat ffmpegSample) noexcept
Definition: audioformat.hpp:47
bool operator==(const PonySampleFormat &rhs) const
Definition: audioformat.hpp:73
AVSampleFormat getFFmpegSampleFormat() const
Definition: audioformat.hpp:85