Skip to content

Commit 638c49c

Browse files
qtaudio: Add Qt 6 support
- Rename class to avoid namespace clash - Remove usage of periodSize() which is Qt 5 specific - Use NE formats, Qt 6 always uses the endianess of the host platform
1 parent eb1d4be commit 638c49c

File tree

6 files changed

+76
-53
lines changed

6 files changed

+76
-53
lines changed

.github/actions/install-dependencies/action.yml

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ runs:
4747
mingw-w64-ucrt-x86_64-opusfile
4848
mingw-w64-ucrt-x86_64-pkg-config
4949
mingw-w64-ucrt-x86_64-qt6-base
50+
mingw-w64-ucrt-x86_64-qt6-multimedia
5051
mingw-w64-ucrt-x86_64-qt6-svg
5152
mingw-w64-ucrt-x86_64-SDL2
5253
mingw-w64-ucrt-x86_64-wavpack

.github/actions/install-dependencies/install-dependencies.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ ubuntu_packages='gettext libadplug-dev libasound2-dev libavformat-dev
2828
libsndio-dev libsoxr-dev libvorbis-dev libwavpack-dev libxml2-dev'
2929

3030
ubuntu_qt5_packages='libqt5svg5-dev libqt5x11extras5-dev qtbase5-dev qtmultimedia5-dev'
31-
ubuntu_qt6_packages='qt6-base-dev qt6-svg-dev'
31+
ubuntu_qt6_packages='qt6-base-dev qt6-multimedia-dev qt6-svg-dev'
3232

3333
macos_packages='adplug faad2 ffmpeg libbs2b libcue libmms libmodplug libnotify
3434
libopenmpt libsamplerate libsoxr neon opusfile sdl2 wavpack'

configure.ac

+1-7
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,6 @@ check_allowed () {
117117
if test $plugin_allowed = no -a $2 = yes ; then
118118
AC_MSG_ERROR([--enable-$1 cannot be used without --enable-qt])
119119
fi
120-
if test $plugin_allowed = yes -a $1 = qtaudio ; then
121-
plugin_allowed=$USE_QT5
122-
if test $plugin_allowed = no -a $2 = yes ; then
123-
AC_MSG_ERROR([--enable-$1 cannot be used without --enable-qt5])
124-
fi
125-
fi
126120
if test $plugin_allowed = yes -a $1 = ampache ; then
127121
plugin_allowed=$have_neon
128122
if test $plugin_allowed = no -a $2 = yes ; then
@@ -887,7 +881,7 @@ fi
887881
if test "x$USE_QT" = "xyes" ; then
888882
echo " Qt Support"
889883
echo " ----------"
890-
echo " Qt Multimedia output (Qt 5 only): $have_qtaudio"
884+
echo " Qt Multimedia output: $have_qtaudio"
891885
echo " Qt Interface: yes"
892886
echo " Winamp Classic Interface: yes"
893887
echo " Album Art: yes"

src/qtaudio/Makefile

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ include ../../extra.mk
88
plugindir := ${plugindir}/${OUTPUT_PLUGIN_DIR}
99

1010
LD = ${CXX}
11-
CPPFLAGS += -I../.. ${QTMULTIMEDIA_CFLAGS}
12-
CXXFLAGS += ${GLIB_CFLAGS} ${PLUGIN_CFLAGS}
13-
LIBS += -lm ${GLIB_LIBS} ${QTMULTIMEDIA_LIBS}
11+
CPPFLAGS += -I../.. ${QT_CFLAGS} ${QTMULTIMEDIA_CFLAGS}
12+
CXXFLAGS += ${PLUGIN_CFLAGS}
13+
LIBS += -lm ${QT_LIBS} ${QTMULTIMEDIA_LIBS}

src/qtaudio/meson.build

+1-6
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,6 @@ if get_option('qt5')
22
qt_multimedia_dep = dependency('qt5', version: qt_req, required: false, modules: ['Multimedia'])
33
else
44
qt_multimedia_dep = dependency('qt6', version: qt_req, required: false, modules: ['Multimedia'])
5-
6-
if qt_multimedia_dep.found()
7-
warning('The Qt Multimedia output plugin is not yet compatible with Qt 6.')
8-
qt_multimedia_dep = dependency('', required: false)
9-
endif
105
endif
116

127
have_qtaudio = qt_multimedia_dep.found()
@@ -15,7 +10,7 @@ have_qtaudio = qt_multimedia_dep.found()
1510
if have_qtaudio
1611
shared_module('qtaudio',
1712
'qtaudio.cc',
18-
dependencies: [audacious_dep, qt_multimedia_dep],
13+
dependencies: [audacious_dep, qt_dep, qt_multimedia_dep],
1914
name_prefix: '',
2015
install: true,
2116
install_dir: output_plugin_dir

src/qtaudio/qtaudio.cc

+69-36
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,20 @@
3030
#include <libaudcore/plugin.h>
3131
#include <libaudcore/runtime.h>
3232

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
3340
#include <QAudioOutput>
41+
#endif
3442

3543
#define VOLUME_RANGE 40 /* decibels */
3644
#define NS_PER_SECOND 1000000000
3745

38-
class QtAudio : public OutputPlugin
46+
class QtAudioOutput : public OutputPlugin
3947
{
4048
public:
4149
static const char about[];
@@ -47,7 +55,7 @@ class QtAudio : public OutputPlugin
4755
about
4856
};
4957

50-
constexpr QtAudio () : OutputPlugin (info, 1) {}
58+
constexpr QtAudioOutput () : OutputPlugin (info, 1) {}
5159

5260
bool init ();
5361

@@ -70,18 +78,19 @@ class QtAudio : public OutputPlugin
7078
timespec calc_abs_time (const timespec & rel_time);
7179
};
7280

73-
EXPORT QtAudio aud_plugin_instance;
81+
EXPORT QtAudioOutput aud_plugin_instance;
7482

75-
const char QtAudio::about[] =
83+
const char QtAudioOutput::about[] =
7684
N_("QtMultimedia Audio Output Plugin for Audacious\n"
7785
"Copyright 2014 William Pitcock\n\n"
7886
"Based on SDL Output Plugin for Audacious\n"
7987
"Copyright 2010 John Lindgren");
8088

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+
};
8594

8695
static const timespec fifty_ms = {0, 50000000};
8796

@@ -93,41 +102,49 @@ static bool paused;
93102
static int last_buffered, delay_estimate;
94103
static timeval last_system_time;
95104

105+
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
106+
static QAudioSink * output_instance = nullptr;
107+
#else
96108
static QAudioOutput * output_instance = nullptr;
109+
#endif
97110
static QIODevice * buffer_instance = nullptr;
98111

99112
struct FormatDescriptionMap {
100113
int aud_format;
101-
114+
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
115+
enum QAudioFormat::SampleFormat sample_format;
116+
#else
102117
unsigned int sample_size;
103118
enum QAudioFormat::SampleType sample_type;
104-
enum QAudioFormat::Endian endian;
119+
#endif
105120
};
106121

107122
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
117134
};
118135

119-
bool QtAudio::init ()
136+
bool QtAudioOutput::init ()
120137
{
121138
aud_config_set_defaults ("qtaudio", defaults);
122139
return true;
123140
}
124141

125-
StereoVolume QtAudio::get_volume ()
142+
StereoVolume QtAudioOutput::get_volume ()
126143
{
127144
return {aud_get_int ("qtaudio", "vol_left"), aud_get_int ("qtaudio", "vol_right")};
128145
}
129146

130-
void QtAudio::set_volume (StereoVolume v)
147+
void QtAudioOutput::set_volume (StereoVolume v)
131148
{
132149
int vol_max = aud::max (v.left, v.right);
133150

@@ -142,7 +159,7 @@ void QtAudio::set_volume (StereoVolume v)
142159
}
143160
}
144161

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)
146163
{
147164
const FormatDescriptionMap * m = nullptr;
148165

@@ -178,19 +195,35 @@ bool QtAudio::open_audio (int format, int rate, int chan, String & error)
178195
QAudioFormat fmt;
179196
fmt.setSampleRate (rate);
180197
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
182203
fmt.setCodec ("audio/pcm");
183-
fmt.setByteOrder (m->endian);
204+
fmt.setSampleSize (m->sample_size);
184205
fmt.setSampleType (m->sample_type);
185206

207+
#ifdef WORDS_BIGENDIAN
208+
fmt.setByteOrder (QAudioFormat::BigEndian);
209+
#else
210+
fmt.setByteOrder (QAudioFormat::LittleEndian);
211+
#endif
212+
186213
QAudioDeviceInfo info (QAudioDeviceInfo::defaultOutputDevice ());
214+
#endif
215+
187216
if (! info.isFormatSupported (fmt))
188217
{
189218
error = String ("QtAudio error: Format not supported by backend.");
190219
return false;
191220
}
192221

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
194227
output_instance->setBufferSize (buffer_size);
195228
buffer_instance = output_instance->start ();
196229

@@ -199,7 +232,7 @@ bool QtAudio::open_audio (int format, int rate, int chan, String & error)
199232
return true;
200233
}
201234

202-
void QtAudio::close_audio ()
235+
void QtAudioOutput::close_audio ()
203236
{
204237
AUDDBG ("Closing audio.\n");
205238

@@ -209,11 +242,11 @@ void QtAudio::close_audio ()
209242
output_instance = nullptr;
210243
}
211244

212-
void QtAudio::period_wait ()
245+
void QtAudioOutput::period_wait ()
213246
{
214247
pthread_mutex_lock (& mutex);
215248

216-
while (output_instance->bytesFree () < output_instance->periodSize ())
249+
while (output_instance->bytesFree () == 0)
217250
{
218251
timespec ts = calc_abs_time (fifty_ms);
219252
pthread_cond_timedwait (& cond, & mutex, & ts);
@@ -222,19 +255,19 @@ void QtAudio::period_wait ()
222255
pthread_mutex_unlock (& mutex);
223256
}
224257

225-
int QtAudio::write_audio (const void * data, int len)
258+
int QtAudioOutput::write_audio (const void * data, int len)
226259
{
227260
pthread_mutex_lock (& mutex);
228261

229-
len = aud::min (len, output_instance->bytesFree ());
262+
len = aud::min<int> (len, output_instance->bytesFree ());
230263
buffer_instance->write ((const char *) data, len);
231264
last_buffered += len;
232265

233266
pthread_mutex_unlock (& mutex);
234267
return len;
235268
}
236269

237-
void QtAudio::drain ()
270+
void QtAudioOutput::drain ()
238271
{
239272
AUDDBG ("Draining.\n");
240273
pthread_mutex_lock (& mutex);
@@ -248,7 +281,7 @@ void QtAudio::drain ()
248281
pthread_mutex_unlock (& mutex);
249282
}
250283

251-
int QtAudio::get_delay ()
284+
int QtAudioOutput::get_delay ()
252285
{
253286
auto timediff = [] (const timeval & a, const timeval & b) -> int64_t
254287
{ 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 ()
275308
return delay;
276309
}
277310

278-
void QtAudio::pause (bool pause)
311+
void QtAudioOutput::pause (bool pause)
279312
{
280313
AUDDBG ("%sause.\n", pause ? "P" : "Unp");
281314
pthread_mutex_lock (& mutex);
@@ -291,7 +324,7 @@ void QtAudio::pause (bool pause)
291324
pthread_mutex_unlock (& mutex);
292325
}
293326

294-
void QtAudio::flush ()
327+
void QtAudioOutput::flush ()
295328
{
296329
AUDDBG ("Seek requested; discarding buffer.\n");
297330
pthread_mutex_lock (& mutex);
@@ -308,7 +341,7 @@ void QtAudio::flush ()
308341
pthread_mutex_unlock (& mutex);
309342
}
310343

311-
timespec QtAudio::calc_abs_time (const timespec & rel_time)
344+
timespec QtAudioOutput::calc_abs_time (const timespec & rel_time)
312345
{
313346
timespec ts {};
314347
clock_gettime (CLOCK_REALTIME, & ts);

0 commit comments

Comments
 (0)