24 #include "../core/system/log.h"
25 #include "../core/system/simplethreadhandler.h"
68 format.setSampleRate(mAudioSource->getSamplingRate());
69 format.setChannelCount(mAudioSource->getChannelCount());
70 format.setCodec(
"audio/pcm");
72 format.setSampleType(QAudioFormat::SignedInt);
75 QAudioDeviceInfo device(QAudioDeviceInfo::defaultOutputDevice());
76 if (mAudioSource->getDeviceName().size() > 0)
78 QList<QAudioDeviceInfo> devices(QAudioDeviceInfo::availableDevices(QAudio::AudioOutput));
79 for (
const QAudioDeviceInfo &i : devices)
81 if (i.deviceName().toStdString() == mAudioSource->getDeviceName())
87 if (!device.isFormatSupported(format))
88 LogE(
"Selected device settings are not supported!");
93 if (not device.isFormatSupported(format))
95 LogW(
"Raw audio format not supported by backend, falling back to default supported");
96 format = device.preferredFormat();
98 if (not device.isFormatSupported(format))
100 LogW(
"Fallback failed. Probably there is no output device available.");
103 mAudioSource->setSamplingRate(format.sampleRate());
104 if (format.sampleSize() !=
sizeof(
DataFormat) * 8)
106 LogW(
"Sample size not supported");
109 if (format.sampleType() != QAudioFormat::SignedInt)
111 LogW(
"Sample format not supported");
116 mAudioSource->setDeviceName(device.deviceName().toStdString());
119 mAudioSink =
new QAudioOutput(device, format);
122 LogE(
"Error opening QAudioOutput with error %d",
mAudioSink->error());
131 const size_t BufferSize = mAudioSource->getChannelCount() *
135 LogE(
"Error opening QAudioOutput with error %d",
mAudioSink->error());
139 if (mAudioSource->getWriter()) {
140 mAudioSource->getWriter()->init(mAudioSource->getSamplingRate(), mAudioSource->getChannelCount());
143 LogI(
"Initialized Qt audio player using device: %s", mAudioSource->getDeviceName().c_str());
170 LogI(
"Qt audio player closed.");
184 LogI(
"Start Qt audio device")
187 LogI(
"Audio device was not created and thus cannot be started.");
192 mIODevice = mAudioSink->start();
193 if (mAudioSink->error() != QAudio::NoError)
195 qWarning() <<
"Error opening QAudioOutput with error " << mAudioSink->error();
212 LogI(
"Stop Qt audio device");
251 const auto scaling = std::numeric_limits<AudioPlayerThreadForQt::DataFormat>::max();
265 QThread::msleep(500);
273 if (
mAudioSink->state() != QAudio::SuspendedState) {
279 if (
mAudioSink->state() == QAudio::SuspendedState) {
282 if (packet.size() == 0) {QThread::msleep(5);
continue;}
284 std::vector<DataFormat> buffer(packet.size());
285 for (
size_t i=0; i<buffer.size(); ++i) buffer[i] = static_cast<DataFormat>(packet[i] * scaling);
QAudioOutput * mAudioSink
Audio sink to which the data is sent.
std::vector< PCMDataType > PacketType
Type definition of a PCM packet (vector of PCM values).
AudioPlayerThreadForQt(AudioPlayerForQt *audio)
Constructor.
void start()
Start the Qt audio device.
bool isMuted()
Returns true if the player is muted.
void stop()
Stop the Qt audio device.
QIODevice * mIODevice
Qt IO device pointer.
AudioPlayerForQt * mAudioSource
Audio source where the data comes from.
PCMWriterInterface * getWriter()
Get pointer to the PCM writer.
The AudioPlayerForQt class.
void workerFunction()
Main worker function of the Qt audio manager.
virtual bool generateAudioSignal(AudioBase::PacketType &outputPacket)=0
Function that generates new sound and copies it to the outputPacket.
std::atomic< bool > mThreadRunning
Boolean indicating that the thread is running.
void init()
Initialize the audio player.
virtual void exit()=0
Exit, shut down writer interface.
std::atomic< bool > mPause
Boolean indicating that the thread is pausing.
void exit()
Exit from the Qt audio player.
void setPause(bool pause)
Pause the audio player.
static const double BufferMilliseconds