Skip to content
Snippets Groups Projects
Commit ea40c00f authored by SeeLook's avatar SeeLook :musical_note:
Browse files

Port to new Qt Multimedia API

- but it doesn't work
parent eac47010
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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;
};
......
......@@ -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
......
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment