diff --git a/src/sound/tqtaudioin.cpp b/src/sound/tqtaudioin.cpp index b7d534b6b5ab400e71e92026d729b21945aad3c4..120d549c6e3415845a0c35d30093fde0eb93d3e3 100644 --- a/src/sound/tqtaudioin.cpp +++ b/src/sound/tqtaudioin.cpp @@ -26,6 +26,7 @@ #include <QtCore/qthread.h> #include <QtGui/qevent.h> #include <QtMultimedia/qaudioinput.h> +#include <QtMultimedia/qmediadevices.h> #include <QtWidgets/qapplication.h> #include <QtCore/qdebug.h> @@ -36,9 +37,9 @@ QStringList TaudioIN::getAudioDevicesList() { QStringList devNamesList; - QList<QAudioDeviceInfo> devList = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); - for (int i = 0; i < devList.size(); ++i) - devNamesList << devList[i].deviceName(); + auto devList = QMediaDevices::audioInputs(); + for (auto const &d : devList) + devNamesList << d.description(); return devNamesList; } @@ -48,8 +49,6 @@ QString TaudioIN::m_deviceName = QStringLiteral("anything"); TaudioIN::TaudioIN(TaudioParams *params, QObject *parent) : TcommonListener(params, parent) , m_audioParams(params) - , m_audioIN(nullptr) - , m_inBuffer(nullptr) { if (m_instance) { qDebug() << "Nothing of this kind... TaudioIN already exist!"; @@ -67,9 +66,9 @@ TaudioIN::~TaudioIN() { stopListening(); delete m_touchHandler; - if (m_audioIN) { - m_audioIN->blockSignals(true); // otherwise stop() will activate it again - m_audioIN->stop(); + if (m_mediaIN) { + m_mediaIN->blockSignals(true); // otherwise stop() will activate it again + m_mediaIN->stop(); } m_audioParams->INdevName = m_deviceName; // store device name at the app exit @@ -90,18 +89,18 @@ void TaudioIN::updateAudioParams() void TaudioIN::stopDevice() { - if (m_audioIN) { - disconnect(m_audioIN, &QAudioInput::stateChanged, this, &TaudioIN::stateChangedSlot); - m_audioIN->stop(); + if (m_mediaIN) { + disconnect(m_mediaIN, &QMediaRecorder::recorderStateChanged, this, &TaudioIN::stateChangedSlot); + m_mediaIN->stop(); } else qDebug() << "[tqtaudioin] Input device doesn't exist! Nothing to stop!"; } void TaudioIN::startDevice() { - if (m_audioIN) { - m_audioIN->start(m_inBuffer); - connect(m_audioIN, &QAudioInput::stateChanged, this, &TaudioIN::stateChangedSlot, Qt::UniqueConnection); + if (m_mediaIN) { + m_mediaIN->record(); + connect(m_mediaIN, &QMediaRecorder::recorderStateChanged, this, &TaudioIN::stateChangedSlot, Qt::UniqueConnection); } else qDebug() << "[tqtaudioin] Input device doesn't exist! Nothing to start!"; } @@ -109,7 +108,7 @@ void TaudioIN::startDevice() void TaudioIN::startListening() { m_touchHandler->skip(); - if (m_audioIN && m_audioIN->state() == QAudio::StoppedState) + if (m_mediaIN && m_mediaIN->recorderState() == QMediaRecorder::RecordingState) startDevice(); if (detectingState() == e_stopped) { resetVolume(); @@ -135,18 +134,18 @@ void TaudioIN::stopListening() // ################### PRIVATE ############################################ // ################################################################################################# -void TaudioIN::stateChangedSlot(QAudio::State s) +void TaudioIN::stateChangedSlot(QMediaRecorder::RecorderState s) { - if (s != QAudio::ActiveState) { + if (s != QMediaRecorder::RecordingState) { qDebug() << "[TaudioIN] input device is not active, trying to activate"; - if (m_audioIN->error() != QAudio::NoError) - qDebug() << "[TaudioIN] error occurred" << m_audioIN->error(); + if (m_mediaIN->error() != QMediaRecorder::NoError) + qDebug() << "[TaudioIN] error occurred" << m_mediaIN->error(); m_audioIN->blockSignals(true); QTimer::singleShot(100, this, [=] { - if (m_audioIN->state() != QAudio::StoppedState) - m_audioIN->stop(); - m_audioIN->start(m_inBuffer); - m_audioIN->blockSignals(false); + if (m_mediaIN->recorderState() != QMediaRecorder::StoppedState) + m_mediaIN->stop(); + m_mediaIN->record(); + m_mediaIN->blockSignals(false); qDebug() << "[TaudioIN] input device started again"; }); } @@ -154,36 +153,36 @@ void TaudioIN::stateChangedSlot(QAudio::State s) void TaudioIN::createInputDevice() { - m_deviceInfo = QAudioDeviceInfo::defaultInputDevice(); - QList<QAudioDeviceInfo> devList = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); - for (int i = 0; i < devList.size(); ++i) { // find device with name or keep default one - if (devList[i].deviceName() == m_audioParams->INdevName) { - m_deviceInfo = devList[i]; - break; - } - } - m_deviceName = m_deviceInfo.deviceName(); + m_deviceInfo = QMediaDevices::defaultAudioInput(); + // QList<QAudioDeviceInfo> devList = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); + // for (int i = 0; i < devList.size(); ++i) { // find device with name or keep default one + // if (devList[i].deviceName() == m_audioParams->INdevName) { + // m_deviceInfo = devList[i]; + // break; + // } + // } + m_deviceName = m_deviceInfo.description(); qDebug() << "IN:" << m_deviceName; QAudioFormat format; format.setChannelCount(1); format.setSampleRate(48000); - format.setSampleType(QAudioFormat::SignedInt); - format.setSampleSize(16); - format.setCodec("audio/pcm"); - format.setByteOrder(QAudioFormat::LittleEndian); - if (!m_deviceInfo.isFormatSupported(format)) { - qDebug() << "[TaudioIN] Format 48000/16 mono is not supported"; - format = m_deviceInfo.nearestFormat(format); - qDebug() << "[TaudioIN] Format is" << format.sampleRate() << format.channelCount() << format.sampleSize(); - } + // format.setSampleType(QAudioFormat::SignedInt); + // format.setSampleSize(16); + // format.setCodec("audio/pcm"); + // format.setByteOrder(QAudioFormat::LittleEndian); + // if (!m_deviceInfo.isFormatSupported(format)) { + // qDebug() << "[TaudioIN] Format 48000/16 mono is not supported"; + // format = m_deviceInfo.nearestFormat(format); + // qDebug() << "[TaudioIN] Format is" << format.sampleRate() << format.channelCount() << format.sampleSize(); + // } if (m_audioIN) { delete m_audioIN; m_inBuffer->close(); } - m_audioIN = new QAudioInput(m_deviceInfo, format, this); - finder()->setSampleRate(m_audioIN->format().sampleRate()); // framesPerChunk is determined here - m_audioIN->setBufferSize(1024); // about 11ms + m_audioIN = new QAudioInput(this); + finder()->setSampleRate(48000); // framesPerChunk is determined here + // m_audioIN->setBufferSize(1024); // about 11ms m_inBuffer->open(QIODevice::WriteOnly); m_inBuffer->setBufferSize(0); // respect amount of data send by input device, otherwise it will be overwritten diff --git a/src/sound/tqtaudioin.h b/src/sound/tqtaudioin.h index 431358f54ca477ac50959889995603ade8511360..44253f13e09cfb39b25d3604a32a1a30c330b3a2 100644 --- a/src/sound/tqtaudioin.h +++ b/src/sound/tqtaudioin.h @@ -22,7 +22,8 @@ #include "tcommonlistener.h" #include <QtCore/qiodevice.h> #include <QtCore/qtimer.h> -#include <QtMultimedia/qaudiodeviceinfo.h> +#include <QtMultimedia/qaudiodevice.h> +#include <QtMultimedia/qmediarecorder.h> class QAudioInput; class QIODevice; @@ -94,7 +95,7 @@ public slots: protected slots: void bufferReady(const char *data, qint64 &dataLenght); - void stateChangedSlot(QAudio::State s); + void stateChangedSlot(QMediaRecorder::RecorderState s); private: /** @@ -106,9 +107,10 @@ private: static TaudioIN *m_instance; static QString m_deviceName; TaudioParams *m_audioParams; - QAudioInput *m_audioIN; - QAudioDeviceInfo m_deviceInfo; - TaudioBuffer *m_inBuffer; + QAudioInput *m_audioIN = nullptr; + QAudioDevice m_deviceInfo; + TaudioBuffer *m_inBuffer = nullptr; + QMediaRecorder *m_mediaIN = nullptr; TtouchHandler *m_touchHandler; }; diff --git a/src/sound/tqtaudioout.cpp b/src/sound/tqtaudioout.cpp index 0f0b9209ea0b4f4078adba882d0d724029ebede4..ac8daa2d006abd3b35c2c01768ea43c7c4891f58 100644 --- a/src/sound/tqtaudioout.cpp +++ b/src/sound/tqtaudioout.cpp @@ -18,7 +18,7 @@ #include "tqtaudioout.h" #include "taudiobuffer.h" -#include "taudioobject.h" +// #include "taudioobject.h" #include "toggscale.h" #include <taudioparams.h> #include <tglobals.h> @@ -27,6 +27,7 @@ #include <QtCore/qthread.h> #include <QtCore/qtimer.h> #include <QtMultimedia/qaudiooutput.h> +#include <QtMultimedia/qmediadevices.h> #define CROSS_SMP (2200) // 50ms #define INVALID_NOTE_NR (-100) @@ -36,9 +37,9 @@ QStringList TaudioOUT::getAudioDevicesList() { QStringList devNamesList; - QList<QAudioDeviceInfo> devList = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); - for (int i = 0; i < devList.size(); ++i) - devNamesList << devList[i].deviceName(); + auto devList = QMediaDevices::audioOutputs(); + for (const auto &outDev : devList) + devNamesList << outDev.description(); return devNamesList; } @@ -108,44 +109,51 @@ void TaudioOUT::setAudioOutParams() void TaudioOUT::createOutputDevice() { - m_deviceInfo = QAudioDeviceInfo::defaultOutputDevice(); - auto devList = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); - for (int i = 0; i < devList.size(); ++i) { // find device with name or keep default one - if (devList[i].deviceName() == m_audioParams->OUTdevName) { - m_deviceInfo = devList[i]; - break; - } - } - m_devName = m_deviceInfo.deviceName(); + m_deviceInfo = QMediaDevices::defaultAudioOutput(); // QAudioDeviceInfo::defaultOutputDevice(); + // auto devList = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); + // for (int i = 0; i < devList.size(); ++i) { // find device with name or keep default one + // if (devList[i].deviceName() == m_audioParams->OUTdevName) { + // m_deviceInfo = devList[i]; + // break; + // } + // } + m_devName = m_deviceInfo.description(); QAudioFormat format; format.setChannelCount(1); // Mono format.setSampleRate(m_sampleRate); - format.setSampleType(QAudioFormat::SignedInt); - format.setSampleSize(16); - format.setCodec("audio/pcm"); - format.setByteOrder(QAudioFormat::LittleEndian); - if (!m_deviceInfo.isFormatSupported(format)) { - qDebug() << "Output Format 44100/16 stereo is not supported"; - format = m_deviceInfo.nearestFormat(format); - qDebug() << "Format is" << format.sampleRate() << format.channelCount() << format.sampleSize(); - } - m_sampleRate = format.sampleRate(); + format.setSampleFormat(QAudioFormat::Int16); + // format.setSampleSize(16); + // format.setCodec("audio/pcm"); + // format.setByteOrder(QAudioFormat::LittleEndian); + // if (!m_deviceInfo.isFormatSupported(format)) { + // qDebug() << "Output Format 44100/16 stereo is not supported"; + // format = m_deviceInfo.nearestFormat(format); + // qDebug() << "Format is" << format.sampleRate() << format.channelCount() << format.sampleSize(); + // } + // m_sampleRate = format.sampleRate(); if (m_audioOUT) { delete m_audioOUT; delete m_buffer; } - m_audioOUT = new QAudioOutput(m_deviceInfo, format, this); - m_audioOUT->setBufferSize(m_bufferFrames * 2); + m_audioOUT = new QAudioOutput(this); + m_audioOUT->setDevice(m_deviceInfo); + m_mediaOUT = new QMediaPlayer(this); + m_mediaOUT->setAudioOutput(m_audioOUT); + + // m_audioOUT = new QAudioOutput(m_deviceInfo, format, this); + // m_audioOUT->setBufferSize(m_bufferFrames * 2); m_buffer = new TaudioBuffer(this); m_buffer->open(QIODevice::ReadOnly); - m_buffer->setBufferSize(m_audioOUT->bufferSize()); + // m_buffer->setBufferSize(m_audioOUT->bufferSize()); + m_buffer->setBufferSize(m_bufferFrames * 2); + m_mediaOUT->setSourceDevice(m_buffer); - qDebug() << "OUT:" << m_deviceInfo.deviceName() << m_audioOUT->format().sampleRate(); + qDebug() << "OUT:" << m_deviceInfo.description(); // << m_audioOUT->format().sampleRate(); connect(m_buffer, &TaudioBuffer::feedAudio, this, &TaudioOUT::outCallBack, Qt::DirectConnection); - connect(m_audioOUT, &QAudioOutput::stateChanged, this, &TaudioOUT::stateChangedSlot); + // connect(m_mediaOUT, &QMediaPlayer::mediaStatusChanged, this, &TaudioOUT::stateChangedSlot); } #include <QtCore/qelapsedtimer.h> @@ -187,9 +195,9 @@ void TaudioOUT::startPlaying() void TaudioOUT::startPlayingSlot() { - if (m_audioOUT->state() != QAudio::ActiveState) { + if (m_mediaOUT->playbackState() != QMediaPlayer::PlayingState) { qDebug() << "preparation time" << pt.elapsed(); - m_audioOUT->start(m_buffer); + m_mediaOUT->play(); } } @@ -300,15 +308,15 @@ void TaudioOUT::outCallBack(char *data, qint64 maxLen, qint64 &wasRead) } } -void TaudioOUT::stateChangedSlot(QAudio::State state) +void TaudioOUT::stateChangedSlot(QMediaPlayer::PlaybackState state) { // qDebug() << "[TaudioOUT]" << state; - p_isPlaying = (state == QAudio::ActiveState); - if (state == QAudio::ActiveState) + p_isPlaying = (state == QMediaPlayer::PlayingState); + if (state == QMediaPlayer::PlayingState) emit playingStarted(); - else if (state == QAudio::StoppedState) + else if (state == QMediaPlayer::StoppedState) emit playingFinished(); - else if (state == QAudio::IdleState) + else if (state == QMediaPlayer::PausedState) stop(); // playingFinishedSlot(); } @@ -316,7 +324,7 @@ void TaudioOUT::stateChangedSlot(QAudio::State state) void TaudioOUT::playingFinishedSlot() { // qDebug() << "stop playing"; - m_audioOUT->stop(); + m_mediaOUT->stop(); // if (p_doEmit) // emit playingFinished(); p_doEmit = false; // emit once per play/stop cycle diff --git a/src/sound/tqtaudioout.h b/src/sound/tqtaudioout.h index 338a3fdeb73414e261376e450fcaeba8d91afd6c..b58439cb9e4c0494d6f55183fb6d3d87369bd48d 100644 --- a/src/sound/tqtaudioout.h +++ b/src/sound/tqtaudioout.h @@ -23,7 +23,8 @@ #include "tabstractplayer.h" #include <QtCore/qstringlist.h> #include <QtMultimedia/qaudio.h> -#include <QtMultimedia/qaudiodeviceinfo.h> +#include <QtMultimedia/qaudiodevice.h> +#include <QtMultimedia/qmediaplayer.h> class ToggScale; class TaudioParams; @@ -72,7 +73,7 @@ private: void outCallBack(char *data, qint64 maxLen, qint64 &wasRead); // void updateSlot() { setAudioOutParams(); } void playingFinishedSlot(); - void stateChangedSlot(QAudio::State state); + void stateChangedSlot(QMediaPlayer::PlaybackState state); void startPlayingSlot(); private: @@ -81,9 +82,10 @@ private: int m_bufferFrames, m_sampleRate; bool m_callBackIsBussy; TaudioParams *m_audioParams; - QAudioOutput *m_audioOUT; + QAudioOutput *m_audioOUT = nullptr; + QMediaPlayer *m_mediaOUT = nullptr; TaudioBuffer *m_buffer; - QAudioDeviceInfo m_deviceInfo; + QAudioDevice m_deviceInfo; }; #endif // TRTAUDIOOUT_H