30
30
#include < libaudcore/plugin.h>
31
31
#include < libaudcore/runtime.h>
32
32
33
+ #include < QtGlobal>
34
+ #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
35
+ #include < QAudioDevice>
36
+ #include < QAudioFormat>
37
+ #include < QAudioSink>
38
+ #include < QMediaDevices>
39
+ #else
33
40
#include < QAudioOutput>
41
+ #endif
34
42
35
43
#define VOLUME_RANGE 40 /* decibels */
36
44
#define NS_PER_SECOND 1000000000
37
45
38
- class QtAudio : public OutputPlugin
46
+ class QtAudioOutput : public OutputPlugin
39
47
{
40
48
public:
41
49
static const char about[];
@@ -47,7 +55,7 @@ class QtAudio : public OutputPlugin
47
55
about
48
56
};
49
57
50
- constexpr QtAudio () : OutputPlugin (info, 1 ) {}
58
+ constexpr QtAudioOutput () : OutputPlugin (info, 1 ) {}
51
59
52
60
bool init ();
53
61
@@ -70,15 +78,15 @@ class QtAudio : public OutputPlugin
70
78
timespec calc_abs_time (const timespec & rel_time);
71
79
};
72
80
73
- EXPORT QtAudio aud_plugin_instance;
81
+ EXPORT QtAudioOutput aud_plugin_instance;
74
82
75
- const char QtAudio ::about[] =
83
+ const char QtAudioOutput ::about[] =
76
84
N_ (" QtMultimedia Audio Output Plugin for Audacious\n "
77
85
" Copyright 2014 William Pitcock\n\n "
78
86
" Based on SDL Output Plugin for Audacious\n "
79
87
" Copyright 2010 John Lindgren" );
80
88
81
- const char * const QtAudio ::defaults[] = {
89
+ const char * const QtAudioOutput ::defaults[] = {
82
90
" vol_left" , " 100" ,
83
91
" vol_right" , " 100" ,
84
92
nullptr };
@@ -93,18 +101,36 @@ static bool paused;
93
101
static int last_buffered, delay_estimate;
94
102
static timeval last_system_time;
95
103
104
+ #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
105
+ static QAudioSink * output_instance = nullptr ;
106
+ #else
96
107
static QAudioOutput * output_instance = nullptr ;
108
+ #endif
97
109
static QIODevice * buffer_instance = nullptr ;
98
110
99
111
struct FormatDescriptionMap {
100
112
int aud_format;
101
-
113
+ #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
114
+ enum QAudioFormat::SampleFormat sample_format;
115
+ #else
102
116
unsigned int sample_size;
103
117
enum QAudioFormat::SampleType sample_type;
104
- enum QAudioFormat::Endian endian;
118
+ enum QAudioFormat::Endian endian;
119
+ #endif
105
120
};
106
121
107
122
static constexpr FormatDescriptionMap FormatMap[] = {
123
+ #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
124
+ {FMT_S16_LE, QAudioFormat::Int16},
125
+ {FMT_S16_BE, QAudioFormat::Int16},
126
+ {FMT_U16_LE, QAudioFormat::Int16},
127
+ {FMT_U16_BE, QAudioFormat::Int16},
128
+ {FMT_S32_LE, QAudioFormat::Int32},
129
+ {FMT_S32_BE, QAudioFormat::Int32},
130
+ {FMT_U32_LE, QAudioFormat::Int32},
131
+ {FMT_U32_BE, QAudioFormat::Int32},
132
+ {FMT_FLOAT, QAudioFormat::Float},
133
+ #else
108
134
{FMT_S16_LE, 16 , QAudioFormat::SignedInt, QAudioFormat::LittleEndian},
109
135
{FMT_S16_BE, 16 , QAudioFormat::SignedInt, QAudioFormat::BigEndian},
110
136
{FMT_U16_LE, 16 , QAudioFormat::UnSignedInt, QAudioFormat::LittleEndian},
@@ -114,20 +140,21 @@ static constexpr FormatDescriptionMap FormatMap[] = {
114
140
{FMT_U32_LE, 32 , QAudioFormat::UnSignedInt, QAudioFormat::LittleEndian},
115
141
{FMT_U32_BE, 32 , QAudioFormat::UnSignedInt, QAudioFormat::BigEndian},
116
142
{FMT_FLOAT, 32 , QAudioFormat::Float, QAudioFormat::LittleEndian},
143
+ #endif
117
144
};
118
145
119
- bool QtAudio ::init ()
146
+ bool QtAudioOutput ::init ()
120
147
{
121
148
aud_config_set_defaults (" qtaudio" , defaults);
122
149
return true ;
123
150
}
124
151
125
- StereoVolume QtAudio ::get_volume ()
152
+ StereoVolume QtAudioOutput ::get_volume ()
126
153
{
127
154
return {aud_get_int (" qtaudio" , " vol_left" ), aud_get_int (" qtaudio" , " vol_right" )};
128
155
}
129
156
130
- void QtAudio ::set_volume (StereoVolume v)
157
+ void QtAudioOutput ::set_volume (StereoVolume v)
131
158
{
132
159
int vol_max = aud::max (v.left , v.right );
133
160
@@ -142,7 +169,7 @@ void QtAudio::set_volume (StereoVolume v)
142
169
}
143
170
}
144
171
145
- bool QtAudio ::open_audio (int format, int rate, int chan, String & error)
172
+ bool QtAudioOutput ::open_audio (int format, int rate, int chan, String & error)
146
173
{
147
174
const FormatDescriptionMap * m = nullptr ;
148
175
@@ -178,19 +205,30 @@ bool QtAudio::open_audio (int format, int rate, int chan, String & error)
178
205
QAudioFormat fmt;
179
206
fmt.setSampleRate (rate);
180
207
fmt.setChannelCount (chan);
208
+
209
+ #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
210
+ /* How do we need to handle signed/unsigned formats and endianess? */
211
+ fmt.setSampleFormat (m->sample_format );
212
+ QAudioDevice info = QMediaDevices::defaultAudioOutput ();
213
+ #else
181
214
fmt.setSampleSize (m->sample_size );
182
215
fmt.setCodec (" audio/pcm" );
183
216
fmt.setByteOrder (m->endian );
184
217
fmt.setSampleType (m->sample_type );
185
-
186
218
QAudioDeviceInfo info (QAudioDeviceInfo::defaultOutputDevice ());
219
+ #endif
220
+
187
221
if (! info.isFormatSupported (fmt))
188
222
{
189
223
error = String (" QtAudio error: Format not supported by backend." );
190
224
return false ;
191
225
}
192
226
193
- output_instance = new QAudioOutput (fmt, nullptr );
227
+ #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
228
+ output_instance = new QAudioSink (info, fmt);
229
+ #else
230
+ output_instance = new QAudioOutput (fmt);
231
+ #endif
194
232
output_instance->setBufferSize (buffer_size);
195
233
buffer_instance = output_instance->start ();
196
234
@@ -199,7 +237,7 @@ bool QtAudio::open_audio (int format, int rate, int chan, String & error)
199
237
return true ;
200
238
}
201
239
202
- void QtAudio ::close_audio ()
240
+ void QtAudioOutput ::close_audio ()
203
241
{
204
242
AUDDBG (" Closing audio.\n " );
205
243
@@ -209,11 +247,11 @@ void QtAudio::close_audio ()
209
247
output_instance = nullptr ;
210
248
}
211
249
212
- void QtAudio ::period_wait ()
250
+ void QtAudioOutput ::period_wait ()
213
251
{
214
252
pthread_mutex_lock (& mutex);
215
253
216
- while (output_instance->bytesFree () < output_instance-> periodSize () )
254
+ while (output_instance->bytesFree () == 0 )
217
255
{
218
256
timespec ts = calc_abs_time (fifty_ms);
219
257
pthread_cond_timedwait (& cond, & mutex, & ts);
@@ -222,19 +260,19 @@ void QtAudio::period_wait ()
222
260
pthread_mutex_unlock (& mutex);
223
261
}
224
262
225
- int QtAudio ::write_audio (const void * data, int len)
263
+ int QtAudioOutput ::write_audio (const void * data, int len)
226
264
{
227
265
pthread_mutex_lock (& mutex);
228
266
229
- len = aud::min (len, output_instance->bytesFree ());
267
+ len = aud::min< int > (len, output_instance->bytesFree ());
230
268
buffer_instance->write ((const char *) data, len);
231
269
last_buffered += len;
232
270
233
271
pthread_mutex_unlock (& mutex);
234
272
return len;
235
273
}
236
274
237
- void QtAudio ::drain ()
275
+ void QtAudioOutput ::drain ()
238
276
{
239
277
AUDDBG (" Draining.\n " );
240
278
pthread_mutex_lock (& mutex);
@@ -248,7 +286,7 @@ void QtAudio::drain ()
248
286
pthread_mutex_unlock (& mutex);
249
287
}
250
288
251
- int QtAudio ::get_delay ()
289
+ int QtAudioOutput ::get_delay ()
252
290
{
253
291
auto timediff = [] (const timeval & a, const timeval & b) -> int64_t
254
292
{ return 1000 * (int64_t ) (b.tv_sec - a.tv_sec ) + (b.tv_usec - a.tv_usec ) / 1000 ; };
@@ -275,7 +313,7 @@ int QtAudio::get_delay ()
275
313
return delay;
276
314
}
277
315
278
- void QtAudio ::pause (bool pause)
316
+ void QtAudioOutput ::pause (bool pause)
279
317
{
280
318
AUDDBG (" %sause.\n " , pause ? " P" : " Unp" );
281
319
pthread_mutex_lock (& mutex);
@@ -291,7 +329,7 @@ void QtAudio::pause (bool pause)
291
329
pthread_mutex_unlock (& mutex);
292
330
}
293
331
294
- void QtAudio ::flush ()
332
+ void QtAudioOutput ::flush ()
295
333
{
296
334
AUDDBG (" Seek requested; discarding buffer.\n " );
297
335
pthread_mutex_lock (& mutex);
@@ -308,7 +346,7 @@ void QtAudio::flush ()
308
346
pthread_mutex_unlock (& mutex);
309
347
}
310
348
311
- timespec QtAudio ::calc_abs_time (const timespec & rel_time)
349
+ timespec QtAudioOutput ::calc_abs_time (const timespec & rel_time)
312
350
{
313
351
timespec ts {};
314
352
clock_gettime (CLOCK_REALTIME, & ts);
0 commit comments