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,18 +78,19 @@ 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[] = {
82
- " vol_left" , " 100" ,
83
- " vol_right" , " 100" ,
84
- nullptr };
89
+ const char * const QtAudioOutput::defaults[] = {
90
+ " vol_left" , " 100" ,
91
+ " vol_right" , " 100" ,
92
+ nullptr
93
+ };
85
94
86
95
static const timespec fifty_ms = {0 , 50000000 };
87
96
@@ -93,41 +102,49 @@ static bool paused;
93
102
static int last_buffered, delay_estimate;
94
103
static timeval last_system_time;
95
104
105
+ #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
106
+ static QAudioSink * output_instance = nullptr ;
107
+ #else
96
108
static QAudioOutput * output_instance = nullptr ;
109
+ #endif
97
110
static QIODevice * buffer_instance = nullptr ;
98
111
99
112
struct FormatDescriptionMap {
100
113
int aud_format;
101
-
114
+ #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
115
+ enum QAudioFormat::SampleFormat sample_format;
116
+ #else
102
117
unsigned int sample_size;
103
118
enum QAudioFormat::SampleType sample_type;
104
- enum QAudioFormat::Endian endian;
119
+ # endif
105
120
};
106
121
107
122
static constexpr FormatDescriptionMap FormatMap[] = {
108
- {FMT_S16_LE, 16 , QAudioFormat::SignedInt, QAudioFormat::LittleEndian},
109
- {FMT_S16_BE, 16 , QAudioFormat::SignedInt, QAudioFormat::BigEndian},
110
- {FMT_U16_LE, 16 , QAudioFormat::UnSignedInt, QAudioFormat::LittleEndian},
111
- {FMT_U16_BE, 16 , QAudioFormat::UnSignedInt, QAudioFormat::BigEndian},
112
- {FMT_S32_LE, 32 , QAudioFormat::SignedInt, QAudioFormat::LittleEndian},
113
- {FMT_S32_BE, 32 , QAudioFormat::SignedInt, QAudioFormat::BigEndian},
114
- {FMT_U32_LE, 32 , QAudioFormat::UnSignedInt, QAudioFormat::LittleEndian},
115
- {FMT_U32_BE, 32 , QAudioFormat::UnSignedInt, QAudioFormat::BigEndian},
116
- {FMT_FLOAT, 32 , QAudioFormat::Float, QAudioFormat::LittleEndian},
123
+ #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
124
+ {FMT_S16_NE, QAudioFormat::Int16},
125
+ {FMT_S32_NE, QAudioFormat::Int32},
126
+ {FMT_FLOAT, QAudioFormat::Float},
127
+ #else
128
+ {FMT_S16_NE, 16 , QAudioFormat::SignedInt},
129
+ {FMT_U16_NE, 16 , QAudioFormat::UnSignedInt},
130
+ {FMT_S32_NE, 32 , QAudioFormat::SignedInt},
131
+ {FMT_U32_NE, 32 , QAudioFormat::UnSignedInt},
132
+ {FMT_FLOAT, 32 , QAudioFormat::Float},
133
+ #endif
117
134
};
118
135
119
- bool QtAudio ::init ()
136
+ bool QtAudioOutput ::init ()
120
137
{
121
138
aud_config_set_defaults (" qtaudio" , defaults);
122
139
return true ;
123
140
}
124
141
125
- StereoVolume QtAudio ::get_volume ()
142
+ StereoVolume QtAudioOutput ::get_volume ()
126
143
{
127
144
return {aud_get_int (" qtaudio" , " vol_left" ), aud_get_int (" qtaudio" , " vol_right" )};
128
145
}
129
146
130
- void QtAudio ::set_volume (StereoVolume v)
147
+ void QtAudioOutput ::set_volume (StereoVolume v)
131
148
{
132
149
int vol_max = aud::max (v.left , v.right );
133
150
@@ -142,7 +159,7 @@ void QtAudio::set_volume (StereoVolume v)
142
159
}
143
160
}
144
161
145
- bool QtAudio ::open_audio (int format, int rate, int chan, String & error)
162
+ bool QtAudioOutput ::open_audio (int format, int rate, int chan, String & error)
146
163
{
147
164
const FormatDescriptionMap * m = nullptr ;
148
165
@@ -178,19 +195,35 @@ bool QtAudio::open_audio (int format, int rate, int chan, String & error)
178
195
QAudioFormat fmt;
179
196
fmt.setSampleRate (rate);
180
197
fmt.setChannelCount (chan);
181
- fmt.setSampleSize (m->sample_size );
198
+
199
+ #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
200
+ fmt.setSampleFormat (m->sample_format );
201
+ QAudioDevice info = QMediaDevices::defaultAudioOutput ();
202
+ #else
182
203
fmt.setCodec (" audio/pcm" );
183
- fmt.setByteOrder (m->endian );
204
+ fmt.setSampleSize (m->sample_size );
184
205
fmt.setSampleType (m->sample_type );
185
206
207
+ #ifdef WORDS_BIGENDIAN
208
+ fmt.setByteOrder (QAudioFormat::BigEndian);
209
+ #else
210
+ fmt.setByteOrder (QAudioFormat::LittleEndian);
211
+ #endif
212
+
186
213
QAudioDeviceInfo info (QAudioDeviceInfo::defaultOutputDevice ());
214
+ #endif
215
+
187
216
if (! info.isFormatSupported (fmt))
188
217
{
189
218
error = String (" QtAudio error: Format not supported by backend." );
190
219
return false ;
191
220
}
192
221
193
- output_instance = new QAudioOutput (fmt, nullptr );
222
+ #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
223
+ output_instance = new QAudioSink (info, fmt);
224
+ #else
225
+ output_instance = new QAudioOutput (fmt);
226
+ #endif
194
227
output_instance->setBufferSize (buffer_size);
195
228
buffer_instance = output_instance->start ();
196
229
@@ -199,7 +232,7 @@ bool QtAudio::open_audio (int format, int rate, int chan, String & error)
199
232
return true ;
200
233
}
201
234
202
- void QtAudio ::close_audio ()
235
+ void QtAudioOutput ::close_audio ()
203
236
{
204
237
AUDDBG (" Closing audio.\n " );
205
238
@@ -209,11 +242,11 @@ void QtAudio::close_audio ()
209
242
output_instance = nullptr ;
210
243
}
211
244
212
- void QtAudio ::period_wait ()
245
+ void QtAudioOutput ::period_wait ()
213
246
{
214
247
pthread_mutex_lock (& mutex);
215
248
216
- while (output_instance->bytesFree () < output_instance-> periodSize () )
249
+ while (output_instance->bytesFree () == 0 )
217
250
{
218
251
timespec ts = calc_abs_time (fifty_ms);
219
252
pthread_cond_timedwait (& cond, & mutex, & ts);
@@ -222,19 +255,19 @@ void QtAudio::period_wait ()
222
255
pthread_mutex_unlock (& mutex);
223
256
}
224
257
225
- int QtAudio ::write_audio (const void * data, int len)
258
+ int QtAudioOutput ::write_audio (const void * data, int len)
226
259
{
227
260
pthread_mutex_lock (& mutex);
228
261
229
- len = aud::min (len, output_instance->bytesFree ());
262
+ len = aud::min< int > (len, output_instance->bytesFree ());
230
263
buffer_instance->write ((const char *) data, len);
231
264
last_buffered += len;
232
265
233
266
pthread_mutex_unlock (& mutex);
234
267
return len;
235
268
}
236
269
237
- void QtAudio ::drain ()
270
+ void QtAudioOutput ::drain ()
238
271
{
239
272
AUDDBG (" Draining.\n " );
240
273
pthread_mutex_lock (& mutex);
@@ -248,7 +281,7 @@ void QtAudio::drain ()
248
281
pthread_mutex_unlock (& mutex);
249
282
}
250
283
251
- int QtAudio ::get_delay ()
284
+ int QtAudioOutput ::get_delay ()
252
285
{
253
286
auto timediff = [] (const timeval & a, const timeval & b) -> int64_t
254
287
{ return 1000 * (int64_t ) (b.tv_sec - a.tv_sec ) + (b.tv_usec - a.tv_usec ) / 1000 ; };
@@ -275,7 +308,7 @@ int QtAudio::get_delay ()
275
308
return delay;
276
309
}
277
310
278
- void QtAudio ::pause (bool pause)
311
+ void QtAudioOutput ::pause (bool pause)
279
312
{
280
313
AUDDBG (" %sause.\n " , pause ? " P" : " Unp" );
281
314
pthread_mutex_lock (& mutex);
@@ -291,7 +324,7 @@ void QtAudio::pause (bool pause)
291
324
pthread_mutex_unlock (& mutex);
292
325
}
293
326
294
- void QtAudio ::flush ()
327
+ void QtAudioOutput ::flush ()
295
328
{
296
329
AUDDBG (" Seek requested; discarding buffer.\n " );
297
330
pthread_mutex_lock (& mutex);
@@ -308,7 +341,7 @@ void QtAudio::flush ()
308
341
pthread_mutex_unlock (& mutex);
309
342
}
310
343
311
- timespec QtAudio ::calc_abs_time (const timespec & rel_time)
344
+ timespec QtAudioOutput ::calc_abs_time (const timespec & rel_time)
312
345
{
313
346
timespec ts {};
314
347
clock_gettime (CLOCK_REALTIME, & ts);
0 commit comments