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();
122 if(dest_device.minimumSampleRate() > rate) {
123 rate = dest_device.minimumSampleRate();
124 } else if(dest_device.maximumSampleRate() < rate) {
125 rate = dest_device.maximumSampleRate();
131 channels = _channels; // Workaround 20221008 K.O
133 desired.setSampleRate(rate);
135 QList<QAudioFormat::SampleFormat> _al = dest_device.supportedSampleFormats();
136 if(_al.contains(QAudioFormat::Int16)) {
137 desired.setSampleFormat(QAudioFormat::Int16);
138 } else if(_al.contains(QAudioFormat::Int32)) {
139 desired.setSampleFormat(QAudioFormat::Int32);
141 desired.setSampleFormat(QAudioFormat::Unknown);
147 desired.setChannelConfig(QAudioFormat::ChannelConfigMono);
150 desired.setChannelConfig(QAudioFormat::ChannelConfigStereo);
153 desired.setChannelConfig(QAudioFormat::ChannelConfig2Dot1);
156 desired.setChannelConfig(QAudioFormat::ChannelConfigSurround5Dot0);
159 desired.setChannelConfig(QAudioFormat::ChannelConfigSurround5Dot1);
162 desired.setChannelConfig(QAudioFormat::ChannelConfigSurround7Dot0);
165 desired.setChannelConfig(QAudioFormat::ChannelConfigSurround7Dot1);
169 desired.setChannelConfig(QAudioFormat::ChannelConfigStereo);
172 desired.setChannelCount(channels);
174 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
175 void M_QT_MULTIMEDIA::set_audio_format(QAudioDeviceInfo dest_device, QAudioFormat& desired, int& channels, int& rate)
177 int _channels = channels;
178 QList<int> channelsList = dest_device.supportedChannelCounts();
179 QList<int> ratesList = dest_device.supportedSampleRates();
181 int _min_channels = INT_MAX;
182 int _max_channels = 0;
183 for(auto i = channelsList.begin() ; i != channelsList.end(); ++i) {
184 if((*i) < _min_channels) _min_channels = (*i);
185 if((*i) > _max_channels) _max_channels = (*i);
187 if(_min_channels > _channels) {
188 _channels = _min_channels;
189 } else if(_max_channels < _channels) {
190 _channels = _max_channels;
193 int _min_rate = INT_MAX;
195 for(auto i = ratesList.begin() ; i != ratesList.end(); ++i) {
196 if((*i) < _min_rate) _min_rate = (*i);
197 if((*i) > _max_rate) _max_rate = (*i);
199 if(_min_rate > rate) {
201 } else if(_max_rate < rate) {
208 channels = _channels; // Workaround 20221008 K.O
211 desired.setSampleRate(rate);
212 desired.setSampleSize(16);
213 desired.setSampleType(QAudioFormat::SignedInt);
214 #if Q_BYTE_ORDER == Q_BIG_ENDIAN
215 desired.setByteOrder(QAudioFormat::BigEndian);
217 desired.setByteOrder(QAudioFormat::LittleEndian);
220 desired.setChannelCount(channels);
224 bool M_QT_MULTIMEDIA::initialize_driver()
228 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
229 QAudioDevice tmp_output_device;
230 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
231 QAudioDeviceInfo tmp_output_device;
233 tmp_output_device = get_device_by_name(QString::fromStdString(m_device_name));
234 QAudioFormat tmp_output_format = tmp_output_device.preferredFormat();
236 int _channels = m_channels;
238 set_audio_format(tmp_output_device, tmp_output_format, _channels, _rate);
239 if((_channels > 0) && (_rate > 0)) {
240 m_channels = _channels;
243 tmp_output_format = tmp_output_device.preferredFormat();
244 _channels = tmp_output_format.channelCount();
245 _rate = tmp_output_format.sampleRate();
246 if((_rate <= 0) || (_channels <= 0)) {
247 return false; // None devices.
250 m_audioOutputDevice = tmp_output_device;
251 m_audioOutputFormat = tmp_output_format;
253 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
254 m_audioOutputSink.reset(new QAudioSink(m_audioOutputDevice, m_audioOutputFormat, this));
255 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
256 m_audioOutputSink.reset(new QAudioOutput(m_audioOutputDevice, m_audioOutputFormat, this));
258 result = ((m_audioOutputSink.get() != nullptr) /* || (m_audioInputSource.get() != nullptr) */);
260 connect(m_audioOutputSink.get(), SIGNAL(stateChanged(QAudio::State)), this, SLOT(driver_state_changed(QAudio::State)));
261 m_channels = m_audioOutputSink->format().channelCount();
262 m_rate = m_audioOutputSink->format().sampleRate();
265 m_samples = ((qint64)m_latency_ms * (qint64)(m_rate)) / 1000;
269 update_driver_fileio();
271 __debug_log_func(_T("status=%s"), (m_config_ok) ? _T("OK") : _T("NG"));
275 void M_QT_MULTIMEDIA::initialize_sound_devices_list()
277 devices_name_list.clear();
278 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
279 m_audioOutputsList = QMediaDevices::audioOutputs();
280 for(auto i = m_audioOutputsList.begin(); i != m_audioOutputsList.end(); ++i) {
281 devices_name_list.push_back((*i).description().toStdString());
283 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
284 m_audioOutputsList = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
285 for(auto i = m_audioOutputsList.begin(); i != m_audioOutputsList.end(); ++i) {
286 devices_name_list.push_back((*i).deviceName().toStdString());
291 std::list<std::string> M_QT_MULTIMEDIA::get_sound_devices_list()
293 return devices_name_list;
296 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
297 QAudioDevice M_QT_MULTIMEDIA::get_device_by_name(QString driver_name)
299 QAudioDeviceInfo M_QT_MULTIMEDIA::get_device_by_name(QString driver_name)
302 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
303 QAudioDevice dest_device = m_audioOutputDevice;
304 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
305 QAudioDeviceInfo dest_device = m_audioOutputDevice;
308 if((driver_name == QString::fromUtf8("Default")) || (driver_name.isEmpty())) {
309 m_device_is_default = true;
310 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
311 dest_device = QMediaDevices::defaultAudioOutput();
312 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
313 dest_device = QAudioDeviceInfo::defaultOutputDevice();
316 for(auto i = m_audioOutputsList.begin(); i != m_audioOutputsList.end(); ++i) {
317 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
318 if((*i).description().compare(driver_name) == 0) {
320 m_device_is_default = false;
323 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
324 if((*i).deviceName().compare(driver_name) == 0) {
326 m_device_is_default = false;
332 QString dest_device_name;
333 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
334 dest_device_name = dest_device.description();
335 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
336 dest_device_name = dest_device.deviceName();
339 __debug_log_func(_T("desired_driver=%s using=%s"), driver_name.toLocal8Bit().constData(), dest_device_name.toLocal8Bit().constData());
344 void M_QT_MULTIMEDIA::do_set_device_by_name(QString driver_name)
346 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
347 QAudioDevice dest_device = get_device_by_name(driver_name);
348 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
349 QAudioDeviceInfo dest_device = get_device_by_name(driver_name);
351 setup_device(dest_device, m_rate, m_channels, m_latency_ms, true);
354 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
355 void M_QT_MULTIMEDIA::setup_device(QAudioDevice dest_device, int& rate,int& channels,int& latency_ms, bool force_reinit)
357 void M_QT_MULTIMEDIA::setup_device(QAudioDeviceInfo dest_device, int& rate,int& channels,int& latency_ms, bool force_reinit)
360 if(dest_device.isNull()) return; // None initialize if NULL.
362 __debug_log_func(_T("Expected: rate=%d channels=%d latency=%dmSec reinit=%d"), rate, channels, latency_ms, force_reinit);
364 if(!(force_reinit)) {
365 // If already initialized and not changed, skip.
366 if((m_audioOutputDevice == dest_device)
368 && (channels == m_channels)
369 && (latency_ms == m_latency_ms)
370 && (m_audioOutputSink.get() != nullptr)
371 && (m_fileio.get() != nullptr)) {
372 if(m_fileio->isOpen()) {
375 update_driver_fileio();
376 __debug_log_func(_T("Nothing changed.Exit."));
378 //real_reconfig_sound(rate, channels, latency_ms);
379 emit sig_start_audio();
383 if((m_audioOutputDevice.isNull()) || (m_audioOutputDevice != dest_device)) {
386 bool force_req_reinit = false;
387 if(!(force_reinit)) {
388 if(m_latency_ms != latency_ms) {
389 force_req_reinit = true;
391 if(m_audioOutputSink.get() != nullptr) {
392 if((m_audioOutputSink->format().channelCount() != channels) ||
393 (m_audioOutputSink->format().sampleRate() != rate)) {
394 force_req_reinit = true;
402 if((force_reinit) || (force_req_reinit)) {
403 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
404 QString __name = dest_device.description();
405 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
406 QString __name = dest_device.deviceName();
409 QAudioFormat desired = dest_device.preferredFormat();
410 int _channels = channels;
412 set_audio_format(dest_device, desired, channels, rate);
413 if((channels <= 0) || (rate <= 0)) {
414 __debug_log_func(_T("Desired device \"%s\" don't be effective.Make fallback. rate=%d channels=%d"), __name.toLocal8Bit().constData(), rate, channels);
415 channels = _channels;
420 if(m_audioOutputSink.get() != nullptr) {
421 if(m_audioOutputSink->state() != QAudio::StoppedState) {
422 m_audioOutputSink->stop();
423 wait_driver_stopped(1000);
425 m_audioOutputSink->disconnect();
426 m_audioOutputSink.reset();
429 m_audioOutputDevice = dest_device;
430 m_audioOutputFormat = desired;
432 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
433 m_audioOutputSink.reset(new QAudioSink(dest_device, desired, this));
434 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
435 m_audioOutputSink.reset(new QAudioOutput(dest_device, desired, this));
437 if(m_audioOutputSink.get() != nullptr) {
438 connect(m_audioOutputSink.get(), SIGNAL(stateChanged(QAudio::State)), this, SLOT(driver_state_changed(QAudio::State)));
439 channels = m_audioOutputSink->format().channelCount();
440 rate = m_audioOutputSink->format().sampleRate();
441 QString _tmpname = QString::fromUtf8("Defalut");
442 if(!(m_device_is_default)) {
443 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
444 _tmpname = m_audioOutputDevice.description();
445 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
446 _tmpname = m_audioOutputDevice.deviceName();
449 m_device_name = _tmpname.toLocal8Bit().toStdString();
450 config_t* _ccp = get_config_ptr();
451 if(_ccp != nullptr) {
452 memset(_ccp->sound_device_name, 0x00, sizeof(_ccp->sound_device_name));
453 my_tcscpy_s(_ccp->sound_device_name, (sizeof(_ccp->sound_device_name) / sizeof(_TCHAR)) - 1, _tmpname.toUtf8().constData());
456 recalc_samples(rate, latency_ms, true, true);
458 m_config_ok = (m_fileio.get() != nullptr);
460 if(m_config_ok.load()) {
461 real_reconfig_sound(rate, channels, latency_ms);
464 m_device_name.clear();
468 ((int64_t)rate * latency_ms) / 1000;
469 if(_samples < 100) _samples = 100;
470 if(m_fileio.get() != nullptr) {
471 if(m_fileio->isOpen()) {
475 update_driver_fileio();
477 m_samples = _samples;
478 m_latency_ms = latency_ms;
480 m_channels = channels;
483 __debug_log_func(_T("Result: rate=%d channels=%d latency=%dmSec reinit=%d"), m_rate, m_channels, m_latency_ms, force_reinit);
484 if(m_audioOutputSink.get() != nullptr) {
485 update_driver_fileio();
486 emit sig_start_audio();
487 //update_render_point_usec();
491 const std::string M_QT_MULTIMEDIA::set_device_sound(const _TCHAR* driver_name, int& rate,int& channels,int& latency_ms)
493 if(driver_name == nullptr) {
494 return (const std::string)(std::string(""));
496 if(strlen(driver_name) <= 0) {
497 return (const std::string)(std::string(""));
500 QString _name = QString::fromUtf8(driver_name);
502 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
503 QAudioDevice dest_device = get_device_by_name(_name);
504 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
505 QAudioDeviceInfo dest_device = get_device_by_name(_name);
507 setup_device(dest_device, rate, channels, latency_ms, false);
509 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
510 return m_audioOutputDevice.description().toStdString();
511 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
512 return m_audioOutputDevice.deviceName().toStdString();
514 return (const std::string)(std::string(""));
518 bool M_QT_MULTIMEDIA::real_reconfig_sound(int& rate,int& channels,int& latency_ms)
520 if((rate <= 0) || (channels < 1) || (latency_ms < 10)) {
524 int64_t _samples = (rate * latency_ms) / 1000;
525 if((rate != m_rate) || (_samples != m_samples) || (m_latency_ms != latency_ms)) {
526 m_device_name = set_device_sound((const _TCHAR *)(m_device_name.c_str()), rate, channels, latency_ms);
527 __debug_log_func(_T("Returned Driver=\"%s\" rate=%dHz channles=%d latency=%dmSec"), m_device_name.c_str(), rate, channels, latency_ms);
528 //emit sig_set_sound_device(m_device_name);
530 if((rate <= 0) || (latency_ms <= 0)) {
536 if(recalc_samples(rate, latency_ms, true, false)) {
537 m_prev_started = m_mute = false;
540 return m_config_ok.load();
544 void M_QT_MULTIMEDIA::release_sound()
546 // std::lock_guard<std::recursive_timed_mutex> locker(m_locker);
548 m_audioOutputSink->disconnect();
550 if(m_audioOutputSink.get() != nullptr) {
551 m_audioOutputSink->stop();
553 m_audioOutputSink.reset();
555 M_BASE::release_sound();
558 bool M_QT_MULTIMEDIA::release_driver()
560 emit sig_stop_audio();
561 if(!(wait_driver_stopped(1000))) return false;
562 return release_driver_fileio();
565 void M_QT_MULTIMEDIA::do_sound_start()
567 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
568 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
569 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
570 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
572 if(m_driver_fileio.get() != nullptr) {
573 m_driver_fileio->reset();
575 if(p.get() != nullptr) {
576 p->start(m_driver_fileio.get());
577 __debug_log_func("GO. fileio=%0llx", m_driver_fileio.get());
579 update_render_point_usec();
580 m_prev_started = true;
583 void M_QT_MULTIMEDIA::do_sound_stop()
585 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
586 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
587 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
588 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
590 if(p.get() != nullptr) {
594 update_render_point_usec();
595 m_prev_started = false;
598 void M_QT_MULTIMEDIA::do_sound_resume()
600 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
601 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
602 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
603 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
605 if(p.get() != nullptr) {
607 update_render_point_usec();
611 void M_QT_MULTIMEDIA::do_sound_suspend()
613 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
614 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
615 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
616 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
618 if(p.get() != nullptr) {
623 void M_QT_MULTIMEDIA::do_sound_volume(double level)
625 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
626 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
627 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
628 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
630 if(p.get() != nullptr) {
635 int64_t M_QT_MULTIMEDIA::driver_elapsed_usec()
637 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
638 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
639 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
640 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
642 if(p.get() != nullptr) {
643 return (int64_t)(p->elapsedUSecs());
648 int64_t M_QT_MULTIMEDIA::driver_processed_usec()
650 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
651 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
652 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
653 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
655 if(p.get() != nullptr) {
656 return (int64_t)(p->processedUSecs());
661 bool M_QT_MULTIMEDIA::is_driver_started()
663 bool _b = M_BASE::is_driver_started();
664 std::shared_ptr<SOUND_BUFFER_QT> q = m_driver_fileio;
665 if(q.get() == nullptr) {
672 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
673 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
674 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
675 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
677 if(p.get() == nullptr) {
680 if(p->state() == QAudio::StoppedState) {
686 void M_QT_MULTIMEDIA::mute_sound()
688 if(!(m_mute.load()) && (m_config_ok.load())) {
689 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
690 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
691 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
692 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
695 if(p.get() != nullptr) {
697 case QAudio::ActiveState:
698 case QAudio::IdleState:
699 emit sig_pause_audio();
700 emit sig_discard_audio();
710 void M_QT_MULTIMEDIA::do_discard_sound()
712 std::shared_ptr<SOUND_BUFFER_QT> q = m_driver_fileio;
713 if(q.get() != nullptr) {
718 void M_QT_MULTIMEDIA::stop_sound()
720 if((m_config_ok.load()) && (m_prev_started)) {
721 #if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
722 std::shared_ptr<QAudioSink> p = m_audioOutputSink;
723 #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
724 std::shared_ptr<QAudioOutput> p = m_audioOutputSink;
726 if(p.get() != nullptr) {
728 case QAudio::ActiveState:
729 case QAudio::IdleState:
730 case QAudio::SuspendedState:
731 emit sig_stop_audio();
740 /* SOUND_MODULE::OUTPUT */