mirror of
https://gitee.com/drabel/LibQQt.git
synced 2025-01-04 10:18:44 +08:00
update QQt audio manager
This commit is contained in:
parent
bcee91d195
commit
533326c80f
@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
QQtAudioManager::QQtAudioManager ( QObject* parent ) : QObject ( parent )
|
QQtAudioManager::QQtAudioManager ( QObject* parent ) : QObject ( parent )
|
||||||
{
|
{
|
||||||
mInputAudioFormat = QAudioDeviceInfo::defaultInputDevice().preferredFormat();
|
mInputAudioFormat = defaultInputDevice().preferredFormat();
|
||||||
mOutputAudioFormat = QAudioDeviceInfo::defaultOutputDevice().preferredFormat();
|
mOutputAudioFormat = defaultOutputDevice().preferredFormat();
|
||||||
|
|
||||||
mInputDeviceInfo = QAudioDeviceInfo::defaultInputDevice();
|
mInputDeviceInfo = defaultInputDevice();
|
||||||
mOutputDeviceInfo = QAudioDeviceInfo::defaultOutputDevice();
|
mOutputDeviceInfo = defaultOutputDevice();
|
||||||
|
|
||||||
mInputDevice = NULL;
|
mInputDevice = NULL;
|
||||||
mOutputDevice = NULL;
|
mOutputDevice = NULL;
|
||||||
@ -47,8 +47,10 @@ void QQtAudioManager::startInput()
|
|||||||
|
|
||||||
void QQtAudioManager::stopInput()
|
void QQtAudioManager::stopInput()
|
||||||
{
|
{
|
||||||
|
//输入设备还开着,那么输入流设备一定开着。这是QQtAudioManager的功能设定。
|
||||||
if ( mInputDevice )
|
if ( mInputDevice )
|
||||||
{
|
{
|
||||||
|
//关闭QAudioInput,等于关闭了拾音器。
|
||||||
mInputManager->stop();
|
mInputManager->stop();
|
||||||
mInputManager->deleteLater();
|
mInputManager->deleteLater();
|
||||||
mInputManager = NULL;
|
mInputManager = NULL;
|
||||||
@ -96,3 +98,34 @@ void QQtAudioManager::writeBytes ( QByteArray& bytes )
|
|||||||
QAudioOutput* QQtAudioManager::outputManager() { return mOutputManager; }
|
QAudioOutput* QQtAudioManager::outputManager() { return mOutputManager; }
|
||||||
|
|
||||||
QIODevice* QQtAudioManager::outputDevice() { return mOutputDevice; }
|
QIODevice* QQtAudioManager::outputDevice() { return mOutputDevice; }
|
||||||
|
|
||||||
|
/*用户只需要处理音频输入、输出设备和每个的格式,QAudioInput、QAudioOutput、QIODevice(in + out),都被QQtAudioManager处理了。*/
|
||||||
|
void QQtAudioManager::startDefaultInput()
|
||||||
|
{
|
||||||
|
/*使用默认输入设备*/
|
||||||
|
mInputDeviceInfo = QQtAudioManager::defaultInputDevice();
|
||||||
|
|
||||||
|
// pline() << "in prefer" << mInputDeviceInfo.preferredFormat().channelCount() <<
|
||||||
|
// mInputDeviceInfo.preferredFormat().sampleRate() <<
|
||||||
|
// mInputDeviceInfo.preferredFormat().sampleSize();
|
||||||
|
|
||||||
|
// pline() << "in" << mInputAudioFormat.channelCount() << mInputAudioFormat.sampleRate() <<
|
||||||
|
// mInputAudioFormat.sampleSize();
|
||||||
|
|
||||||
|
startInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QQtAudioManager::startDefaultOutput()
|
||||||
|
{
|
||||||
|
/*使用默认输出设备*/
|
||||||
|
mOutputDeviceInfo = QQtAudioManager::defaultOutputDevice();
|
||||||
|
|
||||||
|
// pline() << "out prefer" << mOutputDeviceInfo.preferredFormat().channelCount() <<
|
||||||
|
// mOutputDeviceInfo.preferredFormat().sampleRate() <<
|
||||||
|
// mOutputDeviceInfo.preferredFormat().sampleSize();
|
||||||
|
|
||||||
|
// pline() << "out" << mOutputAudioFormat.channelCount() << mOutputAudioFormat.sampleRate() <<
|
||||||
|
// mOutputAudioFormat.sampleSize();
|
||||||
|
|
||||||
|
startOutput();
|
||||||
|
}
|
||||||
|
@ -31,6 +31,8 @@
|
|||||||
* 然后,读写设备即可。
|
* 然后,读写设备即可。
|
||||||
* manager把读写声音设备当做读写一个设备处理。支持本地声卡,蓝牙连接的声卡,hdmi接口上的声卡,其他接口上的声卡。只要系统显示的,一般都支持。
|
* manager把读写声音设备当做读写一个设备处理。支持本地声卡,蓝牙连接的声卡,hdmi接口上的声卡,其他接口上的声卡。只要系统显示的,一般都支持。
|
||||||
*
|
*
|
||||||
|
* *******使用QQtAudioManager,用户关注输入、输出设备的切换,和输入、输出格式的改变即可,其他的不必关注。*******
|
||||||
|
*
|
||||||
* 原理:
|
* 原理:
|
||||||
* 声音三要素: 采样率, 量化精度, 声道
|
* 声音三要素: 采样率, 量化精度, 声道
|
||||||
* 通常我们用一位二进制表示两种状态, 如1表示高电平, 0表示低电平。在音频领域里,如只用一位二进制表示声音,那么只能表示发声和不发声两种状态(蜂鸣器)。
|
* 通常我们用一位二进制表示两种状态, 如1表示高电平, 0表示低电平。在音频领域里,如只用一位二进制表示声音,那么只能表示发声和不发声两种状态(蜂鸣器)。
|
||||||
@ -58,6 +60,10 @@ public:
|
|||||||
static QAudioDeviceInfo defaultOutputDevice();
|
static QAudioDeviceInfo defaultOutputDevice();
|
||||||
|
|
||||||
/*一般建议设置一个AudioFormat,然后这个format和设置的相等。default为preffered格式*/
|
/*一般建议设置一个AudioFormat,然后这个format和设置的相等。default为preffered格式*/
|
||||||
|
//这里保证输入、输出使用格式相等 或者 不同
|
||||||
|
//如果格式不同,在mac电脑上本地输入输出设备是可以使用的,但是对于连接的语音蓝牙话筒,却是不可以使用的,原因未知。
|
||||||
|
//格式相同的时候,实在是太好用啦。
|
||||||
|
//这个建议默认就相同,但是,在QQtAudioManager当中,并没有直接将其相等处理,如果用户在readyRead槽函数里,可以更改采样率进行某些特殊处理。一般不需要差异处理的,相等就行了。
|
||||||
QAudioFormat& inputAudioFormat ( void );
|
QAudioFormat& inputAudioFormat ( void );
|
||||||
QAudioFormat& outputAudioFormat ( void );
|
QAudioFormat& outputAudioFormat ( void );
|
||||||
|
|
||||||
@ -79,6 +85,14 @@ public:
|
|||||||
QAudioOutput* outputManager();
|
QAudioOutput* outputManager();
|
||||||
QIODevice* outputDevice();
|
QIODevice* outputDevice();
|
||||||
|
|
||||||
|
//这是个方便
|
||||||
|
//如果使用这个函数,建议:设置公共的AudioFormat,比如输出的format,或者输入、输出都支持的Format。
|
||||||
|
//这个Format不会跟随默认设备的改变而改变,有初始值,但是用户在使用过程中,有必要关注和更改。
|
||||||
|
//prefer和nearest并不是default,所以还是需要用户设置。
|
||||||
|
QAudioFormat& defaultAudioFormat();
|
||||||
|
void startDefaultInput();
|
||||||
|
void startDefaultOutput();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
/*输入音频数据准备就绪,readAll即可读取。*/
|
/*输入音频数据准备就绪,readAll即可读取。*/
|
||||||
void readyRead();
|
void readyRead();
|
||||||
@ -96,10 +110,10 @@ private:
|
|||||||
/*操作输入、输出设备的工具*/
|
/*操作输入、输出设备的工具*/
|
||||||
QAudioInput* mInputManager;
|
QAudioInput* mInputManager;
|
||||||
QAudioOutput* mOutputManager;
|
QAudioOutput* mOutputManager;
|
||||||
|
|
||||||
/*读写输入、输出设备的流控制器,QIODevice*/
|
/*读写输入、输出设备的流控制器,QIODevice*/
|
||||||
QIODevice* mInputDevice;
|
QIODevice* mInputDevice;
|
||||||
QIODevice* mOutputDevice;
|
QIODevice* mOutputDevice;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QQTAUDIOMANAGER_H
|
#endif // QQTAUDIOMANAGER_H
|
||||||
|
@ -12,10 +12,8 @@
|
|||||||
#if you succeed with LibQQt, please thumb up.
|
#if you succeed with LibQQt, please thumb up.
|
||||||
#2017年11月10日18:53:56
|
#2017年11月10日18:53:56
|
||||||
#-------------------------------------------------
|
#-------------------------------------------------
|
||||||
SOURCES = \
|
SOURCES =
|
||||||
$$PWD/multimedia/qqtaudiomanager.cpp
|
HEADERS =
|
||||||
HEADERS = \
|
|
||||||
$$PWD/multimedia/qqtaudiomanager.h
|
|
||||||
|
|
||||||
#root dir
|
#root dir
|
||||||
HEADERS += $$PWD/qqt.h \
|
HEADERS += $$PWD/qqt.h \
|
||||||
@ -146,13 +144,21 @@ contains(QKIT_PRIVATE, iOS||iOSSimulator) {
|
|||||||
|
|
||||||
|
|
||||||
#multimedia
|
#multimedia
|
||||||
#arm mips
|
#audio success.
|
||||||
#TODO: +wince +android +ios +macOS +win +linux
|
#video arm mips
|
||||||
|
#TODO: video +wince +android +ios +macOS +win +linux
|
||||||
contains (DEFINES, __MULTIMEDIA__) {
|
contains (DEFINES, __MULTIMEDIA__) {
|
||||||
|
#mplayer
|
||||||
contains (DEFINES, __PROCESSMODULE__){
|
contains (DEFINES, __PROCESSMODULE__){
|
||||||
SOURCES += $$PWD/multimedia/qqtmplayer.cpp
|
SOURCES += $$PWD/multimedia/qqtmplayer.cpp
|
||||||
HEADERS += $$PWD/multimedia/qqtmplayer.h
|
HEADERS += $$PWD/multimedia/qqtmplayer.h
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#audio
|
||||||
|
SOURCES += \
|
||||||
|
$$PWD/multimedia/qqtaudiomanager.cpp
|
||||||
|
HEADERS += \
|
||||||
|
$$PWD/multimedia/qqtaudiomanager.h
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -228,10 +228,14 @@ void MainWindow::currentOutputRowChanged ( QModelIndex cur, QModelIndex )
|
|||||||
void MainWindow::on_pushButton_clicked()
|
void MainWindow::on_pushButton_clicked()
|
||||||
{
|
{
|
||||||
/*这里是自定义输入、输出设备*/
|
/*这里是自定义输入、输出设备*/
|
||||||
QString name = ui->inputListWidget->currentIndex().data().toString();
|
QString name = QQtAudioManager::defaultInputDevice().deviceName();
|
||||||
|
if ( ui->inputListWidget->currentIndex().isValid() )
|
||||||
|
name = ui->inputListWidget->currentIndex().data().toString();
|
||||||
QAudioDeviceInfo dev = findInputAudioDeviceInfoByName ( name );
|
QAudioDeviceInfo dev = findInputAudioDeviceInfoByName ( name );
|
||||||
|
|
||||||
name = ui->outputListWidget->currentIndex().data().toString();
|
name = QQtAudioManager::defaultOutputDevice().deviceName();
|
||||||
|
if ( ui->outputListWidget->currentIndex().isValid() )
|
||||||
|
name = ui->outputListWidget->currentIndex().data().toString();
|
||||||
QAudioDeviceInfo devOut = findOutputAudioDeviceInfoByName ( name );
|
QAudioDeviceInfo devOut = findOutputAudioDeviceInfoByName ( name );
|
||||||
|
|
||||||
/*使用默认输入、输出设备*/
|
/*使用默认输入、输出设备*/
|
||||||
@ -249,18 +253,43 @@ void MainWindow::on_pushButton_clicked()
|
|||||||
//如果格式不同,在mac电脑上本地输入输出设备是可以使用的,但是对于连接的语音蓝牙话筒,却是不可以使用的,原因未知。
|
//如果格式不同,在mac电脑上本地输入输出设备是可以使用的,但是对于连接的语音蓝牙话筒,却是不可以使用的,原因未知。
|
||||||
//格式相同的时候,实在是太好用啦。
|
//格式相同的时候,实在是太好用啦。
|
||||||
//这个建议默认就相同,但是,在QQtAudioManager当中,并没有直接将其相等处理,如果用户在readyRead槽函数里,可以更改采样率进行某些特殊处理。一般不需要差异处理的,相等就行了。
|
//这个建议默认就相同,但是,在QQtAudioManager当中,并没有直接将其相等处理,如果用户在readyRead槽函数里,可以更改采样率进行某些特殊处理。一般不需要差异处理的,相等就行了。
|
||||||
manager.inputAudioFormat() = manager.outputDeviceInfo().preferredFormat();
|
// int inBit = ui->inBit->currentIndex().data().toInt();
|
||||||
manager.outputAudioFormat() = manager.outputDeviceInfo().preferredFormat();
|
// int inChn = ui->inChn->currentIndex().data().toInt();
|
||||||
|
// int inRate = ui->intRate->currentIndex().data().toInt();
|
||||||
|
// QAudioFormat inFmt;
|
||||||
|
// inFmt.setChannelCount ( inChn );
|
||||||
|
// inFmt.setSampleSize ( inBit );
|
||||||
|
// inFmt.setSampleRate ( inRate );
|
||||||
|
// inFmt.setCodec ( "audio/pcm" );
|
||||||
|
// manager.inputAudioFormat() = inFmt;
|
||||||
|
|
||||||
|
QAudioFormat outFmt = manager.outputDeviceInfo().preferredFormat();
|
||||||
|
|
||||||
|
int outBit = outFmt.sampleSize(), outChn = outFmt.channelCount(), outRate = outFmt.sampleRate();
|
||||||
|
if ( ui->outBit->currentIndex().isValid() )
|
||||||
|
outBit = ui->outBit->currentIndex().data().toInt();
|
||||||
|
if ( ui->outChn->currentIndex().isValid() )
|
||||||
|
outChn = ui->outChn->currentIndex().data().toInt();
|
||||||
|
if ( ui->outRate->currentIndex().isValid() )
|
||||||
|
outRate = ui->outRate->currentIndex().data().toInt();
|
||||||
|
|
||||||
|
outFmt.setChannelCount ( outChn );
|
||||||
|
outFmt.setSampleSize ( outBit );
|
||||||
|
outFmt.setSampleRate ( outRate );
|
||||||
|
outFmt.setCodec ( "audio/pcm" );
|
||||||
|
|
||||||
|
manager.inputAudioFormat() = outFmt;
|
||||||
|
manager.outputAudioFormat() = outFmt;
|
||||||
|
|
||||||
pline() << "in prefer" << dev.preferredFormat().channelCount() << dev.preferredFormat().sampleRate() <<
|
pline() << "in prefer" << dev.preferredFormat().channelCount() << dev.preferredFormat().sampleRate() <<
|
||||||
dev.preferredFormat().sampleSize();
|
dev.preferredFormat().sampleSize();
|
||||||
|
|
||||||
pline() << "out prefer" << devOut.preferredFormat().channelCount() << devOut.preferredFormat().sampleRate() <<
|
|
||||||
devOut.preferredFormat().sampleSize();
|
|
||||||
|
|
||||||
pline() << "in" << manager.inputAudioFormat().channelCount() << manager.inputAudioFormat().sampleRate() <<
|
pline() << "in" << manager.inputAudioFormat().channelCount() << manager.inputAudioFormat().sampleRate() <<
|
||||||
manager.inputAudioFormat().sampleSize();
|
manager.inputAudioFormat().sampleSize();
|
||||||
|
|
||||||
|
pline() << "out prefer" << devOut.preferredFormat().channelCount() << devOut.preferredFormat().sampleRate() <<
|
||||||
|
devOut.preferredFormat().sampleSize();
|
||||||
|
|
||||||
pline() << "out" << manager.outputAudioFormat().channelCount() << manager.outputAudioFormat().sampleRate() <<
|
pline() << "out" << manager.outputAudioFormat().channelCount() << manager.outputAudioFormat().sampleRate() <<
|
||||||
manager.outputAudioFormat().sampleSize();
|
manager.outputAudioFormat().sampleSize();
|
||||||
|
|
||||||
@ -316,3 +345,12 @@ void MainWindow::on_outHS_valueChanged ( int value )
|
|||||||
pline() << "输出音量" << vol ;
|
pline() << "输出音量" << vol ;
|
||||||
manager.outputManager()->setVolume ( vol );
|
manager.outputManager()->setVolume ( vol );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_pushButton_4_clicked()
|
||||||
|
{
|
||||||
|
manager.inputAudioFormat() = QQtAudioManager::defaultOutputDevice().preferredFormat();
|
||||||
|
manager.outputAudioFormat() = QQtAudioManager::defaultOutputDevice().preferredFormat();
|
||||||
|
|
||||||
|
manager.startDefaultInput();
|
||||||
|
manager.startDefaultOutput();
|
||||||
|
}
|
||||||
|
@ -32,6 +32,8 @@ private slots:
|
|||||||
|
|
||||||
void on_outHS_valueChanged ( int value );
|
void on_outHS_valueChanged ( int value );
|
||||||
|
|
||||||
|
void on_pushButton_4_clicked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MainWindow* ui;
|
Ui::MainWindow* ui;
|
||||||
QQtAudioManager manager;
|
QQtAudioManager manager;
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>917</width>
|
<width>1198</width>
|
||||||
<height>587</height>
|
<height>591</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -91,6 +91,19 @@
|
|||||||
<string>stop (optional)</string>
|
<string>stop (optional)</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QPushButton" name="pushButton_4">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>820</x>
|
||||||
|
<y>40</y>
|
||||||
|
<width>291</width>
|
||||||
|
<height>32</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>start take voice and play (default device)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
<widget class="QWidget" name="">
|
<widget class="QWidget" name="">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user