1 #include "../../../config.h"
2 #include "../../gui/menu_flags.h"
3 #include "../../osd_base.h"
5 #include "../sound_buffer_qt.h"
7 #include "./osd_sound_mod_qtmultimedia.h"
11 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
12 #include <QMediaDevices>
15 namespace SOUND_MODULE {
20 M_QT_MULTIMEDIA::M_QT_MULTIMEDIA(
22 SOUND_BUFFER_QT* deviceIO,
26 void *extra_config_values,
27 int extra_config_bytes )
38 m_classname = "SOUND_MODULE::OUTPUT::M_QT_MULTIMEDIA";
40 connect(this, SIGNAL(sig_start_audio()), this, SLOT(do_sound_start()), Qt::QueuedConnection);
41 connect(this, SIGNAL(sig_stop_audio()), this, SLOT(do_sound_stop()), Qt::QueuedConnection);
42 connect(this, SIGNAL(sig_pause_audio()), this, SLOT(do_sound_suspend()), Qt::QueuedConnection);
43 connect(this, SIGNAL(sig_resume_audio()), this, SLOT(do_sound_resume()), Qt::QueuedConnection);
44 connect(this, SIGNAL(sig_discard_audio()), this, SLOT(do_discard_sound()), Qt::QueuedConnection);
45 connect(this, SIGNAL(sig_set_volume(double)), this, SLOT(do_sound_volume(double)), Qt::QueuedConnection);
47 connect(parent, SIGNAL(sig_set_sound_volume(int)), this, SLOT(set_volume(int)), Qt::QueuedConnection);
48 connect(parent, SIGNAL(sig_set_sound_volume(double)), this, SLOT(set_volume(double)), Qt::QueuedConnection);
49 connect(parent, SIGNAL(sig_set_sound_device(QString)), this, SLOT(do_set_device_by_name(QString)), Qt::QueuedConnection);
51 initialize_sound_devices_list();
52 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
53 m_audioOutputDevice = QMediaDevices::defaultAudioOutput();
54 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
55 m_audioOutputDevice = QAudioDeviceInfo::defaultOutputDevice();
57 m_device_is_default = true;
58 m_device_name = "Default";
60 QString _drv = QString::fromStdString(m_device_name);
61 config_t* _ccp = get_config_ptr();
63 if(strlen(_ccp->sound_device_name) > 0) {
64 _drv = QString::fromUtf8(_ccp->sound_device_name);
67 auto _match = std::find(devices_name_list.begin(), devices_name_list.end(), _drv.toLocal8Bit().toStdString());
68 if(_match != devices_name_list.end()) {
69 m_device_name = (*_match);
71 m_config_ok = initialize_driver();
74 M_QT_MULTIMEDIA::~M_QT_MULTIMEDIA()
78 void M_QT_MULTIMEDIA::driver_state_changed(QAudio::State newState)
81 case QAudio::ActiveState:
82 __debug_log_func(_T("AUDIO:ACTIVE"));
84 case QAudio::IdleState:
85 __debug_log_func(_T("AUDIO:IDLE"));
86 //if(m_audioOutputSink != nullptr) {
87 // m_audioOutputSink->stop();
90 case QAudio::StoppedState:
91 __debug_log_func(_T("AUDIO:STOP"));
93 case QAudio::SuspendedState:
94 __debug_log_func(_T("AUDIO:SUSPEND"));
96 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
97 case QAudio::InterruptedState:
98 __debug_log_func(_T("AUDIO:INTERRUPTED"));
106 void M_QT_MULTIMEDIA::update_driver_fileio()
108 m_driver_fileio = m_fileio;
113 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
114 void M_QT_MULTIMEDIA::set_audio_format(QAudioDevice dest_device, QAudioFormat& desired, int& channels, int& rate)
116 int _channels = channels;
117 if(dest_device.minimumChannelCount() > _channels) {
118 _channels = dest_device.minimumChannelCount();
119 } else if(dest_device.maximumChannelCount() < _channels) {
120 _channels = dest_device.maximumChannelCount();
123 if(dest_device.minimumSampleRate() > _rate) {
124 _rate = dest_device.minimumSampleRate();
125 } else if(dest_device.maximumSampleRate() < _rate) {
126 _rate = dest_device.maximumSampleRate();
129 rate = _rate; // Workaround 20221018 K.O
135 channels = _channels; // Workaround 20221008 K.O
137 desired.setSampleRate(rate);
139 QList<QAudioFormat::SampleFormat> _al = dest_device.supportedSampleFormats();
140 if(_al.contains(QAudioFormat::Int16)) {
141 desired.setSampleFormat(QAudioFormat::Int16);
142 } else if(_al.contains(QAudioFormat::Int32)) {
143 desired.setSampleFormat(QAudioFormat::Int32);
145 desired.setSampleFormat(QAudioFormat::Unknown);
151 desired.setChannelConfig(QAudioFormat::ChannelConfigMono);
154 desired.setChannelConfig(QAudioFormat::ChannelConfigStereo);
157 desired.setChannelConfig(QAudioFormat::ChannelConfig2Dot1);
160 desired.setChannelConfig(QAudioFormat::ChannelConfigSurround5Dot0);
163 desired.setChannelConfig(QAudioFormat::ChannelConfigSurround5Dot1);
166 desired.setChannelConfig(QAudioFormat::ChannelConfigSurround7Dot0);
169 desired.setChannelConfig(QAudioFormat::ChannelConfigSurround7Dot1);
173 desired.setChannelConfig(QAudioFormat::ChannelConfigStereo);
176 desired.setChannelCount(channels);
178 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
179 void M_QT_MULTIMEDIA::set_audio_format(QAudioDeviceInfo dest_device, QAudioFormat& desired, int& channels, int& rate)
181 int _channels = channels;
182 QList<int> channelsList = dest_device.supportedChannelCounts();
183 QList<int> ratesList = dest_device.supportedSampleRates();
185 int _min_channels = INT_MAX;
186 int _max_channels = 0;
187 for(auto i = channelsList.begin() ; i != channelsList.end(); ++i) {
188 if((*i) < _min_channels) _min_channels = (*i);
189 if((*i) > _max_channels) _max_channels = (*i);
191 if(_min_channels > _channels) {
192 _channels = _min_channels;
193 } else if(_max_channels < _channels) {
194 _channels = _max_channels;
197 int _min_rate = INT_MAX;
199 for(auto i = ratesList.begin() ; i != ratesList.end(); ++i) {
200 if((*i) < _min_rate) _min_rate = (*i);
201 if((*i) > _max_rate) _max_rate = (*i);
203 if(_min_rate > rate) {
205 } else if(_max_rate < rate) {
212 channels = _channels; // Workaround 20221008 K.O
215 desired.setSampleRate(rate);
216 desired.setSampleSize(16);
217 desired.setSampleType(QAudioFormat::SignedInt);
218 #if Q_BYTE_ORDER == Q_BIG_ENDIAN
219 desired.setByteOrder(QAudioFormat::BigEndian);
221 desired.setByteOrder(QAudioFormat::LittleEndian);
224 desired.setChannelCount(channels);
228 bool M_QT_MULTIMEDIA::initialize_driver()
232 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
233 QAudioDevice tmp_output_device;
234 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
235 QAudioDeviceInfo tmp_output_device;
237 tmp_output_device = get_device_by_name(QString::fromStdString(m_device_name));
238 QAudioFormat tmp_output_format = tmp_output_device.preferredFormat();
240 int _channels = m_channels;
242 set_audio_format(tmp_output_device, tmp_output_format, _channels, _rate);
243 if((_channels > 0) && (_rate > 0)) {
244 m_channels = _channels;
247 tmp_output_format = tmp_output_device.preferredFormat();
248 _channels = tmp_output_format.channelCount();
249 _rate = tmp_output_format.sampleRate();
250 if((_rate <= 0) || (_channels <= 0)) {
251 return false; // None devices.
254 m_audioOutputDevice = tmp_output_device;
255 m_audioOutputFormat = tmp_output_format;
257 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
258 m_audioOutputSink.reset(new QAudioSink(m_audioOutputDevice, m_audioOutputFormat, this));
259 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
260 m_audioOutputSink.reset(new QAudioOutput(m_audioOutputDevice, m_audioOutputFormat, this));
262 result = ((m_audioOutputSink.get() != nullptr) /* || (m_audioInputSource.get() != nullptr) */);
264 connect(m_audioOutputSink.get(), SIGNAL(stateChanged(QAudio::State)), this, SLOT(driver_state_changed(QAudio::State)));
265 m_channels = m_audioOutputSink->format().channelCount();
266 m_rate = m_audioOutputSink->format().sampleRate();
269 m_samples = ((qint64)m_latency_ms * (qint64)(m_rate)) / 1000;
273 update_driver_fileio();
275 __debug_log_func(_T("status=%s"), (m_config_ok) ? _T("OK") : _T("NG"));
279 void M_QT_MULTIMEDIA::initialize_sound_devices_list()
281 devices_name_list.clear();
282 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
283 m_audioOutputsList = QMediaDevices::audioOutputs();
284 for(auto i = m_audioOutputsList.begin(); i != m_audioOutputsList.end(); ++i) {
285 devices_name_list.push_back((*i).description().toStdString());
287 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
288 m_audioOutputsList = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
289 for(auto i = m_audioOutputsList.begin(); i != m_audioOutputsList.end(); ++i) {
290 devices_name_list.push_back((*i).deviceName().toStdString());
295 std::list<std::string> M_QT_MULTIMEDIA::get_sound_devices_list()
297 return devices_name_list;
300 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
301 QAudioDevice M_QT_MULTIMEDIA::get_device_by_name(QString driver_name)
303 QAudioDeviceInfo M_QT_MULTIMEDIA::get_device_by_name(QString driver_name)
306 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
307 QAudioDevice dest_device = m_audioOutputDevice;
308 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
309 QAudioDeviceInfo dest_device = m_audioOutputDevice;
312 if((driver_name == QString::fromUtf8("Default")) || (driver_name.isEmpty())) {
313 m_device_is_default = true;
314 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
315 dest_device = QMediaDevices::defaultAudioOutput();
316 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
317 dest_device = QAudioDeviceInfo::defaultOutputDevice();
320 for(auto i = m_audioOutputsList.begin(); i != m_audioOutputsList.end(); ++i) {
321 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
322 if((*i).description().compare(driver_name) == 0) {
324 m_device_is_default = false;
327 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
328 if((*i).deviceName().compare(driver_name) == 0) {
330 m_device_is_default = false;
336 QString dest_device_name;
337 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
338 dest_device_name = dest_device.description();
339 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
340 dest_device_name = dest_device.deviceName();
343 __debug_log_func(_T("desired_driver=%s using=%s"), driver_name.toLocal8Bit().constData(), dest_device_name.toLocal8Bit().constData());
348 void M_QT_MULTIMEDIA::do_set_device_by_name(QString driver_name)
350 if(m_device_name == driver_name.toLocal8Bit().toStdString()) {
353 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
354 QAudioDevice dest_device = get_device_by_name(driver_name);
355 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
356 QAudioDeviceInfo dest_device = get_device_by_name(driver_name);
359 setup_device(dest_device, m_rate, m_channels, m_latency_ms, true);
362 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
363 void M_QT_MULTIMEDIA::setup_device(QAudioDevice dest_device, int& rate,int& channels,int& latency_ms, bool force_reinit)
365 void M_QT_MULTIMEDIA::setup_device(QAudioDeviceInfo dest_device, int& rate,int& channels,int& latency_ms, bool force_reinit)
368 if(dest_device.isNull()) return; // None initialize if NULL.
370 __debug_log_func(_T("Expected: rate=%d channels=%d latency=%dmSec reinit=%d"), rate, channels, latency_ms, force_reinit);
372 if(!(force_reinit)) {
373 // If already initialized and not changed, skip.
374 if((m_audioOutputDevice == dest_device)
376 && (channels == m_channels)
377 && (latency_ms == m_latency_ms)
378 && (m_audioOutputSink.get() != nullptr)
379 && (m_fileio.get() != nullptr)) {
380 if(m_fileio->isOpen()) {
383 update_driver_fileio();
384 __debug_log_func(_T("Nothing changed.Exit."));
386 //real_reconfig_sound(rate, channels, latency_ms);
387 emit sig_start_audio();
391 if((m_audioOutputDevice.isNull()) || (m_audioOutputDevice != dest_device)) {
394 bool force_req_reinit = false;
395 if(!(force_reinit)) {
396 if(m_latency_ms != latency_ms) {
397 force_req_reinit = true;
399 if(m_audioOutputSink.get() != nullptr) {
400 if((m_audioOutputSink->format().channelCount() != channels) ||
401 (m_audioOutputSink->format().sampleRate() != rate)) {
402 force_req_reinit = true;
410 if((force_reinit) || (force_req_reinit)) {
411 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
412 QString __name = dest_device.description();
413 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
414 QString __name = dest_device.deviceName();
417 QAudioFormat desired = dest_device.preferredFormat();
418 int _channels = channels;
420 set_audio_format(dest_device, desired, channels, rate);
421 if((channels <= 0) || (rate <= 0)) {
422 __debug_log_func(_T("Desired device \"%s\" don't be effective.Make fallback. rate=%d channels=%d"), __name.toLocal8Bit().constData(), rate, channels);
423 channels = _channels;
428 if(m_audioOutputSink.get() != nullptr) {
429 if(m_audioOutputSink->state() != QAudio::StoppedState) {
430 m_audioOutputSink->stop();
431 wait_driver_stopped(1000);
433 m_audioOutputSink->disconnect();
434 m_audioOutputSink.reset();
437 m_audioOutputDevice = dest_device;
438 m_audioOutputFormat = desired;
440 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
441 m_audioOutputSink.reset(new QAudioSink(dest_device, desired, this));
442 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
443 m_audioOutputSink.reset(new QAudioOutput(dest_device, desired, this));
446 m_prev_started = false;
447 m_before_rendered = 0;
449 if(m_audioOutputSink.get() != nullptr) {
450 m_audioOutputSink->setBufferSize(m_chunk_bytes);
451 connect(m_audioOutputSink.get(), SIGNAL(stateChanged(QAudio::State)), this, SLOT(driver_state_changed(QAudio::State)));
452 channels = m_audioOutputSink->format().channelCount();
453 rate = m_audioOutputSink->format().sampleRate();
454 QString _tmpname = QString::fromUtf8("Defalut");
455 if(!(m_device_is_default)) {
456 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
457 _tmpname = m_audioOutputDevice.description();
458 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
459 _tmpname = m_audioOutputDevice.deviceName();
462 m_device_name = _tmpname.toLocal8Bit().toStdString();
463 config_t* _ccp = get_config_ptr();
464 if(_ccp != nullptr) {
465 memset(_ccp->sound_device_name, 0x00, sizeof(_ccp->sound_device_name));
466 my_tcscpy_s(_ccp->sound_device_name, (sizeof(_ccp->sound_device_name) / sizeof(_TCHAR)) - 1, _tmpname.toUtf8().constData());
469 recalc_samples(rate, latency_ms, true, true);
470 m_config_ok = (m_fileio.get() != nullptr);
471 if(m_config_ok.load()) {
472 real_reconfig_sound(rate, channels, latency_ms);
475 m_device_name.clear();
479 ((int64_t)rate * latency_ms) / 1000;
480 if(_samples < 100) _samples = 100;
481 if(m_fileio.get() != nullptr) {
482 if(m_fileio->isOpen()) {
486 update_driver_fileio();
488 m_samples = _samples;
489 m_latency_ms = latency_ms;
491 m_channels = channels;
494 __debug_log_func(_T("Result: rate=%d channels=%d latency=%dmSec reinit=%d"), m_rate, m_channels, m_latency_ms, force_reinit);
495 if(m_audioOutputSink.get() != nullptr) {
496 update_driver_fileio();
497 emit sig_start_audio();
498 //update_render_point_usec();
502 const std::string M_QT_MULTIMEDIA::set_device_sound(const _TCHAR* driver_name, int& rate,int& channels,int& latency_ms)
504 if(driver_name == nullptr) {
505 return (const std::string)(std::string(""));
507 if(strlen(driver_name) <= 0) {
508 return (const std::string)(std::string(""));
511 QString _name = QString::fromUtf8(driver_name);
513 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
514 QAudioDevice dest_device = get_device_by_name(_name);
515 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
516 QAudioDeviceInfo dest_device = get_device_by_name(_name);
518 setup_device(dest_device, rate, channels, latency_ms, false);
520 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
521 return m_audioOutputDevice.description().toStdString();
522 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
523 return m_audioOutputDevice.deviceName().toStdString();
525 return (const std::string)(std::string(""));
529 bool M_QT_MULTIMEDIA::real_reconfig_sound(int& rate,int& channels,int& latency_ms)
531 if((rate <= 0) || (channels < 1) || (latency_ms < 10)) {
535 int64_t _samples = (rate * latency_ms) / 1000;
536 // if((rate != m_rate) || (_samples != m_samples) || (m_latency_ms != latency_ms)) {
537 m_device_name = set_device_sound((const _TCHAR *)(m_device_name.c_str()), rate, channels, latency_ms);
538 __debug_log_func(_T("Returned Driver=\"%s\" rate=%dHz channles=%d latency=%dmSec"), m_device_name.c_str(), rate, channels, latency_ms);
539 //emit sig_set_sound_device(m_device_name);
541 if((rate <= 0) || (latency_ms <= 0)) {
547 if(recalc_samples(rate, latency_ms, true, false)) {
548 m_prev_started = m_mute = false;
551 return m_config_ok.load();
555 void M_QT_MULTIMEDIA::release_sound()
557 // std::lock_guard<std::recursive_timed_mutex> locker(m_locker);
558 if(m_audioOutputSink.get() != nullptr) {
559 m_audioOutputSink->stop();
560 m_audioOutputSink->disconnect();
562 m_audioOutputSink.reset();
564 M_BASE::release_sound();
567 bool M_QT_MULTIMEDIA::release_driver()
569 emit sig_stop_audio();
570 if(!(wait_driver_stopped(1000))) return false;
571 return release_driver_fileio();
574 void M_QT_MULTIMEDIA::do_sound_start()
576 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
577 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
578 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
579 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
581 if(p.get() == nullptr) {
584 if((p->state() != QAudio::StoppedState) && (m_prev_started)) {
585 // update_render_point_usec();
588 if(m_driver_fileio.get() == nullptr) {
589 //m_driver_fileio->reset();
592 m_driver_fileio->reset();
593 p->setBufferSize(m_chunk_bytes);
594 p->start(m_driver_fileio.get());
595 update_render_point_usec();
596 __debug_log_func("GO. fileio=%0llx", m_driver_fileio.get());
598 //update_render_point_usec();
599 m_prev_started = true;
602 void M_QT_MULTIMEDIA::do_sound_stop()
604 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
605 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
606 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
607 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
609 if(p.get() != nullptr) {
613 m_before_rendered = 0;
614 m_prev_started = false;
617 void M_QT_MULTIMEDIA::do_sound_resume()
619 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
620 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
621 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
622 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
624 if(p.get() != nullptr) {
626 update_render_point_usec();
630 void M_QT_MULTIMEDIA::do_sound_suspend()
632 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
633 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
634 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
635 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
637 if(p.get() != nullptr) {
642 void M_QT_MULTIMEDIA::do_sound_volume(double level)
644 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
645 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
646 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
647 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
649 if(p.get() != nullptr) {
654 int64_t M_QT_MULTIMEDIA::driver_elapsed_usec()
656 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
657 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
658 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
659 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
661 if(p.get() != nullptr) {
662 return (int64_t)(p->elapsedUSecs());
663 //return (int64_t)(p->processedUSecs());
668 int64_t M_QT_MULTIMEDIA::driver_processed_usec()
670 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
671 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
672 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
673 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
675 if(p.get() != nullptr) {
676 return (int64_t)(p->processedUSecs());
681 bool M_QT_MULTIMEDIA::is_driver_started()
683 bool _b = M_BASE::is_driver_started();
684 std::shared_ptr<SOUND_BUFFER_QT> q = m_driver_fileio;
685 if(q.get() == nullptr) {
692 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
693 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
694 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
695 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
697 if(p.get() == nullptr) {
700 if(p->state() == QAudio::StoppedState) {
706 void M_QT_MULTIMEDIA::mute_sound()
708 if(!(m_mute.load()) && (m_config_ok.load())) {
709 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
710 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
711 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
712 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
715 if(p.get() != nullptr) {
717 case QAudio::ActiveState:
718 case QAudio::IdleState:
719 emit sig_pause_audio();
720 emit sig_discard_audio();
730 void M_QT_MULTIMEDIA::do_discard_sound()
732 std::shared_ptr<SOUND_BUFFER_QT> q = m_driver_fileio;
733 if(q.get() != nullptr) {
738 void M_QT_MULTIMEDIA::stop_sound()
740 if((m_config_ok.load()) && (m_prev_started)) {
741 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
742 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
743 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
744 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
746 if(p.get() != nullptr) {
748 case QAudio::ActiveState:
749 case QAudio::IdleState:
750 case QAudio::SuspendedState:
751 emit sig_stop_audio();
760 /* SOUND_MODULE::OUTPUT */