Skip to content

Commit f6eda3f

Browse files
qtaudio: Add Qt 6 support
- Rename class to avoid namespace clash - Remove usage of periodSize() which is Qt 5 specific
1 parent eb1d4be commit f6eda3f

File tree

6 files changed

+68
-40
lines changed

6 files changed

+68
-40
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

+61-23
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,15 +78,15 @@ 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[] = {
89+
const char * const QtAudioOutput::defaults[] = {
8290
"vol_left", "100",
8391
"vol_right", "100",
8492
nullptr};
@@ -93,18 +101,36 @@ static bool paused;
93101
static int last_buffered, delay_estimate;
94102
static timeval last_system_time;
95103

104+
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
105+
static QAudioSink * output_instance = nullptr;
106+
#else
96107
static QAudioOutput * output_instance = nullptr;
108+
#endif
97109
static QIODevice * buffer_instance = nullptr;
98110

99111
struct FormatDescriptionMap {
100112
int aud_format;
101-
113+
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
114+
enum QAudioFormat::SampleFormat sample_format;
115+
#else
102116
unsigned int sample_size;
103117
enum QAudioFormat::SampleType sample_type;
104-
enum QAudioFormat::Endian endian;
118+
enum QAudioFormat::Endian endian;
119+
#endif
105120
};
106121

107122
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
108134
{FMT_S16_LE, 16, QAudioFormat::SignedInt, QAudioFormat::LittleEndian},
109135
{FMT_S16_BE, 16, QAudioFormat::SignedInt, QAudioFormat::BigEndian},
110136
{FMT_U16_LE, 16, QAudioFormat::UnSignedInt, QAudioFormat::LittleEndian},
@@ -114,20 +140,21 @@ static constexpr FormatDescriptionMap FormatMap[] = {
114140
{FMT_U32_LE, 32, QAudioFormat::UnSignedInt, QAudioFormat::LittleEndian},
115141
{FMT_U32_BE, 32, QAudioFormat::UnSignedInt, QAudioFormat::BigEndian},
116142
{FMT_FLOAT, 32, QAudioFormat::Float, QAudioFormat::LittleEndian},
143+
#endif
117144
};
118145

119-
bool QtAudio::init ()
146+
bool QtAudioOutput::init ()
120147
{
121148
aud_config_set_defaults ("qtaudio", defaults);
122149
return true;
123150
}
124151

125-
StereoVolume QtAudio::get_volume ()
152+
StereoVolume QtAudioOutput::get_volume ()
126153
{
127154
return {aud_get_int ("qtaudio", "vol_left"), aud_get_int ("qtaudio", "vol_right")};
128155
}
129156

130-
void QtAudio::set_volume (StereoVolume v)
157+
void QtAudioOutput::set_volume (StereoVolume v)
131158
{
132159
int vol_max = aud::max (v.left, v.right);
133160

@@ -142,7 +169,7 @@ void QtAudio::set_volume (StereoVolume v)
142169
}
143170
}
144171

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)
146173
{
147174
const FormatDescriptionMap * m = nullptr;
148175

@@ -178,19 +205,30 @@ bool QtAudio::open_audio (int format, int rate, int chan, String & error)
178205
QAudioFormat fmt;
179206
fmt.setSampleRate (rate);
180207
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
181214
fmt.setSampleSize (m->sample_size);
182215
fmt.setCodec ("audio/pcm");
183216
fmt.setByteOrder (m->endian);
184217
fmt.setSampleType (m->sample_type);
185-
186218
QAudioDeviceInfo info (QAudioDeviceInfo::defaultOutputDevice ());
219+
#endif
220+
187221
if (! info.isFormatSupported (fmt))
188222
{
189223
error = String ("QtAudio error: Format not supported by backend.");
190224
return false;
191225
}
192226

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
194232
output_instance->setBufferSize (buffer_size);
195233
buffer_instance = output_instance->start ();
196234

@@ -199,7 +237,7 @@ bool QtAudio::open_audio (int format, int rate, int chan, String & error)
199237
return true;
200238
}
201239

202-
void QtAudio::close_audio ()
240+
void QtAudioOutput::close_audio ()
203241
{
204242
AUDDBG ("Closing audio.\n");
205243

@@ -209,11 +247,11 @@ void QtAudio::close_audio ()
209247
output_instance = nullptr;
210248
}
211249

212-
void QtAudio::period_wait ()
250+
void QtAudioOutput::period_wait ()
213251
{
214252
pthread_mutex_lock (& mutex);
215253

216-
while (output_instance->bytesFree () < output_instance->periodSize ())
254+
while (output_instance->bytesFree () == 0)
217255
{
218256
timespec ts = calc_abs_time (fifty_ms);
219257
pthread_cond_timedwait (& cond, & mutex, & ts);
@@ -222,19 +260,19 @@ void QtAudio::period_wait ()
222260
pthread_mutex_unlock (& mutex);
223261
}
224262

225-
int QtAudio::write_audio (const void * data, int len)
263+
int QtAudioOutput::write_audio (const void * data, int len)
226264
{
227265
pthread_mutex_lock (& mutex);
228266

229-
len = aud::min (len, output_instance->bytesFree ());
267+
len = aud::min<int> (len, output_instance->bytesFree ());
230268
buffer_instance->write ((const char *) data, len);
231269
last_buffered += len;
232270

233271
pthread_mutex_unlock (& mutex);
234272
return len;
235273
}
236274

237-
void QtAudio::drain ()
275+
void QtAudioOutput::drain ()
238276
{
239277
AUDDBG ("Draining.\n");
240278
pthread_mutex_lock (& mutex);
@@ -248,7 +286,7 @@ void QtAudio::drain ()
248286
pthread_mutex_unlock (& mutex);
249287
}
250288

251-
int QtAudio::get_delay ()
289+
int QtAudioOutput::get_delay ()
252290
{
253291
auto timediff = [] (const timeval & a, const timeval & b) -> int64_t
254292
{ 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 ()
275313
return delay;
276314
}
277315

278-
void QtAudio::pause (bool pause)
316+
void QtAudioOutput::pause (bool pause)
279317
{
280318
AUDDBG ("%sause.\n", pause ? "P" : "Unp");
281319
pthread_mutex_lock (& mutex);
@@ -291,7 +329,7 @@ void QtAudio::pause (bool pause)
291329
pthread_mutex_unlock (& mutex);
292330
}
293331

294-
void QtAudio::flush ()
332+
void QtAudioOutput::flush ()
295333
{
296334
AUDDBG ("Seek requested; discarding buffer.\n");
297335
pthread_mutex_lock (& mutex);
@@ -308,7 +346,7 @@ void QtAudio::flush ()
308346
pthread_mutex_unlock (& mutex);
309347
}
310348

311-
timespec QtAudio::calc_abs_time (const timespec & rel_time)
349+
timespec QtAudioOutput::calc_abs_time (const timespec & rel_time)
312350
{
313351
timespec ts {};
314352
clock_gettime (CLOCK_REALTIME, & ts);

0 commit comments

Comments
 (0)